Changeset: 29c66a262adf for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29c66a262adf Modified Files: sql/server/rel_optimizer.c sql/server/rel_rewriter.c sql/test/SQLancer/Tests/sqlancer13.test Branch: default Log Message:
->f atoms may contain columns, so apply algorithms recursively on them. This fixes a sqlancer crash diffs (136 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -1332,7 +1332,19 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel ne = exp_aggr(sql->sa, nl, e->f, need_distinct(e), need_no_nil(e), e->card, has_nil(e)); break; } - case e_atom: + case e_atom: { + list *l = e->f, *nl = NULL; + + if (!l) { + return e; + } else { + nl = exps_rename(sql, l, f, t); + if (!nl) + return NULL; + } + ne = exp_values(sql->sa, nl); + break; + } case e_psm: return e; } @@ -2290,7 +2302,19 @@ exp_push_down_prj(mvc *sql, sql_exp *e, ne = exp_aggr(sql->sa, nl, e->f, need_distinct(e), need_no_nil(e), e->card, has_nil(e)); return exp_propagate(sql->sa, ne, e); } - case e_atom: + case e_atom: { + list *l = e->f, *nl = NULL; + + if (!l) { + return e; + } else { + nl = exps_push_down_prj(sql, l, f, t); + if (!nl) + return NULL; + } + ne = exp_values(sql->sa, nl); + return exp_propagate(sql->sa, ne, e); + } case e_psm: if (e->type == e_atom && e->f) /* value list */ return NULL; @@ -6289,7 +6313,18 @@ exp_use_consts(mvc *sql, sql_exp *e, lis else return exp_aggr(sql->sa, nl, e->f, need_distinct(e), need_no_nil(e), e->card, has_nil(e)); } - case e_atom: + case e_atom: { + list *l = e->f, *nl = NULL; + + if (!l) { + return e; + } else { + nl = exps_use_consts(sql, l, consts); + if (!nl) + return NULL; + } + return exp_values(sql->sa, nl); + } case e_psm: return e; } diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c --- a/sql/server/rel_rewriter.c +++ b/sql/server/rel_rewriter.c @@ -324,7 +324,18 @@ static sql_exp * else return exp_aggr(sql->sa, nl, e->f, need_distinct(e), need_no_nil(e), e->card, has_nil(e)); } - case e_atom: + case e_atom: { + list *l = e->f, *nl = NULL; + + if (!l) { + return e; + } else { + nl = exps_push_down(sql, l, f, t); + if (!nl) + return NULL; + } + return exp_values(sql->sa, nl); + } case e_psm: return 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 @@ -93,17 +93,14 @@ query I rowsort SELECT 1 FROM t2 WHERE NULL NOT IN (SELECT 1 FROM t2) ---- - query I rowsort SELECT 1 FROM t2 WHERE NULL <> ALL(SELECT 1 FROM t2) ---- - query T rowsort SELECT t0.c3 FROM t0, t2 WHERE NULLIF(t0.c3, t0.c3) <> ALL(SELECT DISTINCT '1' FROM t0) ---- - query I rowsort SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(NULLIF(t0.c3, t0.c3) <> ALL(SELECT DISTINCT '1' FROM t0) AS INT) as count FROM t0, t2) as res ---- @@ -177,3 +174,26 @@ select ((select 1 from t1, t0)) in (2, t statement ok ROLLBACK +statement ok +START TRANSACTION + +statement ok +CREATE TABLE "sys"."t1" ("c2" BIGINT NOT NULL,"c4" DATE,CONSTRAINT "t1_c2_pkey" PRIMARY KEY ("c2")) + +statement ok +CREATE TABLE "sys"."t2" ("c0" DOUBLE NOT NULL,"c2" INTERVAL DAY,CONSTRAINT "t2_c0_unique" UNIQUE ("c0"),CONSTRAINT "t2_c0_c2_unique" UNIQUE ("c0", "c2")) + +query I rowsort +SELECT 1 FROM t2, t1 WHERE (t2.c0 > 4 OR false) AND 9 IN (t2.c0, t1.c2) = TRUE +---- + +query I rowsort +SELECT 1 FROM t2, t1 WHERE (t2.c0 > 4 OR false) AND (CASE WHEN 9 IN (t2.c0, t1.c2) THEN TRUE END) +---- + +query T rowsort +SELECT t1.c2 FROM t2, t1 WHERE (((((((((t2.c0)^(2))) NOT BETWEEN SYMMETRIC (least(t1.c2, t1.c2)) AND (4))AND(NOT (TRUE))))OR(least(FALSE, FALSE))))AND(CASE WHEN (9) NOT IN (t2.c0, t1.c2) THEN TRUE ELSE greatest(TRUE, FALSE) END)) +---- + +statement ok +ROLLBACK _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list