Changeset: 7c491499ca18 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7c491499ca18 Modified Files: sql/include/sql_catalog.h sql/storage/objectset.c sql/storage/store.c Branch: iso Log Message:
crude protection agains multiple functions inserted concurrently diffs (61 lines): 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 @@ -258,6 +258,7 @@ extern sql_base *os_find_id(struct objec extern void os_iterator(struct os_iter *oi, struct objectset *os, struct sql_trans *tr, const char *name /*optional*/); extern sql_base *oi_next(struct os_iter *oi); extern bool os_obj_intransaction(struct objectset *os, struct sql_trans *tr, sql_base *b); +extern bool os_has_changes(struct objectset *os, struct sql_trans *tr); extern objlist *ol_new(sql_allocator *sa, destroy_fptr destroy, sql_store store); extern void ol_destroy(objlist *ol, sql_store store); diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -1099,7 +1099,6 @@ os_obj_intransaction(objectset *os, stru versionhead *n = find_id(os, b->id); if (n) { - //objectversion *ov = get_valid_object_id(tr, n->ov); objectversion *ov = n->ov; if (ov && os_atmc_get_state(ov) == active && ov->ts == tr->tid) @@ -1107,3 +1106,18 @@ os_obj_intransaction(objectset *os, stru } return false; } + +/* return true if this object set has changes pending for an other transaction */ +bool +os_has_changes(objectset *os, struct sql_trans *tr) +{ + versionhead *n = os->id_based_t; + + if (n) { + objectversion *ov = n->ov; + + if (ov && os_atmc_get_state(ov) == active && ov->ts != tr->tid && ov->ts > TRANSACTION_ID_BASE) + return true; + } + return false; +} diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -4315,13 +4315,15 @@ sql_trans_create_func(sql_trans *tr, sql const char *mod, const char *impl, const char *query, bit varres, bit vararg, bit system) { sqlstore *store = tr->store; - sql_func *t = SA_ZNEW(tr->sa, sql_func); sql_table *sysfunc = find_sql_table(tr, find_sql_schema(tr, "sys"), "functions"); sql_table *sysarg = find_sql_table(tr, find_sql_schema(tr, "sys"), "args"); node *n; int number = 0, ftype = (int) type, flang = (int) lang; bit se; + if (os_has_changes(s->funcs, tr)) + return NULL; + sql_func *t = SA_ZNEW(tr->sa, sql_func); base_init(tr->sa, &t->base, next_oid(tr->store), TR_NEW, func); assert(impl && mod); t->imp = (impl)?SA_STRDUP(tr->sa, impl):NULL; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list