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