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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list