Changeset: dfd6ee42a068 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dfd6ee42a068
Modified Files:
sql/server/rel_optimizer.c
sql/test/SQLancer/Tests/sqlancer17.test
Branch: default
Log Message:
Merged with Jan2022
diffs (114 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
@@ -6524,7 +6524,8 @@ rel_push_project_up(visitor *v, sql_rel
return rel;
}
-/* if local_proj is set: the current expression is from the same projection */
+/* if local_proj is >= -1, the current expression is from the same projection
+ if local_proj is -1, then we don't care about self references (eg used to
check for order by exps) */
static int exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj);
static int
@@ -6548,6 +6549,9 @@ exp_mark_used(sql_rel *subrel, sql_exp *
switch(e->type) {
case e_column:
ne = rel_find_exp(subrel, e);
+ /* if looking in the same projection, make sure 'ne' is
projected before the searched column */
+ if (ne && local_proj > -1 && list_position(subrel->exps, ne) >
local_proj)
+ ne = NULL;
break;
case e_convert:
return exp_mark_used(subrel, e->l, local_proj);
@@ -6592,7 +6596,7 @@ exp_mark_used(sql_rel *subrel, sql_exp *
break;
}
if (ne && e != ne) {
- if (!local_proj || ne->type != e_column || (has_label(ne) ||
(ne->alias.rname && ne->alias.rname[0] == '%')) || (subrel->l &&
!rel_find_exp(subrel->l, e)))
+ if (local_proj == -2 || ne->type != e_column || (has_label(ne)
|| (ne->alias.rname && ne->alias.rname[0] == '%')) || (subrel->l &&
!rel_find_exp(subrel->l, e)))
ne->used = 1;
return ne->used;
}
@@ -6630,7 +6634,7 @@ rel_exps_mark_used(sql_allocator *sa, sq
sql_exp *e = n->data;
e->used = 1;
- exp_mark_used(rel, e, 1);
+ exp_mark_used(rel, e, -1);
}
}
@@ -6653,8 +6657,8 @@ rel_exps_mark_used(sql_allocator *sa, sq
if (!is_project(rel->op) || e->used) {
if (is_project(rel->op))
- nr += exp_mark_used(rel, e, 1);
- nr += exp_mark_used(subrel, e, 0);
+ nr += exp_mark_used(rel, e, i);
+ nr += exp_mark_used(subrel, e, -2);
}
}
}
@@ -6673,7 +6677,7 @@ rel_exps_mark_used(sql_allocator *sa, sq
e->used = 1;
/* possibly project/groupby uses columns from the inner
*/
- exp_mark_used(subrel, e, 0);
+ exp_mark_used(subrel, e, -2);
}
}
}
@@ -6772,7 +6776,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
if (rel->l && rel->flag != TRIGGER_WRAPPER) {
rel_used(rel);
if (rel->r)
- exp_mark_used(rel->l, rel->r, 0);
+ exp_mark_used(rel->l, rel->r, -2);
rel_mark_used(sql, rel->l, proj);
}
break;
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
@@ -628,3 +628,40 @@ SELECT 1 FROM tz, vx WHERE (vx.vc1 + tz.
statement ok
ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE rt0 (c0 INT)
+
+statement ok
+create or replace view vx(vc0) as (select 'a')
+
+statement ok
+create or replace view vy(vc0) as (select 2)
+
+# make sure self-references are eliminated by rel_dce
+query T nosort
+PLAN SELECT 1 FROM rt0 CROSS JOIN (SELECT CASE sub0.c2 WHEN 4 THEN 'c' END,
+least(3, sub0.c1) FROM vx JOIN (SELECT 4, vy.vc0 FROM vy) AS sub0(c1,c2) ON
TRUE) AS sub0(c0,c2)
+----
+project (
+| crossproduct (
+| | table("sys"."rt0") [ "rt0"."%TID%" NOT NULL UNIQUE ],
+| | project (
+| | | crossproduct (
+| | | | [ boolean(1) "true" as "%1"."%1" ],
+| | | | [ boolean(1) "true" as "%2"."%2" ]
+| | | ) [ ]
+| | ) [ "sys"."casewhen"(tinyint(2) "2", tinyint(3) "4", char(1) "c", char(1)
NULL) as "sub0"."c0" ]
+| ) [ ]
+) [ tinyint(1) "1" ]
+
+query I nosort
+SELECT 1 FROM rt0 CROSS JOIN (SELECT CASE sub0.c2 WHEN 4 THEN 'c' END,
+least(3, sub0.c1) FROM vx JOIN (SELECT 4, vy.vc0 FROM vy) AS sub0(c1,c2) ON
TRUE) AS sub0(c0,c2)
+----
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list