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