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

Reply via email to