Changeset: 98268e37128e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/98268e37128e Modified Files: sql/include/sql_relation.h sql/server/rel_unnest.c sql/test/SQLancer/Tests/sqlancer22.test Branch: default Log Message:
Merged with Jan2022 (conflict generated) diffs (99 lines): diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -298,7 +298,7 @@ typedef struct relation { single:1, /* * Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so a relation is not modified twice - * The first two bits are used by rel_unnest modifiers and always reset after. + * All bits are used by rel_unnest modifiers and always reset after. * The first bit is also used by rel_dce and rel_merge_select_rse optimizers. * The third bit is used by rel_remote_func only and it's not reset. */ 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 @@ -24,9 +24,11 @@ /* some unnesting steps use the 'used' flag to avoid further rewrites. List them here, so only one reset flag iteration will be used */ #define rewrite_fix_count_used (1 << 0) #define rewrite_values_used (1 << 1) +#define rewrite_outer_used (1 << 2) #define is_rewrite_fix_count_used(X) ((X & rewrite_fix_count_used) == rewrite_fix_count_used) #define is_rewrite_values_used(X) ((X & rewrite_values_used) == rewrite_values_used) +#define is_rewrite_outer_used(X) ((X & rewrite_outer_used) == rewrite_outer_used) static void exp_set_freevar(mvc *sql, sql_exp *e, sql_rel *r) @@ -3652,7 +3654,7 @@ include_tid(sql_rel *r) static inline sql_rel * rewrite_outer2inner_union(visitor *v, sql_rel *rel) { - if (is_outerjoin(rel->op) && !list_empty(rel->exps) && (((is_left(rel->op) || is_full(rel->op)) && rel_has_freevar(v->sql,rel->l)) || + if (is_outerjoin(rel->op) && !is_rewrite_outer_used(rel->used) && !list_empty(rel->exps) && (((is_left(rel->op) || is_full(rel->op)) && rel_has_freevar(v->sql,rel->l)) || ((is_right(rel->op) || is_full(rel->op)) && rel_has_freevar(v->sql,rel->r)) || exps_have_freevar(v->sql, rel->exps) || exps_have_rel_exp(rel->exps))) { sql_exp *f = exp_atom_bool(v->sql->sa, 0); int nrcols = rel->nrcols; @@ -3669,6 +3671,7 @@ rewrite_outer2inner_union(visitor *v, sq set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); set_processed(nrel); + nrel->used |= rewrite_outer_used; rel_join_add_exp(v->sql->sa, nrel, f); rel->op = op_join; nrel = rel_setop(v->sql->sa, @@ -3688,6 +3691,7 @@ rewrite_outer2inner_union(visitor *v, sq set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); set_processed(nrel); + nrel->used |= rewrite_outer_used; rel_join_add_exp(v->sql->sa, nrel, f); rel->op = op_join; nrel = rel_setop(v->sql->sa, @@ -3707,6 +3711,7 @@ rewrite_outer2inner_union(visitor *v, sq set_processed(except); sql_rel *lrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); set_processed(lrel); + lrel->used |= rewrite_outer_used; rel_join_add_exp(v->sql->sa, lrel, f); except = rel_setop(v->sql->sa, @@ -3716,6 +3721,7 @@ rewrite_outer2inner_union(visitor *v, sq set_processed(except); sql_rel *rrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); set_processed(rrel); + rrel->used |= rewrite_outer_used; rel_join_add_exp(v->sql->sa, rrel, f); lrel = rel_setop(v->sql->sa, rel_project(v->sql->sa, lrel, rel_projections(v->sql, lrel, NULL, 1, 1)), @@ -3841,7 +3847,8 @@ rel_unnest_simplify(visitor *v, sql_rel static sql_rel * rel_unnest_projects(visitor *v, sql_rel *rel) { - /* both rewrite_values and rewrite_fix_count use 'used' property from sql_rel, reset it, so make sure rewrite_reset_used is called first */ + /* The rewriters 'rewrite_values', 'rewrite_fix_count' and 'rewrite_outer2inner_union' use + 'used' property from sql_rel, reset it, so make sure rewrite_reset_used is called first */ if (rel) rel = rewrite_reset_used(v, rel); if (rel) diff --git a/sql/test/SQLancer/Tests/sqlancer22.test b/sql/test/SQLancer/Tests/sqlancer22.test --- a/sql/test/SQLancer/Tests/sqlancer22.test +++ b/sql/test/SQLancer/Tests/sqlancer22.test @@ -228,3 +228,17 @@ 2 statement ok ROLLBACK + +statement ok +START TRANSACTION + +statement ok +create table t0 (c0 int, CONSTRAINT "t0_c0_pkey" PRIMARY KEY ("c0")) + +statement ok rowcount 1 +MERGE INTO t0 USING (SELECT 1 FROM t0 +FULL OUTER JOIN (SELECT 1 FROM t0 AS w RIGHT OUTER JOIN (SELECT 1) AS z(z) ON EXISTS (SELECT 1 WHERE w.c0 > 0)) AS y(y) +ON y.y = y.y) AS x(x) ON TRUE WHEN NOT MATCHED THEN INSERT (c0) VALUES (1) + +statement ok +ROLLBACK _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list