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

Reply via email to