Changeset: 68ee548d3a9c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=68ee548d3a9c
Added Files:
        sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
        
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.stable.err
        
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.stable.out
Modified Files:
        sql/server/rel_updates.c
        sql/test/BugTracker-2019/Tests/All
Branch: Apr2019
Log Message:

Added test and fix for Bug 6715, ie when generating an update relation, take in 
account that the base table might have an alias on it.
Also fixed possible bugs in insert/update indexes statements generation with 
aliases.


diffs (truncated from 513 to 300 lines):

diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -96,7 +96,7 @@ get_inserts( sql_rel *ins )
 }
 
 static sql_rel *
-rel_insert_hash_idx(mvc *sql, sql_idx *i, sql_rel *inserts)
+rel_insert_hash_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *inserts)
 {
        char *iname = sa_strconcat( sql->sa, "%", i->base.name);
        node *m;
@@ -142,12 +142,12 @@ rel_insert_hash_idx(mvc *sql, sql_idx *i
        }
        /* append inserts to hash */
        append(get_inserts(inserts), h);
-       exp_setname(sql->sa, h, i->t->base.name, iname);
+       exp_setname(sql->sa, h, alias, iname);
        return inserts;
 }
 
 static sql_rel *
-rel_insert_join_idx(mvc *sql, sql_idx *i, sql_rel *inserts)
+rel_insert_join_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *inserts)
 {
        char *iname = sa_strconcat( sql->sa, "%", i->base.name);
        int need_nulls = 0;
@@ -185,12 +185,12 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
                lnl = exp_unop(sql->sa, _is, isnil);
                rnl = exp_unop(sql->sa, _is, isnil);
                if (need_nulls) {
-                   if (lnll_exps) {
-                       lnll_exps = exp_binop(sql->sa, lnll_exps, lnl, or);
-                       rnll_exps = exp_binop(sql->sa, rnll_exps, rnl, or);
-                   } else {
-                       lnll_exps = lnl;
-                       rnll_exps = rnl;
+                       if (lnll_exps) {
+                               lnll_exps = exp_binop(sql->sa, lnll_exps, lnl, 
or);
+                               rnll_exps = exp_binop(sql->sa, rnll_exps, rnl, 
or);
+                       } else {
+                               lnll_exps = lnl;
+                               rnll_exps = rnl;
                    }
                }
 
@@ -200,14 +200,14 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
                append(join_exps, je);
        }
        if (need_nulls) {
-                       _nlls = rel_select( sql->sa, rel_dup(ins), 
+               _nlls = rel_select( sql->sa, rel_dup(ins),
                                exp_compare(sql->sa, lnll_exps, 
exp_atom_bool(sql->sa, 1), cmp_equal ));
-               nnlls = rel_select( sql->sa, rel_dup(ins), 
+               nnlls = rel_select( sql->sa, rel_dup(ins),
                                exp_compare(sql->sa, rnll_exps, 
exp_atom_bool(sql->sa, 0), cmp_equal ));
                _nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls, 
NULL, 1, 1));
                /* add constant value for NULLS */
                e = exp_atom(sql->sa, atom_general(sql->sa, 
sql_bind_localtype("oid"), NULL));
-               exp_setname(sql->sa, e, i->t->base.name, iname);
+               exp_setname(sql->sa, e, alias, iname);
                append(_nlls->exps, e);
        } else {
                nnlls = ins;
@@ -219,7 +219,7 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
        nnlls = rel_project(sql->sa, nnlls, pexps);
        /* add row numbers */
        e = exp_column(sql->sa, rel_name(rt), TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1);
-       exp_setname(sql->sa, e, i->t->base.name, iname);
+       exp_setname(sql->sa, e, alias, iname);
        append(nnlls->exps, e);
 
        if (need_nulls) {
@@ -234,7 +234,7 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
 }
 
 static sql_rel *
-rel_insert_idxs(mvc *sql, sql_table *t, sql_rel *inserts)
+rel_insert_idxs(mvc *sql, sql_table *t, const char* alias, sql_rel *inserts)
 {
        sql_rel *p = inserts->r;
        node *n;
@@ -250,9 +250,9 @@ rel_insert_idxs(mvc *sql, sql_table *t, 
                if (ins->op == op_union) 
                        inserts->r = rel_project(sql->sa, ins, 
rel_projections(sql, ins, NULL, 0, 1));
                if (hash_index(i->type) || i->type == no_idx) {
-                       rel_insert_hash_idx(sql, i, inserts);
+                       rel_insert_hash_idx(sql, alias, i, inserts);
                } else if (i->type == join_idx) {
-                       rel_insert_join_idx(sql, i, inserts);
+                       rel_insert_join_idx(sql, alias, i, inserts);
                }
        }
        if (inserts->r != p) {
@@ -282,7 +282,7 @@ rel_insert(mvc *sql, sql_rel *t, sql_rel
        r->r = inserts;
        /* insert indices */
        if (tab) 
-               return rel_insert_idxs(sql, tab, r);
+               return rel_insert_idxs(sql, tab, rel_name(t), r);
        return r;
 }
 
@@ -396,7 +396,6 @@ rel_inserts(mvc *sql, sql_table *t, sql_
        return exps;
 }
 
-
 sql_table *
 insert_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname)
 {
@@ -673,7 +672,7 @@ is_idx_updated(sql_idx * i, list *exps)
 }
 
 static sql_rel *
-rel_update_hash_idx(mvc *sql, sql_idx *i, sql_rel *updates)
+rel_update_hash_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *updates)
 {
        char *iname = sa_strconcat( sql->sa, "%", i->base.name);
        node *m;
@@ -690,12 +689,12 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
                        sql_kc *c = m->data;
                        sql_exp *e;
 
-                       e = list_fetch(get_inserts(updates), c->c->colnr+1);
-                       
+                       e = list_fetch(get_inserts(updates), c->c->colnr+1);
+
                        if (h && i->type == hash_idx)  { 
                                list *exps = new_exp_list(sql->sa);
                                sql_subfunc *xor = 
sql_bind_func_result3(sql->sa, sql->session->schema, "rotate_xor_hash", lng, 
it, &c->c->type, lng);
-       
+
                                append(exps, h);
                                append(exps, exp_atom_int(sql->sa, bits));
                                append(exps, e);
@@ -705,7 +704,7 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
                                sql_subfunc *lsh = 
sql_bind_func_result(sql->sa, sql->session->schema, "left_shift", lng, it, lng);
                                sql_subfunc *lor = 
sql_bind_func_result(sql->sa, sql->session->schema, "bit_or", lng, lng, lng);
                                sql_subfunc *hf = sql_bind_func_result(sql->sa, 
sql->session->schema, "hash", &c->c->type, NULL, lng);
-       
+
                                h = exp_binop(sql->sa, h, exp_atom_int(sql->sa, 
bits), lsh); 
                                h2 = exp_unop(sql->sa, e, hf);
                                h = exp_binop(sql->sa, h, h2, lor);
@@ -719,11 +718,11 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
        }
        /* append hash to updates */
        append(get_inserts(updates), h);
-       exp_setname(sql->sa, h, i->t->base.name, iname);
+       exp_setname(sql->sa, h, alias, iname);
 
        if (!updates->exps)
                updates->exps = new_exp_list(sql->sa);
-       append(updates->exps, exp_column(sql->sa, i->t->base.name, iname, lng, 
CARD_MULTI, 0, 0));
+       append(updates->exps, exp_column(sql->sa, alias, iname, lng, 
CARD_MULTI, 0, 0));
        return updates;
 }
 
@@ -754,7 +753,7 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
             referenced column in R2.
 */
 static sql_rel *
-rel_update_join_idx(mvc *sql, sql_idx *i, sql_rel *updates)
+rel_update_join_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *updates)
 {
        int nr = ++sql->label;
        char name[16], *nme = number2name(name, 16, nr);
@@ -785,20 +784,19 @@ rel_update_join_idx(mvc *sql, sql_idx *i
                sql_exp *upd = list_fetch(get_inserts(updates), c->c->colnr + 
1), *lnl, *rnl, *je;
                sql_exp *rtc = exp_column(sql->sa, rel_name(rt), 
rc->c->base.name, &rc->c->type, CARD_MULTI, rc->c->null, 0);
 
-
                /* FOR MATCH FULL/SIMPLE/PARTIAL see above */
                /* Currently only the default MATCH SIMPLE is supported */
                upd = exp_column(sql->sa, exp_relname(upd), exp_name(upd), 
exp_subtype(upd), upd->card, has_nil(upd), is_intern(upd));
                lnl = exp_unop(sql->sa, upd, isnil);
                rnl = exp_unop(sql->sa, upd, isnil);
                if (need_nulls) {
-                   if (lnll_exps) {
-                       lnll_exps = exp_binop(sql->sa, lnll_exps, lnl, or);
-                       rnll_exps = exp_binop(sql->sa, rnll_exps, rnl, or);
-                   } else {
-                       lnll_exps = lnl;
-                       rnll_exps = rnl;
-                   }
+                       if (lnll_exps) {
+                               lnll_exps = exp_binop(sql->sa, lnll_exps, lnl, 
or);
+                               rnll_exps = exp_binop(sql->sa, rnll_exps, rnl, 
or);
+                       } else {
+                               lnll_exps = lnl;
+                               rnll_exps = rnl;
+                       }
                }
                if (rel_convert_types(sql, &rtc, &upd, 1, type_equal) < 0) {
                        list_destroy(join_exps);
@@ -808,14 +806,14 @@ rel_update_join_idx(mvc *sql, sql_idx *i
                append(join_exps, je);
        }
        if (need_nulls) {
-                       _nlls = rel_select( sql->sa, rel_dup(ups), 
+               _nlls = rel_select( sql->sa, rel_dup(ups),
                                exp_compare(sql->sa, lnll_exps, 
exp_atom_bool(sql->sa, 1), cmp_equal ));
-               nnlls = rel_select( sql->sa, rel_dup(ups), 
+               nnlls = rel_select( sql->sa, rel_dup(ups),
                                exp_compare(sql->sa, rnll_exps, 
exp_atom_bool(sql->sa, 0), cmp_equal ));
                _nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls, 
NULL, 1, 1));
                /* add constant value for NULLS */
                e = exp_atom(sql->sa, atom_general(sql->sa, 
sql_bind_localtype("oid"), NULL));
-               exp_setname(sql->sa, e, i->t->base.name, iname);
+               exp_setname(sql->sa, e, alias, iname);
                append(_nlls->exps, e);
        } else {
                nnlls = ups;
@@ -828,7 +826,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
        nnlls = rel_project(sql->sa, nnlls, pexps);
        /* add row numbers */
        e = exp_column(sql->sa, rel_name(rt), TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1);
-       exp_setname(sql->sa, e, i->t->base.name, iname);
+       exp_setname(sql->sa, e, alias, iname);
        append(nnlls->exps, e);
 
        if (need_nulls) {
@@ -841,7 +839,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
        }
        if (!updates->exps)
                updates->exps = new_exp_list(sql->sa);
-       append(updates->exps, exp_column(sql->sa, i->t->base.name, iname, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 0));
+       append(updates->exps, exp_column(sql->sa, alias, iname, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 0));
        return updates;
 }
 
@@ -849,7 +847,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
  * a DDL_LIST of update relations.
  */
 static sql_rel *
-rel_update_idxs(mvc *sql, sql_table *t, sql_rel *relup)
+rel_update_idxs(mvc *sql, const char *alias, sql_table *t, sql_rel *relup)
 {
        sql_rel *p = relup->r;
        node *n;
@@ -865,16 +863,16 @@ rel_update_idxs(mvc *sql, sql_table *t, 
                 */
                if (relup->exps && is_idx_updated(i, relup->exps) == 0) 
                        continue;
-                
+
                /* 
                 * relup->exps isn't set in case of alter statements!
                 * Ie todo check for new indices.
                 */
 
                if (hash_index(i->type) || i->type == no_idx) {
-                       rel_update_hash_idx(sql, i, relup);
+                       rel_update_hash_idx(sql, alias, i, relup);
                } else if (i->type == join_idx) {
-                       rel_update_join_idx(sql, i, relup);
+                       rel_update_join_idx(sql, alias, i, relup);
                }
        }
        if (relup->r != p) {
@@ -913,20 +911,22 @@ rel_update(mvc *sql, sql_rel *t, sql_rel
 {
        sql_rel *r = rel_create(sql->sa);
        sql_table *tab = get_table(t);
+       const char *alias = rel_name(t);
        node *m;
-       if(!r)
+
+       if (!r)
                return NULL;
 
        if (tab && updates)
-       for (m = tab->columns.set->h; m; m = m->next) {
-               sql_column *c = m->data;
-               sql_exp *v = updates[c->colnr];
+               for (m = tab->columns.set->h; m; m = m->next) {
+                       sql_column *c = m->data;
+                       sql_exp *v = updates[c->colnr];
 
-               if (tab->idxs.set && !v) 
-                       v = exp_column(sql->sa, tab->base.name, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
-               if (v)
-                       v = rel_project_add_exp(sql, uprel, v);
-       }
+                       if (tab->idxs.set && !v)
+                               v = exp_column(sql->sa, alias, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
+                       if (v)
+                               v = rel_project_add_exp(sql, uprel, v);
+               }
 
        r->op = op_update;
        r->l = t;
@@ -934,7 +934,7 @@ rel_update(mvc *sql, sql_rel *t, sql_rel
        r->exps = exps;
        /* update indices */
        if (tab)
-               return rel_update_idxs(sql, tab, r);
+               return rel_update_idxs(sql, alias, tab, r);
        return r;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to