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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list