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

Reply via email to