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