Changeset: 8b64c17db04d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8b64c17db04d
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/rel_updates.c
Branch: default
Log Message:

we need a full relabel on inserts with indices, solves a
problem with key checking/index inserts


diffs (106 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
@@ -7118,7 +7118,7 @@ rel_apply_rewrite(int *changes, mvc *sql
                rel->l = nrel;
                ident = exp_column(sql->sa, exp_relname(ident), 
exp_name(ident), exp_subtype(ident), ident->card, has_nil(ident), 
is_intern(ident));
 
-               rel = rel_label(sql, rel);
+               rel = rel_label(sql, rel, 0);
 
                /* look up the identity columns and label these */
                le = rel_bind_column(sql, rel, ident->name, 0);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -126,12 +126,13 @@ rel_name( sql_rel *r )
 }
 
 sql_rel *
-rel_label( mvc *sql, sql_rel *r)
+rel_label( mvc *sql, sql_rel *r, int all)
 {
        int nr = ++sql->label;
-       char name[16], *nme;
-
-       nme = number2name(name, 16, nr);
+       char tname[16], *tnme;
+       char cname[16], *cnme = NULL;
+
+       tnme = number2name(tname, 16, nr);
        if (!is_project(r->op)) {
                r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
1));
                set_processed(r);
@@ -139,16 +140,26 @@ rel_label( mvc *sql, sql_rel *r)
        if (is_project(r->op) && r->exps) {
                node *ne = r->exps->h;
 
-               for (; ne; ne = ne->next)
-                       exp_setname(sql->sa, ne->data, nme, NULL );
+               for (; ne; ne = ne->next) {
+                       if (all) {
+                               nr = ++sql->label;
+                               cnme = number2name(cname, 16, nr);
+                       }
+                       exp_setname(sql->sa, ne->data, tnme, cnme );
+               }
        }
        /* op_projects can have a order by list */
        if (r->op == op_project && r->r) {
                list *exps = r->r;
                node *ne = exps->h;
 
-               for (; ne; ne = ne->next)
-                       exp_setname(sql->sa, ne->data, nme, NULL );
+               for (; ne; ne = ne->next) {
+                       if (all) {
+                               nr = ++sql->label;
+                               cnme = number2name(cname, 16, nr);
+                       }
+                       exp_setname(sql->sa, ne->data, tnme, cnme );
+               }
        }
        return r;
 }
@@ -2846,7 +2857,7 @@ rel_logical_value_exp(mvc *sql, sql_rel 
                                right = rl;
                        }
                        if (right->processed)
-                               right = rel_label(sql, right);
+                               right = rel_label(sql, right, 0);
                        right = rel_distinct(right);
                } else {
                        return sql_error(sql, 02, "IN: missing inner query");
@@ -3293,7 +3304,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                        }
                        if (!correlated) {
                                if (right->processed)
-                                       right = rel_label(sql, right);
+                                       right = rel_label(sql, right, 0);
                                /*
                                right = rel_distinct(right);
                                */
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -26,7 +26,7 @@ extern sql_rel * rel_project(sql_allocat
 extern sql_rel * rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel 
*l, list *e);
 extern void rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e);
 extern list * rel_projections(mvc *sql, sql_rel *rel, char *tname, int 
settname , int intern);
-extern sql_rel * rel_label( mvc *sql, sql_rel *r);
+extern sql_rel * rel_label( mvc *sql, sql_rel *r, int all);
 extern sql_exp *rel_column_exp(mvc *sql, sql_rel **rel, symbol *column_e, int 
f);
 
 extern void rel_add_intern(mvc *sql, sql_rel *rel);
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
@@ -233,7 +233,7 @@ rel_insert_idxs(mvc *sql, sql_table *t, 
        if (!t->idxs.set)
                return inserts;
 
-       inserts->r = rel_label(sql, inserts->r); 
+       inserts->r = rel_label(sql, inserts->r, 1); 
        for (n = t->idxs.set->h; n; n = n->next) {
                sql_idx *i = n->data;
                sql_rel *ins = inserts->r;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to