Changeset: a8543ecc7d74 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a8543ecc7d74 Modified Files: sql/backends/monet5/sql_cat.c sql/server/rel_psm.c sql/server/rel_schema.c sql/test/Tests/ifexists-views.sql Branch: Nov2019 Log Message:
With the 'IF EXISTS' option, if the SQL object's schema doesn't exist, make it still succeed diffs (243 lines): 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 @@ -465,13 +465,13 @@ static char * drop_trigger(mvc *sql, char *sname, char *tname, int if_exists) { sql_trigger *tri = NULL; - sql_schema *s = NULL; + sql_schema *s = cur_schema(sql); - if (sname && !(s = mvc_bind_schema(sql, sname))) + if (sname && !(s = mvc_bind_schema(sql, sname))) { + if (if_exists) + return MAL_SUCCEED; throw(SQL,"sql.drop_trigger",SQLSTATE(3F000) "DROP TRIGGER: no such schema '%s'", sname); - if (!s) - s = cur_schema(sql); - assert(s); + } if (!mvc_schema_privs(sql, s)) throw(SQL,"sql.drop_trigger",SQLSTATE(3F000) "DROP TRIGGER: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), s->base.name); @@ -488,14 +488,15 @@ drop_trigger(mvc *sql, char *sname, char static char * drop_table(mvc *sql, char *sname, char *tname, int drop_action, int if_exists) { - sql_schema *s = NULL; + sql_schema *s = cur_schema(sql); sql_table *t = NULL; node *n; - if (sname && !(s = mvc_bind_schema(sql, sname))) + if (sname && !(s = mvc_bind_schema(sql, sname))) { + if (if_exists) + return MAL_SUCCEED; throw(SQL,"sql.drop_table",SQLSTATE(3F000) "DROP TABLE: no such schema '%s'", sname); - if (!s) - s = cur_schema(sql); + } t = mvc_bind_table(sql, s, tname); if (!t && !sname) { s = tmp_schema(sql); @@ -543,21 +544,20 @@ static char * drop_view(mvc *sql, char *sname, char *tname, int drop_action, int if_exists) { sql_table *t = NULL; - sql_schema *ss = NULL; + sql_schema *ss = cur_schema(sql); - if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL) + if (sname && !(ss = mvc_bind_schema(sql, sname))) { + if (if_exists) + return MAL_SUCCEED; throw(SQL,"sql.dropview", SQLSTATE(3F000) "DROP VIEW: no such schema '%s'", sname); - - if (ss == NULL) - ss = cur_schema(sql); + } t = mvc_bind_table(sql, ss, tname); if (!mvc_schema_privs(sql, ss) && !(isTempSchema(ss) && t && t->persistence == SQL_LOCAL_TEMP)) { throw(SQL,"sql.dropview", SQLSTATE(42000) "DROP VIEW: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), ss->base.name); } else if (!t) { - if (if_exists){ + if (if_exists) return MAL_SUCCEED; - } throw(SQL,"sql.drop_view",SQLSTATE(42S02) "DROP VIEW: unknown view '%s'", tname); } else if (!isView(t)) { throw(SQL,"sql.drop_view", SQLSTATE(42000) "DROP VIEW: unable to drop view '%s': is a table", tname); @@ -712,7 +712,7 @@ drop_seq(mvc *sql, char *sname, char *na static str drop_func(mvc *sql, char *sname, char *name, sqlid fid, sql_ftype type, int action) { - sql_schema *s = NULL; + sql_schema *s = cur_schema(sql); char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char *F = is_aggr ? "AGGREGATE" : (is_func ? "FUNCTION" : "PROCEDURE"); @@ -720,10 +720,11 @@ drop_func(mvc *sql, char *sname, char *n char *KF = type == F_FILT ? "FILTER " : type == F_UNION ? "UNION " : ""; char *kf = type == F_FILT ? "filter " : type == F_UNION ? "union " : ""; - if (sname && !(s = mvc_bind_schema(sql, sname))) + if (sname && !(s = mvc_bind_schema(sql, sname))) { + if (fid == -2) /* if exists option */ + return MAL_SUCCEED; throw(SQL,"sql.drop_func", SQLSTATE(3F000) "DROP %s%s: no such schema '%s'", KF, F, sname); - if (!s) - s = cur_schema(sql); + } if (fid >= 0) { node *n = find_sql_func_node(s, fid); if (n) { @@ -738,9 +739,9 @@ drop_func(mvc *sql, char *sname, char *n if (mvc_drop_func(sql, s, func, action)) throw(SQL,"sql.drop_func", SQLSTATE(HY013) MAL_MALLOC_FAIL); } - } else if (fid == -2) { //if exists option + } else if (fid == -2) { /* if exists option */ return MAL_SUCCEED; - } else { //fid == -1 + } else { /* fid == -1 */ node *n = NULL; list *list_func = schema_bind_func(sql, s, name, type); int res; 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 @@ -1107,30 +1107,32 @@ rel_drop_func(mvc *sql, dlist *qname, dl { const char *name = qname_table(qname); const char *sname = qname_schema(qname); - sql_schema *s = NULL; + sql_schema *s = cur_schema(sql); sql_func *func = NULL; char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE"); char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": ""; - - if (sname && !(s = mvc_bind_schema(sql, sname))) - return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s%s: no such schema '%s'", KF, F, sname); + char *f = is_aggr?"aggregate":(is_func?"function":"procedure"); + char *kf = type==F_FILT?"filter ": type==F_UNION?"union ": ""; - if (s == NULL) - s = cur_schema(sql); - - func = resolve_func(sql, s, name, typelist, type, "DROP", if_exists); + if (sname && !(s = mvc_bind_schema(sql, sname))) { + if (!if_exists) + return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s%s: no such schema '%s'", KF, F, sname); + } + + if (s) + func = resolve_func(sql, s, name, typelist, type, "DROP", if_exists); if (!func && !sname) { s = tmp_schema(sql); func = resolve_func(sql, s, name, typelist, type, "DROP", if_exists); } - if (func) + if (func && s) return rel_drop_function(sql->sa, s->base.name, name, func->base.id, type, drop_action); - else if(if_exists && !sql->session->status) - return rel_drop_function(sql->sa, s->base.name, name, -2, type, drop_action); - return NULL; + if (if_exists) + return rel_drop_function(sql->sa, sname, name, -2, type, drop_action); + return sql_error(sql, 02, SQLSTATE(42000) "DROP %s%s: %s%s %s not found", KF, F, kf, f, name); } static sql_rel* @@ -1359,11 +1361,11 @@ drop_trigger(mvc *sql, dlist *qname, int const char *tname = qname_table(qname); sql_schema *ss = cur_schema(sql); - if (!sname) - sname = ss->base.name; - - if (sname && !(ss = mvc_bind_schema(sql, sname))) + if (sname && !(ss = mvc_bind_schema(sql, sname))) { + if (if_exists) + return rel_drop_trigger(sql, sname, tname, if_exists); return sql_error(sql, 02, SQLSTATE(3F000) "DROP TRIGGER: no such schema '%s'", sname); + } if (!mvc_schema_privs(sql, ss)) return sql_error(sql, 02, SQLSTATE(3F000) "DROP TRIGGER: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), ss->base.name); 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 @@ -1058,12 +1058,10 @@ rel_create_table(sql_query *query, sql_s sname = s->base.name; if (mvc_bind_table(sql, s, name)) { - if (if_not_exists) { + char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE"; + if (if_not_exists) return rel_psm_block(sql->sa, new_exp_list(sql->sa)); - } else { - char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE"; - return sql_error(sql, 02, SQLSTATE(42S01) "%s TABLE: name '%s' already in use", cd, name); - } + return sql_error(sql, 02, SQLSTATE(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, SQLSTATE(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) { @@ -1400,24 +1398,17 @@ rel_create_schema(sql_query *query, dlis char *auth = schema_auth(auth_name); sqlid auth_id = sql->role_id; - if (auth && (auth_id = sql_find_auth(sql, auth)) < 0) { - sql_error(sql, 02, SQLSTATE(28000) "CREATE SCHEMA: no such authorization '%s'", auth); - return NULL; - } - if (sql->user_id != USER_MONETDB && sql->role_id != ROLE_SYSADMIN) { - sql_error(sql, 02, SQLSTATE(42000) "CREATE SCHEMA: insufficient privileges for user '%s'", stack_get_string(sql, "current_user")); - return NULL; - } + if (auth && (auth_id = sql_find_auth(sql, auth)) < 0) + return sql_error(sql, 02, SQLSTATE(28000) "CREATE SCHEMA: no such authorization '%s'", auth); + if (sql->user_id != USER_MONETDB && sql->role_id != ROLE_SYSADMIN) + return sql_error(sql, 02, SQLSTATE(42000) "CREATE SCHEMA: insufficient privileges for user '%s'", stack_get_string(sql, "current_user")); if (!name) name = auth; assert(name); if (mvc_bind_schema(sql, name)) { - if (!if_not_exists) { - sql_error(sql, 02, SQLSTATE(3F000) "CREATE SCHEMA: name '%s' already in use", name); - return NULL; - } else { - return rel_psm_block(sql->sa, new_exp_list(sql->sa)); - } + if (!if_not_exists) + return sql_error(sql, 02, SQLSTATE(3F000) "CREATE SCHEMA: name '%s' already in use", name); + return rel_psm_block(sql->sa, new_exp_list(sql->sa)); } else { sql_schema *os = sql->session->schema; dnode *n; @@ -1477,7 +1468,7 @@ sql_alter_table(sql_query *query, dlist if ((t = mvc_bind_table(sql, s, tname)) == NULL) { if (mvc_bind_table(sql, mvc_bind_schema(sql, "tmp"), tname) != NULL) return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: not supported on TEMPORARY table '%s'", tname); - if(if_exists) + if (if_exists) return rel_psm_block(sql->sa, new_exp_list(sql->sa)); return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", tname, s->base.name); } else { diff --git a/sql/test/Tests/ifexists-views.sql b/sql/test/Tests/ifexists-views.sql --- a/sql/test/Tests/ifexists-views.sql +++ b/sql/test/Tests/ifexists-views.sql @@ -14,4 +14,9 @@ DROP VIEW IF EXISTS view2; DROP VIEW view2; -- should fail SELECT * FROM view2; -- should fail +DROP FUNCTION IF EXISTS "idontexist"."idontexist"(); +DROP FUNCTION IF EXISTS "idontexist"."idontexist"(INT); +DROP FUNCTION IF EXISTS "sys"."idontexist"(); +DROP FUNCTION IF EXISTS "sys"."idontexist"(INT); + DROP TABLE tab0; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list