Changeset: e9cc7e7eb23f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e9cc7e7eb23f
Modified Files:
sql/server/rel_optimizer.c
sql/test/SQLancer/Tests/sqlancer14.test
Branch: default
Log Message:
If the grouping relation has more than one reference, then the semijoin cannot
be pushed down. This fixes sqlancer infinite optimization loop
diffs (66 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
@@ -4723,26 +4723,21 @@ rel_push_select_down_join(visitor *v, sq
* ->
* {semi}join( A, groupby( semijoin(B,A) [gbe == A.x] ) [gbe][aggrs] ) [ gbe
== A.x ]
*/
-
static inline sql_rel *
rel_push_join_down(visitor *v, sql_rel *rel)
{
- list *exps = NULL;
-
if (!rel_is_ref(rel) && ((is_left(rel->op) || rel->op == op_join ||
is_semi(rel->op)) && rel->l && rel->exps)) {
sql_rel *gb = rel->r, *ogb = gb, *l = NULL, *rell = rel->l;
- if (gb->op == op_project)
+ if (is_simple_project(gb->op) && !rel_is_ref(gb))
gb = gb->l;
- if (rel_is_ref(rell))
+ if (rel_is_ref(rell) || !gb || rel_is_ref(gb))
return rel;
- exps = rel->exps;
- if (gb && gb->op == op_groupby && gb->r && list_length(gb->r)) {
- list *jes = new_exp_list(v->sql->sa);
+ if (is_groupby(gb->op) && gb->r && list_length(gb->r)) {
+ list *exps = rel->exps, *jes =
new_exp_list(v->sql->sa), *gbes = gb->r;
node *n, *m;
- list *gbes = gb->r;
/* find out if all group by expressions are used in the
join */
for(n = gbes->h; n; n = n->next) {
sql_exp *gbe = n->data;
diff --git a/sql/test/SQLancer/Tests/sqlancer14.test
b/sql/test/SQLancer/Tests/sqlancer14.test
--- a/sql/test/SQLancer/Tests/sqlancer14.test
+++ b/sql/test/SQLancer/Tests/sqlancer14.test
@@ -327,7 +327,7 @@ statement ok
INSERT INTO t0(c3) VALUES ((VALUES (3)) = ANY(SELECT 2 FROM t0 WHERE t0.c3))
statement ok
-INSERT INTO t0(c3) VALUES(TRUE), ((VALUES (-409412573)) = ANY(SELECT ALL
(VALUES (0.87714195), (NULL)) FROM t0 AS l1t0 WHERE l1t0.c3));
+INSERT INTO t0(c3) VALUES(TRUE), ((VALUES (-409412573)) = ANY(SELECT ALL
(VALUES (0.87714195), (NULL)) FROM t0 AS l1t0 WHERE l1t0.c3))
statement ok
ROLLBACK
@@ -419,6 +419,19 @@ statement ok
START TRANSACTION
statement ok
+CREATE TABLE "t1" ("c2" DECIMAL(18,3) NOT NULL)
+
+query T rowsort
+SELECT t1.c2 FROM t1 LEFT OUTER JOIN (SELECT 3 = ANY((SELECT 1) INTERSECT
(SELECT 2))) AS sub0 ON (VALUES (FALSE))
+----
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
CREATE TABLE "t0" ("c0" VARCHAR(32))
statement ok
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list