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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list