Changeset: 6c5d5af7666b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6c5d5af7666b
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_cat.c
        sql/server/rel_schema.c
Branch: Jul2021
Log Message:

Replace views on the backend


diffs (246 lines):

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
@@ -6187,7 +6187,7 @@ rel2bin_catalog_table(backend *be, sql_r
        mvc *sql = be->mvc;
        node *en = rel->exps->h;
        stmt *action = exp_bin(be, en->data, NULL, NULL, NULL, NULL, NULL, 
NULL, 0, 0, 0);
-       stmt *table = NULL, *sname, *tname = NULL, *kname = NULL, *ifexists = 
NULL;
+       stmt *table = NULL, *sname, *tname = NULL, *kname = NULL, *ifexists = 
NULL, *replace = NULL;
        list *l = sa_list(sql->sa);
 
        if (!action)
@@ -6222,6 +6222,7 @@ rel2bin_catalog_table(backend *be, sql_r
                        table = exp_bin(be, en->data, NULL, NULL, NULL, NULL, 
NULL, NULL, 0, 0, 0);
                        if (!table)
                                return NULL;
+                       en = en->next;
                }
                append(l, table);
        } else {
@@ -6229,12 +6230,23 @@ rel2bin_catalog_table(backend *be, sql_r
                        ifexists = exp_bin(be, en->data, NULL, NULL, NULL, 
NULL, NULL, NULL, 0, 0, 0);
                        if (!ifexists)
                                return NULL;
+                       en = en->next;
                } else {
                        ifexists = stmt_atom_int(be, 0);
                }
                append(l, ifexists);
        }
        append(l, action);
+       if (rel->flag == ddl_create_view) {
+               if (en) {
+                       replace = exp_bin(be, en->data, NULL, NULL, NULL, NULL, 
NULL, NULL, 0, 0, 0);
+                       if (!replace)
+                               return NULL;
+               } else {
+                       replace = stmt_atom_int(be, 0);
+               }
+               append(l, replace);
+       }
        return stmt_catalog(be, rel->flag, stmt_list(be, l));
 }
 
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
@@ -307,33 +307,51 @@ SQLset_protocol(Client cntxt, MalBlkPtr 
 }
 
 str
-create_table_or_view(mvc *sql, char* sname, char *tname, sql_table *t, int 
temp)
+create_table_or_view(mvc *sql, char *sname, char *tname, sql_table *t, int 
temp, int replace)
 {
        sql_allocator *osa;
        sql_schema *s = mvc_bind_schema(sql, sname);
-       sql_table *nt = NULL;
+       sql_table *nt = NULL, *ot;
        node *n;
        int check = 0;
-       const char *action = (temp == SQL_DECLARED_TABLE) ? "DECLARE" : 
"CREATE";
+       const char *action = (temp == SQL_DECLARED_TABLE) ? "DECLARE" : 
(replace ? "CREATE OR REPLACE" : "CREATE");
        const char *obj = t->query ? "VIEW" : "TABLE";
+       str msg = MAL_SUCCEED;
 
        if (store_readonly(sql->session->tr->store))
                return sql_error(sql, 06, SQLSTATE(25006) "schema statements 
cannot be executed on a readonly database.");
 
        if (!s)
-               return sql_message(SQLSTATE(3F000) "%s %s: schema '%s' doesn't 
exist", action, obj, sname);
-       if (mvc_bind_table(sql, s, t->base.name)) {
-               return sql_message(SQLSTATE(42S01) "%s %s: name '%s' already in 
use", action, obj, t->base.name);
-       } else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && 
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) {
-               return sql_message(SQLSTATE(42000) "%s %s: insufficient 
privileges for user '%s' in schema '%s'", action, obj, 
get_string_global_var(sql, "current_user"), s->base.name);
-       } else if (temp == SQL_DECLARED_TABLE && ol_length(t->keys)) {
-               return sql_message(SQLSTATE(42000) "%s %s: '%s' cannot have 
constraints", action, obj, t->base.name);
-       }
+               return sql_error(sql, 02, SQLSTATE(3F000) "%s %s: schema '%s' 
doesn't exist", action, obj, sname);
+       if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && 
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP)))
+               return sql_error(sql, 02, SQLSTATE(42000) "%s %s: insufficient 
privileges for user '%s' in schema '%s'",
+                                                action, obj, 
get_string_global_var(sql, "current_user"), s->base.name);
+       if ((ot = mvc_bind_table(sql, s, t->base.name))) {
+               if (replace) {
+                       if (ot->type != t->type)
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s 
%s: unable to drop %s '%s': is a %s",
+                                                                action, obj, 
obj, t->base.name, TABLE_TYPE_DESCRIPTION(ot->type, ot->properties));
+                       if (ot->system)
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s 
%s: cannot replace system %s '%s'", action, obj, obj, t->base.name);
+                       if (mvc_check_dependency(sql, ot->base.id, isView(ot) ? 
VIEW_DEPENDENCY : TABLE_DEPENDENCY, NULL))
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s 
%s: cannot replace %s '%s', there are database objects which depend on it",
+                                                                action, obj, 
obj, t->base.name);
+                       if ((msg = mvc_drop_table(sql, s, ot, 0)) != 
MAL_SUCCEED) {
+                               sql_error(sql, 02, "%s", msg);
+                               freeException(msg);
+                               return NULL;
+                       }
+               } else {
+                       return sql_error(sql, 02, SQLSTATE(42S01) "%s %s: name 
'%s' already in use", action, obj, t->base.name);
+               }
+       }
+       if (temp == SQL_DECLARED_TABLE && ol_length(t->keys))
+               return sql_error(sql, 02, SQLSTATE(42000) "%s %s: '%s' cannot 
have constraints", action, obj, t->base.name);
 
        nt = sql_trans_create_table(sql->session->tr, s, tname, t->query, 
t->type, t->system, temp, t->commit_action,
                                                                t->sz, 
t->properties);
        if (!nt)
-               return sql_message(SQLSTATE(42000) "%s %s: '%s' name 
conflicts", action, obj, t->base.name);
+               return sql_error(sql, 02, SQLSTATE(42000) "%s %s: '%s' name 
conflicts", action, obj, t->base.name);
 
        osa = sql->sa;
        sql->sa = sql->ta;
@@ -586,7 +604,7 @@ create_table_from_emit(Client cntxt, cha
                if (!(col = mvc_create_column(sql, t, columns[i].name, &tpe)))
                        return sql_error(sql, 02, SQLSTATE(3F000) "CREATE 
TABLE: could not create column %s", columns[i].name);
        }
-       if ((msg = create_table_or_view(sql, sname, t->base.name, t, 0)) != 
MAL_SUCCEED)
+       if ((msg = create_table_or_view(sql, sname, t->base.name, t, 0, 0)) != 
MAL_SUCCEED)
                return msg;
        if (!(t = mvc_bind_table(sql, s, tname)))
                return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE 
TABLE: could not bind table %s", tname);
@@ -5817,7 +5835,7 @@ static mel_func sql_init_funcs[] = {
  pattern("wlr", "create_schema", WLRgeneric, false, "Catalog operation 
create_schema", args(0,3, arg("sname",str),arg("auth",str),arg("action",int))),
  pattern("wlr", "drop_schema", WLRgeneric, false, "Catalog operation 
drop_schema", args(0,3, 
arg("sname",str),arg("ifexists",int),arg("action",int))),
  pattern("wlr", "create_table", WLRgeneric, false, "Catalog operation 
create_table", args(0,3, arg("sname",str),arg("tname",str),arg("temp",int))),
- pattern("wlr", "create_view", WLRgeneric, false, "Catalog operation 
create_view", args(0,3, arg("sname",str),arg("tname",str),arg("temp",int))),
+ pattern("wlr", "create_view", WLRgeneric, false, "Catalog operation 
create_view", args(0,4, 
arg("sname",str),arg("tname",str),arg("temp",int),arg("replace",int))),
  pattern("wlr", "drop_table", WLRgeneric, false, "Catalog operation 
drop_table", args(0,4, 
arg("sname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
  pattern("wlr", "drop_view", WLRgeneric, false, "Catalog operation drop_view", 
args(0,4, 
arg("sname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
  pattern("wlr", "drop_constraint", WLRgeneric, false, "Catalog operation 
drop_constraint", args(0,5, 
arg("sname",str),arg("tname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
@@ -5840,8 +5858,8 @@ static mel_func sql_init_funcs[] = {
  pattern("wlr", "drop_role", WLRgeneric, false, "Catalog operation drop_role", 
args(0,2, arg("role",str),arg("action",int))),
  pattern("wlr", "drop_index", WLRgeneric, false, "Catalog operation 
drop_index", args(0,3, arg("sname",str),arg("iname",str),arg("action",int))),
  pattern("wlr", "drop_function", WLRgeneric, false, "Catalog operation 
drop_function", args(0,5, 
arg("sname",str),arg("fname",str),arg("fid",int),arg("type",int),arg("action",int))),
- pattern("wlr", "create_function", WLRgeneric, false, "Catalog operation 
create_function", args(0,2, arg("sname",str),arg("fname",str))),
- pattern("wlr", "create_trigger", WLRgeneric, false, "Catalog operation 
create_trigger", args(0,10, 
arg("sname",str),arg("tname",str),arg("triggername",str),arg("time",int),arg("orientation",int),arg("event",int),arg("old",str),arg("new",str),arg("cond",str),arg("qry",str))),
+ pattern("wlr", "create_function", WLRgeneric, false, "Catalog operation 
create_function", args(0,3, 
arg("sname",str),arg("fname",str),arg("replace",int))),
+ pattern("wlr", "create_trigger", WLRgeneric, false, "Catalog operation 
create_trigger", args(0,11, 
arg("sname",str),arg("tname",str),arg("triggername",str),arg("time",int),arg("orientation",int),arg("event",int),arg("old",str),arg("new",str),arg("cond",str),arg("qry",str),arg("replace",int))),
  pattern("wlr", "drop_trigger", WLRgeneric, false, "Catalog operation 
drop_trigger", args(0,3, arg("sname",str),arg("nme",str),arg("ifexists",int))),
  pattern("wlr", "alter_add_table", WLRgeneric, false, "Catalog operation 
alter_add_table", args(0,5, 
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("action",int))),
  pattern("wlr", "alter_del_table", WLRgeneric, false, "Catalog operation 
alter_del_table", args(0,5, 
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("action",int))),
@@ -5866,7 +5884,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sqlcatalog", "create_schema", SQLcreate_schema, false, "Catalog 
operation create_schema", args(0,3, 
arg("sname",str),arg("auth",str),arg("action",int))),
  pattern("sqlcatalog", "drop_schema", SQLdrop_schema, false, "Catalog 
operation drop_schema", args(0,3, 
arg("sname",str),arg("ifexists",int),arg("action",int))),
  pattern("sqlcatalog", "create_table", SQLcreate_table, false, "Catalog 
operation create_table", args(0,4, 
arg("sname",str),arg("tname",str),arg("tbl",ptr),arg("temp",int))),
- pattern("sqlcatalog", "create_view", SQLcreate_view, false, "Catalog 
operation create_view", args(0,4, 
arg("sname",str),arg("vname",str),arg("tbl",ptr),arg("temp",int))),
+ pattern("sqlcatalog", "create_view", SQLcreate_view, false, "Catalog 
operation create_view", args(0,5, 
arg("sname",str),arg("vname",str),arg("tbl",ptr),arg("temp",int),arg("replace",int))),
  pattern("sqlcatalog", "drop_table", SQLdrop_table, false, "Catalog operation 
drop_table", args(0,4, 
arg("sname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
  pattern("sqlcatalog", "drop_view", SQLdrop_view, false, "Catalog operation 
drop_view", args(0,4, 
arg("sname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
  pattern("sqlcatalog", "drop_constraint", SQLdrop_constraint, false, "Catalog 
operation drop_constraint", args(0,5, 
arg("sname",str),arg("tname",str),arg("name",str),arg("action",int),arg("ifexists",int))),
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
@@ -129,7 +129,7 @@ extern str sql_dense_rank(bat *rid, cons
 extern str SQLidentity(oid *rid, const void *i);
 extern str BATSQLidentity(bat *rid, const bat *bid);
 extern str PBATSQLidentity(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
-extern str create_table_or_view(mvc *sql, char* sname, char *tname, sql_table 
*t, int temp);
+extern str create_table_or_view(mvc *sql, char *sname, char *tname, sql_table 
*t, int temp, int replace);
 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
@@ -1469,7 +1469,7 @@ SQLcreate_table(Client cntxt, MalBlkPtr 
        int temp = *getArgReference_int(stk, pci, 4);
 
        initcontext();
-       msg = create_table_or_view(sql, sname, t->base.name, t, temp);
+       msg = create_table_or_view(sql, sname, t->base.name, t, temp, 0);
        return msg;
 }
 
@@ -1481,9 +1481,10 @@ SQLcreate_view(Client cntxt, MalBlkPtr m
        //str vname = *getArgReference_str(stk, pci, 2);
        sql_table *t = *(sql_table **) getArgReference(stk, pci, 3);
        int temp = *getArgReference_int(stk, pci, 4);
+       int replace = *getArgReference_int(stk, pci, 5);
 
        initcontext();
-       msg = create_table_or_view(sql, sname, t->base.name, t, temp);
+       msg = create_table_or_view(sql, sname, t->base.name, t, temp, replace);
        return msg;
 }
 
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
@@ -46,6 +46,16 @@ rel_table(mvc *sql, int cat_type, const 
 }
 
 static sql_rel *
+rel_create_view_ddl(mvc *sql, int cat_type, const char *sname, sql_table *t, 
int nr, int replace)
+{
+       sql_rel *rel = rel_table(sql, cat_type, sname, t, nr);
+       if (!rel)
+               return NULL;
+       append(rel->exps, exp_atom_int(sql->sa, replace));
+       return rel;
+}
+
+static sql_rel *
 rel_alter_table(sql_allocator *sa, int cattype, char *sname, char *tname, char 
*sname2, char *tname2, int action)
 {
        sql_rel *rel = rel_create(sa);
@@ -1184,29 +1194,9 @@ rel_create_view(sql_query *query, dlist 
                return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "%s: no 
such schema '%s'", base, sname);
        if (create && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
persistent == SQL_LOCAL_TEMP)))
                return sql_error(sql, 02, SQLSTATE(42000) "%s: access denied 
for %s to schema '%s'", base, get_string_global_var(sql, "current_user"), 
s->base.name);
+       if (create && !replace && mvc_bind_table(sql, s, name) != NULL)
+               return sql_error(sql, 02, SQLSTATE(42S01) "%s: name '%s' 
already in use", base, name);
 
-       if (create) {
-               if ((t = mvc_bind_table(sql, s, name))) {
-                       if (replace) {
-                               if (!isView(t)) {
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: unable to drop view '%s': is a table", base, name);
-                               } else if (t->system) {
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: cannot replace system view '%s'", base, name);
-                               } else if (mvc_check_dependency(sql, 
t->base.id, VIEW_DEPENDENCY, NULL)) {
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: cannot replace view '%s', there are database objects which 
depend on it", base, t->base.name);
-                               } else {
-                                       str output;
-                                       if ((output = mvc_drop_table(sql, s, t, 
0)) != MAL_SUCCEED) {
-                                               sql_error(sql, 02, 
SQLSTATE(42000) "%s", output);
-                                               freeException(output);
-                                               return NULL;
-                                       }
-                               }
-                       } else {
-                               return sql_error(sql, 02, SQLSTATE(42S01) "%s: 
name '%s' already in use", base, name);
-                       }
-               }
-       }
        if (ast) {
                sql_rel *sq = NULL;
                char *q = QUERY(sql->scanner);
@@ -1244,7 +1234,7 @@ rel_create_view(sql_query *query, dlist 
                                rel_destroy(sq);
                                return NULL;
                        }
-                       return rel_table(sql, ddl_create_view, s->base.name, t, 
SQL_PERSIST);
+                       return rel_create_view_ddl(sql, ddl_create_view, 
s->base.name, t, SQL_PERSIST, replace);
                }
                if (!persistent && column_spec)
                        sq = view_rename_columns(sql, name, sq, column_spec);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to