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

Don't generate cartesian products on single row inserts


diffs (60 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
@@ -464,10 +464,7 @@ insert_generate_inserts(sql_query *query
 
        if (val_or_q->token == SQL_VALUES) {
                dlist *rowlist = val_or_q->data.lval;
-               dlist *values;
-               dnode *o;
                list *exps = new_exp_list(sql->sa);
-               sql_rel *inner = NULL;
 
                if (!rowlist->h) {
                        r = rel_project(sql->sa, NULL, NULL);
@@ -475,8 +472,8 @@ insert_generate_inserts(sql_query *query
                                collist = NULL;
                }
 
-               for (o = rowlist->h; o; o = o->next, rowcount++) {
-                       values = o->data.lval;
+               for (dnode *o = rowlist->h; o; o = o->next, rowcount++) {
+                       dlist *values = o->data.lval;
 
                        if (dlist_length(values) != list_length(collist)) {
                                return sql_error(sql, 02, SQLSTATE(21S01) "%s: 
number of values doesn't match number of columns of table '%s'", action, 
t->base.name);
@@ -499,8 +496,8 @@ insert_generate_inserts(sql_query *query
                                                sql_exp *vals = v->data;
                                                list *vals_list = vals->f;
                                                sql_column *c = m->data;
-                                               sql_rel *r = NULL;
                                                sql_exp *ins = 
insert_value(query, c, &r, n->data.sym, action);
+
                                                if (!ins)
                                                        return NULL;
                                                if (!exp_name(ins))
@@ -511,14 +508,10 @@ insert_generate_inserts(sql_query *query
                                        /* only allow correlation in a single 
row of values */
                                        for (n = values->h, m = collist->h; n 
&& m; n = n->next, m = m->next) {
                                                sql_column *c = m->data;
-                                               sql_rel *r = NULL;
                                                sql_exp *ins = 
insert_value(query, c, &r, n->data.sym, action);
+
                                                if (!ins)
                                                        return NULL;
-                                               if (r && inner)
-                                                       inner = 
rel_crossproduct(sql->sa, inner, r, op_join);
-                                               else if (r)
-                                                       inner = r;
                                                if (!exp_name(ins))
                                                        exp_label(sql->sa, ins, 
++sql->label);
                                                list_append(exps, ins);
@@ -527,7 +520,7 @@ insert_generate_inserts(sql_query *query
                        }
                }
                if (collist)
-                       r = rel_project(sql->sa, inner, exps);
+                       r = rel_project(sql->sa, r, exps);
        } else {
                exp_kind ek = {type_value, card_relation, TRUE};
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to