Changeset: 8821d8e7e395 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8821d8e7e395
Added Files:
        sql/test/rename/Tests/rename03.sql
        sql/test/rename/Tests/rename03.stable.err
        sql/test/rename/Tests/rename03.stable.out
Modified Files:
        monetdb5/modules/mal/wlc.mal
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_cat.h
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sqlcatalog.mal
        sql/backends/monet5/wlr.mal
        sql/include/sql_relation.h
        sql/server/rel_schema.c
        sql/server/rel_semantic.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_partition.c
        sql/server/sql_partition.h
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/rename/Tests/All
        sql/test/rename/Tests/rename01.sql
        sql/test/rename/Tests/rename01.stable.out
        sql/test/rename/Tests/rename02.sql
        sql/test/rename/Tests/rename02.stable.out
Branch: rename-sql
Log Message:

Renames tables and columns with small tests.

For columns it's important to note that the column is moved to the end of the 
table. Now it's time to test all possible SQL combinations :/


diffs (truncated from 1542 to 300 lines):

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,6 +234,14 @@ pattern rename_schema(sname:str, newnme:
 address WLCgeneric
 comment "Catalog operation rename_schema";
 
+pattern rename_table(sname:str, tname:str, newnme:str)
+address WLCgeneric
+comment "Catalog operation rename_table";
+
+pattern rename_column(sname:str, tname:str, cname:str, newnme:str)
+address WLCgeneric
+comment "Catalog operation rename_column";
+
 pattern transaction_release(chain:int,name:str):void
 address WLCgeneric
 comment "A transaction statement (type can be commit,release,rollback or 
start)";
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -234,7 +234,9 @@ str register_supervisorRef;
 str releaseRef;
 str remapRef;
 str remoteRef;
+str rename_columnRef;
 str rename_schemaRef;
+str rename_tableRef;
 str rename_userRef;
 str replaceRef;
 str replicatorRef;
@@ -539,7 +541,9 @@ void optimizerInit(void)
        releaseRef = putName("release");
        remapRef = putName("remap");
        remoteRef = putName("remote");
+       rename_columnRef = putName("rename_column");
        rename_schemaRef = putName("rename_schema");
+       rename_tableRef = putName("rename_table");
        rename_userRef = putName("rename_user");
        replaceRef = putName("replace");
        replicatorRef = putName("replicator");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -242,7 +242,9 @@ mal_export  str register_supervisorRef;
 mal_export  str releaseRef;
 mal_export  str remapRef;
 mal_export  str remoteRef;
+mal_export  str rename_columnRef;
 mal_export  str rename_schemaRef;
+mal_export  str rename_tableRef;
 mal_export  str rename_userRef;
 mal_export  str replaceRef;
 mal_export  str replicatorRef;
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
@@ -5244,7 +5244,7 @@ rel2bin_ddl(backend *be, sql_rel *rel, l
        } else if (rel->flag <= DDL_ALTER_TABLE) {
                s = rel2bin_catalog_table(be, rel, refs);
                sql->type = Q_SCHEMA;
-       } else if (rel->flag <= DDL_RENAME_SCHEMA) {
+       } else if (rel->flag <= DDL_RENAME_COLUMN) {
                s = rel2bin_catalog2(be, rel, refs);
                sql->type = Q_SCHEMA;
        }
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -278,7 +278,7 @@ SQLshutdown_wrap(Client cntxt, MalBlkPtr
 }
 
 str
-create_table_or_view(mvc *sql, char* sname, char *tname, sql_table *t, int 
temp, bool rename)
+create_table_or_view(mvc *sql, char* sname, char *tname, sql_table *t, int 
temp, sqlid reuse, bool rename)
 {
        sql_allocator *osa;
        sql_schema *s = mvc_bind_schema(sql, sname);
@@ -286,7 +286,6 @@ create_table_or_view(mvc *sql, char* sna
        node *n;
        int check = 0;
 
-       (void)tname;
        if (STORE_READONLY)
                return sql_error(sql, 06, "25006!schema statements cannot be 
executed on a readonly database.");
 
@@ -308,8 +307,8 @@ create_table_or_view(mvc *sql, char* sna
        osa = sql->sa;
        sql->sa = NULL;
 
-       nt = sql_trans_create_table(sql->session->tr, s, t->base.name, 
t->query, t->type, t->system, temp, t->commit_action,
-                                                               t->sz, rename ? 
t->base.id : 0);
+       nt = sql_trans_create_table(sql->session->tr, s, tname, t->query, 
t->type, t->system, temp, t->commit_action,
+                                                               t->sz, reuse ? 
reuse : 0);
 
        /* first check default values */
        for (n = t->columns.set->h; n; n = n->next) {
@@ -358,7 +357,7 @@ create_table_or_view(mvc *sql, char* sna
        }
 
        for (n = t->columns.set->h; n; n = n->next) {
-               sql_column *c = n->data, *copied = mvc_copy_column(sql, nt, c, 
!rename);
+               sql_column *c = n->data, *copied = mvc_copy_column(sql, nt, c, 
NULL, !rename);
 
                if (copied == NULL) {
                        sql->sa = osa;
@@ -378,7 +377,7 @@ create_table_or_view(mvc *sql, char* sna
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                }
 
-               err = bootstrap_partition_expression(sql, sql->session->tr->sa, 
nt, 1, rename);
+               err = bootstrap_partition_expression(sql, sql->session->tr->sa, 
nt, 1, !rename);
                sa_destroy(sql->sa);
                sql->sa = NULL;
                if(err) {
@@ -505,7 +504,7 @@ create_table_from_emit(Client cntxt, cha
                        goto cleanup;
                }
        }
-       msg = create_table_or_view(sql, sname, t->base.name, t, 0, false);
+       msg = create_table_or_view(sql, sname, t->base.name, t, 0, 0, false);
        if (msg != MAL_SUCCEED) {
                goto cleanup;
        }
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -144,7 +144,7 @@ sql5_export str sql_dense_rank(bat *rid,
 sql5_export str SQLidentity(oid *rid, const void *i);
 sql5_export str BATSQLidentity(bat *rid, const bat *bid);
 sql5_export str PBATSQLidentity(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str create_table_or_view(mvc *sql, char* sname, char *tname, 
sql_table *t, int temp, bool rename);
+sql5_export str create_table_or_view(mvc *sql, char* sname, char *tname, 
sql_table *t, int temp, sqlid reuse, bool rename);
 sql5_export str create_table_from_emit(Client cntxt, char *sname, char *tname, 
sql_emit_col *columns, size_t ncols);
 sql5_export str append_to_table_from_emit(Client cntxt, char *sname, char 
*tname, sql_emit_col *columns, size_t ncols);
 
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
@@ -375,7 +375,7 @@ alter_table_del_table(mvc *sql, char *ms
                if (!pt || (n = cs_find_id(&mt->members, pt->base.id)) == NULL)
                        throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) 
"ALTER TABLE: table '%s.%s' isn't part of the MERGE TABLE '%s.%s'", psname, 
ptname, msname, mtname);
 
-               sql_trans_del_table(sql->session->tr, mt, pt, drop_action, 
false);
+               sql_trans_del_table(sql->session->tr, mt, pt, drop_action, 
true);
        } else if (mt) {
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", ptname, psname);
        } else {
@@ -881,7 +881,7 @@ alter_table(Client cntxt, mvc *sql, char
        for (; n; n = n->next) {
                /* propagate alter table .. add column */
                sql_column *c = n->data;
-               mvc_copy_column(sql, nt, c, true);
+               mvc_copy_column(sql, nt, c, NULL, true);
        }
        if (t->idxs.set) {
                /* alter drop index */
@@ -1051,12 +1051,12 @@ SQLcreate_table(Client cntxt, MalBlkPtr 
 {      mvc *sql = NULL;
        str msg;
        str sname = *getArgReference_str(stk, pci, 1);
-       str tname = *getArgReference_str(stk, pci, 2); 
+       //str tname = *getArgReference_str(stk, pci, 2);
        sql_table *t = *(sql_table **) getArgReference(stk, pci, 3);
        int temp = *getArgReference_int(stk, pci, 4);
 
        initcontext();
-       msg = create_table_or_view(sql, sname, tname, t, temp, false);
+       msg = create_table_or_view(sql, sname, t->base.name, t, temp, 0, false);
        return msg;
 }
 
@@ -1065,12 +1065,12 @@ SQLcreate_view(Client cntxt, MalBlkPtr m
 {      mvc *sql = NULL;
        str msg;
        str sname = *getArgReference_str(stk, pci, 1);
-       str vname = *getArgReference_str(stk, pci, 2);
+       //str vname = *getArgReference_str(stk, pci, 2);
        sql_table *t = *(sql_table **) getArgReference(stk, pci, 3);
        int temp = *getArgReference_int(stk, pci, 4);
 
        initcontext();
-       msg = create_table_or_view(sql, sname, vname, t, temp, false);
+       msg = create_table_or_view(sql, sname, t->base.name, t, temp, 0, false);
        return msg;
 }
 
@@ -1558,7 +1558,7 @@ str
 SQLrename_schema(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        mvc *sql = NULL;
-       str msg;
+       str msg = MAL_SUCCEED;
        str old_name = *getArgReference_str(stk, pci, 1);
        str new_name = *getArgReference_str(stk, pci, 2);
        sql_schema *olds, *news;
@@ -1566,7 +1566,7 @@ SQLrename_schema(Client cntxt, MalBlkPtr
 
        initcontext();
        if (!(olds = mvc_bind_schema(sql, old_name)))
-               throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: 
no such schema '%s'", old_name);
+               throw(SQL, "sql.rename_schema", SQLSTATE(42S02) "ALTER SCHEMA: 
no such schema '%s'", old_name);
        if (!mvc_schema_privs(sql, olds))
                throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: 
access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
old_name);
        if (olds->system)
@@ -1578,7 +1578,7 @@ SQLrename_schema(Client cntxt, MalBlkPtr
        if (mvc_bind_schema(sql, new_name))
                throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: 
there is a schema named '%s' in the database", new_name);
 
-       if(sql_trans_drop_schema(sql->session->tr, olds->base.id, 
DROP_RESTRICT, true))
+       if (sql_trans_drop_schema(sql->session->tr, olds->base.id, 
DROP_RESTRICT, false))
                throw(SQL, "sql.rename_schema", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
        news = sql_trans_create_schema(sql->session->tr, new_name, 
sql->role_id, sql->user_id, olds->base.id);
 
@@ -1586,13 +1586,13 @@ SQLrename_schema(Client cntxt, MalBlkPtr
                for (n = olds->types.set->h; n; n = n->next) {
                        sql_type *ot = n->data;
                        if(sql_trans_create_type(sql->session->tr, news, 
ot->sqlname, ot->digits, ot->scale, ot->radix, ot->base.name, ot->base.id))
-                               throw(SQL,"sql.rename_schema", SQLSTATE(0D000) 
"ALTER SCHEMA: unknown external type '%s'", ot->base.name);
+                               throw(SQL, "sql.rename_schema", SQLSTATE(0D000) 
"ALTER SCHEMA: unknown external type '%s'", ot->base.name);
                }
        }
        if (olds->tables.set) {
                for (n = olds->tables.set->h; n; n = n->next) {
                        sql_table *ot = n->data;
-                       if((msg = create_table_or_view(sql, news->base.name, 
ot->base.name, ot, ot->persistence, true)) != MAL_SUCCEED)
+                       if((msg = create_table_or_view(sql, news->base.name, 
ot->base.name, ot, ot->persistence, 0, true)) != MAL_SUCCEED)
                                return msg;
                }
        }
@@ -1610,5 +1610,79 @@ SQLrename_schema(Client cntxt, MalBlkPtr
                                                                                
         os->maxvalue, os->increment, os->cacheinc, os->cycle, 0, os->base.id);
                }
        }
-       return MAL_SUCCEED;
+       return msg;
+}
+
+str
+SQLrename_table(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg;
+       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;
+       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 system table '%s'", old_name);
+       if (!new_name || strcmp(new_name, str_nil) == 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 (sql_trans_drop_table(sql->session->tr, s, t->base.id, 
DROP_RESTRICT, false))
+               throw(SQL, "sql.rename_table", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+       if ((msg = create_table_or_view(sql, s->base.name, new_name, t, 
t->persistence, t->base.id, true)) != MAL_SUCCEED)
+               return msg;
+       return msg;
 }
+
+str
+SQLrename_column(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg;
+       str schema_name = *getArgReference_str(stk, pci, 1);
+       str table_name = *getArgReference_str(stk, pci, 2);
+       str old_name = *getArgReference_str(stk, pci, 3);
+       str new_name = *getArgReference_str(stk, pci, 4);
+       sql_schema *s;
+       sql_table *t;
+       sql_column *oc, *nc;
+
+       initcontext();
+       if (!(s = mvc_bind_schema(sql, schema_name)))
+               throw(SQL, "sql.rename_column", SQLSTATE(42S02) "ALTER TABLE: 
no such schema '%s'", schema_name);
+       if (!mvc_schema_privs(sql, s))
+               throw(SQL, "sql.rename_column", 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, table_name)))
+               throw(SQL, "sql.rename_column", SQLSTATE(42S02) "ALTER TABLE: 
no such table '%s' in schema '%s'", table_name, schema_name);
+       if (t->system)
+               throw(SQL, "sql.rename_column", SQLSTATE(42000) "ALTER TABLE: 
cannot rename system table '%s'", t->base.name);
+       if (isView(t))
+               throw(SQL, "sql.rename_column", SQLSTATE(42000) "ALTER TABLE: 
cannot rename column '%s': '%s' is a view", old_name, t->base.name);
+       if (!(oc = mvc_bind_column(sql, t, old_name)))
+               throw(SQL, "sql.rename_column", "ALTER TABLE: no such column 
'%s' in table '%s'", old_name, t->base.name);
+       if (!new_name || strcmp(new_name, str_nil) == 0)
+               throw(SQL, "sql.rename_column", SQLSTATE(3F000) "ALTER TABLE: 
invalid new column name");
+       if (mvc_bind_column(sql, t, new_name))
+               throw(SQL, "sql.rename_column", SQLSTATE(3F000) "ALTER TABLE: 
there is a column named '%s' in table '%s'", new_name, t->base.name);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to