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

Reply via email to