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

Reply via email to