Changeset: 195fa9b092ae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=195fa9b092ae
Modified Files:
        sql/server/rel_updates.c
Branch: default
Log Message:

only create exp_values while inserting, when we realy have more than 1 row too 
insert.


diffs (113 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
@@ -325,45 +325,40 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                        }
                }
        }
-       for (i = 0; i < len; i++) {
-               if (!inserts[i]) {
-                       for (m = ol_first_node(t->columns); m; m = m->next) {
-                               sql_column *c = m->data;
+       for (m = ol_first_node(t->columns); m; m = m->next) {
+               sql_column *c = m->data;
+               sql_exp *exps = NULL;
 
-                               if (c->colnr == i) {
-                                       size_t j = 0;
-                                       sql_exp *exps = NULL;
-
-                                       for (j = 0; j < rowcount; j++) {
-                                               sql_exp *e = NULL;
+               if (!inserts[c->colnr]) {
+                       for (size_t j = 0; j < rowcount; j++) {
+                               sql_exp *e = NULL;
 
-                                               if (c->def) {
-                                                       e = rel_parse_val(sql, 
c->def, &c->type, sql->emode, NULL);
-                                                       if (!e || (e = 
exp_check_type(sql, &c->type, r, e, type_equal)) == NULL)
-                                                               return 
sql_error(sql, 02, SQLSTATE(HY005) "%s: default expression could not be 
evaluated", action);
-                                               } else {
-                                                       atom *a = 
atom_general(sql->sa, &c->type, NULL);
-                                                       e = exp_atom(sql->sa, 
a);
-                                               }
-                                               if (!e)
-                                                       return sql_error(sql, 
02, SQLSTATE(42000) "%s: column '%s' has no valid default value", action, 
c->base.name);
-                                               if (exps) {
-                                                       list *vals_list = 
exps->f;
+                               if (c->def) {
+                                       e = rel_parse_val(sql, c->def, 
&c->type, sql->emode, NULL);
+                                       if (!e || (e = exp_check_type(sql, 
&c->type, r, e, type_equal)) == NULL)
+                                               return sql_error(sql, 02, 
SQLSTATE(HY005) "%s: default expression could not be evaluated", action);
+                               } else {
+                                       atom *a = atom_general(sql->sa, 
&c->type, NULL);
+                                       e = exp_atom(sql->sa, a);
+                               }
+                               if (!e)
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' has no valid default value", action, 
c->base.name);
+                               if (!exps && j+1 < rowcount) {
+                                       exps = exp_values(sql->sa, 
sa_list(sql->sa));
+                                       exps->tpe = c->type;
+                                       exp_label(sql->sa, exps, ++sql->label);
+                               }
+                               if (exps) {
+                                       list *vals_list = exps->f;
 
-                                                       list_append(vals_list, 
e);
-                                               }
-                                               if (!exps && j+1 < rowcount) {
-                                                       exps = 
exp_values(sql->sa, sa_list(sql->sa));
-                                                       exps->tpe = c->type;
-                                                       exp_label(sql->sa, 
exps, ++sql->label);
-                                               }
-                                               if (!exps)
-                                                       exps = e;
-                                       }
-                                       inserts[i] = exps;
+                                       assert(rowcount > 1);
+                                       list_append(vals_list, e);
                                }
+                               if (!exps)
+                                       exps = e;
                        }
-                       assert(inserts[i]);
+                       inserts[c->colnr] = exps;
+                       assert(inserts[c->colnr]);
                }
        }
        /* now rewrite project exps in proper table order */
@@ -442,7 +437,7 @@ insert_generate_inserts(sql_query *query
 {
        mvc *sql = query->sql;
        sql_rel *r = NULL;
-       size_t rowcount = 1;
+       size_t rowcount = 0;
        list *collist = check_table_columns(sql, t, columns, action, 
t->base.name);
        if (!collist)
                return NULL;
@@ -457,6 +452,8 @@ insert_generate_inserts(sql_query *query
                                collist = NULL;
                }
 
+               if (!rowlist->h) /* no values insert 1 row */
+                       rowcount++;
                for (dnode *o = rowlist->h; o; o = o->next, rowcount++) {
                        dlist *values = o->data.lval;
 
@@ -510,6 +507,7 @@ insert_generate_inserts(sql_query *query
                exp_kind ek = {type_value, card_relation, TRUE};
 
                r = rel_subquery(query, NULL, val_or_q, ek);
+               rowcount++;
        }
        if (!r)
                return NULL;
@@ -577,7 +575,7 @@ merge_generate_inserts(sql_query *query,
                return sql_error(sql, 02, SQLSTATE(21S01) "MERGE: query result 
doesn't match number of columns in table '%s'", t->base.name);
 
        res->l = r;
-       res->exps = rel_inserts(sql, t, res, collist, 2, 0, "MERGE");
+       res->exps = rel_inserts(sql, t, res, collist, 1, 0, "MERGE");
        if(!res->exps)
                return NULL;
        return res;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to