Changeset: ec16ed63d7ba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ec16ed63d7ba
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/test/SQLancer/Tests/sqlancer13.test
Branch: default
Log Message:

Back when I was fixing joinable like expressions, I realized the simple ones 
needed a fix too. Now sqlancer just proved it


diffs (101 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2393,7 +2393,7 @@ split_join_exps(sql_rel *rel, list *join
        if (!list_empty(rel->exps)) {
                for (node *n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
-                       int left_reference = 0, right_reference = 0;
+                       int can_join = 0;
 
                        /* we can handle thetajoins, rangejoins and filter 
joins (like) */
                        /* ToDo how about atom expressions? */
@@ -2419,17 +2419,21 @@ split_join_exps(sql_rel *rel, list *join
                                                    (rl && !ll &&
                                                   ((lr && !rr) || (nrcl1 = 
r->card == CARD_ATOM && exp_is_atom(r))) &&
                                                   ((lf && !rf) || (nrcl2 = 
f->card == CARD_ATOM && exp_is_atom(f))) && (nrcl1+nrcl2) <= 1)) {
-                                                       left_reference = 
right_reference = 1;
+                                                       can_join = 1;
                                                }
                                        } else {
+                                               int ll = 0, lr = 0, rl = 0, rr 
= 0;
+
                                                if (l->card != CARD_ATOM || 
!exp_is_atom(l)) {
-                                                       left_reference |= 
rel_find_exp(rel->l, l) != NULL;
-                                                       right_reference |= 
rel_find_exp(rel->r, l) != NULL;
+                                                       ll |= 
rel_find_exp(rel->l, l) != NULL;
+                                                       rl |= 
rel_find_exp(rel->r, l) != NULL;
                                                }
                                                if (r->card != CARD_ATOM || 
!exp_is_atom(r)) {
-                                                       left_reference |= 
rel_find_exp(rel->l, r) != NULL;
-                                                       right_reference |= 
rel_find_exp(rel->r, r) != NULL;
+                                                       lr |= 
rel_find_exp(rel->l, r) != NULL;
+                                                       rr |= 
rel_find_exp(rel->r, r) != NULL;
                                                }
+                                               if ((ll && !lr && !rl && rr) || 
(!ll && lr && rl && !rr))
+                                                       can_join = 1;
                                        }
                                } else if (flag == cmp_filter) {
                                        list *l = e->l, *r = e->r;
@@ -2452,10 +2456,10 @@ split_join_exps(sql_rel *rel, list *join
                                                }
                                        }
                                        if ((ll && !lr && !rl && rr) || (!ll && 
lr && rl && !rr))
-                                               right_reference = 
left_reference = 1;
+                                               can_join = 1;
                                }
                        }
-                       if (left_reference && right_reference) {
+                       if (can_join) {
                                append(joinable, e);
                        } else {
                                append(not_joinable, e);
diff --git a/sql/test/SQLancer/Tests/sqlancer13.test 
b/sql/test/SQLancer/Tests/sqlancer13.test
--- a/sql/test/SQLancer/Tests/sqlancer13.test
+++ b/sql/test/SQLancer/Tests/sqlancer13.test
@@ -764,3 +764,45 @@ DROP TABLE t1
 
 statement ok
 DROP TABLE t2
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "sys"."t0" ("c1" BIGINT NOT NULL,"c5" BINARY LARGE 
OBJECT,CONSTRAINT "t0_c1_pkey" PRIMARY KEY ("c1"),CONSTRAINT "t0_c5_unique" 
UNIQUE ("c5"))
+
+statement ok
+COPY 5 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"'
+<COPY_INTO_DATA>
+1150662203     
+-1997528658    8BBD50
+8      B4
+20     E4FCBC9E10
+0      D0
+
+statement ok
+CREATE TABLE "sys"."t1" ("c0" CHARACTER LARGE OBJECT NOT NULL,"c2" CHARACTER 
LARGE OBJECT,"c3" DECIMAL(18,3) NOT NULL,"c5" CHARACTER LARGE OBJECT NOT NULL,
+       "c6" CHAR(175),"c7" DOUBLE,CONSTRAINT "t1_c0_unique" UNIQUE ("c0"))
+
+statement ok
+COPY 8 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"'
+<COPY_INTO_DATA>
+"sIm&S"        NULL    0.383   "xvᝅ〯p]"        "0.8474899180729288"    
0.39434750848770694
+"uꑳ䍴HnkZf"     NULL    0.453   "357028814"     "葬L*鴎k" NULL
+"\t멥U\015W"    NULL    0.842   "XJ"    NULL    NULL
+")\006x+okyG"  "U"     0.033   "G&"    "8Zc"   NULL
+"0"    "p-J"   0.033   ""      "2006489952"    NULL
+"0.6387965642930552"   ">*"   0.899   "I8NdU3M"       "dH/"   0.68878347
+"-1798514093"  NULL    0.265   "Q"     "wGy1y_9.x"     0.9869141021920103
+""     NULL    0.459   "꺦"     "l"     3.1323088
+
+query I rowsort
+select 1 from t1, t0 where (case when false then t1.c3 else 6 end) <= (case 
when false then t0.c1 when true then t1.c7 end)
+----
+
+query I rowsort
+select t0.c1 from t1, t0 where ((case when false then t1.c3 else 6 end)<=(case 
when false then 9 when false then t0.c1 when true then t1.c7 else 5 end))
+----
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to