Changeset: 828f97e2416f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=828f97e2416f
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/server/rel_psm.c
        sql/server/rel_schema.c
Branch: default
Log Message:

Cleanup at sql_cat.c

Throw right error message when schema is not existent.
Make sure mvc_schema_privs is called during the operation.
Corrected missing cases for 'if exists'.


diffs (truncated from 796 to 300 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
@@ -139,38 +139,41 @@ static char*
 validate_alter_table_add_table(mvc *sql, char* call, char *msname, char 
*mtname, char *psname, char *ptname,
                                                           sql_table **mt, 
sql_table **pt, int update)
 {
-       sql_schema *ms = mvc_bind_schema(sql, msname), *ps = 
mvc_bind_schema(sql, psname);
+       char *msg = MAL_SUCCEED;
+       sql_schema *ms = cur_schema(sql), *ps = cur_schema(sql);
        sql_table *rmt = NULL, *rpt = NULL;
 
-       if (ms)
-               rmt = mvc_bind_table(sql, ms, mtname);
-       if (ps)
-               rpt = mvc_bind_table(sql, ps, ptname);
-       *mt = rmt;
-       *pt = rpt;
-       if (!update && rmt && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
-               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table 
'%s.%s' to %s '%s.%s'", psname, ptname, TABLE_TYPE_DESCRIPTION(rmt->type, 
rmt->properties), msname, mtname);
-       if (rmt && rpt) {
-               char *msg;
-               node *n = cs_find_id(&rmt->members, rpt->base.id);
-               const char *errtable = TABLE_TYPE_DESCRIPTION(rmt->type, 
rmt->properties);
+       if (msname && !(ms = mvc_bind_schema(sql, msname)))
+               throw(SQL,call,SQLSTATE(3F000) "ALTER TABLE: no such schema 
'%s'", msname);
+       if (psname && !(ps = mvc_bind_schema(sql, psname)))
+               throw(SQL,call,SQLSTATE(3F000) "ALTER TABLE: no such schema 
'%s'", psname);
+       if (!mvc_schema_privs(sql, ms))
+               throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: access denied for 
%s to schema '%s'", stack_get_string(sql, "current_user"), ms->base.name);
+       if (!mvc_schema_privs(sql, ps))
+               throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: access denied for 
%s to schema '%s'", stack_get_string(sql, "current_user"), ps->base.name);
+       if (!(rmt = mvc_bind_table(sql, ms, mtname)))
+               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: no such table '%s' 
in schema '%s'", ms->base.name, mtname);
+       if (!(rpt = mvc_bind_table(sql, ps, ptname)))
+               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: no such table '%s' 
in schema '%s'", ps->base.name, mtname);
 
-               if (isView(rpt))
-                       throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: can't add 
a view into a %s", errtable);
-               if (ms->base.id != ps->base.id)
-                       throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: all 
children tables of '%s.%s' must be part of schema '%s'", msname, mtname, 
msname);
-               if (n && !update)
-                       throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table 
'%s.%s' is already part of %s '%s.%s'", psname, ptname, errtable, msname, 
mtname);
-               if (!n && update)
-                       throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table 
'%s.%s' isn't part of %s '%s.%s'", psname, ptname, errtable, msname, mtname);
-               if ((msg = rel_check_tables(rmt, rpt, errtable)) != NULL)
-                       return msg;
-               return MAL_SUCCEED;
-       } else if (rmt) {
-               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: no such table '%s' 
in schema '%s'", ptname, psname);
-       } else {
-               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: no such table '%s' 
in schema '%s'", mtname, msname);
-       }
+       const char *errtable = TABLE_TYPE_DESCRIPTION(rmt->type, 
rmt->properties);
+       if (!update && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
+               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table 
'%s.%s' to %s '%s.%s'", psname, ptname, errtable, msname, mtname);
+       node *n = cs_find_id(&rmt->members, rpt->base.id);
+       if (isView(rpt))
+               throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: can't add a view 
into a %s", errtable);
+       if (ms->base.id != ps->base.id)
+               throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: all children 
tables of '%s.%s' must be part of schema '%s'", msname, mtname, msname);
+       if (n && !update)
+               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table '%s.%s' is 
already part of %s '%s.%s'", psname, ptname, errtable, msname, mtname);
+       if (!n && update)
+               throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table '%s.%s' 
isn't part of %s '%s.%s'", psname, ptname, errtable, msname, mtname);
+       if ((msg = rel_check_tables(rmt, rpt, errtable)) != MAL_SUCCEED)
+               return msg;
+
+       *mt = rmt;
+       *pt = rpt;      
+       return MAL_SUCCEED;
 }
 
 static char *
@@ -364,49 +367,53 @@ finish:
 static char *
 alter_table_del_table(mvc *sql, char *msname, char *mtname, char *psname, char 
*ptname, int drop_action)
 {
-       sql_schema *ms = mvc_bind_schema(sql, msname), *ps = 
mvc_bind_schema(sql, psname);
+       sql_schema *ms = cur_schema(sql), *ps = cur_schema(sql);
        sql_table *mt = NULL, *pt = NULL;
-
-       if (ms)
-               mt = mvc_bind_table(sql, ms, mtname);
-       if (ps)
-               pt = mvc_bind_table(sql, ps, ptname);
-       if (mt && pt) {
-               node *n = NULL;
+       node *n = NULL;
 
-               if (!pt || (n = cs_find_id(&mt->members, pt->base.id)) == NULL)
-                       throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) 
"ALTER TABLE: table '%s.%s' isn't part of the MERGE TABLE '%s.%s'", psname, 
ptname, msname, mtname);
+       if (msname && !(ms = mvc_bind_schema(sql, msname)))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(3F000) "ALTER 
TABLE: no such schema '%s'", msname);
+       if (psname && !(ps = mvc_bind_schema(sql, psname)))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(3F000) "ALTER 
TABLE: no such schema '%s'", psname);
+       if (!mvc_schema_privs(sql, ms))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42000) "ALTER 
TABLE: access denied for %s to schema '%s'", stack_get_string(sql, 
"current_user"), ms->base.name);
+       if (!mvc_schema_privs(sql, ps))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42000) "ALTER 
TABLE: access denied for %s to schema '%s'", stack_get_string(sql, 
"current_user"), ps->base.name);
+       if (!(mt = mvc_bind_table(sql, ms, mtname)))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", ms->base.name, mtname);
+       if (!(pt = mvc_bind_table(sql, ps, ptname)))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", ps->base.name, mtname);
+       const char *errtable = TABLE_TYPE_DESCRIPTION(mt->type, mt->properties);
+       if (!isMergeTable(mt) && !isReplicaTable(mt))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: cannot drop table '%s.%s' to %s '%s.%s'", psname, ptname, errtable, 
msname, mtname);
+       if (!(n = cs_find_id(&mt->members, pt->base.id)))
+               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: table '%s.%s' isn't part of the MERGE TABLE '%s.%s'", ps->base.name, 
ptname, ms->base.name, mtname);
 
-               sql_trans_del_table(sql->session->tr, mt, pt, drop_action);
-       } else if (mt) {
-               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", ptname, psname);
-       } else {
-               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", mtname, msname);
-       }
+       sql_trans_del_table(sql->session->tr, mt, pt, drop_action);
        return MAL_SUCCEED;
 }
 
 static char *
 alter_table_set_access(mvc *sql, char *sname, char *tname, int access)
 {
-       sql_schema *s = mvc_bind_schema(sql, sname);
+       sql_schema *s = cur_schema(sql);
        sql_table *t = NULL;
 
-       if (s)
-               t = mvc_bind_table(sql, s, tname);
-       if (t) {
-               if (isMergeTable(t))
-                       throw(SQL,"sql.alter_table_set_access",SQLSTATE(42S02) 
"ALTER TABLE: read only MERGE TABLES are not supported");
-               if (t->access != access) {
-                       if (access && table_has_updates(sql->session->tr, t))
-                               
throw(SQL,"sql.alter_table_set_access",SQLSTATE(40000) "ALTER TABLE: set READ 
or INSERT ONLY not possible with outstanding updates (wait until updates are 
flushed)\n");
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               throw(SQL,"sql.alter_table_set_access",SQLSTATE(3F000) "ALTER 
TABLE: no such schema '%s'", sname);
+       if (s && !mvc_schema_privs(sql, s))
+               throw(SQL,"sql.alter_table_set_access",SQLSTATE(42000) "ALTER 
TABLE: access denied for %s to schema '%s'", stack_get_string(sql, 
"current_user"), s->base.name);
+       if (!(t = mvc_bind_table(sql, s, tname)))
+               throw(SQL,"sql.alter_table_set_access",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", tname, s->base.name);
+       if (isMergeTable(t))
+               throw(SQL,"sql.alter_table_set_access",SQLSTATE(42S02) "ALTER 
TABLE: read only MERGE TABLES are not supported");
+       if (t->access != access) {
+               if (access && table_has_updates(sql->session->tr, t))
+                       throw(SQL,"sql.alter_table_set_access",SQLSTATE(40000) 
"ALTER TABLE: set READ or INSERT ONLY not possible with outstanding updates 
(wait until updates are flushed)\n");
 
-                       mvc_access(sql, t, access);
-                       if (access == 0)
-                               sql_drop_statistics(sql, t);
-               }
-       } else {
-               throw(SQL,"sql.alter_table_set_access",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", tname, sname);
+               mvc_access(sql, t, access);
+               if (access == 0)
+                       sql_drop_statistics(sql, t);
        }
        return MAL_SUCCEED;
 }
@@ -415,21 +422,17 @@ static char *
 create_trigger(mvc *sql, char *sname, char *tname, char *triggername, int 
time, int orientation, int event, char *old_name, char *new_name, char 
*condition, char *query)
 {
        sql_trigger *tri = NULL;
-       sql_schema *s = NULL;
+       sql_schema *s = cur_schema(sql);
        sql_table *t;
 
        if (sname && !(s = mvc_bind_schema(sql, sname)))
                throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: 
no such schema '%s'", sname);
-       if (!s)
-               s = cur_schema(sql);
        if (!mvc_schema_privs(sql, s))
-               throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: 
access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
-       if (mvc_bind_trigger(sql, s, triggername) != NULL)
+               throw(SQL,"sql.create_trigger",SQLSTATE(42000) "CREATE TRIGGER: 
access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
+       if (mvc_bind_trigger(sql, s, triggername))
                throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: 
name '%s' already in use", triggername);
-
        if (!(t = mvc_bind_table(sql, s, tname)))
                throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: 
unknown table '%s'", tname);
-
        if (isView(t))
                throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: 
cannot create trigger on view '%s'", tname);
 
@@ -462,15 +465,15 @@ 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);
+               throw(SQL,"sql.drop_trigger",SQLSTATE(42000) "DROP TRIGGER: 
access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
 
        if ((tri = mvc_bind_trigger(sql, s, tname)) == NULL) {
                if (if_exists)
@@ -485,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);
@@ -501,14 +505,14 @@ drop_table(mvc *sql, char *sname, char *
        if (!t) {
                if (if_exists)
                        return MAL_SUCCEED;
-               throw(SQL,"sql.droptable", SQLSTATE(42S02) "DROP TABLE: no such 
table '%s'", tname);
-       } else if (isView(t)) {
-               throw(SQL,"sql.droptable", SQLSTATE(42000) "DROP TABLE: cannot 
drop VIEW '%s'", tname);
-       } else if (t->system) {
-               throw(SQL,"sql.droptable", SQLSTATE(42000) "DROP TABLE: cannot 
drop system table '%s'", tname);
-       } else if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)) {
-               throw(SQL,"sql.droptable",SQLSTATE(42000) "DROP TABLE: access 
denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
+               throw(SQL,"sql.drop_table", SQLSTATE(42S02) "DROP TABLE: no 
such table '%s'", tname);
        }
+       if (isView(t))
+               throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: cannot 
drop VIEW '%s'", tname);
+       if (t->system)
+               throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: cannot 
drop system table '%s'", tname);
+       if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && t->persistence == 
SQL_LOCAL_TEMP))
+               throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: access 
denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        if (!drop_action && t->keys.set) {
                for (n = t->keys.set->h; n; n = n->next) {
                        sql_key *k = n->data;
@@ -523,7 +527,7 @@ drop_table(mvc *sql, char *sname, char *
                                                k = l->data;
                                                /* make sure it is not a self 
referencing key */
                                                if (k->t != t)
-                                                       
throw(SQL,"sql.droptable", SQLSTATE(40000) "DROP TABLE: FOREIGN KEY %s.%s 
depends on %s", k->t->base.name, k->base.name, tname);
+                                                       
throw(SQL,"sql.drop_table", SQLSTATE(40000) "DROP TABLE: FOREIGN KEY %s.%s 
depends on %s", k->t->base.name, k->base.name, tname);
                                        }
                                }
                        }
@@ -531,7 +535,7 @@ drop_table(mvc *sql, char *sname, char *
        }
 
        if (!drop_action && mvc_check_dependency(sql, t->base.id, 
TABLE_DEPENDENCY, NULL))
-               throw (SQL,"sql.droptable",SQLSTATE(42000) "DROP TABLE: unable 
to drop table %s (there are database objects which depend on it)\n", 
t->base.name);
+               throw (SQL,"sql.drop_table",SQLSTATE(42000) "DROP TABLE: unable 
to drop table %s (there are database objects which depend on it)\n", 
t->base.name);
 
        return mvc_drop_table(sql, s, t, drop_action);
 }
@@ -540,29 +544,26 @@ static char *
 drop_view(mvc *sql, char *sname, char *tname, int drop_action, int if_exists)
 {
        sql_table *t = NULL;
-       sql_schema *ss = NULL;
-
-       if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL)
-               throw(SQL,"sql.dropview", SQLSTATE(3F000) "DROP VIEW: no such 
schema '%s'", sname);
-
-       if (ss == NULL)
-               ss = cur_schema(sql);
+       sql_schema *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 (sname && !(ss = mvc_bind_schema(sql, sname))) {
+               if (if_exists)
                        return MAL_SUCCEED;
-               }
+               throw(SQL,"sql.drop_view", SQLSTATE(3F000) "DROP VIEW: no such 
schema '%s'", sname);
+       }
+       if (!(t = mvc_bind_table(sql, ss, tname))) {
+               if (if_exists)
+                       return MAL_SUCCEED;
                throw(SQL,"sql.drop_view",SQLSTATE(42S02) "DROP VIEW: unknown 
view '%s'", tname);
-       } else if (!isView(t)) {
+       }
+       if (!mvc_schema_privs(sql, ss) && !(isTempSchema(ss) && t && 
t->persistence == SQL_LOCAL_TEMP))
+               throw(SQL,"sql.drop_view", SQLSTATE(42000) "DROP VIEW: access 
denied for %s to schema '%s'", stack_get_string(sql, "current_user"), 
ss->base.name);
+       if (!isView(t))
                throw(SQL,"sql.drop_view", SQLSTATE(42000) "DROP VIEW: unable 
to drop view '%s': is a table", tname);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to