Changeset: db2d498a30ed for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=db2d498a30ed Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.mal sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_optimizer.c sql/backends/monet5/sql_result.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_upgrades.c sql/backends/monet5/sql_user.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_psm.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_semantic.c sql/server/rel_sequence.c sql/server/rel_updates.c sql/server/sql_env.c sql/server/sql_env.h sql/server/sql_mvc.c sql/server/sql_mvc.h sql/server/sql_parser.y sql/server/sql_privileges.c sql/server/sql_var.c Branch: scoping Log Message:
Adding schemas to declared variables. The server doesn't start yet. Also we have to decide how the scoping precedence will be. diffs (truncated from 1801 to 300 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -4552,7 +4552,7 @@ sql_stack_add_updated(mvc *sql, const ch r->l = ti; /* put single table into the stack with 2 names, needed for the psm code */ - if(!stack_push_rel_view(sql, on, r) || !stack_push_rel_view(sql, nn, rel_dup(r))) + if (!stack_push_rel_view(sql, on, r) || !stack_push_rel_view(sql, nn, rel_dup(r))) return 0; return 1; } diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -294,7 +294,7 @@ create_table_or_view(mvc *sql, char* sna char *cd = (temp == SQL_DECLARED_TABLE) ? "DECLARE" : "CREATE"; return sql_message(SQLSTATE(42S01) "%s TABLE: name '%s' already in use", cd, t->base.name); } else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) { - return sql_message(SQLSTATE(42000) "CREATE TABLE: insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + return sql_message(SQLSTATE(42000) "CREATE TABLE: insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } else if (temp == SQL_DECLARED_TABLE && !list_empty(t->keys.set)) { return sql_message(SQLSTATE(42000) "DECLARE TABLE: '%s' cannot have constraints", t->base.name); } @@ -617,26 +617,31 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M return sql_message(SQLSTATE(25006) "Deprecated statement"); } -/* setVariable(int *ret, str *name, any value) */ +/* setVariable(int *ret, str *sname, str *name, any value) */ str setVariable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { int *res = getArgReference_int(stk, pci, 0); mvc *m = NULL; str msg; - const char *varname = *getArgReference_str(stk, pci, 2); - int mtype = getArgType(mb, pci, 3); + const char *sname = *getArgReference_str(stk, pci, 2); + const char *varname = *getArgReference_str(stk, pci, 3); + int mtype = getArgType(mb, pci, 4); ValRecord *src; + sql_schema *s; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; if ((msg = checkSQLContext(cntxt)) != NULL) return msg; + if (!(s = mvc_bind_schema(m, sname))) + throw(SQL, "sql.setVariable", SQLSTATE(3F000) "Cannot find the schema %s", sname); + *res = 0; if (mtype < 0 || mtype >= 255) throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable type error"); - if (strcmp("optimizer", varname) == 0) { + if (!strcmp("tmp", s->base.name) && !strcmp("optimizer", varname)) { const char *newopt = *getArgReference_str(stk, pci, 3); if (newopt) { char buf[BUFSIZ]; @@ -648,30 +653,30 @@ setVariable(Client cntxt, MalBlkPtr mb, msg = addPipeDefinition(cntxt, buf, newopt); if (msg) return msg; - if (stack_find_var(m, varname)) { - if(!stack_set_string(m, varname, buf)) + if (stack_find_var(m, s, varname)) { + if (!stack_set_string(m, s, varname, buf)) throw(SQL, "sql.setVariable", SQLSTATE(HY013) MAL_MALLOC_FAIL); } - } else if (stack_find_var(m, varname)) { - if(!stack_set_string(m, varname, newopt)) + } else if (stack_find_var(m, s, varname)) { + if (!stack_set_string(m, s, varname, newopt)) throw(SQL, "sql.setVariable", SQLSTATE(HY013) MAL_MALLOC_FAIL); } } return MAL_SUCCEED; } src = &stk->stk[getArg(pci, 3)]; - if (stack_find_var(m, varname)) { + if (stack_find_var(m, s, varname)) { #ifdef HAVE_HGE hge sgn = val_get_number(src); #else lng sgn = val_get_number(src); #endif - if ((msg = sql_update_var(m, varname, src->val.sval, sgn)) != NULL) + if ((msg = sql_update_var(m, s, varname, src->val.sval, sgn)) != NULL) return msg; - if(!stack_set_var(m, varname, src)) + if (!stack_set_var(m, s, varname, src)) throw(SQL, "sql.setVariable", SQLSTATE(HY013) MAL_MALLOC_FAIL); } else { - throw(SQL, "sql.setVariable", SQLSTATE(42100) "variable '%s' unknown", varname); + throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable '%s.%s' unknown", sname, varname); } return MAL_SUCCEED; } @@ -683,18 +688,23 @@ getVariable(Client cntxt, MalBlkPtr mb, int mtype = getArgType(mb, pci, 0); mvc *m = NULL; str msg; - const char *varname = *getArgReference_str(stk, pci, 2); + const char *sname = *getArgReference_str(stk, pci, 2); + const char *varname = *getArgReference_str(stk, pci, 3); atom *a; ValRecord *dst, *src; + sql_schema *s; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; if ((msg = checkSQLContext(cntxt)) != NULL) return msg; + + if (!(s = mvc_bind_schema(m, sname))) + throw(SQL, "sql.getVariable", SQLSTATE(3F000) "Cannot find the schema %s", sname); if (mtype < 0 || mtype >= 255) throw(SQL, "sql.getVariable", SQLSTATE(42100) "Variable type error"); - if (!(a = stack_get_var(m, varname))) - throw(SQL, "sql.getVariable", SQLSTATE(42100) "variable '%s' unknown", varname); + if (!(a = stack_get_var(m, s, varname))) + throw(SQL, "sql.getVariable", SQLSTATE(42100) "Variable'%s.%s' unknown", sname, varname); src = &a->data; dst = &stk->stk[getArg(pci, 0)]; if (VALcopy(dst, src) == NULL) @@ -777,7 +787,7 @@ mvc_next_value(Client cntxt, MalBlkPtr m if (seq_next_value(seq, res)) { m->last_id = *res; - stack_set_number(m, "last_id", m->last_id); + stack_set_number(m, mvc_bind_schema(m, "tmp"), "last_id", m->last_id); return MAL_SUCCEED; } throw(SQL, "sql.next_value", SQLSTATE(42000) "Error in fetching next value for sequence %s.%s", sname, seqname); diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -86,11 +86,11 @@ pattern assert(b:lng,msg:str):void address SQLassertLng comment "Generate an exception when b!=0"; -pattern setVariable(mvc:int, varname:str, value:any_1 ):int +pattern setVariable(mvc:int, sname:str, varname:str, value:any_1 ):int address setVariable comment "Set the value of a session variable"; -pattern getVariable(mvc:int, varname:str ):any_1 +pattern getVariable(mvc:int, sname:str, varname:str ):any_1 address getVariable comment "Get the value of a session variable"; 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 @@ -423,7 +423,7 @@ create_trigger(mvc *sql, char *sname, ch 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); + throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); if (mvc_bind_trigger(sql, s, triggername) != NULL) throw(SQL,"sql.create_trigger",SQLSTATE(3F000) "CREATE TRIGGER: name '%s' already in use", triggername); @@ -470,7 +470,7 @@ drop_trigger(mvc *sql, char *sname, char 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(3F000) "DROP TRIGGER: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); if ((tri = mvc_bind_trigger(sql, s, tname)) == NULL) { if (if_exists) @@ -507,7 +507,7 @@ drop_table(mvc *sql, char *sname, char * } 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.droptable",SQLSTATE(42000) "DROP TABLE: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } if (!drop_action && t->keys.set) { for (n = t->keys.set->h; n; n = n->next) { @@ -550,7 +550,7 @@ drop_view(mvc *sql, char *sname, char *t 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); + throw(SQL,"sql.dropview", SQLSTATE(42000) "DROP VIEW: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), ss->base.name); } else if (!t) { if (if_exists){ return MAL_SUCCEED; @@ -599,7 +599,7 @@ drop_index(Client cntxt, mvc *sql, char if (!i) { throw(SQL,"sql.drop_index", SQLSTATE(42S12) "DROP INDEX: no such index '%s'", iname); } else if (!mvc_schema_privs(sql, s)) { - throw(SQL,"sql.drop_index", SQLSTATE(42000) "DROP INDEX: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_index", SQLSTATE(42000) "DROP INDEX: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } else { if (i->type == ordered_idx) { sql_kc *ic = i->columns->h->data; @@ -636,7 +636,7 @@ create_seq(mvc *sql, char *sname, char * if (find_sql_sequence(s, seq->base.name)) { throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: name '%s' already in use", seq->base.name); } else if (!mvc_schema_privs(sql, s)) { - throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } else if (is_lng_nil(seq->start) || is_lng_nil(seq->minvalue) || is_lng_nil(seq->maxvalue) || is_lng_nil(seq->increment) || is_lng_nil(seq->cacheinc) || is_bit_nil(seq->cycle)) { throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: sequence properties must be non-NULL"); @@ -665,7 +665,7 @@ alter_seq(mvc *sql, char *sname, char *s if (!(nseq = find_sql_sequence(s, seq->base.name))) throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: no such sequence '%s'", seq->base.name); else if (!mvc_schema_privs(sql, s)) - throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); /* if seq properties hold NULL values, then they should be ignored during the update */ /* first alter the known values */ sql_trans_alter_sequence(sql->session->tr, nseq, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle); @@ -697,7 +697,7 @@ drop_seq(mvc *sql, char *sname, char *na if (!(seq = find_sql_sequence(s, name))) { throw(SQL,"sql.drop_seq", SQLSTATE(42M35) "DROP SEQUENCE: no such sequence '%s'", name); } else if (!mvc_schema_privs(sql, s)) { - throw(SQL,"sql.drop_seq", SQLSTATE(42000) "DROP SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_seq", SQLSTATE(42000) "DROP SEQUENCE: insufficient privileges for '%s' in schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } if (mvc_check_dependency(sql, seq->base.id, BEDROPPED_DEPENDENCY, NULL)) throw(SQL,"sql.drop_seq", SQLSTATE(2B000) "DROP SEQUENCE: unable to drop sequence %s (there are database objects which depend on it)\n", seq->base.name); @@ -727,7 +727,7 @@ drop_func(mvc *sql, char *sname, char *n sql_func *func = n->data; if (!mvc_schema_privs(sql, s)) { - throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s%s: access denied for %s to schema '%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s%s: access denied for %s to schema '%s'", KF, F, stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } if (!action && mvc_check_dependency(sql, func->base.id, !IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL)) throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s%s: there are database objects dependent on %s%s %s;", KF, F, kf, f, func->base.name); @@ -744,7 +744,7 @@ drop_func(mvc *sql, char *sname, char *n if (!mvc_schema_privs(sql, s)) { list_destroy(list_func); - throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s%s: access denied for %s to schema '%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s%s: access denied for %s to schema '%s'", KF, F, stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } for (n = list_func->h; n; n = n->next) { sql_func *func = n->data; @@ -845,7 +845,7 @@ alter_table(Client cntxt, mvc *sql, char if ((nt = mvc_bind_table(sql, s, t->base.name)) == NULL) { throw(SQL,"sql.alter_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s'", t->base.name); } else if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && t->persistence == SQL_LOCAL_TEMP)) { - throw(SQL,"sql.alter_table", SQLSTATE(42000) "ALTER TABLE: insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.alter_table", SQLSTATE(42000) "ALTER TABLE: insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } /* First check if all the changes are allowed */ @@ -1034,7 +1034,7 @@ SQLcreate_schema(Client cntxt, MalBlkPtr throw(SQL,"sql.create_schema", SQLSTATE(42M32) "CREATE SCHEMA: no such authorization '%s'", name); } if (sql->user_id != USER_MONETDB && sql->role_id != ROLE_SYSADMIN) { - throw(SQL,"sql.create_schema", SQLSTATE(42000) "CREATE SCHEMA: insufficient privileges for user '%s'", stack_get_string(sql, "current_user")); + throw(SQL,"sql.create_schema", SQLSTATE(42000) "CREATE SCHEMA: insufficient privileges for user '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user")); } if (mvc_bind_schema(sql, sname)) { throw(SQL,"sql.create_schema", SQLSTATE(3F000) "CREATE SCHEMA: name '%s' already in use", sname); @@ -1061,7 +1061,7 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m if (!if_exists) throw(SQL,"sql.drop_schema",SQLSTATE(3F000) "DROP SCHEMA: name %s does not exist", sname); } else if (!mvc_schema_privs(sql, s)) { - throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); } else if (s == cur_schema(sql)) { throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: cannot drop current schema"); } else if (s->system) { @@ -1180,7 +1180,7 @@ SQLcreate_type(Client cntxt, MalBlkPtr m s = cur_schema(sql); if (!mvc_schema_privs(sql, s)) - throw(SQL,"sql.create_type", SQLSTATE(42000) "CREATE TYPE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.create_type", SQLSTATE(42000) "CREATE TYPE: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); if (schema_bind_type(sql, s, name)) throw(SQL,"sql.create_type", SQLSTATE(42S02) "CREATE TYPE: type '%s' already exists", name); if (!mvc_create_type(sql, s, name, 0, 0, 0, impl)) @@ -1206,7 +1206,7 @@ SQLdrop_type(Client cntxt, MalBlkPtr mb, s = cur_schema(sql); if (!mvc_schema_privs(sql, s)) - throw(SQL,"sql.drop_type", SQLSTATE(42000) "DROP TYPE: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), s->base.name); + throw(SQL,"sql.drop_type", SQLSTATE(42000) "DROP TYPE: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), s->base.name); else if (!(t = schema_bind_type(sql, s, name))) throw(SQL,"sql.drop_type", SQLSTATE(3F000) "DROP TYPE: type '%s' does not exist", name); else if (!drop_action && mvc_check_dependency(sql, t->base.id, TYPE_DEPENDENCY, NULL)) @@ -1611,7 +1611,7 @@ SQLrename_schema(Client cntxt, MalBlkPtr if (!(s = mvc_bind_schema(sql, old_name))) throw(SQL, "sql.rename_schema", SQLSTATE(42S02) "ALTER SCHEMA: no such schema '%s'", old_name); if (!mvc_schema_privs(sql, s)) - throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: access denied for %s to schema '%s'", stack_get_string(sql, "current_user"), old_name); + throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: access denied for %s to schema '%s'", stack_get_string(sql, mvc_bind_schema(sql, "tmp"), "current_user"), old_name); if (s->system) throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: cannot rename a system schema"); if (!list_empty(s->tables.set) || !list_empty(s->types.set) || !list_empty(s->funcs.set) || !list_empty(s->seqs.set)) @@ -1647,7 +1647,7 @@ SQLrename_table(Client cntxt, MalBlkPtr _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list