Changeset: 6d0218a8b66d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6d0218a8b66d
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/test/pg_regress/Tests/alter_table.stable.err
Branch: linear-hashing
Log Message:

Merged with Nov2019


diffs (truncated from 332 to 300 lines):

diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -34,11 +34,12 @@ rel_generate_anti_expression(mvc *sql, s
                *anti_rel = rel_project(sql->sa, *anti_rel, NULL);
                if(!(res = rel_parse_val(sql, sa_message(sql->sa, "select %s;", 
mt->part.pexp->exp), sql->emode, (*anti_rel)->l)))
                        return NULL;
-               exp_label(sql->sa, res, ++sql->label);
        } else {
                assert(0);
        }
        (*anti_rel)->exps = new_exp_list(sql->sa);
+       if (!exp_name(res))
+               exp_label(sql->sa, res, ++sql->label);
        append((*anti_rel)->exps, res);
        res = exp_ref(sql->sa, res);
        return res;
@@ -58,9 +59,11 @@ rel_create_common_relation(mvc *sql, sql
                inserts = ((sql_rel*)(rel->r))->l;
                for (node *n = t->columns.set->h, *m = inserts->exps->h; n && 
m; n = n->next, m = m->next) {
                        sql_column *col = n->data;
-                       sql_exp *before = m->data;
-                       sql_exp *help = exp_ref(sql->sa, before);
+                       sql_exp *before = m->data, *help;
 
+                       if (!exp_name(before))
+                               exp_label(sql->sa, before, ++sql->label);
+                       help = exp_ref(sql->sa, before);
                        exp_setname(sql->sa, help, t->base.name, 
col->base.name);
                        list_append(l, help);
                }
@@ -86,9 +89,11 @@ rel_generate_anti_insert_expression(mvc 
                        inserts = inserts->l;
                for (node *n = t->columns.set->h, *m = inserts->exps->h; n && 
m; n = n->next, m = m->next) {
                        sql_column *col = n->data;
-                       sql_exp *before = m->data;
-                       sql_exp *help = exp_ref(sql->sa, before);
+                       sql_exp *before = m->data, *help;
 
+                       if (!exp_name(before))
+                               exp_label(sql->sa, before, ++sql->label);
+                       help = exp_ref(sql->sa, before);
                        exp_setname(sql->sa, help, t->base.name, 
col->base.name);
                        list_append(l, help);
                }
@@ -106,6 +111,8 @@ rel_generate_anti_insert_expression(mvc 
        } else {
                assert(0);
        }
+       if (!exp_name(res))
+               exp_label(sql->sa, res, ++sql->label);
        res = exp_ref(sql->sa, res);
        return res;
 }
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -100,7 +100,9 @@ psm_set_exp(sql_query *query, dnode *n)
 
                if (!rel_val)
                        return NULL;
-               if (!is_project(rel_val->op) || dlist_length(vars) != 
list_length(rel_val->exps))
+               if (!is_project(rel_val->op))
+                       return sql_error(sql, 02, SQLSTATE(42000) "SET: The 
subquery is not a projection");
+               if (dlist_length(vars) != list_length(rel_val->exps))
                        return sql_error(sql, 02, SQLSTATE(42000) "SET: Number 
of variables not equal to number of supplied values");
 
                b = sa_list(sql->sa);
@@ -475,6 +477,8 @@ rel_psm_return( sql_query *query, sql_su
                        oexps_rel = l;
                        oexps = l->exps;
                }
+               if (list_length(oexps) != list_length(restypelist))
+                       return sql_error(sql, 02, SQLSTATE(42000) "RETURN: 
number of columns do not match");
                for (n = oexps->h, m = restypelist->h; n && m; n = n->next, m = 
m->next) {
                        sql_exp *e = n->data;
                        sql_arg *ce = m->data;
@@ -483,8 +487,11 @@ rel_psm_return( sql_query *query, sql_su
 
                        if (!cname)
                                cname = sa_strdup(sql->sa, number2name(name, 
sizeof(name), ++sql->label));
-                       if (!isproject) 
+                       if (!isproject) {
+                               if (!exp_name(e))
+                                       exp_label(sql->sa, e, ++sql->label);
                                e = exp_ref(sql->sa, e);
+                       }
                        e = rel_check_type(sql, &ce->type, oexps_rel, e, 
type_equal);
                        if (!e)
                                return NULL;
@@ -540,6 +547,10 @@ rel_select_into( sql_query *query, symbo
        r = rel_subquery(query, NULL, sq, ek);
        if (!r) 
                return NULL;
+       if (!is_project(r->op))
+               return sql_error(sql, 02, SQLSTATE(42000) "SELECT INTO: The 
subquery is not a projection");
+       if (list_length(r->exps) != dlist_length(into))
+               return sql_error(sql, 02, SQLSTATE(21S01) "SELECT INTO: number 
of values doesn't match number of variables to set");
        nl = sa_list(sql->sa);
        append(nl, exp_rel(sql, r));
        for (m = r->exps->h, n = into->h; m && n; m = m->next, n = n->next) {
@@ -1322,7 +1333,8 @@ create_trigger(sql_query *query, dlist *
                if (old_name)
                        stack_update_rel_view(sql, old_name, 
new_name?rel_dup(rel):rel);
        }
-       sq = sequential_block(query, NULL, NULL, stmts, NULL, 1);
+       if (!(sq = sequential_block(query, NULL, NULL, stmts, NULL, 1)))
+               return NULL;
        r = rel_psm_block(sql->sa, sq);
 
        if (!instantiate)
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
@@ -4340,6 +4340,8 @@ rel_order_by(sql_query *query, sql_rel *
                                                e = exps_get_exp(rel->exps, nr);
                                                if (!e)
                                                        return sql_error(sql, 
02, SQLSTATE(42000) "SELECT: the order by column number (%d) is not in the 
number of projections range (%d)", nr, list_length(rel->exps));
+                                               if (!exp_name(e))
+                                                       exp_label(sql->sa, e, 
++sql->label);
                                                e = exp_ref(sql->sa, e);
                                                /* do not cache this query */
                                                if (e)
@@ -5038,7 +5040,7 @@ rel_value_exp2(sql_query *query, sql_rel
 
                        if (!exp_name(exp))
                                exp_label(sql->sa, exp, ++sql->label);
-                       res  = exp_ref(sql->sa, exp);
+                       res = exp_ref(sql->sa, exp);
                        res->card = (*rel)->card;
                        if (se->token == SQL_AGGR) {
                                dlist *l = se->data.lval;
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
@@ -316,7 +316,9 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                        for (n = r->exps->h, m = collist->h; n && m; n = 
n->next, m = m->next) {
                                sql_column *c = m->data;
                                sql_exp *e = n->data;
-               
+
+                               if (inserts[c->colnr])
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' specified more than once", action, 
c->base.name);
                                inserts[c->colnr] = rel_check_type(sql, 
&c->type, r, e, type_equal);
                        }
                } else {
@@ -325,8 +327,11 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                                sql_exp *e;
 
                                e = exps_bind_column2( r->exps, 
c->t->base.name, c->base.name);
-                               if (e)
+                               if (e) {
+                                       if (inserts[c->colnr])
+                                               return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' specified more than once", action, 
c->base.name);
                                        inserts[c->colnr] = exp_ref(sql->sa, e);
+                               }
                        }
                }
        }
@@ -915,16 +920,10 @@ rel_update(mvc *sql, sql_rel *t, sql_rel
 static sql_exp *
 update_check_column(mvc *sql, sql_table *t, sql_column *c, sql_exp *v, sql_rel 
*r, char *cname, const char *action)
 {
-       if (!c) {
-               rel_destroy(r);
-               return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column 
'%s.%s'", action, t->base.name, cname);
-       }
        if (!table_privs(sql, t, PRIV_UPDATE) && !sql_privilege(sql, 
sql->user_id, c->base.id, PRIV_UPDATE)) 
                return sql_error(sql, 02, SQLSTATE(42000) "%s: insufficient 
privileges for user '%s' to update table '%s' on column '%s'", action, 
stack_get_string(sql, "current_user"), t->base.name, cname);
-       if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == 
NULL) {
-               rel_destroy(r);
+       if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == NULL)
                return NULL;
-       }
        return v;
 }
 
@@ -933,7 +932,7 @@ update_generate_assignments(sql_query *q
 {
        mvc *sql = query->sql;
        sql_table *mt = NULL;
-       sql_exp *e = NULL, **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, 
list_length(t->columns.set));
+       sql_exp **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, 
list_length(t->columns.set));
        list *exps, *pcols = NULL;
        dnode *n;
        const char *rname = NULL;
@@ -952,9 +951,7 @@ update_generate_assignments(sql_query *q
                pcols = mt->part.pexp->cols;
        }
        /* first create the project */
-       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);
+       exps = list_append(new_exp_list(sql->sa), exp_column(sql->sa, rname = 
rel_name(r), TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
 
        for (n = assignmentlist->h; n; n = n->next) {
                symbol *a = NULL;
@@ -972,6 +969,9 @@ update_generate_assignments(sql_query *q
                        if (single && a->token == SQL_DEFAULT) {
                                char *colname = assignment->h->next->data.sval;
                                sql_column *col = mvc_bind_column(sql, t, 
colname);
+
+                               if (!col)
+                                       return sql_error(sql, 02, 
SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, colname);
                                if (col->def) {
                                        char *typestr = 
subtype2string2(&col->type);
                                        if (!typestr)
@@ -1033,23 +1033,22 @@ update_generate_assignments(sql_query *q
                        dlist *cols = assignment->h->next->data.lval;
                        dnode *m;
                        node *n;
-                       int nr;
 
                        if (!rel_val)
                                rel_val = r;
-                       if (!rel_val || !is_project(rel_val->op) ||
-                               dlist_length(cols) > 
list_length(rel_val->exps)) {
-                               rel_destroy(r);
-                               return sql_error(sql, 02, SQLSTATE(42000) "%s: 
too many columns specified", action);
-                       }
-                       nr = (list_length(rel_val->exps)-dlist_length(cols));
-                       for (n=rel_val->exps->h; nr; nr--, n = n->next)
-                               ;
-                       for (m = cols->h; n && m; n = n->next, m = m->next) {
+                       if (!rel_val || !is_project(rel_val->op))
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s: 
Invalid right side of the SET clause", action);
+                       if (dlist_length(cols) != list_length(rel_val->exps))
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s: 
The number of specified columns between the SET clause and the right side don't 
match (%d != %d)", action, dlist_length(cols), list_length(rel_val->exps));
+                       for (n = rel_val->exps->h, m = cols->h; n && m; n = 
n->next, m = m->next) {
                                char *cname = m->data.sval;
                                sql_column *c = mvc_bind_column(sql, t, cname);
                                sql_exp *v = n->data;
 
+                               if (!c)
+                                       return sql_error(sql, 02, 
SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname);
+                               if (updates[c->colnr])
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: Multiple assignments to same column '%s'", action, 
c->base.name);
                                if (mt && pcols) {
                                        for (node *nn = pcols->h; nn; nn = 
n->next) {
                                                int next = *(int*) nn->data;
@@ -1066,13 +1065,11 @@ update_generate_assignments(sql_query *q
                                        exp_label(sql->sa, v, ++sql->label);
                                if (!exp_is_atom(v) || outer)
                                        v = exp_ref(sql->sa, v);
-                               if (!v) { /* check for NULL */
+                               if (!v) /* check for NULL */
                                        v = exp_atom(sql->sa, 
atom_general(sql->sa, &c->type, NULL));
-                               } else if ((v = update_check_column(sql, t, c, 
v, r, cname, action)) == NULL) {
+                               if (!(v = update_check_column(sql, t, c, v, r, 
cname, action)))
                                        return NULL;
-                               }
                                list_append(exps, exp_column(sql->sa, 
t->base.name, cname, &c->type, CARD_MULTI, 0, 0));
-                               assert(!updates[c->colnr]);
                                exp_setname(sql->sa, v, c->t->base.name, 
c->base.name);
                                updates[c->colnr] = v;
                        }
@@ -1080,6 +1077,10 @@ update_generate_assignments(sql_query *q
                        char *cname = assignment->h->next->data.sval;
                        sql_column *c = mvc_bind_column(sql, t, cname);
 
+                       if (!c)
+                               return sql_error(sql, 02, SQLSTATE(42S22) "%s: 
no such column '%s.%s'", action, t->base.name, cname);
+                       if (updates[c->colnr])
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s: 
Multiple assignments to same column '%s'", action, c->base.name);
                        if (mt && pcols) {
                                for (node *nn = pcols->h; nn; nn = nn->next) {
                                        int next = *(int*) nn->data;
@@ -1092,18 +1093,16 @@ update_generate_assignments(sql_query *q
                                        }
                                }
                        }
-                       if (!v) {
+                       if (!v)
                                v = exp_atom(sql->sa, atom_general(sql->sa, 
&c->type, NULL));
-                       } else if ((v = update_check_column(sql, t, c, v, r, 
cname, action)) == NULL) {
+                       if (!(v = update_check_column(sql, t, c, v, r, cname, 
action)))
                                return NULL;
-                       }
                        list_append(exps, exp_column(sql->sa, t->base.name, 
cname, &c->type, CARD_MULTI, 0, 0));
                        exp_setname(sql->sa, v, c->t->base.name, c->base.name);
                        updates[c->colnr] = v;
                }
        }
-       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_project(sql->sa, r, list_append(new_exp_list(sql->sa), 
exp_column(sql->sa, rname, TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1)));
        r = rel_update(sql, bt, r, updates, exps);
        return r;
 }
@@ -1443,6 +1442,8 @@ merge_into_table(sql_query *query, dlist
 
                                //select bt values which are not null (they had 
a match in the join)
                                project_first = 
extra_project->exps->h->next->data; // this expression must come from bt!!
+                               if (!exp_name(project_first))
+                                       exp_label(sql->sa, project_first, 
++sql->label);
                                project_first = exp_ref(sql->sa, project_first);
                                nils = rel_unop_(sql, extra_project, 
project_first, NULL, "isnull", card_value);
                                set_has_no_nil(nils);
@@ -1472,6 +1473,8 @@ merge_into_table(sql_query *query, dlist
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to