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