Changeset: 301a8a02a89b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=301a8a02a89b
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_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_privileges.c
        sql/server/sql_semantic.c
        sql/server/sql_semantic.h
Branch: scoping2
Log Message:

Starting to implement search path. This is not functional yet, but there are 
some steps done.


diffs (truncated from 858 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
@@ -454,13 +454,11 @@ rel_psm_return( sql_query *query, sql_su
                dlist *l = return_sym->data.lval;
                const char *sname = qname_schema(l);
                const char *tname = qname_schema_object(l);
-               sql_schema *s = cur_schema(sql);
-               sql_table *t;
+               sql_schema *s = NULL;
+               sql_table *t = NULL;
 
-               if (sname && !(s = mvc_bind_schema(sql, sname)))
-                       return sql_error(sql, 02, SQLSTATE(3F000) "RETURN: no 
such schema '%s'", sname);
-               if (!(t = find_table_on_scope(sql, &s, sname, tname)))
-                       return sql_error(sql, 02, SQLSTATE(42S02) "RETURN: no 
such table '%s'", tname);
+               if (!(t = find_table_on_scope(sql, &s, sname, tname, "RETURN")))
+                       return NULL;
 
                if (isDeclaredTable(t)) {
                        rel = rel_table(sql, ddl_create_table, s->base.name, t, 
SQL_DECLARED_TABLE);
@@ -1238,7 +1236,7 @@ create_trigger(sql_query *query, dlist *
        const char *triggername = qname_schema_object(qname);
        const char *sname = qname_schema(tqname);
        const char *tname = qname_schema_object(tqname);
-       sql_schema *ss = cur_schema(sql), *old_schema = cur_schema(sql);
+       sql_schema *ss = NULL, *old_schema = cur_schema(sql);
        sql_table *t = NULL;
        sql_trigger *st = NULL;
        int instantiate = (sql->emode == m_instantiate);
@@ -1251,9 +1249,6 @@ create_trigger(sql_query *query, dlist *
        dlist *stmts = triggered_action->h->next->next->data.lval;
        symbol *condition = triggered_action->h->next->data.sym;
 
-       if (sname && !(ss = mvc_bind_schema(sql, sname)))
-               return sql_error(sql, 02, SQLSTATE(3F000) "%s TRIGGER: no such 
schema '%s'", base, sname);
-
        if (opt_ref) {
                dnode *dl = opt_ref->h;
                for ( ; dl; dl = dl->next) {
@@ -1268,14 +1263,16 @@ create_trigger(sql_query *query, dlist *
                }
        }
 
-       if (create && !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);
        if (create) {
-               if (!(t = find_table_on_scope(sql, &ss, sname, tname)))
-                       return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: 
unknown table '%s'", base, tname);
+               if (!(t = find_table_on_scope(sql, &ss, sname, tname, base)))
+                       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);
+               if (isView(t))
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: 
cannot create trigger on view '%s'", base, tname);
+       } else {
+               ss = cur_schema(sql);
        }
-       if (create && isView(t))
-               return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: cannot 
create trigger on view '%s'", base, tname);
        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);
        if (create && (st = mvc_bind_trigger(sql, ss, triggername)) != NULL) {
@@ -1504,19 +1501,17 @@ static sql_rel*
 create_table_from_loader(sql_query *query, dlist *qname, symbol *fcall)
 {
        mvc *sql = query->sql;
-       sql_schema *s = cur_schema(sql);
+       sql_schema *s = NULL;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
        sql_subfunc *loader = NULL;
        sql_rel *rel = NULL;
        sql_table *t = NULL;
 
-       if (sname && !(s = mvc_bind_schema(sql, sname)))
-               return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE FROM 
LOADER: no such schema '%s'", sname);
+       if ((t = find_table_on_scope(sql, &s, sname, tname, "CREATE TABLE FROM 
LOADER")))
+               return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM 
LOADER: name '%s' already in use", tname);
        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);
-       if ((t = find_table_on_scope(sql, &s, sname, tname)))
-               return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM 
LOADER: name '%s' already in use", tname);
 
        rel = rel_loader_function(query, fcall, new_exp_list(sql->sa), &loader);
        if (!rel || !loader)
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,16 +514,11 @@ table_foreign_key(mvc *sql, char *name, 
        sql_schema *fs = ss;
        sql_table *ft = NULL;
 
-       if (rsname && !(fs = mvc_bind_schema(sql, rsname))) {
-               (void) sql_error(sql, 02, SQLSTATE(3F000) "CONSTRAINT FOREIGN 
KEY: no such schema '%s'", rsname);
-               return SQL_ERR;
-       }
-       ft = find_table_on_scope(sql, &fs, rsname, rtname);
+       ft = find_table_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT FOREIGN 
KEY");
        /* self referenced table */
        if (!ft && t->s == fs && strcmp(t->base.name, rtname) == 0)
                ft = t;
        if (!ft) {
-               sql_error(sql, 02, SQLSTATE(42S02) "CONSTRAINT FOREIGN KEY: no 
such table '%s'\n", rtname);
                return SQL_ERR;
        } else if (list_find_name(t->keys.set, name)) {
                sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN KEY: key 
'%s' already exists", name);
@@ -856,14 +851,8 @@ table_element(sql_query *query, symbol *
                sql_table *ot = NULL;
                node *n;
 
-               if (sname && !(os = mvc_bind_schema(sql, sname))) {
-                       sql_error(sql, 02, SQLSTATE(3F000) "%s: no such schema 
'%s'", action, sname);
+               if (!(ot = find_table_on_scope(sql, &os, sname, name, action)))
                        return SQL_ERR;
-               }
-               if (!(ot = find_table_on_scope(sql, &os, sname, name))) {
-                       sql_error(sql, 02, SQLSTATE(3F000) "%s: no such table 
'%s'", action, name);
-                       return SQL_ERR;
-               }
                for (n = ot->columns.set->h; n; n = n->next) {
                        sql_column *oc = n->data;
 
@@ -1127,30 +1116,28 @@ rel_create_view(sql_query *query, sql_sc
        mvc *sql = query->sql;
        const char *name = qname_schema_object(qname);
        const char *sname = qname_schema(qname);
-       sql_schema *s = cur_schema(sql);
+       sql_schema *s = NULL;
        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" : "CREATE";
+       const char *base = replace ? "CREATE OR REPLACE VIEW" : "CREATE VIEW";
 
        (void) ss;
        (void) check;           /* Stefan: unused!? */
-       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);
-
+       t = find_table_on_scope(sql, &s, sname, name, base);
        if (create) {
-               if ((t = find_table_on_scope(sql, &s, sname, name))) {
+               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 (replace) {
                                if (!isView(t)) {
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "%s VIEW: unable to drop view '%s': is a table", base, name);
+                                       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 VIEW: cannot replace system view '%s'", base, name);
+                                       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 VIEW: cannot replace view '%s', there are database objects 
which depend on it", base, t->base.name);
+                                       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) {
@@ -1160,10 +1147,12 @@ rel_create_view(sql_query *query, sql_sc
                                        }
                                }
                        } else {
-                               return sql_error(sql, 02, SQLSTATE(42S01) "%s 
VIEW: name '%s' already in use", base, name);
+                               return sql_error(sql, 02, SQLSTATE(42S01) "%s: 
name '%s' already in use", base, name);
                        }
                }
-       }
+       } else if (!t)
+               return NULL;
+
        if (ast) {
                sql_rel *sq = NULL;
                char *q = QUERY(sql->scanner);
@@ -1172,7 +1161,7 @@ rel_create_view(sql_query *query, sql_sc
                        SelectNode *sn = (SelectNode *) ast;
 
                        if (sn->limit || sn->sample)
-                               return sql_error(sql, 01, SQLSTATE(42000) "%s 
VIEW: %s not supported", base, sn->limit ? "LIMIT" : "SAMPLE");
+                               return sql_error(sql, 01, SQLSTATE(42000) "%s: 
%s not supported", base, sn->limit ? "LIMIT" : "SAMPLE");
                }
 
                sq = schema_selects(query, s, ast);
@@ -1203,7 +1192,8 @@ rel_create_view(sql_query *query, sql_sc
                        }
                        return rel_table(sql, ddl_create_view, s->base.name, t, 
SQL_PERSIST);
                }
-               t = find_table_on_scope(sql, &s, sname, name);
+               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) {
@@ -1395,11 +1385,10 @@ rel_create_schema(sql_query *query, dlis
 }
 
 static str
-get_schema_name(mvc *sql, char *sname, char *tname)
+get_schema_name(mvc *sql, sql_schema *s, char *sname, char *tname, const char 
*err)
 {
        if (!sname) {
-               sql_schema *s = cur_schema(sql);
-               sql_table *t = find_table_on_scope(sql, &s, sname, tname);
+               sql_table *t = find_table_on_scope(sql, &s, sname, tname, err);
 
                if (t && t->s)
                        return t->s->base.name;
@@ -1414,24 +1403,18 @@ sql_alter_table(sql_query *query, dlist 
        mvc *sql = query->sql;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
-       sql_schema *s = cur_schema(sql);
+       sql_schema *s = NULL;
        sql_table *t = NULL, *nt = NULL;
        sql_rel *res = NULL, *r;
        sql_exp **updates, *e;
 
-       if (sname && !(s = mvc_bind_schema(sql, sname))) {
+       if (!(t = find_table_on_scope(sql, &s, sname, tname, "ALTER TABLE"))) {
                if (if_exists)
                        return rel_psm_block(sql->sa, new_exp_list(sql->sa));
-               return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE: no such 
schema '%s'", sname);
+               return NULL;
        }
        if (!mvc_schema_privs(sql, s))
                return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
s->base.name);
-
-       if (!(t = find_table_on_scope(sql, &s, sname, tname))) {
-               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);
-       }
        if (isDeclaredTable(t))
                return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: can't 
alter declared table '%s'", tname);
        if (isTempSchema(t->s))
@@ -1443,19 +1426,12 @@ sql_alter_table(sql_query *query, dlist 
 
        if ((te->token == SQL_TABLE || te->token == SQL_DROP_TABLE)) {
                dlist *nqname = te->data.lval->h->data.lval;
-               sql_schema *spt = NULL;
+               sql_schema *spt = s;
                sql_table *pt = NULL;
                char *nsname = qname_schema(nqname);
                char *ntname = qname_schema_object(nqname);
 
-               /* partition sname */
-               if (!nsname)
-                       nsname = sname;
-
-               if (nsname && !(spt = mvc_bind_schema(sql, nsname)))
-                       return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE: 
no such schema '%s'", sname);
-
-               if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname)))
+               if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname, 
"ALTER TABLE")))
                        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",
@@ -1553,7 +1529,7 @@ 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, sname, tname);
+               sname = get_schema_name(sql, s, sname, tname, "DROP 
CONSTRAINT");
                return rel_drop(sql->sa, ddl_drop_constraint, sname, kname, 
drop_action, 0);
        }
 
@@ -1859,7 +1835,6 @@ rel_grant_func(mvc *sql, sql_schema *cur
        return res;
 }
 
-
 static sql_rel *
 rel_grant_privs(mvc *sql, sql_schema *cur, dlist *privs, dlist *grantees, int 
grant, int grantor)
 {
@@ -1871,12 +1846,10 @@ rel_grant_privs(mvc *sql, sql_schema *cu
                dlist *qname = obj->data.lval;
                char *sname = qname_schema(qname);
                char *tname = qname_schema_object(qname);
-               sql_schema *s = cur;
+               sql_schema *s = NULL;
                sql_table *t = NULL;
 
-               if (sname && !(s = mvc_bind_schema(sql, sname)))
-                       return sql_error(sql, 02, SQLSTATE(3F000) "GRANT: no 
such schema '%s'", sname);
-               if ((t = find_table_on_scope(sql, &s, sname, tname)))
+               if ((t = find_table_on_scope(sql, &s, sname, tname, "GRANT")))
                        token = SQL_TABLE;
        }
 
@@ -2053,12 +2026,10 @@ rel_revoke_privs(mvc *sql, sql_schema *c
                dlist *qname = obj->data.lval;
                char *sname = qname_schema(qname);
                char *tname = qname_schema_object(qname);
-               sql_schema *s = cur;
+               sql_schema *s = NULL;
                sql_table *t = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to