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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list