Changeset: ffe13a882b07 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffe13a882b07
Added Files:
sql/test/scoping/Tests/scoping04.sql
sql/test/scoping/Tests/scoping04.stable.err
sql/test/scoping/Tests/scoping04.stable.out
Modified Files:
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_user.c
sql/include/sql_catalog.h
sql/server/rel_psm.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/rel_semantic.c
sql/server/sql_env.c
sql/server/sql_mvc.c
sql/server/sql_privileges.c
sql/server/sql_privileges.h
sql/storage/store.c
sql/test/scoping/Tests/All
Branch: scoping
Log Message:
Added transaction semantics to the session's schema
diffs (truncated from 760 to 300 lines):
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
@@ -1632,7 +1632,7 @@ str
SQLrename_schema(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *sql = NULL;
- str msg = MAL_SUCCEED;
+ str msg = MAL_SUCCEED, onn;
str old_name = *getArgReference_str(stk, pci, 1);
str new_name = *getArgReference_str(stk, pci, 2);
sql_schema *s;
@@ -1653,9 +1653,15 @@ SQLrename_schema(Client cntxt, MalBlkPtr
if (!sql_trans_rename_schema(sql->session->tr, s->base.id, new_name))
throw(SQL, "sql.rename_schema",SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if (s == cur_schema(sql))
- if (!mvc_set_schema(sql, new_name))
+ if (s == cur_schema(sql)) /* change current session schema name */
+ if (!mvc_set_schema_name(sql, new_name))
throw(SQL, "sql.rename_schema",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ if (strcmp(sql->session->old_schema_name, old_name) == 0) { /* change
old schema name for the session */
+ if (!(onn = _STRDUP(new_name)))
+ throw(SQL, "sql.rename_schema",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ _DELETE(sql->session->old_schema_name);
+ sql->session->old_schema_name = onn;
+ }
return msg;
}
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1174,7 +1174,6 @@ mal_function_find_implementation_address
stream *buf = NULL;
char *n = NULL;
int len = _strlen(f->query);
- sql_schema *s = cur_schema(m);
dlist *l, *ext_name;
if (!(m = ZNEW(mvc))) {
@@ -1191,9 +1190,6 @@ mal_function_find_implementation_address
(void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
goto bailout;
}
- if (s)
- m->session->schema = s;
-
if (!(m->sa = sa_create())) {
(void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
goto bailout;
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -620,16 +620,19 @@ SQLtrans(mvc *m)
throw(SQL, "sql.trans", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
s = m->session;
if (!s->schema) {
- if (s->schema_name)
- GDKfree(s->schema_name);
- s->schema_name = monet5_user_get_def_schema(m,
m->user_id);
- if (!s->schema_name) {
+ int sres;
+ str found = monet5_user_get_def_schema(m, m->user_id);
+
+ if (!found) {
mvc_cancel_session(m);
throw(SQL, "sql.trans", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
- assert(s->schema_name);
- s->schema = find_sql_schema(s->tr, s->schema_name);
- assert(s->schema);
+ sres = mvc_set_schema_name(m, found);
+ _DELETE(found);
+ if (!sres) {
+ mvc_cancel_session(m);
+ throw(SQL, "sql.trans", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ }
}
}
return MAL_SUCCEED;
@@ -1102,7 +1105,7 @@ SQLparser(Client c)
sqlcleanup(m, err);
goto finalize;
}
- assert(m->session->schema != NULL);
+ assert(m->session->schema);
/*
* We have dealt with the first parsing step and advanced the input
reader
* to the next statement (if any).
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -476,8 +476,6 @@ monet5_user_get_def_schema(mvc *m, int u
rid = table_funcs.column_find_row(m->session->tr, schemas_id,
&schema_id, NULL);
if (!is_oid_nil(rid))
schema = table_funcs.column_find_value(m->session->tr,
schemas_name, rid);
- if (!sqlvar_set_string(find_global_var(m, mvc_bind_schema(m, "sys"),
"current_schema"), schema))
- return NULL;
return schema;
}
@@ -510,7 +508,7 @@ monet5_user_set_def_schema(mvc *m, oid u
return (NULL); /* don't reveal that the user doesn't exist */
}
- if(mvc_trans(m) < 0) {
+ if (mvc_trans(m) < 0) {
GDKfree(username);
return NULL;
}
@@ -552,9 +550,9 @@ monet5_user_set_def_schema(mvc *m, oid u
schema = NULL;
}
- if (!schema || !mvc_set_schema(m, schema)) {
+ if (!schema || !mvc_set_schema_name(m, schema)) {
if (m->session->tr->active) {
- if((other = mvc_rollback(m, 0, NULL, false)) !=
MAL_SUCCEED)
+ if ((other = mvc_rollback(m, 0, NULL, false)) !=
MAL_SUCCEED)
freeException(other);
}
GDKfree(username);
@@ -567,7 +565,7 @@ monet5_user_set_def_schema(mvc *m, oid u
schema = NULL;
}
GDKfree(username);
- if((other = mvc_rollback(m, 0, NULL, false)) != MAL_SUCCEED) {
+ if ((other = mvc_commit(m, 0, NULL, false)) != MAL_SUCCEED) { /* has to
commit the new session schema value */
freeException(other);
return NULL;
}
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -695,7 +695,8 @@ typedef struct res_table {
typedef struct sql_session {
sql_trans *tr; /* active transaction */
- char *schema_name;
+ char *old_schema_name; /* transaction's old schema name (from previous
transaction), needed for rollback */
+ char *schema_name; /* transaction's schema name */
sql_schema *schema;
char ac_on_commit; /* if 1, auto_commit should be enabled on
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
@@ -991,17 +991,19 @@ rel_create_func(sql_query *query, dlist
} else if (body) { /* SQL implementation */
sql_arg *ra = (restype && type !=
F_UNION)?restype->h->data:NULL;
list *b = NULL;
- sql_schema *old_schema = cur_schema(sql);
+ sql_schema *os = cur_schema(sql);
if (create) { /* needed for recursive functions */
q = query_cleaned(q);
sql->forward = f = mvc_create_func(sql,
sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg, FALSE);
GDKfree(q);
}
- sql->session->schema = s;
+ if (!mvc_set_schema(query->sql, s))
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
b = sequential_block(query, (ra)?&ra->type:NULL,
ra?NULL:restype, body, NULL, is_func);
sql->forward = NULL;
- sql->session->schema = old_schema;
+ if (!mvc_set_schema(query->sql, os))
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
sql->params = NULL;
if (!b)
return NULL;
@@ -1377,9 +1379,11 @@ create_trigger(sql_query *query, dlist *
if (old_name)
stack_update_rel_view(sql, old_name,
new_name?rel_dup(rel):rel);
}
- sql->session->schema = ss;
+ if (!mvc_set_schema(query->sql, ss))
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
sq = sequential_block(query, NULL, NULL, stmts, NULL, 1);
- sql->session->schema = old_schema;
+ if (!mvc_set_schema(query->sql, old_schema))
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
if (!sq) {
if (!instantiate)
stack_pop_frame(sql);
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
@@ -1367,8 +1367,8 @@ rel_create_schema(sql_query *query, dlis
return sql_error(sql, 02, SQLSTATE(3F000) "CREATE
SCHEMA: name '%s' already in use", name);
return rel_psm_block(sql->sa, new_exp_list(sql->sa));
} else {
- sql_schema *os = sql->session->schema;
- dnode *n;
+ sql_schema *os = cur_schema(sql);
+ dnode *n = schema_elements->h;
sql_schema *ss = SA_ZNEW(sql->sa, sql_schema);
sql_rel *ret = rel_create_schema_dll(sql->sa, name, auth, 0);
@@ -1376,19 +1376,20 @@ rel_create_schema(sql_query *query, dlis
ss->auth_id = auth_id;
ss->owner = sql->user_id;
- sql->session->schema = ss;
- n = schema_elements->h;
+ if (!mvc_set_schema(query->sql, ss))
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
while (n) {
sql_rel *res = rel_semantic(query, n->data.sym);
if (!res) {
rel_destroy(ret);
- sql->session->schema = os;
+ (void) mvc_set_schema(query->sql, os);
return NULL;
}
ret = rel_list(sql->sa, ret, res);
n = n->next;
}
- sql->session->schema = os;
+ if (!mvc_set_schema(query->sql, os))
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
return ret;
}
}
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
@@ -6071,12 +6071,15 @@ rel_selects(sql_query *query, symbol *s)
sql_rel *
schema_selects(sql_query *query, sql_schema *schema, symbol *s)
{
+ mvc *sql = query->sql;
sql_rel *res;
- sql_schema *os = query->sql->session->schema;
-
- query->sql->session->schema = schema;
+ sql_schema *os = cur_schema(sql);
+
+ if (!mvc_set_schema(sql, schema))
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
res = rel_selects(query, s);
- query->sql->session->schema = os;
+ if (!mvc_set_schema(sql, os))
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
return res;
}
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -17,12 +17,12 @@
#include "rel_psm.h"
#include "rel_sequence.h"
#include "rel_exp.h"
+#include "sql_privileges.h"
#include <unistd.h>
#include <string.h>
#include <ctype.h>
-
sql_rel *
rel_parse(mvc *m, sql_schema *s, char *query, char emode)
{
@@ -40,13 +40,11 @@ rel_parse(mvc *m, sql_schema *s, char *q
m->caching = 0;
m->emode = emode;
- if (s)
- m->session->schema = s;
+ if (s && !mvc_set_schema_name(m, s->base.name))
+ return NULL;
- b = (buffer*)GDKmalloc(sizeof(buffer));
- if (!b) {
+ if (!(b = (buffer*)GDKmalloc(sizeof(buffer))))
return NULL;
- }
n = GDKmalloc(len + 1 + 1);
if (!n) {
GDKfree(b);
@@ -105,7 +103,8 @@ rel_parse(mvc *m, sql_schema *s, char *q
*m = o;
m->label = label;
}
- m->session->schema = c;
+ if (!mvc_set_schema_name(m, c->base.name))
+ return NULL;
return rel;
}
diff --git a/sql/server/sql_env.c b/sql/server/sql_env.c
--- a/sql/server/sql_env.c
+++ b/sql/server/sql_env.c
@@ -69,7 +69,7 @@ sql_update_var(mvc *m, sql_schema *s, co
} else if (strcmp(name, "current_schema") == 0 || strcmp(name,
"current_role") == 0) {
if (VALisnil(ptr))
throw(SQL,"sql.update_var", SQLSTATE(42000)
"Variable '%s.%s' cannot be NULL\n", s->base.name, name);
- if (strcmp(name, "current_schema") == 0 &&
!mvc_set_schema(m, ptr->val.sval))
+ if (strcmp(name, "current_schema") == 0 &&
!mvc_set_schema_name(m, ptr->val.sval))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list