Changeset: d0f873006ea6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d0f873006ea6
Added Files:
        sql/test/rename/Tests/rename07.sql
        sql/test/rename/Tests/rename07.stable.err
        sql/test/rename/Tests/rename07.stable.out
Modified Files:
        sql/server/rel_schema.c
        sql/server/rel_semantic.c
        sql/server/sql_parser.h
        sql/server/sql_parser.y
Branch: merge-statements
Log Message:

Added alter schema of table statement, by re-creating the table in the new 
schema.

ALTER TABLE "oldschema"."table" SET SCHEMA "newschema";


diffs (294 lines):

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
@@ -2564,6 +2564,58 @@ rel_rename_column(mvc *sql, char* schema
        return rel;
 }
 
+static sql_rel *
+rel_set_table_schema(mvc *sql, char* old_schema, char *tname, char 
*new_schema, int if_exists)
+{
+       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 (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 (node *cn = ot->columns.set->h; cn; cn = cn->next) {
+               sql_column *col = (sql_column*) cn->data;
+               if (!mvc_create_column(sql, nt, col->base.name, &col->type))
+                       return NULL;
+       }
+       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)
 {
@@ -2789,6 +2841,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:
diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h
--- a/sql/server/sql_parser.h
+++ b/sql/server/sql_parser.h
@@ -192,6 +192,7 @@ typedef enum tokens {
        SQL_RENAME_SCHEMA,
        SQL_RENAME_TABLE,
        SQL_RENAME_COLUMN,
+       SQL_SET_TABLE_SCHEMA,
        SQL_MERGE_MATCH,
        SQL_MERGE_NO_MATCH
 } tokens;
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -1140,6 +1140,12 @@ alter_statement:
          append_string(l, $9);
          append_int(l, $3);
          $$ = _symbol_create_list( SQL_RENAME_COLUMN, l); }
+ | ALTER TABLE if_exists qname SET SCHEMA ident
+       { dlist *l = L();
+         append_list(l, $4);
+         append_string(l, $7);
+         append_int(l, $3);
+         $$ = _symbol_create_list( SQL_SET_TABLE_SCHEMA, l ); }
  | ALTER USER ident passwd_schema
        { dlist *l = L();
          append_string(l, $3);
@@ -6573,6 +6579,7 @@ char *token2string(int token)
        SQL(RENAME_SCHEMA);
        SQL(RENAME_TABLE);
        SQL(RENAME_COLUMN);
+       SQL(SET_TABLE_SCHEMA);
        SQL(MERGE_MATCH);
        SQL(MERGE_NO_MATCH);
        }
diff --git a/sql/test/rename/Tests/rename07.sql 
b/sql/test/rename/Tests/rename07.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename07.sql
@@ -0,0 +1,17 @@
+create schema "oldtables";
+create schema "newtables";
+
+create table "oldtables"."atable" (a int);
+insert into "oldtables"."atable" values (1);
+
+select "a" from "oldtables"."atable";
+select "a" from "newtables"."atable"; --error
+
+alter table "oldtables"."atable" set schema "newtables";
+
+select "a" from "oldtables"."atable"; --error
+select "a" from "newtables"."atable";
+
+drop table "newtables"."atable";
+drop schema "oldtables";
+drop schema "newtables";
diff --git a/sql/test/rename/Tests/rename07.stable.err 
b/sql/test/rename/Tests/rename07.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename07.stable.err
@@ -0,0 +1,45 @@
+stderr of test 'rename07` in directory 'sql/test/rename` itself:
+
+
+# 17:01:58 >  
+# 17:01:58 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=34226" "--set" 
"mapi_usock=/var/tmp/mtest-24376/.s.monetdb.34226" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-merge-statements/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_r=yes" "--set" "embedded_py=true" "--set" "embedded_c=true"
+# 17:01:58 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-merge-statements/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 34226
+# cmdline opt  mapi_usock = /var/tmp/mtest-24376/.s.monetdb.34226
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-merge-statements/BUILD/var/MonetDB/mTests_sql_test_rename
+# cmdline opt  embedded_r = yes
+# cmdline opt  embedded_py = true
+# cmdline opt  embedded_c = true
+# cmdline opt  gdk_debug = 553648138
+
+# 17:01:59 >  
+# 17:01:59 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-24376" "--port=34226"
+# 17:01:59 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-24376/.s.monetdb.34226
+QUERY = select "a" from "newtables"."atable"; --error
+ERROR = !SELECT: no such table 'atable'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-24376/.s.monetdb.34226
+QUERY = select "a" from "oldtables"."atable"; --error
+ERROR = !SELECT: no such table 'atable'
+CODE  = 42S02
+
+# 17:01:59 >  
+# 17:01:59 >  "Done."
+# 17:01:59 >  
+
diff --git a/sql/test/rename/Tests/rename07.stable.out 
b/sql/test/rename/Tests/rename07.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename07.stable.out
@@ -0,0 +1,94 @@
+stdout of test 'rename07` in directory 'sql/test/rename` itself:
+
+
+# 17:01:58 >  
+# 17:01:58 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=34226" "--set" 
"mapi_usock=/var/tmp/mtest-24376/.s.monetdb.34226" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-merge-statements/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_r=yes" "--set" "embedded_py=true" "--set" "embedded_c=true"
+# 17:01:58 >  
+
+# MonetDB 5 server v11.32.0# MonetDB5 server v11.32.0 (hg id: 13e45aae49e6+)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_rename', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.490 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://wired-142.cwi.nl:34226/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-24376/.s.monetdb.34226
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 11_times.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 72_fits.sql
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
+# loading sql script: 75_shp.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 80_udf_hge.sql
+# loading sql script: 85_bam.sql
+# loading sql script: 90_generator.sql
+# loading sql script: 90_generator_hge.sql
+# loading sql script: 99_system.sql
+# MonetDB/SQL module loaded
+# MonetDB/Python2 module loaded
+# MonetDB/R   module loaded
+
+Ready.
+
+# 17:01:59 >  
+# 17:01:59 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-24376" "--port=34226"
+# 17:01:59 >  
+
+#create schema "oldtables";
+#create schema "newtables";
+#create table "oldtables"."atable" (a int);
+#insert into "oldtables"."atable" values (1);
+[ 1    ]
+#select "a" from "oldtables"."atable";
+% oldtables.atable # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#alter table "oldtables"."atable" set schema "newtables";
+#select "a" from "newtables"."atable";
+% newtables.atable # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#drop table "newtables"."atable";
+#drop schema "oldtables";
+#drop schema "newtables";
+
+# 17:01:59 >  
+# 17:01:59 >  "Done."
+# 17:01:59 >  
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to