Changeset: 19c3ce9e2a1b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=19c3ce9e2a1b Added Files: sql/test/BugTracker-2019/Tests/subselect.Bug-6700.sql sql/test/BugTracker-2019/Tests/subselect.Bug-6700.stable.err sql/test/BugTracker-2019/Tests/subselect.Bug-6700.stable.out sql/test/rename/Tests/rename09.sql sql/test/rename/Tests/rename09.stable.err sql/test/rename/Tests/rename09.stable.out Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/mal/wlc.mal sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sqlcatalog.mal sql/backends/monet5/wlr.mal sql/common/sql_changeset.c sql/include/sql_catalog.h sql/server/rel_optimizer.c sql/server/rel_schema.c sql/storage/sql_storage.h sql/storage/store.c sql/test/BugTracker-2019/Tests/All sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.stable.out sql/test/rename/Tests/All tools/mserver/mserver5.1.in Branch: default Log Message:
Merge with Apr2019 branch. diffs (truncated from 1255 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -11891,7 +11891,7 @@ stdout of test 'MAL-signatures` in direc [ "sqlcatalog", "grant_roles", "pattern sqlcatalog.grant_roles(sname:str, auth:str, grantor:int, admin:int):void ", "SQLgrant_roles;", "Catalog operation grant_roles" ] [ "sqlcatalog", "rename_column", "pattern sqlcatalog.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "SQLrename_column;", "Catalog operation rename_column" ] [ "sqlcatalog", "rename_schema", "pattern sqlcatalog.rename_schema(sname:str, newnme:str):void ", "SQLrename_schema;", "Catalog operation rename_schema" ] -[ "sqlcatalog", "rename_table", "pattern sqlcatalog.rename_table(sname:str, tname:str, newnme:str):void ", "SQLrename_table;", "Catalog operation rename_table" ] +[ "sqlcatalog", "rename_table", "pattern sqlcatalog.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "SQLrename_table;", "Catalog operation rename_table" ] [ "sqlcatalog", "rename_user", "pattern sqlcatalog.rename_user(sname:str, newnme:str, action:int):void ", "SQLrename_user;", "Catalog operation rename_user" ] [ "sqlcatalog", "revoke", "pattern sqlcatalog.revoke(sname:str, tbl:str, grantee:str, privs:int, cname:str, grant:int, grantor:int):void ", "SQLrevoke;", "Catalog operation revoke" ] [ "sqlcatalog", "revoke_function", "pattern sqlcatalog.revoke_function(sname:str, fcnid:int, grantee:str, privs:int, grant:int, grantor:int):void ", "SQLrevoke_function;", "Catalog operation revoke_function" ] @@ -12128,7 +12128,7 @@ stdout of test 'MAL-signatures` in direc [ "wlc", "query", "pattern wlc.query(q:str):void ", "WLCquery;", "Keep the queries for replay." ] [ "wlc", "rename_column", "pattern wlc.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_column" ] [ "wlc", "rename_schema", "pattern wlc.rename_schema(sname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_schema" ] -[ "wlc", "rename_table", "pattern wlc.rename_table(sname:str, tname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_table" ] +[ "wlc", "rename_table", "pattern wlc.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "WLCgeneric;", "Catalog operation rename_table" ] [ "wlc", "rename_user", "pattern wlc.rename_user(sname:str, newnme:str, action:int):void ", "WLCgeneric;", "Catalog operation rename_user" ] [ "wlc", "revoke", "pattern wlc.revoke(sname:str, tbl:str, grantee:str, privs:int, cname:str, grant:int, grantor:int):void ", "WLCgeneric;", "Catalog operation revoke" ] [ "wlc", "revoke_function", "pattern wlc.revoke_function(sname:str, fcnid:int, grantee:str, privs:int, grant:int, grantor:int):void ", "WLCgeneric;", "Catalog operation revoke_function" ] @@ -12188,7 +12188,7 @@ stdout of test 'MAL-signatures` in direc [ "wlr", "grant_roles", "pattern wlr.grant_roles(sname:str, auth:str, grantor:int, admin:int):void ", "WLRgeneric;", "Catalog operation grant_roles" ] [ "wlr", "rename_column", "pattern wlr.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_column" ] [ "wlr", "rename_schema", "pattern wlr.rename_schema(sname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_schema" ] -[ "wlr", "rename_table", "pattern wlr.rename_table(sname:str, tname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_table" ] +[ "wlr", "rename_table", "pattern wlr.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "WLRgeneric;", "Catalog operation rename_table" ] [ "wlr", "rename_user", "pattern wlr.rename_user(sname:str, newnme:str, action:int):void ", "WLRgeneric;", "Catalog operation rename_user" ] [ "wlr", "replicate", "pattern wlr.replicate():void ", "WLRreplicate;", "Roll the snapshot forward to an up-to-date clone" ] [ "wlr", "replicate", "pattern wlr.replicate(dbname:str):void ", "WLRreplicate;", "Roll the snapshot forward to an up-to-date clone" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -16318,7 +16318,7 @@ stdout of test 'MAL-signatures` in direc [ "sqlcatalog", "grant_roles", "pattern sqlcatalog.grant_roles(sname:str, auth:str, grantor:int, admin:int):void ", "SQLgrant_roles;", "Catalog operation grant_roles" ] [ "sqlcatalog", "rename_column", "pattern sqlcatalog.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "SQLrename_column;", "Catalog operation rename_column" ] [ "sqlcatalog", "rename_schema", "pattern sqlcatalog.rename_schema(sname:str, newnme:str):void ", "SQLrename_schema;", "Catalog operation rename_schema" ] -[ "sqlcatalog", "rename_table", "pattern sqlcatalog.rename_table(sname:str, tname:str, newnme:str):void ", "SQLrename_table;", "Catalog operation rename_table" ] +[ "sqlcatalog", "rename_table", "pattern sqlcatalog.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "SQLrename_table;", "Catalog operation rename_table" ] [ "sqlcatalog", "rename_user", "pattern sqlcatalog.rename_user(sname:str, newnme:str, action:int):void ", "SQLrename_user;", "Catalog operation rename_user" ] [ "sqlcatalog", "revoke", "pattern sqlcatalog.revoke(sname:str, tbl:str, grantee:str, privs:int, cname:str, grant:int, grantor:int):void ", "SQLrevoke;", "Catalog operation revoke" ] [ "sqlcatalog", "revoke_function", "pattern sqlcatalog.revoke_function(sname:str, fcnid:int, grantee:str, privs:int, grant:int, grantor:int):void ", "SQLrevoke_function;", "Catalog operation revoke_function" ] @@ -16556,7 +16556,7 @@ stdout of test 'MAL-signatures` in direc [ "wlc", "query", "pattern wlc.query(q:str):void ", "WLCquery;", "Keep the queries for replay." ] [ "wlc", "rename_column", "pattern wlc.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_column" ] [ "wlc", "rename_schema", "pattern wlc.rename_schema(sname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_schema" ] -[ "wlc", "rename_table", "pattern wlc.rename_table(sname:str, tname:str, newnme:str):void ", "WLCgeneric;", "Catalog operation rename_table" ] +[ "wlc", "rename_table", "pattern wlc.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "WLCgeneric;", "Catalog operation rename_table" ] [ "wlc", "rename_user", "pattern wlc.rename_user(sname:str, newnme:str, action:int):void ", "WLCgeneric;", "Catalog operation rename_user" ] [ "wlc", "revoke", "pattern wlc.revoke(sname:str, tbl:str, grantee:str, privs:int, cname:str, grant:int, grantor:int):void ", "WLCgeneric;", "Catalog operation revoke" ] [ "wlc", "revoke_function", "pattern wlc.revoke_function(sname:str, fcnid:int, grantee:str, privs:int, grant:int, grantor:int):void ", "WLCgeneric;", "Catalog operation revoke_function" ] @@ -16616,7 +16616,7 @@ stdout of test 'MAL-signatures` in direc [ "wlr", "grant_roles", "pattern wlr.grant_roles(sname:str, auth:str, grantor:int, admin:int):void ", "WLRgeneric;", "Catalog operation grant_roles" ] [ "wlr", "rename_column", "pattern wlr.rename_column(sname:str, tname:str, cname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_column" ] [ "wlr", "rename_schema", "pattern wlr.rename_schema(sname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_schema" ] -[ "wlr", "rename_table", "pattern wlr.rename_table(sname:str, tname:str, newnme:str):void ", "WLRgeneric;", "Catalog operation rename_table" ] +[ "wlr", "rename_table", "pattern wlr.rename_table(osname:str, nsname:str, otname:str, ntname:str):void ", "WLRgeneric;", "Catalog operation rename_table" ] [ "wlr", "rename_user", "pattern wlr.rename_user(sname:str, newnme:str, action:int):void ", "WLRgeneric;", "Catalog operation rename_user" ] [ "wlr", "replicate", "pattern wlr.replicate():void ", "WLRreplicate;", "Roll the snapshot forward to an up-to-date clone" ] [ "wlr", "replicate", "pattern wlr.replicate(dbname:str):void ", "WLRreplicate;", "Roll the snapshot forward to an up-to-date clone" ] diff --git a/monetdb5/modules/mal/wlc.mal b/monetdb5/modules/mal/wlc.mal --- a/monetdb5/modules/mal/wlc.mal +++ b/monetdb5/modules/mal/wlc.mal @@ -234,7 +234,7 @@ pattern rename_schema(sname:str, newnme: address WLCgeneric comment "Catalog operation rename_schema"; -pattern rename_table(sname:str, tname:str, newnme:str) +pattern rename_table(osname:str, nsname:str, otname:str, ntname:str) address WLCgeneric comment "Catalog operation rename_table"; 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 @@ -5641,8 +5641,11 @@ output_rel_bin(backend *be, sql_rel *rel mvc *sql = be->mvc; list *refs = sa_list(sql->sa); int sqltype = sql->type; - stmt *s = subrel_bin(be, rel, refs); - + stmt *s; + + if (refs == NULL) + return NULL; + s = subrel_bin(be, rel, refs); if (sqltype == Q_SCHEMA) sql->type = sqltype; /* reset */ 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 @@ -1608,30 +1608,65 @@ SQLrename_table(Client cntxt, MalBlkPtr { mvc *sql = NULL; str msg = MAL_SUCCEED; - str schema_name = *getArgReference_str(stk, pci, 1); - str old_name = *getArgReference_str(stk, pci, 2); - str new_name = *getArgReference_str(stk, pci, 3); - sql_schema *s; + str oschema_name = *getArgReference_str(stk, pci, 1); + str nschema_name = *getArgReference_str(stk, pci, 2); + str otable_name = *getArgReference_str(stk, pci, 3); + str ntable_name = *getArgReference_str(stk, pci, 4); + sql_schema *o, *s; sql_table *t; initcontext(); - if (!(s = mvc_bind_schema(sql, schema_name))) - throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", schema_name); - if (!mvc_schema_privs(sql, s)) - throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), schema_name); - if (!(t = mvc_bind_table(sql, s, old_name))) - throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", old_name, schema_name); - 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); - 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)) - throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: there is a table named '%s' in schema '%s'", new_name, schema_name); + + if(strcmp(oschema_name, nschema_name) == 0) { //renaming the table itself + if (!(s = mvc_bind_schema(sql, oschema_name))) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", oschema_name); + if (!mvc_schema_privs(sql, s)) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), oschema_name); + if (!(t = mvc_bind_table(sql, s, otable_name))) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", otable_name, oschema_name); + 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)", otable_name); + if (!ntable_name || strcmp(ntable_name, str_nil) == 0 || *ntable_name == '\0') + throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: invalid new table name"); + if (mvc_bind_table(sql, s, ntable_name)) + throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: there is a table named '%s' in schema '%s'", ntable_name, oschema_name); + + if (!sql_trans_rename_table(sql->session->tr, s, t->base.id, ntable_name)) + throw(SQL, "sql.rename_table",SQLSTATE(HY001) MAL_MALLOC_FAIL); + } else { //changing the schema of the table + assert(strcmp(otable_name, ntable_name) == 0); - if (!sql_trans_rename_table(sql->session->tr, s, t->base.id, new_name)) - throw(SQL, "sql.rename_table",SQLSTATE(HY001) MAL_MALLOC_FAIL); + if (!(o = mvc_bind_schema(sql, oschema_name))) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", oschema_name); + if (!mvc_schema_privs(sql, o)) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), oschema_name); + if (!(t = mvc_bind_table(sql, o, otable_name))) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", otable_name, oschema_name); + if (t->system) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: cannot set schema of a system table"); + if (isTempSchema(o) || isTempTable(t)) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: not possible to change a temporary table schema"); + if (isView(t)) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a view"); + if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL)) + throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", otable_name); + if (t->members.set || t->triggers.set) + throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", otable_name); + if (!(s = mvc_bind_schema(sql, nschema_name))) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", nschema_name); + if (!mvc_schema_privs(sql, s)) + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: access denied for '%s' to schema '%s'", stack_get_string(sql, "current_user"), nschema_name); + if (isTempSchema(s)) + throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: not possible to change table's schema to temporary"); + if (mvc_bind_table(sql, s, otable_name)) + throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: table '%s' on schema '%s' already exists", otable_name, nschema_name); + + if (!sql_trans_set_table_schema(sql->session->tr, t->base.id, o, s)) + throw(SQL, "sql.rename_table",SQLSTATE(HY001) MAL_MALLOC_FAIL); + } + return msg; } diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -102,7 +102,7 @@ SQLsession(Client cntxt, MalBlkPtr mb, M logmsg = GDKgetenv("recovery"); if( logmsg== NULL && ++cnt == 5) throw(SQL,"SQLinit", "#WARNING server not ready, recovery in progress\n"); - }while (logmsg == NULL); + } while (logmsg == NULL); return msg; } @@ -125,7 +125,7 @@ SQLsession2(Client cntxt, MalBlkPtr mb, logmsg = GDKgetenv("recovery"); if( logmsg== NULL && ++cnt == 5) throw(SQL,"SQLinit","#WARNING server not ready, recovery in progress\n"); - }while (logmsg == NULL); + } while (logmsg == NULL); return msg; } diff --git a/sql/backends/monet5/sqlcatalog.mal b/sql/backends/monet5/sqlcatalog.mal --- a/sql/backends/monet5/sqlcatalog.mal +++ b/sql/backends/monet5/sqlcatalog.mal @@ -167,7 +167,7 @@ pattern rename_schema(sname:str, newnme: address SQLrename_schema comment "Catalog operation rename_schema"; -pattern rename_table(sname:str, tname:str, newnme:str) +pattern rename_table(osname:str, nsname:str, otname:str, ntname:str) address SQLrename_table comment "Catalog operation rename_table"; diff --git a/sql/backends/monet5/wlr.mal b/sql/backends/monet5/wlr.mal --- a/sql/backends/monet5/wlr.mal +++ b/sql/backends/monet5/wlr.mal @@ -239,7 +239,7 @@ pattern rename_schema(sname:str, newnme: address WLRgeneric comment "Catalog operation rename_schema"; -pattern rename_table(sname:str, tname:str, newnme:str) +pattern rename_table(osname:str, nsname:str, otname:str, ntname:str) address WLRgeneric comment "Catalog operation rename_table"; diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c --- a/sql/common/sql_changeset.c +++ b/sql/common/sql_changeset.c @@ -81,6 +81,14 @@ cs_del(changeset * cs, node *elm, int fl } } +void +cs_move(changeset *from, changeset *to, void *data) +{ + if (!to->set) + to->set = list_new(to->sa, to->destroy); + list_move_data(from->set, to->set, data); +} + int cs_size(changeset * cs) { diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -85,6 +85,7 @@ #define SCALE_EQ 7 /* user defined functions need equal scales */ #define SCALE_DIGITS_FIX 8 /* the geom module requires the types and functions to have the same scale and digits */ +/* Warning TR flags are a bitmask */ #define TR_NEW 1 #define TR_RENAMED 2 @@ -228,6 +229,7 @@ extern void cs_add(changeset * cs, void extern void *cs_add_with_validate(changeset * cs, void *elm, int flag, fvalidate cmp); extern void cs_add_before(changeset * cs, node *n, void *elm); extern void cs_del(changeset * cs, node *elm, int flag); +extern void cs_move(changeset *from, changeset *to, void *data); extern void *cs_transverse_with_validate(changeset * cs, void *elm, fvalidate cmp); extern int cs_size(changeset * cs); extern node *cs_find_name(changeset * cs, const char *name); @@ -249,6 +251,7 @@ typedef struct sql_trans { int schema_updates; /* set on schema changes */ int status; /* status of the last query */ list *dropped; /* protection against recursive cascade action*/ + list *moved_tables; changeset schemas; @@ -603,6 +606,13 @@ typedef struct sql_table { } part; } sql_table; +typedef struct sql_moved_table { + sql_schema *from; + sql_schema *to; + sql_table *t; + node *p; //need to iterate the list backwards +} sql_moved_table; + typedef struct res_col { char *tn; char *name; diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -4587,6 +4587,8 @@ rel_push_semijoin_down(int *changes, mvc list *exps = rel->exps, *nexps = sa_list(sql->sa); node *n; + if (nexps == NULL) + return NULL; for(n = exps->h; n; n = n->next) { sql_exp *sje = n->data; @@ -7058,7 +7060,9 @@ rel_simplify_like_select(int *changes, m if (is_select(rel->op) && rel->exps) { node *n; list *exps = sa_list(sql->sa); - + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list