Changeset: f1bccde37863 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f1bccde37863 Added Files: sql/test/SQLancer/Tests/sqlancer21.SQL.py Modified Files: sql/server/rel_rel.c sql/test/SQLancer/Tests/All sql/test/SQLancer/Tests/sqlancer20.SQL.py Branch: default Log Message:
rel_bind_path improvements 1. Call rel_base_bind_column only if basetable relation has no exps set 2. Return early on error and avoid crash. 3. Don't compute other children bind paths if earlier ones are not found diffs (216 lines): diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -1057,44 +1057,36 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s break; case op_semi: case op_anti: - case op_select: case op_topn: case op_sample: found = rel_bind_path_(sql, rel->l, e, path); break; - case op_basetable: - if (e->l) - found = (rel_base_bind_column2_(rel, e->l, e->r) != NULL); - else - found = (rel_base_bind_column_(rel, e->r) != NULL); - break; case op_union: case op_inter: case op_except: - if (!rel->exps) { - found = rel_bind_path_(sql, rel->l, e, path); - assert(0); - break; - } - /* fall through */ case op_groupby: case op_project: case op_table: - if (!rel->exps) - break; - if (!found && e->l && exps_bind_column2(rel->exps, e->l, e->r, NULL)) - found = 1; - if (!found && !e->l && exps_bind_column(rel->exps, e->r, NULL, NULL, 1)) - found = 1; + if (is_basetable(rel->op) && !rel->exps) { + if (e->l) { + if (rel_base_bind_column2_(rel, e->l, e->r)) + found = 1; + } else if (rel_base_bind_column_(rel, e->r)) + found = 1; + } else if (rel->exps) { + if (!found && e->l && exps_bind_column2(rel->exps, e->l, e->r, NULL)) + found = 1; + if (!found && !e->l && exps_bind_column(rel->exps, e->r, NULL, NULL, 1)) + found = 1; + } break; case op_insert: case op_update: case op_delete: case op_truncate: case op_merge: - break; case op_ddl: break; } @@ -1109,9 +1101,10 @@ rel_bind_path(mvc *sql, sql_rel *rel, sq if (!path) return NULL; - if (e->type == e_convert) - path = rel_bind_path(sql, rel, e->l, path); - else if (e->type == e_column) { + if (e->type == e_convert) { + if (!(path = rel_bind_path(sql, rel, e->l, path))) + return NULL; + } else if (e->type == e_column) { if (rel) { if (!rel_bind_path_(sql, rel, e, path)) { /* something is wrong */ @@ -1207,15 +1200,13 @@ rel_push_select(mvc *sql, sql_rel *rel, sql_rel * rel_push_join(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2, sql_exp *e, int f) { - list *l = rel_bind_path(sql, rel, ls, sa_list(sql->sa)); - list *r = rel_bind_path(sql, rel, rs, sa_list(sql->sa)); - list *r2 = NULL; + list *l = NULL, *r = NULL, *r2 = NULL; node *ln, *rn; sql_rel *lrel = NULL, *rrel = NULL, *rrel2 = NULL, *p = NULL; - if (rs2) - r2 = rel_bind_path(sql, rel, rs2, sa_list(sql->sa)); - if (!l || !r || (rs2 && !r2)) + if (!(l = rel_bind_path(sql, rel, ls, sa_list(sql->sa))) || + !(r = rel_bind_path(sql, rel, rs, sa_list(sql->sa))) || + (rs2 && !(r2 = rel_bind_path(sql, rel, rs2, sa_list(sql->sa))))) return NULL; if (is_sql_or(f)) diff --git a/sql/test/SQLancer/Tests/All b/sql/test/SQLancer/Tests/All --- a/sql/test/SQLancer/Tests/All +++ b/sql/test/SQLancer/Tests/All @@ -17,4 +17,5 @@ sqlancer16 sqlancer17 sqlancer18 sqlancer19 -KNOWNFAIL?sqlancer20 +sqlancer20 +KNOWNFAIL?sqlancer21 diff --git a/sql/test/SQLancer/Tests/sqlancer20.SQL.py b/sql/test/SQLancer/Tests/sqlancer20.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer20.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer20.SQL.py @@ -1,5 +1,4 @@ import os -from decimal import Decimal from MonetDBtesting.sqltest import SQLTestCase @@ -10,30 +9,39 @@ with SQLTestCase() as cli: cli.connect(username="monetdb", password="monetdb") cli.execute(""" START TRANSACTION; - CREATE TABLE "t1" ("c0" BIGINT,"c1" INTERVAL MONTH); - INSERT INTO "t1" VALUES (1, INTERVAL '9' MONTH),(5, INTERVAL '6' MONTH),(5, NULL),(7, NULL),(2, INTERVAL '1' MONTH),(2, INTERVAL '1' MONTH); + CREATE MERGE TABLE "mt2" ("c0" CHAR(78),"c1" UUID NOT NULL,CONSTRAINT "mt2_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "mt2_c1_unique" UNIQUE ("c1")); + + CREATE TABLE "mct21" ("c0" CHAR(78),"c1" UUID NOT NULL,CONSTRAINT "mct21_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "mct21_c1_unique" UNIQUE ("c1")); + INSERT INTO "mct21" VALUES ('2\\\\5LTC', 'efcdc386-d403-cf6d-4d34-79e08cefad9b'); + + CREATE TABLE "mct20" ("c0" CHAR(78),"c1" UUID NOT NULL,CONSTRAINT "mct20_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "mct20_c1_unique" UNIQUE ("c1")); + INSERT INTO "mct20" VALUES ('gC', '7ffeefe2-5ad2-9a6b-71e5-9ecbb8b52ce9'),('3', 'd4bb47ec-0ccf-2daf-3997-bfa94b409fae'),('o', 'd7c126c0-bb8b-f457-50e0-dcaf5e68e6be'), + ('55', 'bf940cb2-f98d-67ae-1cae-17c8ed046ab6'),('#~Ew', 'afa1c3a9-b09d-92a0-e1ef-ed27bb663c2d'),(NULL, 'b991d4fe-abba-c4ea-c282-c19c2dd9f08d'), + (NULL, 'da1bfd50-14d3-43fa-b6c1-cd95ee6f2f17'),(NULL, 'b408ad8d-bfe4-e2a9-f2b1-bf7bb2310226'),('', '15fed7bd-387b-475e-03b4-03da2cafbad7'), + ('3', 'fb1f40ff-fa29-da45-f90b-0562639de03c'),(NULL, 'dac78eac-8483-46d4-ccd0-fb61eedaac02'); COMMIT; START TRANSACTION; - CREATE REMOTE TABLE "rt1" ("c0" BIGINT,"c1" INTERVAL MONTH) ON 'mapi:monetdb://localhost:%s/%s/sys/t1'; - COMMIT;""" % (port, db)).assertSucceeded() + CREATE REMOTE TABLE "rmct20" ("c0" CHAR(78),"c1" UUID NOT NULL,CONSTRAINT "rmct20_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "rmct20_c1_unique" UNIQUE ("c1")) ON 'mapi:monetdb://localhost:%s/%s/sys/mct20'; + CREATE REMOTE TABLE "rmct21" ("c0" CHAR(78),"c1" UUID NOT NULL,CONSTRAINT "rmct21_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "rmct21_c1_unique" UNIQUE ("c1")) ON 'mapi:monetdb://localhost:%s/%s/sys/mct21'; + ALTER TABLE "mt2" ADD TABLE "rmct20"; + ALTER TABLE "mt2" ADD TABLE "rmct21"; + COMMIT;""" % (port, db, port, db)).assertSucceeded() - # Issues related to scale propagation in the sql layer - cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM t1 where t1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) - cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM rt1 where rt1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) - cli.execute("SELECT scale_down(146.0, 1) FROM t1 where t1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([(Decimal('14.6'),)]) - cli.execute("SELECT scale_down(146.0, 1) FROM rt1 where rt1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([(Decimal('14.6'),)]) - cli.execute("SELECT greatest(\"lower\"('D4Idf '), 'x x') FROM t1 where t1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([("x x",)]) - cli.execute("SELECT greatest(\"lower\"('D4Idf '), 'x x') FROM rt1 where rt1.c0 = 1;") \ - .assertSucceeded().assertDataResultMatch([("x x",)]) + cli.execute("START TRANSACTION;") + cli.execute('(select 0) intersect (select 0 from mt2, mct20 where mct20.c0 like mt2.c0);') \ + .assertSucceeded().assertDataResultMatch([(0,)]) + cli.execute('(select 0) intersect (select 1 from mt2, mct20 where mct20.c0 like mt2.c0);') \ + .assertSucceeded().assertDataResultMatch([]) + cli.execute("ROLLBACK;") cli.execute(""" START TRANSACTION; - DROP TABLE rt1; - DROP TABLE t1; + ALTER TABLE mt2 DROP TABLE rmct20; + ALTER TABLE mt2 DROP TABLE rmct21; + DROP TABLE rmct20; + DROP TABLE rmct21; + DROP TABLE mct20; + DROP TABLE mct21; + DROP TABLE mt2; COMMIT;""").assertSucceeded() diff --git a/sql/test/SQLancer/Tests/sqlancer21.SQL.py b/sql/test/SQLancer/Tests/sqlancer21.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/SQLancer/Tests/sqlancer21.SQL.py @@ -0,0 +1,39 @@ +import os +from decimal import Decimal + +from MonetDBtesting.sqltest import SQLTestCase + +port = os.environ['MAPIPORT'] +db = os.environ['TSTDB'] + +with SQLTestCase() as cli: + cli.connect(username="monetdb", password="monetdb") + cli.execute(""" + START TRANSACTION; + CREATE TABLE "t1" ("c0" BIGINT,"c1" INTERVAL MONTH); + INSERT INTO "t1" VALUES (1, INTERVAL '9' MONTH),(5, INTERVAL '6' MONTH),(5, NULL),(7, NULL),(2, INTERVAL '1' MONTH),(2, INTERVAL '1' MONTH); + COMMIT; + + START TRANSACTION; + CREATE REMOTE TABLE "rt1" ("c0" BIGINT,"c1" INTERVAL MONTH) ON 'mapi:monetdb://localhost:%s/%s/sys/t1'; + COMMIT;""" % (port, db)).assertSucceeded() + + # Issues related to scale propagation in the sql layer + cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM t1 where t1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) + cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM rt1 where rt1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) + cli.execute("SELECT scale_down(146.0, 1) FROM t1 where t1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([(Decimal('14.6'),)]) + cli.execute("SELECT scale_down(146.0, 1) FROM rt1 where rt1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([(Decimal('14.6'),)]) + cli.execute("SELECT greatest(\"lower\"('D4Idf '), 'x x') FROM t1 where t1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([("x x",)]) + cli.execute("SELECT greatest(\"lower\"('D4Idf '), 'x x') FROM rt1 where rt1.c0 = 1;") \ + .assertSucceeded().assertDataResultMatch([("x x",)]) + + cli.execute(""" + START TRANSACTION; + DROP TABLE rt1; + DROP TABLE t1; + COMMIT;""").assertSucceeded() _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list