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