Changeset: cbe1ee5b34a8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cbe1ee5b34a8
Added Files:
        sql/test/mergetables/Tests/transaction-conflict.stable.err
        sql/test/mergetables/Tests/transaction-conflict.stable.out
Modified Files:
        sql/common/sql_list.c
        sql/include/sql_catalog.h
        sql/storage/store.c
        sql/test/mergetables/Tests/transaction-conflict.py
Branch: Nov2019
Log Message:

Fix for transaction-conflict bug. Whenever attempting to remove a child table 
from the parent table, use the transaction flags from the sql_part instead of 
the sql_table


diffs (240 lines):

diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -314,6 +314,7 @@ list_remove_node(list *l, node *n)
                l->t = p;
        node_destroy(l, n);
        l->cnt--;
+       assert(l->cnt >= 0);
        MT_lock_set(&l->ht_lock);
        if (l->ht && data)
                hash_delete(l->ht, data);
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
@@ -364,13 +364,13 @@ typedef enum sql_ftype {
        F_LOADER = 7
 } sql_ftype;
 
-#define IS_FUNC(f) (f->type == F_FUNC)
-#define IS_PROC(f) (f->type == F_PROC)
-#define IS_AGGR(f) (f->type == F_AGGR)
-#define IS_FILT(f) (f->type == F_FILT)
-#define IS_UNION(f) (f->type == F_UNION)
-#define IS_ANALYTIC(f) (f->type == F_ANALYTIC)
-#define IS_LOADER(f) (f->type == F_LOADER)
+#define IS_FUNC(f)     ((f)->type == F_FUNC)
+#define IS_PROC(f)     ((f)->type == F_PROC)
+#define IS_AGGR(f)     ((f)->type == F_AGGR)
+#define IS_FILT(f)     ((f)->type == F_FILT)
+#define IS_UNION(f)    ((f)->type == F_UNION)
+#define IS_ANALYTIC(f) ((f)->type == F_ANALYTIC)
+#define IS_LOADER(f)   ((f)->type == F_LOADER)
 
 typedef enum sql_flang {
        FUNC_LANG_INT = 0, /* internal */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1155,7 +1155,7 @@ load_schema(sql_trans *tr, sqlid id, oid
        type_id = find_sql_column(types, "id");
        rs = table_funcs.rids_select(tr, type_schema, &s->base.id, &s->base.id, 
type_id, &tmpid, NULL, NULL);
        for (rid = table_funcs.rids_next(rs); !is_oid_nil(rid); rid = 
table_funcs.rids_next(rs)) 
-               cs_add(&s->types, load_type(tr, s, rid), 0);
+               cs_add(&s->types, load_type(tr, s, rid), 0);
        table_funcs.rids_destroy(rs);
 
        /* second tables */
@@ -1703,7 +1703,6 @@ bootstrap_create_table(sql_trans *tr, sq
        return t;
 }
 
-
 static sql_schema *
 bootstrap_create_schema(sql_trans *tr, char *name, sqlid auth_id, int owner)
 {
@@ -2201,7 +2200,6 @@ store_exit(void)
        store_initialized=0;
 }
 
-
 /* call locked! */
 int
 store_apply_deltas(bool not_locked)
@@ -2312,7 +2310,6 @@ idle_manager(void)
        }
 }
 
-
 void
 store_lock(void)
 {
@@ -2649,7 +2646,6 @@ sql_trans_copy_part( sql_trans *tr, sql_
 {
        sql_schema *syss = find_sql_schema(tr, isGlobal(t)?"sys":"tmp");
        sql_table *sysic = find_sql_table(syss, "objects");
-       node *n;
        sql_part *npt = SA_ZNEW(tr->sa, sql_part);
 
        base_init(tr->sa, &npt->base, pt->base.id, TR_NEW, npt->base.name);
@@ -2658,7 +2654,7 @@ sql_trans_copy_part( sql_trans *tr, sql_
        npt->with_nills = pt->with_nills;
        npt->t = t;
 
-       assert(!npt->t || isMergeTable(npt->t) || isReplicaTable(npt->t));
+       assert(isMergeTable(npt->t) || isReplicaTable(npt->t));
        if (isRangePartitionTable(t)) {
                npt->part.range.minvalue = sa_alloc(tr->sa, 
pt->part.range.minlength);
                npt->part.range.maxvalue = sa_alloc(tr->sa, 
pt->part.range.maxlength);
@@ -2668,7 +2664,7 @@ sql_trans_copy_part( sql_trans *tr, sql_
                npt->part.range.maxlength = pt->part.range.maxlength;
        } else if (isListPartitionTable(t)) {
                npt->part.values = list_new(tr->sa, (fdestroy) NULL);
-               for (n = pt->part.values->h ; n ; n = n->next) {
+               for (node *n = pt->part.values->h ; n ; n = n->next) {
                        sql_part_value *prev = (sql_part_value*) n->data, 
*nextv = SA_ZNEW(tr->sa, sql_part_value);
                        nextv->tpe = prev->tpe;
                        nextv->value = sa_alloc(tr->sa, prev->length);
@@ -2694,7 +2690,6 @@ trigger_dup(sql_trans *tr, int flags, sq
 {
        sql_allocator *sa = (newFlagSet(flags))?tr->parent->sa:tr->sa;
        sql_trigger *nt = SA_ZNEW(sa, sql_trigger);
-       node *n;
 
        base_init(sa, &nt->base, i->base.id, tr_flag(&i->base, flags), 
i->base.name);
 
@@ -2712,7 +2707,7 @@ trigger_dup(sql_trans *tr, int flags, sq
                nt->condition = sa_strdup(sa, i->condition);
        nt->statement = sa_strdup(sa, i->statement);
 
-       for (n = i->columns->h; n; n = n->next) {
+       for (node *n = i->columns->h; n; n = n->next) {
                sql_kc *okc = n->data;
 
                list_append(nt->columns, kc_dup(tr, flags, okc, t));
@@ -5530,6 +5525,7 @@ sql_trans_del_table(sql_trans *tr, sql_t
        sql_table *sysobj = find_sql_table(syss, "objects");
        node *n = cs_find_name(&mt->members, pt->base.name);
        oid obj_oid = table_funcs.column_find_row(tr, find_sql_column(sysobj, 
"nr"), &pt->base.id, NULL), rid;
+       sql_part *p = (sql_part*) n->data;
 
        if (is_oid_nil(obj_oid))
                return NULL;
@@ -5551,7 +5547,7 @@ sql_trans_del_table(sql_trans *tr, sql_t
        /* merge table depends on part table */
        sql_trans_drop_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY);
 
-       cs_del(&mt->members, n, pt->base.flags);
+       cs_del(&mt->members, n, p->base.flags);
        pt->p = NULL;
        table_funcs.table_delete(tr, sysobj, obj_oid);
 
diff --git a/sql/test/mergetables/Tests/transaction-conflict.py 
b/sql/test/mergetables/Tests/transaction-conflict.py
--- a/sql/test/mergetables/Tests/transaction-conflict.py
+++ b/sql/test/mergetables/Tests/transaction-conflict.py
@@ -66,7 +66,6 @@ cursor.execute("""
 START TRANSACTION;
 DROP TABLE "mt";
 DROP TABLE "part";
-DROP TABLE "dummy";
 COMMIT;
 """)
 
diff --git a/sql/test/mergetables/Tests/transaction-conflict.stable.err 
b/sql/test/mergetables/Tests/transaction-conflict.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/transaction-conflict.stable.err
@@ -0,0 +1,24 @@
+stderr of test 'transaction-conflict` in directory 'sql/test/mergetables` 
itself:
+
+
+# 09:38:29 >  
+# 09:38:29 >  "/usr/bin/python3" "transaction-conflict.py" 
"transaction-conflict"
+# 09:38:29 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_ipv6 = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 38130
+# cmdline opt  mapi_usock = /var/tmp/mtest-42574/.s.monetdb.38130
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_mergetables
+
+# 09:38:31 >  
+# 09:38:31 >  "Done."
+# 09:38:31 >  
+
diff --git a/sql/test/mergetables/Tests/transaction-conflict.stable.out 
b/sql/test/mergetables/Tests/transaction-conflict.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/transaction-conflict.stable.out
@@ -0,0 +1,64 @@
+stdout of test 'transaction-conflict` in directory 'sql/test/mergetables` 
itself:
+
+
+# 09:38:29 >  
+# 09:38:29 >  "/usr/bin/python3" "transaction-conflict.py" 
"transaction-conflict"
+# 09:38:29 >  
+
+# MonetDB 5 server v11.35.4 (hg id: fa6ec6bdafb1)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_mergetables', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.504 GiB available main-memory of which we use 12.635 GiB
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on 
mapi:monetdb://localhost.localdomain:38130/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-42574/.s.monetdb.38130
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 61_wlcr.sql
+# loading sql script: 72_fits.sql
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
+# loading sql script: 75_shp.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 80_udf_hge.sql
+# loading sql script: 85_bam.sql
+# loading sql script: 90_generator.sql
+# loading sql script: 90_generator_hge.sql
+# loading sql script: 99_system.sql
+# MonetDB/SQL module loaded
+
+# 09:38:31 >  
+# 09:38:31 >  "Done."
+# 09:38:31 >  
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to