Changeset: f13608dcf4f5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f13608dcf4f5
Modified Files:
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_privileges.c
        sql/server/sql_semantic.c
        sql/server/sql_semantic.h
Branch: scoping2
Log Message:

Cleaned some error messages and made server run


diffs (truncated from 591 to 300 lines):

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
@@ -457,7 +457,7 @@ rel_psm_return( sql_query *query, sql_su
                sql_schema *s = NULL;
                sql_table *t = NULL;
 
-               if (!(t = find_table_on_scope(sql, &s, sname, tname, "RETURN")))
+               if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, 
"RETURN", false)))
                        return NULL;
 
                if (isDeclaredTable(t)) {
@@ -1243,7 +1243,7 @@ create_trigger(sql_query *query, dlist *
        int create = (!instantiate && sql->emode != m_deps), event, orientation;
        list *sq = NULL;
        sql_rel *r = NULL;
-       char *q, *base = replace ? "CREATE OR REPLACE" : "CREATE";
+       char *q, *base = replace ? "CREATE OR REPLACE TRIGGER" : "CREATE 
TRIGGER";
        dlist *columns = trigger_event->data.lval;
        const char *old_name = NULL, *new_name = NULL;
        dlist *stmts = triggered_action->h->next->next->data.lval;
@@ -1264,23 +1264,23 @@ create_trigger(sql_query *query, dlist *
        }
 
        if (create) {
-               if (!(t = find_table_on_scope(sql, &ss, sname, tname, base)))
+               if (!(t = find_table_or_view_on_scope(sql, &ss, sname, tname, 
base, false)))
                        return NULL;
                if (!mvc_schema_privs(sql, ss))
-                       return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: 
access denied for %s to schema '%s'", base, get_string_global_var(sql, 
"current_user"), ss->base.name);
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s: access 
denied for %s to schema '%s'", base, get_string_global_var(sql, 
"current_user"), ss->base.name);
                if (isView(t))
-                       return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: 
cannot create trigger on view '%s'", base, tname);
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot 
create trigger on view '%s'", base, tname);
        } else {
                ss = cur_schema(sql);
        }
        if (triggerschema && strcmp(triggerschema, ss->base.name) != 0)
-               return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: trigger 
and respective table must belong to the same schema", base);
+               return sql_error(sql, 02, SQLSTATE(42000) "%s: trigger and 
respective table must belong to the same schema", base);
        if (create && (st = mvc_bind_trigger(sql, ss, triggername)) != NULL) {
                if (replace) {
                        if (mvc_drop_trigger(sql, ss, st))
-                               return sql_error(sql, 02, SQLSTATE(HY013) "%s 
TRIGGER: %s", base, MAL_MALLOC_FAIL);
+                               return sql_error(sql, 02, SQLSTATE(HY013) "%s: 
%s", base, MAL_MALLOC_FAIL);
                } else {
-                       return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: 
name '%s' already in use", base, triggername);
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s: name 
'%s' already in use", base, triggername);
                }
        }
 
@@ -1288,30 +1288,30 @@ create_trigger(sql_query *query, dlist *
                switch (trigger_event->token) {
                        case SQL_INSERT: {
                                if (old_name)
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: old name not allowed at insert events", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: old name not allowed at insert events", base);
                                event = 0;
                        }       break;
                        case SQL_DELETE: {
                                if (new_name)
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: new name not allowed at delete events", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: new name not allowed at delete events", base);
                                event = 1;
                        }       break;
                        case SQL_TRUNCATE: {
                                if (new_name)
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: new name not allowed at truncate events", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: new name not allowed at truncate events", base);
                                event = 3;
                        }       break;
                        case SQL_UPDATE: {
                                if (old_name && new_name && !strcmp(old_name, 
new_name))
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: old and new names cannot be the same", base);
                                if (!old_name && new_name && !strcmp("old", 
new_name))
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: old and new names cannot be the same", base);
                                if (!new_name && old_name && !strcmp("new", 
old_name))
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base);
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s: old and new names cannot be the same", base);
                                event = 2;
                        }       break;
                        default:
-                               return sql_error(sql, 02, SQLSTATE(42000) "%s 
TRIGGER: invalid event: %s", base, token2string(trigger_event->token));
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s: 
invalid event: %s", base, token2string(trigger_event->token));
                }
 
                assert(triggered_action->h->type == type_int);
@@ -1508,8 +1508,10 @@ create_table_from_loader(sql_query *quer
        sql_rel *rel = NULL;
        sql_table *t = NULL;
 
-       if ((t = find_table_on_scope(sql, &s, sname, tname, "CREATE TABLE FROM 
LOADER")))
+       if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, "CREATE 
TABLE FROM LOADER", false)))
                return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM 
LOADER: name '%s' already in use", tname);
+       sql->errstr[0] = '\0'; /* reset table not found error */
+       sql->session->status = 0;
        if (!mvc_schema_privs(sql, s))
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE FROM 
LOADER: insufficient privileges for user '%s' in schema '%s'", 
get_string_global_var(sql, "current_user"), s->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
@@ -514,10 +514,13 @@ table_foreign_key(mvc *sql, char *name, 
        sql_schema *fs = ss;
        sql_table *ft = NULL;
 
-       ft = find_table_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT FOREIGN 
KEY");
+       ft = find_table_or_view_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT 
FOREIGN KEY", isView(t));
        /* self referenced table */
-       if (!ft && t->s == fs && strcmp(t->base.name, rtname) == 0)
+       if (!ft && t->s == fs && strcmp(t->base.name, rtname) == 0) {
+               sql->errstr[0] = '\0'; /* reset table not found error */
+               sql->session->status = 0;
                ft = t;
+       }
        if (!ft) {
                return SQL_ERR;
        } else if (list_find_name(t->keys.set, name)) {
@@ -851,7 +854,7 @@ table_element(sql_query *query, symbol *
                sql_table *ot = NULL;
                node *n;
 
-               if (!(ot = find_table_on_scope(sql, &os, sname, name, action)))
+               if (!(ot = find_table_or_view_on_scope(sql, &os, sname, name, 
action, isView(t))))
                        return SQL_ERR;
                for (n = ot->columns.set->h; n; n = n->next) {
                        sql_column *oc = n->data;
@@ -1111,26 +1114,27 @@ rel_create_table(sql_query *query, int t
 }
 
 static sql_rel *
-rel_create_view(sql_query *query, sql_schema *ss, dlist *qname, dlist 
*column_spec, symbol *ast, int check, int persistent, int replace)
+rel_create_view(sql_query *query, dlist *qname, dlist *column_spec, symbol 
*ast, int check, int persistent, int replace)
 {
        mvc *sql = query->sql;
        const char *name = qname_schema_object(qname);
        const char *sname = qname_schema(qname);
-       sql_schema *s = NULL;
+       sql_schema *s = cur_schema(sql);
        sql_table *t = NULL;
        int instantiate = (sql->emode == m_instantiate || !persistent);
        int deps = (sql->emode == m_deps);
        int create = (!instantiate && !deps);
        const char *base = replace ? "CREATE OR REPLACE VIEW" : "CREATE VIEW";
 
-       (void) ss;
        (void) check;           /* Stefan: unused!? */
 
-       t = find_table_on_scope(sql, &s, sname, name, base);
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               return sql_error(sql, 02, SQLSTATE(3F000) "CREATE VIEW: no such 
schema '%s'", sname);
+       if (create && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
persistent == SQL_LOCAL_TEMP)))
+               return sql_error(sql, 02, SQLSTATE(42000) "%s VIEW: access 
denied for %s to schema '%s'", base, get_string_global_var(sql, 
"current_user"), s->base.name);
+
        if (create) {
-               if (t) {
-                       if ((!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 ((t = find_table_or_view_on_scope(sql, &s, sname, name, 
base, true))) {
                        if (replace) {
                                if (!isView(t)) {
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "%s: unable to drop view '%s': is a table", base, name);
@@ -1149,10 +1153,11 @@ rel_create_view(sql_query *query, sql_sc
                        } else {
                                return sql_error(sql, 02, SQLSTATE(42S01) "%s: 
name '%s' already in use", base, name);
                        }
+               } else {
+                       sql->errstr[0] = '\0'; /* reset table not found error */
+                       sql->session->status = 0;
                }
-       } else if (!t)
-               return NULL;
-
+       }
        if (ast) {
                sql_rel *sq = NULL;
                char *q = QUERY(sql->scanner);
@@ -1192,8 +1197,6 @@ rel_create_view(sql_query *query, sql_sc
                        }
                        return rel_table(sql, ddl_create_view, s->base.name, t, 
SQL_PERSIST);
                }
-               s = NULL;
-               t = find_table_on_scope(sql, &s, sname, name, base);
                if (!persistent && column_spec)
                        sq = view_rename_columns(sql, name, sq, column_spec);
                if (sq && sq->op == op_project && sq->l && sq->exps && sq->card 
== CARD_AGGR) {
@@ -1384,17 +1387,46 @@ rel_create_schema(sql_query *query, dlis
        }
 }
 
-static str
-get_schema_name(mvc *sql, sql_schema *s, char *sname, char *tname, const char 
*err)
+static sql_rel *
+sql_drop_table(sql_query *query, dlist *qname, int nr, int if_exists)
 {
-       if (!sname) {
-               sql_table *t = find_table_on_scope(sql, &s, sname, tname, err);
+       mvc *sql = query->sql;
+       char *sname = qname_schema(qname);
+       char *tname = qname_schema_object(qname);
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+
+       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "DROP 
TABLE", false))) {
+               if (if_exists) {
+                       sql->errstr[0] = '\0'; /* reset table not found error */
+                       sql->session->status = 0;
+                       return rel_psm_block(sql->sa, new_exp_list(sql->sa));
+               }
+               return NULL;
+       }
 
-               if (t && t->s)
-                       return t->s->base.name;
-               return s->base.name;
+       return rel_drop(sql->sa, ddl_drop_table, s->base.name, tname, nr, 
if_exists);
+}
+
+static sql_rel *
+sql_drop_view(sql_query *query, dlist *qname, int nr, int if_exists)
+{
+       mvc *sql = query->sql;
+       char *sname = qname_schema(qname);
+       char *tname = qname_schema_object(qname);
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+
+       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "DROP 
VIEW", true))) {
+               if (if_exists) {
+                       sql->errstr[0] = '\0'; /* reset table not found error */
+                       sql->session->status = 0;
+                       return rel_psm_block(sql->sa, new_exp_list(sql->sa));
+               }
+               return NULL;
        }
-       return sname;
+
+       return rel_drop(sql->sa, ddl_drop_view, s->base.name, tname, nr, 
if_exists);
 }
 
 static sql_rel *
@@ -1408,9 +1440,12 @@ sql_alter_table(sql_query *query, dlist 
        sql_rel *res = NULL, *r;
        sql_exp **updates, *e;
 
-       if (!(t = find_table_on_scope(sql, &s, sname, tname, "ALTER TABLE"))) {
-               if (if_exists)
+       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "ALTER 
TABLE", false))) {
+               if (if_exists) {
+                       sql->errstr[0] = '\0'; /* reset table not found error */
+                       sql->session->status = 0;
                        return rel_psm_block(sql->sa, new_exp_list(sql->sa));
+               }
                return NULL;
        }
        if (!mvc_schema_privs(sql, s))
@@ -1431,7 +1466,7 @@ sql_alter_table(sql_query *query, dlist 
                char *nsname = qname_schema(nqname);
                char *ntname = qname_schema_object(nqname);
 
-               if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname, 
"ALTER TABLE")))
+               if (!(pt = find_table_or_view_on_scope(sql, &spt, nsname, 
ntname, "ALTER TABLE", false)))
                        return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: 
no such table '%s' in schema '%s'", ntname, spt->base.name);
                if (isView(pt))
                        return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a view into a %s",
@@ -1529,8 +1564,9 @@ sql_alter_table(sql_query *query, dlist 
                char *kname = l->h->data.sval;
                int drop_action = l->h->next->data.i_val;
 
-               sname = get_schema_name(sql, s, sname, tname, "DROP 
CONSTRAINT");
-               return rel_drop(sql->sa, ddl_drop_constraint, sname, kname, 
drop_action, 0);
+               if (!(t = find_table_or_view_on_scope(sql, &s, sname, kname, 
"DROP CONSTRAINT", isView(t))))
+                       return NULL;
+               return rel_drop(sql->sa, ddl_drop_constraint, s->base.name, 
kname, drop_action, 0);
        }
 
        if (t->s && !nt->s)
@@ -1849,8 +1885,10 @@ rel_grant_privs(mvc *sql, sql_schema *cu
                sql_schema *s = NULL;
                sql_table *t = NULL;
 
-               if ((t = find_table_on_scope(sql, &s, sname, tname, "GRANT")))
+               if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, 
"GRANT", false)))
                        token = SQL_TABLE;
+               sql->errstr[0] = '\0'; /* reset table not found error */
+               sql->session->status = 0;
        }
 
        switch (token) {
@@ -2029,8 +2067,10 @@ rel_revoke_privs(mvc *sql, sql_schema *c
                sql_schema *s = NULL;
                sql_table *t = NULL;
 
-               if ((t = find_table_on_scope(sql, &s, sname, tname, "REVOKE")))
+               if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, 
"REVOKE", false)))
                        token = SQL_TABLE;
+               sql->errstr[0] = '\0'; /* reset table not found error */
+               sql->session->status = 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to