Changeset: ada3588fcf99 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ada3588fcf99
Modified Files:
        sql/server/rel_rewriter.c
        sql/server/rel_unnest.c
        sql/test/SQLancer/Tests/sqlancer17.test
Branch: Jul2021
Log Message:

Make sure relation under new select is processed and added defensive checks


diffs (128 lines):

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
@@ -125,7 +125,8 @@ rewrite_simplify_exp(visitor *v, sql_rel
                        sql_exp *l = args->h->data;
                        sql_exp *vals = args->h->next->data;
 
-                       ie = exp_in_func(v->sql, l, vals, 1, 0);
+                       if (!(ie = exp_in_func(v->sql, l, vals, 1, 0)))
+                               return NULL;
                        if (exp_name(e))
                                exp_prop_alias(v->sql->sa, ie, e);
                        v->changes++;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2107,6 +2107,9 @@ rewrite_aggregates(visitor *v, sql_rel *
 static sql_rel *
 rewrite_or_exp(visitor *v, sql_rel *rel)
 {
+       if (mvc_highwater(v->sql))
+               return sql_error(v->sql, 10, SQLSTATE(42000) "Query too 
complex: running out of stack space");
+
        if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
!list_empty(rel->exps)) {
                for(node *n=rel->exps->h; n; n=n->next) {
                        sql_exp *e = n->data, *id;
@@ -2139,8 +2142,8 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
                                                n = next;
                                        }
 
-                                       sql_rel *l = rel;
-                                       sql_rel *r = rel_dup(rel);
+                                       sql_rel *l = rel, *r = rel_dup(rel);
+                                       set_processed(rel);
                                        l = rel_select(v->sql->sa, l, NULL);
                                        l->exps = e->l;
                                        if (!(l = rewrite_or_exp(v, l)))
@@ -2449,6 +2452,9 @@ rel_union_exps(mvc *sql, sql_exp **l, li
        list *exps = NULL;
        int freevar = 0;
 
+       if (mvc_highwater(sql))
+               return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
+
        for (node *n=vals->h; n; n = n->next) {
                sql_exp *ve = n->data, *r, *s;
                sql_rel *sq = NULL;
@@ -2972,6 +2978,9 @@ rewrite_compare(visitor *v, sql_rel *rel
 static sql_rel *
 rewrite_join2semi(visitor *v, sql_rel *rel)
 {
+       if (mvc_highwater(v->sql))
+               return sql_error(v->sql, 10, SQLSTATE(42000) "Query too 
complex: running out of stack space");
+
        if (is_select(rel->op) && !list_empty(rel->exps)) {
                sql_rel *j = rel->l;
                int needed=0;
@@ -2988,8 +2997,12 @@ rewrite_join2semi(visitor *v, sql_rel *r
                }
                if (needed) {
                        list *exps = sa_list(v->sql->sa);
-                       sql_rel *l = j->l = rel_select(v->sql->sa, j->l, NULL);
-
+                       sql_rel *l = j->l;
+
+                       if (!is_select(l->op)) {
+                               set_processed(l);
+                               l = j->l = rel_select(v->sql->sa, j->l, NULL);
+                       }
                        for (node *n = rel->exps->h; n;) {
                                node *next = n->next;
                                sql_exp *e = n->data;
@@ -3002,7 +3015,8 @@ rewrite_join2semi(visitor *v, sql_rel *r
                                n = next;
                        }
                        l->exps = exps;
-                       j->l = rewrite_join2semi(v, j->l);
+                       if (!(j->l = rewrite_join2semi(v, j->l)))
+                               return NULL;
                }
 
                needed = 0;
@@ -3263,8 +3277,11 @@ rewrite_ifthenelse(visitor *v, sql_rel *
 static list *
 rewrite_compare_exps(visitor *v, sql_rel *rel, list *exps)
 {
+       if (mvc_highwater(v->sql))
+               return sql_error(v->sql, 10, SQLSTATE(42000) "Query too 
complex: running out of stack space");
        if (list_empty(exps))
                return exps;
+
        for(node *n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
 
diff --git a/sql/test/SQLancer/Tests/sqlancer17.test 
b/sql/test/SQLancer/Tests/sqlancer17.test
--- a/sql/test/SQLancer/Tests/sqlancer17.test
+++ b/sql/test/SQLancer/Tests/sqlancer17.test
@@ -106,9 +106,6 @@ statement ok
 ROLLBACK
 
 statement ok
-START TRANSACTION
-
-statement ok
 CREATE TABLE "t1" ("c0" BINARY LARGE OBJECT,"c1" INTERVAL SECOND,"c2" 
CHARACTER LARGE OBJECT)
 
 statement ok rowcount 8
@@ -124,6 +121,9 @@ NULL        1010163365.000  NULL
 5BCD   6.000   NULL
 
 statement ok
+START TRANSACTION
+
+statement ok
 CREATE TABLE "t2" ("c0" INTEGER,"c2" INET,CONSTRAINT "t2_c0_pkey" PRIMARY KEY 
("c0"))
 
 statement ok rowcount 7
@@ -150,3 +150,10 @@ AND (CASE WHEN (r'1810575798') BETWEEN '
 
 statement ok
 ROLLBACK
+
+query I rowsort
+SELECT 1 FROM t1 WHERE 2 IN (3, (SELECT 4 FROM (select 1) as v0(c0))) AND '8' 
<> ANY(SELECT '1') AND ('2' > (SELECT '' WHERE TRUE)) IS NULL
+----
+
+statement ok
+DROP TABLE t1
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to