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