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