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

Reply via email to