Changeset: a6ec321350ba for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a6ec321350ba Added Files: sql/test/merge-statements/Tests/All sql/test/merge-statements/Tests/mergestmt00.sql sql/test/merge-statements/Tests/mergestmt00.stable.err sql/test/merge-statements/Tests/mergestmt00.stable.out sql/test/merge-statements/Tests/mergestmt01.sql sql/test/merge-statements/Tests/mergestmt01.stable.err sql/test/merge-statements/Tests/mergestmt01.stable.out sql/test/merge-statements/Tests/mergestmt02.sql sql/test/merge-statements/Tests/mergestmt02.stable.err sql/test/merge-statements/Tests/mergestmt02.stable.out sql/test/merge-statements/Tests/mergestmt03.sql sql/test/merge-statements/Tests/mergestmt03.stable.err sql/test/merge-statements/Tests/mergestmt03.stable.out sql/test/miscellaneous/Tests/update_delete_aliases.sql sql/test/miscellaneous/Tests/update_delete_aliases.stable.err sql/test/miscellaneous/Tests/update_delete_aliases.stable.out sql/test/rename/Tests/rename07.sql sql/test/rename/Tests/rename07.stable.err sql/test/rename/Tests/rename07.stable.out sql/test/rename/Tests/rename08.sql sql/test/rename/Tests/rename08.stable.err sql/test/rename/Tests/rename08.stable.out Modified Files: clients/mapiclient/mhelp.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_cat.c sql/server/rel_psm.c sql/server/rel_schema.c sql/server/rel_semantic.c sql/server/rel_updates.c sql/server/sql_parser.h sql/server/sql_parser.y sql/server/sql_scan.c sql/server/sql_tokens.h sql/test/miscellaneous/Tests/All sql/test/rename/Tests/All sql/test/rename/Tests/rename05.stable.err Branch: default Log Message:
Merged merge-statements into default. diffs (truncated from 2950 to 300 lines): diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c --- a/clients/mapiclient/mhelp.c +++ b/clients/mapiclient/mhelp.c @@ -41,7 +41,7 @@ typedef struct { const char *comments; } SQLhelp; -#define NUMBER_MAJOR_COMMANDS 75 // The number of major commands to show in case of no query +#define NUMBER_MAJOR_COMMANDS 76 // The number of major commands to show in case of no query SQLhelp sqlhelp[] = { // major commands @@ -56,7 +56,8 @@ SQLhelp sqlhelp[] = { "ALTER TABLE [ IF EXISTS ] qname DROP [ COLUMN ] ident [ RESTRICT | CASCADE ]\n" "ALTER TABLE [ IF EXISTS ] qname DROP CONSTRAINT ident [ RESTRICT | CASCADE ]\n" "ALTER TABLE [ IF EXISTS ] qname SET { { READ | INSERT } ONLY | READ WRITE }\n" - "ALTER TABLE [ IF EXISTS ] qname RENAME TO ident", + "ALTER TABLE [ IF EXISTS ] qname RENAME TO ident\n" + "ALTER TABLE [ IF EXISTS ] qname SET SCHEMA ident", "column_def,table_constraint", "See also https://www.monetdb.org/Documentation/SQLreference/Alter"}, {"ALTER MERGE TABLE", @@ -275,7 +276,7 @@ SQLhelp sqlhelp[] = { NULL}, {"DELETE", "", - "[ WITH with_list ] DELETE FROM qname [ WHERE search_condition ]", + "[ WITH with_list ] DELETE FROM qname [ [AS] ident ] [ WHERE search_condition ]", "with_list,search_condition", NULL}, {"DROP AGGREGATE", @@ -356,7 +357,7 @@ SQLhelp sqlhelp[] = { "See also https://www.monetdb.org/Documentation/SQLreference/Flowofcontrol"}, {"INSERT", "", - "[ WITH with_list ] INSERT INTO qname [ column_list ] { DEFAULT VALUES | VALUES row_values | query_expression }", + "[ WITH with_list ] INSERT INTO qname [ column_list ] [ { DEFAULT VALUES | VALUES row_values | query_expression } ]", "with_list,column_list,row_values,query_expression", "See also https://www.monetdb.org/Documentation/SQLreference/Updates"}, {"GRANT", @@ -365,6 +366,11 @@ SQLhelp sqlhelp[] = { "GRANT role [',' ...] TO grantee [',' ...] [ WITH ADMIN OPTION]", "privileges,role,grantee", "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_list,table_ref,search_condition,merge_list", + NULL}, {"RELEASE SAVEPOINT", "", "RELEASE SAVEPOINT ident", @@ -479,7 +485,7 @@ SQLhelp sqlhelp[] = { NULL}, {"UPDATE", "", - "[ WITH with_list ] UPDATE qname SET assignment_list [ WHERE search_condition ]", + "[ WITH with_list ] UPDATE qname [ [AS] ident ] SET assignment_list [ WHERE search_condition ]", "with_list,assignment_list,search_condition", NULL}, {"WHILE", @@ -623,6 +629,17 @@ SQLhelp sqlhelp[] = { "READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE ", NULL, NULL}, + {"merge_clause", + NULL, + "{ WHEN MATCHED [ AND search_condition ] THEN { UPDATE SET assignment_list | DELETE } } |\n" + "{ WHEN NOT MATCHED [ AND search_condition ] THEN INSERT [ column_list ] [ { DEFAULT VALUES | VALUES row_values } ] }", + "search_condition,assignment_list,column_list,row_values", + NULL}, + {"merge_list", + NULL, + "merge_clause [ ',' ... ]", + "merge_clause", + NULL}, {"nrofrecords", "", "OFFSET integer | integer RECORDS | integer OFFSET integer RECORDS | integer RECORDS OFFSET integer", @@ -774,8 +791,8 @@ SQLhelp sqlhelp[] = { NULL}, {"update_statement", NULL, - "delete_stmt | truncate_stmt | insert_stmt | update_stmt | copyfrom_stmt", - "delete_stmt | truncate_stmt | insert_stmt | update_stmt | copyfrom_stmt", + "delete_stmt | truncate_stmt | insert_stmt | update_stmt | merge_stmt | copyfrom_stmt", + "delete_stmt,truncate_stmt,insert_stmt,update_stmt,merge_stmt,copyfrom_stmt", NULL}, {"triggered_action", NULL, diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -3502,7 +3502,7 @@ rel2bin_insert(backend *be, sql_rel *rel pin = refs_find_rel(refs, prel); if (constraint && !be->first_statement_generated) - sql_insert_check_null(be, be->cur_append? t->p : t, inserts->op4.lval); + sql_insert_check_null(be, (be->cur_append && t->p) ? t->p : t, inserts->op4.lval); l = sa_list(sql->sa); @@ -4417,7 +4417,7 @@ sql_update(backend *be, sql_table *t, st node *n; if (!be->first_statement_generated) - sql_update_check_null(be, be->cur_append? t->p : t, updates); + sql_update_check_null(be, (be->cur_append && t->p) ? t->p : t, updates); /* check keys + get idx */ idx_updates = update_idxs_and_check_keys(be, t, rows, updates, l, NULL); @@ -4512,7 +4512,7 @@ rel2bin_update(backend *be, sql_rel *rel updates[c->colnr] = bin_find_column(be, update, ce->l, ce->r); } if (!be->first_statement_generated) - sql_update_check_null(be, be->cur_append? t->p : t, updates); + sql_update_check_null(be, (be->cur_append && t->p) ? t->p : t, updates); /* check keys + get idx */ updcol = first_updated_col(updates, list_length(t->columns.set)); @@ -4749,7 +4749,7 @@ sql_delete(backend *be, sql_table *t, st if(be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_delete_triggers(be, up, v, 0, 1, 3)) - return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: triggers failed for table '%s'", up->base.name); + return sql_error(sql, 02, SQLSTATE(42000) "DELETE: triggers failed for table '%s'", up->base.name); } } if (!sql_delete_triggers(be, t, v, 0, 1, 3)) @@ -5067,6 +5067,10 @@ rel2bin_list(backend *be, sql_rel *rel, list *slist = sa_list(sql->sa); (void)refs; + + if(find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create affected rows accumulator */ + create_merge_partitions_accumulator(be); + if (rel->l) /* first construct the sub relation */ l = subrel_bin(be, rel->l, refs); if (rel->r) /* first construct the sub relation */ diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -1611,7 +1611,7 @@ SQLrename_table(Client cntxt, MalBlkPtr if (t->system) throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: cannot rename a system table"); if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL)) - throw (SQL,"sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to rename table %s (there are database objects which depend on it)", old_name); + throw (SQL,"sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to rename table '%s' (there are database objects which depend on it)", old_name); if (!new_name || strcmp(new_name, str_nil) == 0 || *new_name == '\0') throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: invalid new table name"); if (mvc_bind_table(sql, s, new_name)) 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 @@ -666,7 +666,8 @@ sequential_block (mvc *sql, sql_subtype case SQL_INSERT: case SQL_UPDATE: case SQL_DELETE: - case SQL_TRUNCATE: { + case SQL_TRUNCATE: + case SQL_MERGE: { sql_rel *r = rel_updates(sql, s); if (!r) return NULL; diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -2515,7 +2515,7 @@ rel_rename_table(mvc *sql, char* schema_ if (t->system) return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: cannot rename a system table"); if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL)) - return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER TABLE: unable to rename table %s (there are database objects which depend on it)", old_name); + return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER TABLE: unable to rename table '%s' (there are database objects which depend on it)", old_name); if (!new_name || strcmp(new_name, str_nil) == 0 || *new_name == '\0') return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE: invalid new table name"); if (mvc_bind_table(sql, s, new_name)) @@ -2580,6 +2580,77 @@ rel_rename_column(mvc *sql, char* schema return rel; } +extern list *rel_dependencies(mvc *sql, sql_rel *r); + +static sql_rel * +rel_set_table_schema(mvc *sql, char* old_schema, char *tname, char *new_schema, int if_exists) +{ + node *n; + sql_schema *os, *ns; + sql_table *ot, *nt; + sql_rel *l, *r, *inserts; + + assert(old_schema && tname && new_schema); + + if (!(os = mvc_bind_schema(sql, old_schema))) { + if (if_exists) + return rel_psm_block(sql->sa, new_exp_list(sql->sa)); + return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", old_schema); + } + if (!mvc_schema_privs(sql, os)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), old_schema); + if (!(ot = mvc_bind_table(sql, os, tname))) { + if (if_exists) + return rel_psm_block(sql->sa, new_exp_list(sql->sa)); + return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", tname, old_schema); + } + if (ot->system) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: cannot set schema of a system table"); + if (isTempSchema(os) || isTempTable(ot)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: not possible to change a temporary table schema"); + if (isView(ot)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a view"); + if (isMergeTable(ot)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a merge table"); + if (mvc_check_dependency(sql, ot->base.id, TABLE_DEPENDENCY, NULL)) + return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", tname); + if (!(ns = mvc_bind_schema(sql, new_schema))) + return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", new_schema); + if (!mvc_schema_privs(sql, ns)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: access denied for '%s' to schema '%s'", stack_get_string(sql, "current_user"), new_schema); + if (isTempSchema(ns)) + return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE: not possible to change table's schema to temporary"); + if (mvc_bind_table(sql, ns, tname)) + return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: table '%s' on schema '%s' already exists", tname, new_schema); + + if ((nt = mvc_create_table(sql, ns, tname, ot->type, 0, SQL_DECLARED_TABLE, ot->commit_action, -1, ot->properties)) == NULL) + return NULL; + + for (n = ot->columns.set->h; n; n = n->next) { + sql_column *oc = (sql_column*) n->data; + if (!mvc_copy_column(sql, nt, oc)) + return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: %s_%s_%s conflicts", ns->base.name, nt->base.name, oc->base.name); + } + + if (ot->idxs.set) + for (n = ot->idxs.set->h; n; n = n->next) + mvc_copy_idx(sql, nt, (sql_idx*) n->data); + + if (ot->keys.set) + for (n = ot->keys.set->h; n; n = n->next) + mvc_copy_key(sql, nt, (sql_key*) n->data); + + if (ot->members.set || ot->triggers.set) + return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", tname); + + l = rel_table(sql, DDL_CREATE_TABLE, new_schema, nt, 0); + inserts = rel_basetable(sql, ot, tname); + inserts = rel_project(sql->sa, inserts, rel_projections(sql, inserts, NULL, 1, 0)); + l = rel_insert(sql, l, inserts); + r = rel_drop(sql->sa, DDL_DROP_TABLE, old_schema, tname, 0, 0); + return rel_list(sql->sa, l, r); +} + sql_rel * rel_schemas(mvc *sql, symbol *s) { @@ -2805,6 +2876,14 @@ rel_schemas(mvc *sql, symbol *s) sname = cur_schema(sql)->base.name; ret = rel_rename_column(sql, sname, tname, l->h->next->data.sval, l->h->next->next->data.sval, l->h->next->next->next->data.i_val); } break; + case SQL_SET_TABLE_SCHEMA: { + dlist *l = s->data.lval; + char *sname = qname_schema(l->h->data.lval); + char *tname = qname_table(l->h->data.lval); + if (!sname) + sname = cur_schema(sql)->base.name; + ret = rel_set_table_schema(sql, sname, tname, l->h->next->data.sval, l->h->next->next->data.i_val); + } break; case SQL_CREATE_TYPE: { dlist *l = s->data.lval; diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c --- a/sql/server/rel_semantic.c +++ b/sql/server/rel_semantic.c @@ -157,6 +157,7 @@ rel_semantic(mvc *sql, symbol *s) case SQL_RENAME_SCHEMA: case SQL_RENAME_TABLE: case SQL_RENAME_USER: + case SQL_SET_TABLE_SCHEMA: case SQL_CREATE_TYPE: case SQL_DROP_TYPE: @@ -185,6 +186,7 @@ rel_semantic(mvc *sql, symbol *s) case SQL_UPDATE: case SQL_DELETE: case SQL_TRUNCATE: + case SQL_MERGE: case SQL_COPYFROM: case SQL_BINCOPYFROM: case SQL_COPYLOADER: 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 @@ -17,9 +17,10 @@ #include "rel_dump.h" #include "rel_psm.h" #include "sql_symbol.h" +#include "rel_prop.h" static sql_exp * -insert_value(mvc *sql, sql_column *c, sql_rel **r, symbol *s) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list