Changeset: 02e10730db9e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=02e10730db9e
Modified Files:
clients/mapiclient/mhelp.c
gdk/gdk_utils.c
sql/server/rel_updates.c
sql/test/merge-statements/Tests/mergestmt01.stable.err
Branch: default
Log Message:
Merge with Apr2019 branch.
diffs (114 lines):
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -396,7 +396,7 @@ SQLhelp sqlhelp1[] = {
"See also
https://www.monetdb.org/Documentation/SQLreference/Permissions"},
{"MERGE",
"",
- "[ WITH with_list ] MERGE INTO qname [ [AS] ident ] USING table_ref ON
search_condition merge_list",
+ "[ WITH with_list ] MERGE INTO qname [ [AS] ident ] USING table_ref [
[AS] ident ] ON search_condition merge_list",
"with_list,table_ref,search_condition,merge_list",
NULL},
{"RELEASE SAVEPOINT",
@@ -678,7 +678,7 @@ SQLhelp sqlhelp2[] = {
NULL},
{"merge_list",
NULL,
- "merge_clause [ ',' ... ]",
+ "merge_clause [ ... ]",
"merge_clause",
NULL},
{"nrofrecords",
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -257,7 +257,7 @@ static void
BATSIGabort(int nr)
{
(void) nr;
- GDKexit(3); /* emulate Windows exit code without pop-up */
+ _Exit(3); /* emulate Windows exit code without pop-up */
}
#endif
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
@@ -1374,7 +1374,8 @@ truncate_table(mvc *sql, dlist *qname, i
extern sql_rel *rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r);
static sql_rel *
-validate_merge_update_delete(mvc *sql, sql_table *t, sql_rel *upd_del, sql_rel
*bt, sql_rel *join_rel)
+validate_merge_update_delete(mvc *sql, sql_table *t, str alias, sql_rel
*joined_table, tokens upd_token,
+ sql_rel *upd_del,
sql_rel *bt, sql_rel *join_rel)
{
char buf[BUFSIZ];
sql_exp *aggr, *bigger, *ex;
@@ -1382,6 +1383,9 @@ validate_merge_update_delete(mvc *sql, s
sql_subfunc *bf;
list *exps = new_exp_list(sql->sa);
sql_rel *groupby, *res;
+ const char *join_rel_name = rel_name(joined_table);
+
+ assert(upd_token == SQL_UPDATE || upd_token == SQL_DELETE);
groupby = rel_groupby(sql, rel_dup(join_rel), NULL); //aggregate by all
column and count (distinct values)
groupby->r = rel_projections(sql, bt, NULL, 1, 0);
@@ -1404,7 +1408,11 @@ validate_merge_update_delete(mvc *sql, s
exp_label(sql->sa, aggr, ++sql->label); //count all of them, if there
is at least one, throw the exception
ex = exp_column(sql->sa, exp_relname(aggr), exp_name(aggr),
exp_subtype(aggr), aggr->card, has_nil(aggr), is_intern(aggr));
- snprintf(buf, BUFSIZ, "MERGE: There are rows in '%s.%s' with multiple
matches on source relation", t->s->base.name, t->base.name);
+ snprintf(buf, BUFSIZ, "MERGE %s: Multiple rows in the input
relation%s%s%s match the same row in the target %s '%s%s%s'",
+ (upd_token == SQL_DELETE) ? "DELETE" : "UPDATE",
+ join_rel_name ? " '" : "", join_rel_name ?
join_rel_name : "", join_rel_name ? "'" : "",
+ alias ? "relation" : "table",
+ alias ? alias : t->s->base.name, alias ? "" : ".",
alias ? "" : t->base.name);
ex = exp_exception(sql->sa, ex, buf);
res = rel_exception(sql->sa, groupby, NULL,
list_append(new_exp_list(sql->sa), ex));
@@ -1457,7 +1465,7 @@ merge_into_table(mvc *sql, dlist *qname,
for(dnode *m = merge_list->h; m; m = m->next) {
symbol *sym = m->data.sym, *opt_search, *action;
- int token = sym->token;
+ tokens token = sym->token;
dlist* dl = sym->data.lval, *sts;
opt_search = dl->h->data.sym;
action = dl->h->next->data.sym;
@@ -1467,7 +1475,7 @@ merge_into_table(mvc *sql, dlist *qname,
return sql_error(sql, 02, SQLSTATE(42000) "MERGE:
search condition not yet supported");
if(token == SQL_MERGE_MATCH) {
- int uptdel = action->token;
+ tokens uptdel = action->token;
sql_exp *e;
if((processed & MERGE_UPDATE_DELETE) ==
MERGE_UPDATE_DELETE)
@@ -1511,7 +1519,7 @@ merge_into_table(mvc *sql, dlist *qname,
} else {
assert(0);
}
- if(!upd_del || !(upd_del =
validate_merge_update_delete(sql, t, upd_del, bt, join_rel)))
+ if(!upd_del || !(upd_del =
validate_merge_update_delete(sql, t, alias, joined, uptdel, upd_del, bt,
join_rel)))
return NULL;
} else if(token == SQL_MERGE_NO_MATCH) {
if((processed & MERGE_INSERT) == MERGE_INSERT)
diff --git a/sql/test/merge-statements/Tests/mergestmt01.stable.err
b/sql/test/merge-statements/Tests/mergestmt01.stable.err
--- a/sql/test/merge-statements/Tests/mergestmt01.stable.err
+++ b/sql/test/merge-statements/Tests/mergestmt01.stable.err
@@ -31,12 +31,12 @@ stderr of test 'mergestmt01` in director
MAPI = (monetdb) /var/tmp/mtest-13603/.s.monetdb.37525
QUERY = merge into predata using (select aa, bb from merging) as sub on
predata.bb = sub.bb
when matched then update set aa = sub.aa; --error, each target
row must match one and only one source row
-ERROR = !MERGE: There are rows in 'sys.predata' with multiple matches on
source relation
+ERROR = !MERGE UPDATE: Multiple rows in the input relation 'sub' match the
same row in the target table 'sys.predata'
CODE = M0M29
MAPI = (monetdb) /var/tmp/mtest-13603/.s.monetdb.37525
QUERY = merge into predata using (select aa, bb from merging) as sub on
predata.bb = sub.bb
when matched then delete; --error, each target row must match
one and only one source row
-ERROR = !MERGE: There are rows in 'sys.predata' with multiple matches on
source relation
+ERROR = !MERGE DELETE: Multiple rows in the input relation 'sub' match the
same row in the target table 'sys.predata'
CODE = M0M29
MAPI = (monetdb) /var/tmp/mtest-13603/.s.monetdb.37525
QUERY = merge into predata othertt using (select aa, bb from merging) as sub
on othertt.bb = sub.bb
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list