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

Reply via email to