Changeset: 6c0bd47cbfc0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6c0bd47cbfc0
Modified Files:
sql/server/rel_unnest.c
sql/test/SQLancer/Tests/sqlancer15.test
Branch: Jul2021
Log Message:
Remove TID references and later restore them with references to the identity
function while generating unions of 'or' subqueries
diffs (77 lines):
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
@@ -2129,13 +2129,24 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
rel = l;
}
rel = rel_add_identity(v->sql, rel,
&id); /* identity function needed */
- assert(id);
+ const char *idrname = exp_relname(id),
*idname = exp_name(id);
+ list *tids = NULL, *exps =
rel_projections(v->sql, rel, NULL, 1, 1);
+
+ for( node *n = exps->h ; n ; ) {
+ node *next = n->next;
+ sql_exp *e = n->data;
+
+ if (strcmp(exp_name(e), TID) ==
0) { /* remove TID references and later restore them with identity function
references */
+ if (!tids)
+ tids =
sa_list(v->sql->sa);
+ list_append(tids,
exp_alias(v->sql->sa, exp_relname(e), TID, idrname, idname,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+ list_remove_node(exps,
NULL, n);
+ }
+ n = next;
+ }
sql_rel *l = rel;
sql_rel *r = rel_dup(rel);
- list *exps = rel_projections(v->sql,
rel, NULL, 1, 0); /* TID column must not be included */
- list_append(exps, exp_ref(v->sql, id));
/* but identity must */
-
l = rel_select(v->sql->sa, l, NULL);
l->exps = e->l;
if (!(l = rewrite_or_exp(v, l)))
@@ -2144,16 +2155,13 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
r->exps = e->r;
if (!(r = rewrite_or_exp(v, r)))
return NULL;
-
- list *ls = rel_projections(v->sql, rel,
NULL, 1, 0);
- list_append(ls, exp_ref(v->sql, id));
- list *rs = rel_projections(v->sql, rel,
NULL, 1, 0);
- list_append(rs, exp_ref(v->sql, id));
- if (!(rel =
rel_setop_check_types(v->sql, l, r, ls, rs, op_union)))
+ if (!(rel =
rel_setop_check_types(v->sql, l, r, exps_copy(v->sql, exps), exps_copy(v->sql,
exps), op_union)))
return NULL;
rel_setop_set_exps(v->sql, rel, exps);
set_processed(rel);
rel = rel_distinct(rel);
+ if (tids) /* restore TIDs with identity
function references */
+ rel = rel_project(v->sql->sa,
rel, list_merge(rel_projections(v->sql, rel, NULL, 1, 1), tids, NULL));
v->changes++;
return rel;
}
diff --git a/sql/test/SQLancer/Tests/sqlancer15.test
b/sql/test/SQLancer/Tests/sqlancer15.test
--- a/sql/test/SQLancer/Tests/sqlancer15.test
+++ b/sql/test/SQLancer/Tests/sqlancer15.test
@@ -81,6 +81,21 @@ statement ok
START TRANSACTION
statement ok
+CREATE TABLE "t2" ("c0" INTERVAL SECOND)
+
+statement ok rowcount 3
+INSERT INTO "t2" VALUES (INTERVAL '1' SECOND), (INTERVAL '3' SECOND),
(INTERVAL '3' SECOND);
+
+statement ok rowcount 0
+update t2 set c0 = INTERVAL '5' SECOND where isauuid('a') or (values (time
'05:52:51')) is null
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
CREATE TABLE "t1" ("c2" INTERVAL DAY)
statement ok rowcount 5
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list