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

Reply via email to