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