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

Input schema is just solely for tables. Clean up search functions


diffs (truncated from 422 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
@@ -73,11 +73,10 @@ psm_set_exp(sql_query *query, dnode *n)
                exp_kind ek = {type_value, card_value, FALSE};
                const char *sname = qname_schema(qname);
                const char *vname = qname_schema_object(qname);
-               sql_schema *s = NULL;
                sql_var *var = NULL;
                sql_arg *a = NULL;
 
-               if (!find_variable_on_scope(sql, &s, sname, vname, &var, &a, 
&tpe, &level, "SET"))
+               if (!find_variable_on_scope(sql, sname, vname, &var, &a, &tpe, 
&level, "SET"))
                        return NULL;
                if (!(e = rel_value_exp2(query, &rel, val, sql_sel | sql_psm, 
ek)))
                        return NULL;
@@ -110,11 +109,10 @@ psm_set_exp(sql_query *query, dnode *n)
                        const char *sname = qname_schema(nqname);
                        const char *vname = qname_schema_object(nqname);
                        sql_exp *v = n->data;
-                       sql_schema *s = NULL;
                        sql_var *var = NULL;
                        sql_arg *a = NULL;
 
-                       if (!find_variable_on_scope(sql, &s, sname, vname, 
&var, &a, &tpe, &level, "SET"))
+                       if (!find_variable_on_scope(sql, sname, vname, &var, 
&a, &tpe, &level, "SET"))
                                return NULL;
 
                        v = exp_ref(sql, v);
@@ -561,14 +559,13 @@ rel_select_into( sql_query *query, symbo
                dlist *qname = n->data.lval;
                const char *sname = qname_schema(qname);
                const char *vname = qname_schema_object(qname);
-               sql_schema *s = NULL;
                sql_exp *v = m->data;
                int level;
                sql_var *var;
                sql_subtype *tpe;
                sql_arg *a = NULL;
 
-               if (!find_variable_on_scope(sql, &s, sname, vname, &var, &a, 
&tpe, &level, "SELECT INTO"))
+               if (!find_variable_on_scope(sql, sname, vname, &var, &a, &tpe, 
&level, "SELECT INTO"))
                        return NULL;
 
                v = exp_ref(sql, v);
@@ -1379,9 +1376,9 @@ drop_trigger(mvc *sql, dlist *qname, int
 {
        const char *sname = qname_schema(qname);
        const char *tname = qname_schema_object(qname);
-       sql_schema *s = NULL;
+       sql_trigger *tr = NULL;
 
-       if (!find_trigger_on_scope(sql, &s, sname, tname, "DROP TRIGGER")) {
+       if (!(tr = find_trigger_on_scope(sql, sname, tname, "DROP TRIGGER"))) {
                if (if_exists) {
                        sql->errstr[0] = '\0'; /* reset trigger not found error 
*/
                        sql->session->status = 0;
@@ -1389,9 +1386,9 @@ drop_trigger(mvc *sql, dlist *qname, int
                }
                return NULL;
        }
-       if (!mvc_schema_privs(sql, s))
-               return sql_error(sql, 02, SQLSTATE(3F000) "DROP TRIGGER: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
s->base.name);
-       return rel_drop_trigger(sql, s->base.name, tname, if_exists);
+       if (!mvc_schema_privs(sql, tr->t->s))
+               return sql_error(sql, 02, SQLSTATE(3F000) "DROP TRIGGER: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
tr->t->s->base.name);
+       return rel_drop_trigger(sql, tr->t->s->base.name, tname, if_exists);
 }
 
 static sql_rel *
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
@@ -1213,13 +1213,13 @@ rel_drop_type(mvc *sql, dlist *qname, in
 {
        char *name = qname_schema_object(qname);
        char *sname = qname_schema(qname);
-       sql_schema *s = NULL;
+       sql_type *t = NULL;
 
-       if (!find_type_on_scope(sql, &s, sname, name, "DROP TYPE"))
+       if (!(t = find_type_on_scope(sql, sname, name, "DROP TYPE")))
                return NULL;
-       if (!mvc_schema_privs(sql, s))
-               return sql_error(sql, 02, SQLSTATE(42000) "DROP TYPE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
s->base.name);
-       return rel_schema2(sql->sa, ddl_drop_type, s->base.name, name, 
drop_action);
+       if (!mvc_schema_privs(sql, t->s))
+               return sql_error(sql, 02, SQLSTATE(42000) "DROP TYPE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
t->s->base.name);
+       return rel_schema2(sql->sa, ddl_drop_type, t->s->base.name, name, 
drop_action);
 }
 
 static sql_rel *
@@ -2187,7 +2187,6 @@ rel_find_designated_column(mvc *sql, sym
 static sqlid
 rel_find_designated_index(mvc *sql, symbol *sym, sql_schema **schema_out) {
        dlist *qname;
-       sql_schema *s = NULL;
        char *iname, *sname;
        sql_idx *idx;
 
@@ -2195,14 +2194,14 @@ rel_find_designated_index(mvc *sql, symb
        qname = sym->data.lval;
        sname = qname_schema(qname);
        iname = qname_schema_object(qname);
-       if (!(idx = find_idx_on_scope(sql, &s, sname, iname, "COMMENT ON")))
+       if (!(idx = find_idx_on_scope(sql, sname, iname, "COMMENT ON")))
                return 0;
        if (idx && idx->t->s && isTempSchema(idx->t->s)) {
                sql_error(sql, 02, SQLSTATE(42000) "COMMENT ON tmp object not 
allowed");
                return 0;
        }
        if (idx) {
-               *schema_out = s;
+               *schema_out = idx->t->s;
                return idx->base.id;
        }
 
@@ -2214,7 +2213,6 @@ rel_find_designated_sequence(mvc *sql, s
        (void)sql;
        (void)sym;
        dlist *qname;
-       sql_schema *s = NULL;
        char *seqname, *sname;
        sql_sequence *seq;
 
@@ -2223,13 +2221,13 @@ rel_find_designated_sequence(mvc *sql, s
        sname = qname_schema(qname);
        seqname = qname_schema_object(qname);
 
-       seq = find_sequence_on_scope(sql, &s, sname, seqname, "COMMENT ON");
+       seq = find_sequence_on_scope(sql, sname, seqname, "COMMENT ON");
        if (seq && seq->s && isTempSchema(seq->s)) {
                sql_error(sql, 02, SQLSTATE(42000) "COMMENT ON tmp object not 
allowed");
                return 0;
        }
        if (seq) {
-               *schema_out = s;
+               *schema_out = seq->s;
                return seq->base.id;
        }
 
@@ -2696,11 +2694,11 @@ rel_schemas(sql_query *query, symbol *s)
                dlist *l = s->data.lval;
                char *sname = qname_schema(l);
                char *iname = qname_schema_object(l);
-               sql_schema *s = NULL;
-               
-               if (!find_idx_on_scope(sql, &s, sname, iname, "DROP INDEX"))
+               sql_idx *idx = NULL;
+
+               if (!(idx = find_idx_on_scope(sql, sname, iname, "DROP INDEX")))
                        return NULL;
-               ret = rel_schema2(sql->sa, ddl_drop_index, s->base.name, iname, 
0);
+               ret = rel_schema2(sql->sa, ddl_drop_index, 
idx->t->s->base.name, iname, 0);
        }       break;
        case SQL_CREATE_USER: {
                dlist *l = s->data.lval;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -973,14 +973,13 @@ table_ref(sql_query *query, sql_rel *rel
 static sql_exp *
 rel_exp_variable_on_scope(mvc *sql, const char *sname, const char *vname)
 {
-       sql_schema *s = NULL;
        sql_subtype *tpe;
        sql_var *var = NULL;
        sql_arg *a = NULL;
        int level = 1;
 
        (void) tpe;
-       if (find_variable_on_scope(sql, &s, sname, vname, &var, &a, &tpe, 
&level, "SELECT")) {
+       if (find_variable_on_scope(sql, sname, vname, &var, &a, &tpe, &level, 
"SELECT")) {
                if (var) /* if variable is known from the stack or a global var 
*/
                        return exp_param_or_declared(sql->sa, var->sname ? 
sa_strdup(sql->sa, var->sname) : NULL, sa_strdup(sql->sa, var->name), 
&(var->var.tpe), level);
                if (a) /* if variable is a parameter */
@@ -3840,22 +3839,21 @@ rel_next_value_for( mvc *sql, symbol *se
 {
        char *sname = qname_schema(se->data.lval);
        char *seqname = qname_schema_object(se->data.lval);
-       sql_schema *s = NULL;
+       sql_sequence *seq = NULL;
        sql_subtype t;
        sql_subfunc *f;
 
        if (!stack_find_rel_view(sql, seqname)) {
-               if (!find_sequence_on_scope(sql, &s, sname, seqname, "NEXT 
VALUE FOR"))
+               if (!(seq = find_sequence_on_scope(sql, sname, seqname, "NEXT 
VALUE FOR")))
                        return NULL;
-               if (!mvc_schema_privs(sql, s))
-                       return sql_error(sql, 02, SQLSTATE(42000) "NEXT VALUE 
FOR: access denied for %s to schema '%s'", get_string_global_var(sql, 
"current_user"), s->base.name);
+               if (!mvc_schema_privs(sql, seq->s))
+                       return sql_error(sql, 02, SQLSTATE(42000) "NEXT VALUE 
FOR: access denied for %s to schema '%s'", get_string_global_var(sql, 
"current_user"), seq->s->base.name);
        }
        sql_find_subtype(&t, "varchar", 0, 0);
        f = sql_bind_func(sql, "sys", "next_value_for", &t, &t, F_FUNC);
        assert(f);
-       if (!s) /* sequence found in the stack. use session's schema? */
-               s = cur_schema(sql);
-       return exp_binop(sql->sa, exp_atom_str(sql->sa, s->base.name, &t), 
exp_atom_str(sql->sa, seqname, &t), f);
+       /* sequence found in the stack. use session's schema? */
+       return exp_binop(sql->sa, exp_atom_str(sql->sa, seq && seq->s ? 
seq->s->base.name : cur_schema(sql)->base.name, &t), exp_atom_str(sql->sa, 
seqname, &t), f);
 }
 
 /* some users like to use aliases already in the groupby */
diff --git a/sql/server/rel_sequence.c b/sql/server/rel_sequence.c
--- a/sql/server/rel_sequence.c
+++ b/sql/server/rel_sequence.c
@@ -245,21 +245,20 @@ rel_alter_seq(
        char *sname = qname_schema(qname);
        char *name = qname_schema_object(qname);
        sql_sequence *seq;
-       sql_schema *s = NULL;
        int start_type = start_list->h->data.i_val;
        sql_rel *r = NULL;
        sql_exp *val = NULL;
 
        assert(start_list->h->type == type_int);
        (void) tpe;
-       if (!(seq = find_sequence_on_scope(sql, &s, sname, name, "ALTER 
SEQUENCE")))
+       if (!(seq = find_sequence_on_scope(sql, sname, name, "ALTER SEQUENCE")))
                return NULL;
-       if (!mvc_schema_privs(sql, s))
+       if (!mvc_schema_privs(sql, seq->s))
                return sql_error(sql, 02, SQLSTATE(42000) "ALTER SEQUENCE: 
insufficient privileges "
-                               "for '%s' in schema '%s'", 
get_string_global_var(sql, "current_user"), s->base.name);
+                               "for '%s' in schema '%s'", 
get_string_global_var(sql, "current_user"), seq->s->base.name);
 
        /* first alter the known values */
-       seq = create_sql_sequence(sql->sa, s, name, seq->start, min, max, inc, 
cache, (bit) cycle);
+       seq = create_sql_sequence(sql->sa, seq->s, name, seq->start, min, max, 
inc, cache, (bit) cycle);
 
        /* restart may be a query, i.e. we create a statement
           restart(ssname,seqname,value) */
@@ -285,7 +284,7 @@ rel_alter_seq(
                sql_subfunc *zero_or_one = sql_bind_func(sql, "sys", 
"zero_or_one", exp_subtype(val), NULL, F_AGGR);
                val = exp_aggr1(sql->sa, val, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(val));
        }
-       return rel_seq(sql->sa, ddl_alter_seq, s->base.name, seq, r, val);
+       return rel_seq(sql->sa, ddl_alter_seq, seq->s->base.name, seq, r, val);
 }
 
 static sql_rel *
@@ -401,11 +400,11 @@ rel_sequences(sql_query *query, symbol *
                        dlist *l = s->data.lval;
                        char *sname = qname_schema(l->h->data.lval);
                        char *seqname = qname_schema_object(l->h->data.lval);
-                       sql_schema *s = NULL;
+                       sql_sequence *seq = NULL;
 
-                       if (!find_sequence_on_scope(sql, &s, sname, seqname, 
"DROP SEQUENCE"))
+                       if (!(seq = find_sequence_on_scope(sql, sname, seqname, 
"DROP SEQUENCE")))
                                return NULL;
-                       res = rel_drop_seq(sql->sa, s->base.name, seqname);
+                       res = rel_drop_seq(sql->sa, seq->s->base.name, seqname);
                }
                break;
                default:
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -116,10 +116,6 @@ tmp_schema(mvc *sql)
                } else { \
                        char *p, *sp, *search_path_copy; \
  \
-                       if (s && *s) { \
-                               found = *s; /* there's a default schema to 
search before all others, e.g. bind a child table from a merge table */ \
-                               CALL; \
-                       } \
                        EXTRA; \
                        if (!res && !sql->search_path_has_tmp) { /* if 'tmp' is 
not in the search path, search it before all others */ \
                                found = mvc_bind_schema(sql, "tmp"); \
@@ -146,12 +142,14 @@ tmp_schema(mvc *sql)
                } \
                if (!res) \
                        return sql_error(sql, ERR_NOTFOUND, ERROR_CODE "%s: no 
such %s %s%s%s'%s'", error, objstr, sname ? "'":"", sname ? sname : "", sname ? 
"'.":"", name); \
-               if (s) \
-                       *s = found; \
        } while (0)
 
 #define table_extra \
        do { \
+               if (s && *s) { \
+                       found = *s; /* there's a default schema to search 
before all others, e.g. bind a child table from a merge table */ \
+                       res = mvc_bind_table(sql, found, name); \
+               } \
                if (!res && strcmp(objstr, "table") == 0 && (res = 
stack_find_table(sql, name))) /* for tables, first try a declared table from 
the stack */ \
                        return res; \
        } while (0)
@@ -163,11 +161,13 @@ find_table_or_view_on_scope(mvc *sql, sq
        sql_table *res = NULL;
 
        search_object_on_path(res = mvc_bind_table(sql, found, name), 
DO_NOTHING, table_extra, SQLSTATE(42S02));
+       if (res && s)
+               *s = res->s;
        return res;
 }
 
 sql_sequence *
-find_sequence_on_scope(mvc *sql, sql_schema **s, const char *sname, const char 
*name, const char *error)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to