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

Reply via email to