Changeset: 79619c1f070b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=79619c1f070b
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_updates.c
sql/test/BugTracker-2015/Tests/All
sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.sql
sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.stable.out
Branch: Oct2014
Log Message:
fixed bug 3662, ie multi value updates
diffs (134 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6507,7 +6507,7 @@ exp_rename_up(mvc *sql, sql_exp *e, list
break;
case e_aggr:
case e_func: {
- list *l = e->l, *nl = NULL;
+ list *l = e->l, *nl = NULL, *r = e->r, *nr = NULL;
if (!l) {
return e;
@@ -6516,10 +6516,19 @@ exp_rename_up(mvc *sql, sql_exp *e, list
if (!nl)
return NULL;
}
+ if (e->r) {
+ nr = exps_rename_up(sql, r, aliases);
+ if (!nr)
+ return NULL;
+ }
if (e->type == e_func)
ne = exp_op(sql->sa, nl, e->f);
else
ne = exp_aggr(sql->sa, nl, e->f, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
+ if (ne && nr) {
+ ne->card = CARD_AGGR;
+ ne->r = nr;
+ }
break;
}
case e_atom:
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
@@ -835,6 +835,7 @@ update_table(mvc *sql, dlist *qname, dli
sql_rel *r = NULL;
list *exps;
dnode *n;
+ char *rname = NULL;
if (t && !isTempTable(t) && STORE_READONLY)
return sql_error(sql, 02, "UPDATE: update table '%s'
not allowed in readonly mode", tname);
@@ -863,7 +864,7 @@ update_table(mvc *sql, dlist *qname, dli
}
/* first create the project */
- e = exp_column(sql->sa, rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
+ e = exp_column(sql->sa, rname = rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
exps = new_exp_list(sql->sa);
append(exps, e);
updates = table_update_array(sql, t);
@@ -890,7 +891,7 @@ update_table(mvc *sql, dlist *qname, dli
sql->session->status = status;
if (single) {
v = rel_value_exp(sql, &r, a,
sql_sel, ek);
- } else {
+ } else if (!rel_val) {
list *val_exps;
r = rel_subquery(sql, r, a, ek,
APPLY_JOIN);
val_exps = rel_projections(sql,
r->r, NULL, 0, 1);
@@ -903,9 +904,9 @@ update_table(mvc *sql, dlist *qname, dli
return NULL;
}
if (rel_val) {
- if (!exp_name(v))
- exp_label(sql->sa, v,
++sql->label);
if (single) {
+ if (!exp_name(v))
+ exp_label(sql->sa, v,
++sql->label);
rel_val = rel_project(sql->sa,
rel_val, rel_projections(sql, rel_val, NULL, 0, 1));
rel_project_add_exp(sql,
rel_val, v);
}
@@ -923,9 +924,9 @@ update_table(mvc *sql, dlist *qname, dli
if (!rel_val)
rel_val = r;
if (!rel_val || !is_project(rel_val->op) ||
- dlist_length(cols) >=
list_length(rel_val->exps)) {
+ dlist_length(cols) >
list_length(rel_val->exps)) {
rel_destroy(r);
- return NULL;
+ return sql_error(sql, 02, "UPDATE: too
many columns specified");
}
nr =
(list_length(rel_val->exps)-dlist_length(cols));
for(n=rel_val->exps->h; nr; nr--, n = n->next)
@@ -935,6 +936,8 @@ update_table(mvc *sql, dlist *qname, dli
sql_column *c = mvc_bind_column(sql, t,
cname);
sql_exp *v = n->data;
+ if (!exp_name(v))
+ exp_label(sql->sa, v,
++sql->label);
v = exp_column(sql->sa, exp_relname(v),
exp_name(v), exp_subtype(v), v->card, has_nil(v), is_intern(v));
if (!v) { /* check for NULL */
v = exp_atom(sql->sa,
atom_general(sql->sa, &c->type, NULL));
@@ -961,7 +964,7 @@ update_table(mvc *sql, dlist *qname, dli
updates[c->colnr] = v;
}
}
- e = exp_column(sql->sa, rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
+ e = exp_column(sql->sa, rname, TID, sql_bind_localtype("oid"),
CARD_MULTI, 0, 1);
r = rel_project(sql->sa, r, append(new_exp_list(sql->sa),e));
r = rel_update(sql, bt, r, updates, exps);
return r;
diff --git a/sql/test/BugTracker-2015/Tests/All
b/sql/test/BugTracker-2015/Tests/All
--- a/sql/test/BugTracker-2015/Tests/All
+++ b/sql/test/BugTracker-2015/Tests/All
@@ -5,3 +5,5 @@ prepare_unop_crash.Bug-3653
and_or_in.Bug-3655
acidity2-fail.Bug-3635
inet-ordering.Bug-3660
+row-value-constructor-crash.Bug-3662
+incorrect-ROW_NUMBER.Bug-3663
diff --git
a/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.sql
b/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.sql
--- a/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.sql
+++ b/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.sql
@@ -1,4 +1,6 @@
CREATE TABLE een (a INTEGER, b INTEGER, C integer);
+insert into een values (1,1,1);
UPDATE een SET (A,B,C) = (SELECT 2,2,2);
SELECT * FROM een;
+drop table een;
diff --git
a/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.stable.out
b/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.stable.out
---
a/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.stable.out
+++
b/sql/test/BugTracker-2015/Tests/row-value-constructor-crash.Bug-3662.stable.out
@@ -55,6 +55,8 @@ Ready.
# 00:52:33 >
#CREATE TABLE een (a INTEGER, b INTEGER, C integer);
+#insert into een values (1,1,1);
+[ 1 ]
#UPDATE een SET (A,B,C) = (SELECT 2,2,2);
[ 1 ]
#SELECT * FROM een;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list