Changeset: c39bb84efba2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c39bb84efba2
Modified Files:
sql/backends/monet5/sql.c
sql/server/rel_psm.c
sql/server/rel_schema.c
sql/server/rel_schema.h
sql/server/sql_parser.y
Branch: default
Log Message:
CREATE TABLE IF NOT EXISTS/DROP TABLE IF EXISTS
diffs (247 lines):
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
@@ -686,7 +686,7 @@ alter_table(Client cntxt, mvc *sql, char
}
static char *
-drop_table(mvc *sql, char *sname, char *tname, int drop_action)
+drop_table(mvc *sql, char *sname, char *tname, int drop_action, int if_exists)
{
sql_schema *s = NULL;
sql_table *t = NULL;
@@ -702,7 +702,11 @@ drop_table(mvc *sql, char *sname, char *
t = mvc_bind_table(sql, s, tname);
}
if (!t) {
- return sql_message("42S02!DROP TABLE: no such table '%s'",
tname);
+ if (if_exists) {
+ return MAL_SUCCEED;
+ } else {
+ return sql_message("42S02!DROP TABLE: no such table
'%s'", tname);
+ }
} else if (isView(t)) {
return sql_message("42000!DROP TABLE: cannot drop VIEW '%s'",
tname);
} else if (t->system) {
@@ -1350,7 +1354,7 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M
int action = *getArgReference_int(stk, pci, 4);
str name = *getArgReference_str(stk, pci, 3);
- msg = drop_table(sql, sname, name, action);
+ msg = drop_table(sql, sname, name, action, if_exists);
break;
}
case DDL_DROP_VIEW_IF_EXISTS:
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -154,7 +154,7 @@ rel_psm_declare_table(mvc *sql, dnode *n
assert(n->next->next->next->type == type_int);
- rel = rel_create_table(sql, cur_schema(sql), SQL_DECLARED_TABLE, NULL,
name, n->next->next->data.sym, n->next->next->next->data.i_val, NULL);
+ rel = rel_create_table(sql, cur_schema(sql), SQL_DECLARED_TABLE, NULL,
name, n->next->next->data.sym, n->next->next->next->data.i_val, NULL, 0);
if (!rel || rel->op != op_ddl || rel->flag != DDL_CREATE_TABLE)
return NULL;
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
@@ -870,7 +870,7 @@ table_element(mvc *sql, symbol *s, sql_s
}
sql_rel *
-rel_create_table(mvc *sql, sql_schema *ss, int temp, const char *sname, const
char *name, symbol *table_elements_or_subquery, int commit_action, const char
*loc)
+rel_create_table(mvc *sql, sql_schema *ss, int temp, const char *sname, const
char *name, symbol *table_elements_or_subquery, int commit_action, const char
*loc, int if_not_exists)
{
sql_schema *s = NULL;
@@ -904,8 +904,12 @@ rel_create_table(mvc *sql, sql_schema *s
sname = s->base.name;
if (mvc_bind_table(sql, s, name)) {
- char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
- return sql_error(sql, 02, "42S01!%s TABLE: name '%s' already in
use", cd, name);
+ if (if_not_exists) {
+ return NULL;
+ } else {
+ char *cd = (temp ==
SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
+ return sql_error(sql, 02, "42S01!%s TABLE: name '%s'
already in use", cd, name);
+ }
} else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) &&
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
return sql_error(sql, 02, "42000!CREATE TABLE: insufficient
privileges for user '%s' in schema '%s'", stack_get_string(sql,
"current_user"), s->base.name);
} else if (table_elements_or_subquery->token == SQL_CREATE_TABLE) {
@@ -1964,7 +1968,7 @@ rel_schemas(mvc *sql, symbol *s)
assert(l->h->type == type_int);
assert(l->h->next->next->next->type == type_int);
- ret = rel_create_table(sql, cur_schema(sql), temp, sname, name,
l->h->next->next->data.sym, l->h->next->next->next->data.i_val,
l->h->next->next->next->next->data.sval);
+ ret = rel_create_table(sql, cur_schema(sql), temp, sname, name,
l->h->next->next->data.sym, l->h->next->next->next->data.i_val,
l->h->next->next->next->next->data.sval,
l->h->next->next->next->next->next->data.i_val);
} break;
case SQL_CREATE_VIEW:
{
@@ -1982,7 +1986,7 @@ rel_schemas(mvc *sql, symbol *s)
assert(l->h->next->type == type_int);
sname = get_schema_name(sql, sname, tname);
- ret = rel_schema(sql->sa, DDL_DROP_TABLE, sname, tname,
l->h->next->data.i_val);
+ ret = rel_schema(sql->sa, l->h->next->next->data.i_val ?
DDL_DROP_TABLE_IF_EXISTS : DDL_DROP_TABLE, sname, tname,
l->h->next->data.i_val);
} break;
case SQL_DROP_VIEW:
{
diff --git a/sql/server/rel_schema.h b/sql/server/rel_schema.h
--- a/sql/server/rel_schema.h
+++ b/sql/server/rel_schema.h
@@ -16,7 +16,7 @@
extern sql_rel *rel_schemas(mvc *sql, symbol *sym);
-extern sql_rel *rel_create_table(mvc *sql, sql_schema *ss, int temp, const
char *sname, const char *name, symbol *table_elements_or_subquery, int
commit_action, const char *loc);
+extern sql_rel *rel_create_table(mvc *sql, sql_schema *ss, int temp, const
char *sname, const char *name, symbol *table_elements_or_subquery, int
commit_action, const char *loc, int if_not_exists);
extern sql_rel *rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r);
extern sql_table * mvc_create_table_as_subquery( mvc *sql, sql_rel *sq,
sql_schema *s, const char *tname, dlist *column_spec, int temp, int
commit_action );
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
@@ -1146,6 +1146,7 @@ drop_table_element:
{ dlist *l = L();
append_string(l, $2 );
append_int(l, $3 );
+ append_int(l, 0);
$$ = _symbol_create_list( SQL_DROP_TABLE, l ); }
;
@@ -1314,78 +1315,84 @@ table_opt_storage:
;
table_def:
- TABLE qname table_content_source table_opt_storage
+ TABLE if_not_exists qname table_content_source table_opt_storage
{ int commit_action = CA_COMMIT;
dlist *l = L();
append_int(l, SQL_PERSIST);
- append_list(l, $2);
- append_symbol(l, $3);
- append_int(l, commit_action);
- append_string(l, NULL);
- append_list(l, $4);
- $$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
- | TABLE qname FROM sqlLOADER func_ref
- {
- dlist *l = L();
- append_list(l, $2);
- append_symbol(l, $5);
- $$ = _symbol_create_list( SQL_CREATE_TABLE_LOADER, l);
- }
- | STREAM TABLE qname table_content_source
- { int commit_action = CA_COMMIT, tpe = SQL_STREAM;
- dlist *l = L();
-
- append_int(l, tpe);
append_list(l, $3);
append_symbol(l, $4);
append_int(l, commit_action);
append_string(l, NULL);
+ append_int(l, $2);
+ append_list(l, $5);
$$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
- | MERGE TABLE qname table_content_source
+ | TABLE if_not_exists qname FROM sqlLOADER func_ref
+ {
+ dlist *l = L();
+ append_list(l, $3);
+ append_symbol(l, $6);
+ $$ = _symbol_create_list( SQL_CREATE_TABLE_LOADER, l);
+ }
+ | STREAM TABLE if_not_exists qname table_content_source
+ { int commit_action = CA_COMMIT, tpe = SQL_STREAM;
+ dlist *l = L();
+
+ append_int(l, tpe);
+ append_list(l, $4);
+ append_symbol(l, $5);
+ append_int(l, commit_action);
+ append_string(l, NULL);
+ append_int(l, $3);
+ $$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
+ | MERGE TABLE if_not_exists qname table_content_source
{ int commit_action = CA_COMMIT, tpe = SQL_MERGE_TABLE;
dlist *l = L();
append_int(l, tpe);
- append_list(l, $3);
- append_symbol(l, $4);
+ append_list(l, $4);
+ append_symbol(l, $5);
append_int(l, commit_action);
append_string(l, NULL);
+ append_int(l, $3);
$$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
- | REPLICA TABLE qname table_content_source
+ | REPLICA TABLE if_not_exists qname table_content_source
{ int commit_action = CA_COMMIT, tpe = SQL_REPLICA_TABLE;
dlist *l = L();
append_int(l, tpe);
- append_list(l, $3);
- append_symbol(l, $4);
+ append_list(l, $4);
+ append_symbol(l, $5);
append_int(l, commit_action);
append_string(l, NULL);
+ append_int(l, $3);
$$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
/* mapi:monetdb://host:port/database[/schema[/table]]
This also allows access via monetdbd.
We assume the monetdb user with default password */
- | REMOTE TABLE qname table_content_source ON STRING
+ | REMOTE TABLE if_not_exists qname table_content_source ON STRING
{ int commit_action = CA_COMMIT, tpe = SQL_REMOTE;
dlist *l = L();
append_int(l, tpe);
- append_list(l, $3);
- append_symbol(l, $4);
+ append_list(l, $4);
+ append_symbol(l, $5);
append_int(l, commit_action);
- append_string(l, $6);
+ append_string(l, $7);
+ append_int(l, $3);
$$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
- | opt_temp TABLE qname table_content_source opt_on_commit
+ | opt_temp TABLE if_not_exists qname table_content_source opt_on_commit
{ int commit_action = CA_COMMIT;
dlist *l = L();
append_int(l, $1);
- append_list(l, $3);
- append_symbol(l, $4);
+ append_list(l, $4);
+ append_symbol(l, $5);
if ($1 != SQL_PERSIST)
- commit_action = $5;
+ commit_action = $6;
append_int(l, commit_action);
append_string(l, NULL);
+ append_int(l, $3);
$$ = _symbol_create_list( SQL_CREATE_TABLE, l ); }
;
@@ -2394,10 +2401,11 @@ routine_designator:
;
drop_statement:
- drop TABLE qname drop_action
+ drop TABLE if_exists qname drop_action
{ dlist *l = L();
- append_list(l, $3 );
- append_int(l, $4 );
+ append_list(l, $4 );
+ append_int(l, $5 );
+ append_int(l, $3);
$$ = _symbol_create_list( SQL_DROP_TABLE, l ); }
| drop routine_designator drop_action
{ dlist *l = $2;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list