Changeset: dc7d77fa247e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/dc7d77fa247e Branch: default Log Message:
Merged with Jul2021 diffs (269 lines): diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -202,15 +202,15 @@ gdk_export const uuid uuid_nil; #define void_nil oid_nil -#define is_bit_nil(v) ((v) == bit_nil) -#define is_bte_nil(v) ((v) == bte_nil) -#define is_sht_nil(v) ((v) == sht_nil) -#define is_int_nil(v) ((v) == int_nil) -#define is_lng_nil(v) ((v) == lng_nil) +#define is_bit_nil(v) ((v) == GDK_bte_min-1) +#define is_bte_nil(v) ((v) == GDK_bte_min-1) +#define is_sht_nil(v) ((v) == GDK_sht_min-1) +#define is_int_nil(v) ((v) == GDK_int_min-1) +#define is_lng_nil(v) ((v) == GDK_lng_min-1) #ifdef HAVE_HGE -#define is_hge_nil(v) ((v) == hge_nil) +#define is_hge_nil(v) ((v) == GDK_hge_min-1) #endif -#define is_oid_nil(v) ((v) == oid_nil) +#define is_oid_nil(v) ((v) == ((oid) 1 << ((8 * SIZEOF_OID) - 1))) #define is_flt_nil(v) isnan(v) #define is_dbl_nil(v) isnan(v) #define is_bat_nil(v) (((v) & 0x7FFFFFFF) == 0) /* v == bat_nil || v == 0 */ @@ -224,11 +224,15 @@ gdk_export const uuid uuid_nil; #define isfinite(x) _finite(x) #endif +#ifdef HAVE_HGE +#define is_uuid_nil(x) ((x).h == 0) +#else #ifdef HAVE_UUID #define is_uuid_nil(x) uuid_is_null((x).u) #else #define is_uuid_nil(x) (memcmp((x).u, uuid_nil.u, UUID_SIZE) == 0) #endif +#endif /* * @- Derived types 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 @@ -754,8 +754,15 @@ create_seq(mvc *sql, char *sname, char * throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: start value is higher than the maximum ("LLFMT" > "LLFMT")", seq->start, seq->maxvalue); if (seq->minvalue && seq->maxvalue && seq->maxvalue < seq->minvalue) throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: maximum value is lesser than the minimum ("LLFMT" < "LLFMT")", seq->maxvalue, seq->minvalue); - if (!sql_trans_create_sequence(sql->session->tr, s, seq->base.name, seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle, seq->bedropped)) - throw(SQL,"sql.create_seq",SQLSTATE(42000) "CREATE SEQUENCE: transaction conflict detected"); + switch (sql_trans_create_sequence(sql->session->tr, s, seq->base.name, seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle, seq->bedropped)) { + case -1: + throw(SQL,"sql.create_seq",SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL,"sql.create_seq",SQLSTATE(42000) "CREATE SEQUENCE: transaction conflict detected"); + default: + break; + } return NULL; } @@ -1282,8 +1289,15 @@ SQLcreate_schema(Client cntxt, MalBlkPtr throw(SQL,"sql.create_schema", SQLSTATE(42000) "CREATE SCHEMA: insufficient privileges for user '%s'", get_string_global_var(sql, "current_user")); if (mvc_bind_schema(sql, sname)) throw(SQL,"sql.create_schema", SQLSTATE(3F000) "CREATE SCHEMA: name '%s' already in use", sname); - if (!mvc_create_schema(sql, sname, auth_id, sql->user_id)) - throw(SQL,"sql.create_schema",SQLSTATE(42000) "CREATE SCHEMA: transaction conflict detected"); + switch (mvc_create_schema(sql, sname, auth_id, sql->user_id)) { + case -1: + throw(SQL,"sql.create_schema",SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL,"sql.create_schema",SQLSTATE(42000) "CREATE SCHEMA: transaction conflict detected"); + default: + break; + } return msg; } diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -1049,14 +1049,11 @@ mvc_drop_all_func(mvc *m, sql_schema *s, return sql_trans_drop_all_func(m->session->tr, s, list_func, drop_action ? DROP_CASCADE_START : DROP_RESTRICT); } -sql_schema * +int mvc_create_schema(mvc *m, const char *name, sqlid auth_id, sqlid owner) { - sql_schema *s = NULL; - TRC_DEBUG(SQL_TRANS, "Create schema: %s %d %d\n", name, auth_id, owner); - s = sql_trans_create_schema(m->session->tr, name, auth_id, owner); - return s; + return sql_trans_create_schema(m->session->tr, name, auth_id, owner); } int diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -202,7 +202,7 @@ extern int mvc_drop_func(mvc *c, sql_sch extern int mvc_drop_all_func(mvc *c, sql_schema *s, list *list_func, int drop_action); extern int mvc_drop_schema(mvc *c, sql_schema *s, int drop_action); -extern sql_schema *mvc_create_schema(mvc *m, const char *name, sqlid auth_id, sqlid owner); +extern int mvc_create_schema(mvc *m, const char *name, sqlid auth_id, sqlid owner); extern BUN mvc_clear_table(mvc *m, sql_table *t); extern str mvc_drop_table(mvc *c, sql_schema *s, sql_table * t, int drop_action); extern sql_table *mvc_create_table(mvc *c, sql_schema *s, const char *name, int tt, bit system, int persistence, int commit_action, int sz, bit properties); diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c --- a/sql/server/sql_privileges.c +++ b/sql/server/sql_privileges.c @@ -790,7 +790,9 @@ sql_create_user(mvc *sql, char *user, ch if (!(s = find_sql_schema(sql->session->tr, schema))) throw(SQL,"sql.create_user", SQLSTATE(3F000) "CREATE USER: no such schema '%s'", schema); schema_id = s->base.id; - if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, s->base.id, ddl) != LOG_OK) + if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, schema_id, ddl) != LOG_OK) + throw(SQL, "sql.create_user", SQLSTATE(HY013) MAL_MALLOC_FAIL); + if (sql_trans_add_dependency(sql->session->tr, sql->user_id, ddl) != LOG_OK) throw(SQL, "sql.create_user", SQLSTATE(HY013) MAL_MALLOC_FAIL); if ((err = backend_create_user(sql, user, passwd, enc, fullname, schema_id, schema_path, sql->user_id)) != NULL) diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -343,7 +343,7 @@ extern int sql_trans_drop_all_func(sql_t extern void sql_trans_update_tables(sql_trans *tr, sql_schema *s); extern void sql_trans_update_schemas(sql_trans *tr); -extern sql_schema *sql_trans_create_schema(sql_trans *tr, const char *name, sqlid auth_id, sqlid owner); +extern int sql_trans_create_schema(sql_trans *tr, const char *name, sqlid auth_id, sqlid owner); extern int sql_trans_rename_schema(sql_trans *tr, sqlid id, const char *new_name); extern int sql_trans_drop_schema(sql_trans *tr, sqlid id, int drop_action); @@ -395,7 +395,7 @@ extern sql_trigger * sql_trans_create_tr extern int sql_trans_drop_trigger(sql_trans *tr, sql_schema *s, sqlid id, int drop_action); extern sql_sequence *create_sql_sequence(struct sqlstore *store, sql_allocator *sa, sql_schema *s, const char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle); -extern sql_sequence * sql_trans_create_sequence(sql_trans *tr, sql_schema *s, const char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle, bit bedropped); +extern int sql_trans_create_sequence(sql_trans *tr, sql_schema *s, const char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle, bit bedropped); extern int sql_trans_drop_sequence(sql_trans *tr, sql_schema *s, sql_sequence *seq, int drop_action); extern int sql_trans_alter_sequence(sql_trans *tr, sql_sequence *seq, lng min, lng max, lng inc, lng cache, bit cycle); extern int sql_trans_sequence_restart(sql_trans *tr, sql_sequence *seq, lng start); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -4766,12 +4766,13 @@ sql_trans_drop_all_func(sql_trans *tr, s return 0; } -sql_schema * +int sql_trans_create_schema(sql_trans *tr, const char *name, sqlid auth_id, sqlid owner) { sqlstore *store = tr->store; sql_schema *s = SA_ZNEW(tr->sa, sql_schema); sql_table *sysschema = find_sql_table(tr, find_sql_schema(tr, "sys"), "schemas"); + int res = LOG_OK; base_init(tr->sa, &s->base, next_oid(tr->store), true, name); s->auth_id = auth_id; @@ -4787,14 +4788,17 @@ sql_trans_create_schema(sql_trans *tr, c s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, isTempSchema(s), false, true, store); s->store = tr->store; - if (store->table_api.table_insert(tr, sysschema, &s->base.id, &s->base.name, &s->auth_id, &s->owner, &s->system)) { + if ((res = store->table_api.table_insert(tr, sysschema, &s->base.id, &s->base.name, &s->auth_id, &s->owner, &s->system))) { schema_destroy(store, s); - return NULL; - } - if (os_add(tr->cat->schemas, tr, s->base.name, &s->base)) { - return NULL; - } - return s; + return res; + } + if ((res = os_add(tr->cat->schemas, tr, s->base.name, &s->base))) + return res; + if ((res = sql_trans_add_dependency(tr, s->auth_id, ddl))) + return res; + if ((res = sql_trans_add_dependency(tr, s->owner, ddl))) + return res; + return res; } int @@ -6478,7 +6482,7 @@ create_sql_sequence(sqlstore *store, sql return create_sql_sequence_with_id(sa, next_oid(store), s, name, start, min, max, inc, cacheinc, cycle); } -sql_sequence * +int sql_trans_create_sequence(sql_trans *tr, sql_schema *s, const char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle, bit bedropped) { @@ -6488,19 +6492,20 @@ sql_trans_create_sequence(sql_trans *tr, sql_sequence *seq = create_sql_sequence_with_id(tr->sa, next_oid(tr->store), s, name, start, min, max, inc, cacheinc, cycle); int res = LOG_OK; - if (os_add(s->seqs, tr, seq->base.name, &seq->base)) - return NULL; - if (store->table_api.table_insert(tr, sysseqs, &seq->base.id, &s->base.id, &seq->base.name, &seq->start, &seq->minvalue, - &seq->maxvalue, &seq->increment, &seq->cacheinc, &seq->cycle)) - return NULL; + if ((res = os_add(s->seqs, tr, seq->base.name, &seq->base))) + return res; + if ((res = store->table_api.table_insert(tr, sysseqs, &seq->base.id, &s->base.id, &seq->base.name, &seq->start, &seq->minvalue, + &seq->maxvalue, &seq->increment, &seq->cacheinc, &seq->cycle))) + return res; /*Create a BEDROPPED dependency for a SERIAL COLUMN*/ if (bedropped) { - sql_trans_create_dependency(tr, seq->base.id, seq->base.id, BEDROPPED_DEPENDENCY); + if ((res = sql_trans_create_dependency(tr, seq->base.id, seq->base.id, BEDROPPED_DEPENDENCY))) + return res; if (!isNew(seq) && (res = sql_trans_add_dependency(tr, seq->base.id, ddl))) - return NULL; - } - return seq; + return res; + } + return res; } int @@ -6551,7 +6556,7 @@ sql_trans_alter_sequence(sql_trans *tr, if ((res = store->table_api.column_update_value(tr, c, rid, &seq->cacheinc))) return res; } - if (!is_lng_nil(cycle) && seq->cycle != cycle) { + if (!is_bit_nil(cycle) && seq->cycle != cycle) { seq->cycle = cycle != 0; c = find_sql_column(seqs, "cycle"); if ((res = store->table_api.column_update_value(tr, c, rid, &seq->cycle))) diff --git a/sql/test/transactions/Tests/transaction_isolation5.SQL.py b/sql/test/transactions/Tests/transaction_isolation5.SQL.py --- a/sql/test/transactions/Tests/transaction_isolation5.SQL.py +++ b/sql/test/transactions/Tests/transaction_isolation5.SQL.py @@ -24,7 +24,6 @@ with SQLTestCase() as mdb1: mdb2.connect(username="monetdb", password="monetdb") mdb1.execute('create table child1(a int);').assertSucceeded() - mdb1.execute('start transaction;').assertSucceeded() mdb2.execute('start transaction;').assertSucceeded() mdb1.execute('create merge table parent1(a int);').assertSucceeded() @@ -33,8 +32,18 @@ with SQLTestCase() as mdb1: mdb1.execute('commit;').assertSucceeded() mdb2.execute('commit;').assertSucceeded() + mdb1.execute('CREATE ROLE myrole;').assertSucceeded() + mdb1.execute('start transaction;').assertSucceeded() + mdb2.execute('start transaction;').assertSucceeded() + mdb1.execute('CREATE schema mysch AUTHORIZATION myrole;').assertSucceeded() + mdb2.execute('DROP ROLE myrole;').assertSucceeded() + mdb1.execute('commit;').assertSucceeded() + mdb2.execute('commit;').assertFailed(err_code="40000", err_message="COMMIT: transaction is aborted because of concurrency conflicts, will ROLLBACK instead") + mdb1.execute('start transaction;').assertSucceeded() mdb1.execute('alter table parent1 drop table child1;').assertSucceeded() mdb1.execute('drop table parent1;').assertSucceeded() mdb1.execute('drop table child1;').assertSucceeded() + mdb1.execute('drop schema mysch;').assertSucceeded() + mdb1.execute('drop role myrole;').assertSucceeded() mdb1.execute('commit;').assertSucceeded() _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list