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