Changeset: 9c9cb4de471f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c9cb4de471f
Added Files:
        sql/test/rename/Tests/rename09.sql
        sql/test/rename/Tests/rename09.stable.err
        sql/test/rename/Tests/rename09.stable.out
Modified Files:
        sql/include/sql_catalog.h
        sql/storage/store.c
        sql/test/rename/Tests/All
Branch: Apr2019
Log Message:

Fix for changing schema twice within the same transaction.


diffs (truncated from 343 to 300 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
@@ -605,6 +605,7 @@ typedef struct sql_moved_table {
        sql_schema *from;
        sql_schema *to;
        sql_table *t;
+       node *p; //need to iterate the list backwards
 } sql_moved_table;
 
 typedef struct res_col {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3990,12 +3990,13 @@ reset_trans(sql_trans *tr, sql_trans *pt
        int res;
 
        if (tr != gtrans && tr->moved_tables) { //before doing any schema 
updates,
-               for (node *n = tr->moved_tables->h ; n ; n = n->next) {
+               for (node *n = tr->moved_tables->t ; n ; ) { //iterate backwards
                        sql_moved_table *smt = (sql_moved_table*) n->data;
 
                        assert(smt && smt->to && smt->from && smt->t);
                        cs_move(&smt->to->tables, &smt->from->tables, smt->t);
                        smt->t->s = smt->from;
+                       n = smt->p;
                }
        }
        tr->moved_tables = NULL;
@@ -5202,12 +5203,15 @@ sql_trans_set_table_schema(sql_trans *tr
        cs_move(&os->tables, &ns->tables, t);
        t->s = ns;
 
+       if (!tr->moved_tables) {
+               tr->moved_tables = sa_list(tr->sa);
+               tr->moved_tables->t = NULL;
+       }
        m = SA_ZNEW(tr->sa, sql_moved_table); //add transaction log entry
        m->from = os;
        m->to = ns;
        m->t = t;
-       if (!tr->moved_tables)
-               tr->moved_tables = sa_list(tr->sa);
+       m->p = tr->moved_tables->t;
        list_append(tr->moved_tables, m);
 
        tr->wtime = tr->wstime;
diff --git a/sql/test/rename/Tests/All b/sql/test/rename/Tests/All
--- a/sql/test/rename/Tests/All
+++ b/sql/test/rename/Tests/All
@@ -7,3 +7,4 @@ rename05
 rename06
 rename07
 rename08
+rename09
diff --git a/sql/test/rename/Tests/rename09.sql 
b/sql/test/rename/Tests/rename09.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename09.sql
@@ -0,0 +1,48 @@
+create schema "SA";
+create schema "SB";
+create schema "SC";
+
+create table "SA"."t1" (a int);
+insert into "SA"."t1" values (1);
+select "a" from "SA"."t1";
+
+start transaction; --Attempt to change schema twice within the same transaction
+select "a" from "SA"."t1";
+alter table "SA"."t1" set schema "SB";
+select "a" from "SB"."t1";
+alter table "SB"."t1" set schema "SC";
+select "a" from "SC"."t1";
+select "a" from "SB"."t1"; --error
+rollback;
+
+select "a" from "SA"."t1";
+select "a" from "SB"."t1"; --error
+select "a" from "SC"."t1"; --error
+
+alter table "SA"."t1" set schema "SB";
+select "a" from "SA"."t1"; --error
+select "a" from "SB"."t1";
+select "a" from "SC"."t1"; --error
+
+alter table "SB"."t1" set schema "SC";
+select "a" from "SA"."t1"; --error
+select "a" from "SB"."t1"; --error
+select "a" from "SC"."t1";
+
+alter table "SC"."t1" set schema "SA";
+
+start transaction; --Attempt to change schema and back to the original one
+select "a" from "SA"."t1";
+alter table "SA"."t1" set schema "SB";
+select "a" from "SB"."t1";
+alter table "SB"."t1" set schema "SA";
+select "a" from "SA"."t1";
+select "a" from "SB"."t1"; --error
+rollback;
+
+select "a" from "SA"."t1";
+select "a" from "SB"."t1"; --error
+
+drop schema "SA" cascade;
+drop schema "SB" cascade;
+drop schema "SC" cascade;
diff --git a/sql/test/rename/Tests/rename09.stable.err 
b/sql/test/rename/Tests/rename09.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename09.stable.err
@@ -0,0 +1,68 @@
+stderr of test 'rename09` in directory 'sql/test/rename` itself:
+
+
+# 17:31:11 >  
+# 17:31:11 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=38540" "--set" 
"mapi_usock=/var/tmp/mtest-19875/.s.monetdb.38540" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_c=true"
+# 17:31:11 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = 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 = 38540
+# cmdline opt  mapi_usock = /var/tmp/mtest-19875/.s.monetdb.38540
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_rename
+# cmdline opt  embedded_c = true
+
+# 17:31:12 >  
+# 17:31:12 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-19875" "--port=38540"
+# 17:31:12 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SC"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SA"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SC"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SA"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-19875/.s.monetdb.38540
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+
+# 17:31:12 >  
+# 17:31:12 >  "Done."
+# 17:31:12 >  
+
diff --git a/sql/test/rename/Tests/rename09.stable.out 
b/sql/test/rename/Tests/rename09.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename09.stable.out
@@ -0,0 +1,157 @@
+stdout of test 'rename09` in directory 'sql/test/rename` itself:
+
+
+# 17:31:11 >  
+# 17:31:11 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=38540" "--set" 
"mapi_usock=/var/tmp/mtest-19875/.s.monetdb.38540" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_c=true"
+# 17:31:11 >  
+
+# MonetDB 5 server v11.33.2 (hg id: a903388a5459+)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_rename', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.527 GiB available main-memory.
+# 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:38540/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-19875/.s.monetdb.38540
+# 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: 11_times.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: 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
+
+Ready.
+
+# 17:31:12 >  
+# 17:31:12 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-19875" "--port=38540"
+# 17:31:12 >  
+
+#create schema "SA";
+#create schema "SB";
+#create schema "SC";
+#create table "SA"."t1" (a int);
+#insert into "SA"."t1" values (1);
+[ 1    ]
+#select "a" from "SA"."t1";
+% SA.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#start transaction; --Attempt to change schema twice within the same 
transaction
+#select "a" from "SA"."t1";
+% SA.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#alter table "SA"."t1" set schema "SB";
+#select "a" from "SB"."t1";
+% SB.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#alter table "SB"."t1" set schema "SC";
+#select "a" from "SC"."t1";
+% SC.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#rollback;
+#select "a" from "SA"."t1";
+% SA.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#alter table "SA"."t1" set schema "SB";
+#select "a" from "SB"."t1";
+% SB.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#alter table "SB"."t1" set schema "SC";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to