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

Do a transaction hard reset during a rollback from a transaction with table 
schema changes.

This avoids problems when rollbacking a transaction with both a schema name 
change and table drop.


diffs (193 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,7 +605,6 @@ 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
@@ -3987,20 +3987,7 @@ reset_schema(sql_trans *tr, sql_schema *
 static int
 reset_trans(sql_trans *tr, sql_trans *ptr)
 {
-       int res;
-
-       if (tr != gtrans && tr->moved_tables) { //before doing any schema 
updates,
-               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;
-       res = reset_changeset(tr, &tr->schemas, &ptr->schemas, (sql_base 
*)tr->parent, (resetf) &reset_schema, (dupfunc) &schema_dup);
+       int res = reset_changeset(tr, &tr->schemas, &ptr->schemas, (sql_base 
*)tr->parent, (resetf) &reset_schema, (dupfunc) &schema_dup);
 #ifdef STORE_DEBUG
        fprintf(stderr,"#reset trans %d\n", tr->wtime);
 #endif
@@ -5209,7 +5196,6 @@ sql_trans_set_table_schema(sql_trans *tr
        m->from = os;
        m->to = ns;
        m->t = t;
-       m->p = tr->moved_tables->t;
        list_append(tr->moved_tables, m);
 
        tr->wtime = tr->wstime;
@@ -6516,8 +6502,15 @@ sql_trans_begin(sql_session *s)
        fprintf(stderr,"#sql trans begin %d\n", snr);
 #endif
        if (tr->stime < gtrans->wstime || tr->wtime || 
-                       store_schema_number() != snr) 
-               reset_trans(tr, gtrans);
+                       store_schema_number() != snr) {
+               if (!list_empty(tr->moved_tables)) {
+                       tr->name = (char*)1; /* make sure it get destroyed 
properly */
+                       sql_trans_destroy(tr);
+                       s->tr = tr = sql_trans_create(s->stk, NULL, NULL);
+               } else {
+                       reset_trans(tr, gtrans);
+               }
+       }
        tr = trans_init(tr, tr->stk, tr->parent);
        s->active = 1;
        s->schema = find_sql_schema(tr, s->schema_name);
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
@@ -8,3 +8,4 @@ rename06
 rename07
 rename08
 rename09
+rename10
diff --git a/sql/test/rename/Tests/rename10.sql 
b/sql/test/rename/Tests/rename10.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename10.sql
@@ -0,0 +1,16 @@
+create schema "SA";
+create schema "SB";
+
+create table "SA"."t1" (a int);
+insert into "SA"."t1" values (1);
+
+start transaction;
+alter table "SA"."t1" set schema "SB";
+drop table "SB"."t1";
+rollback;
+
+select "a" from "SA"."t1";
+select "a" from "SB"."t1"; --error
+
+drop schema "SA" cascade;
+drop schema "SB" cascade;
diff --git a/sql/test/rename/Tests/rename10.stable.err 
b/sql/test/rename/Tests/rename10.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename10.stable.err
@@ -0,0 +1,44 @@
+stderr of test 'rename10` in directory 'sql/test/rename` itself:
+
+
+# 14:45:03 >  
+# 14:45:03 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=37484" "--set" 
"mapi_usock=/var/tmp/mtest-8569/.s.monetdb.37484" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_c=true"
+# 14:45:03 >  
+
+# 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 = 37484
+# cmdline opt  mapi_usock = /var/tmp/mtest-8569/.s.monetdb.37484
+# 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
+#main thread:!ERROR:LoaderException:loadLibrary:Loading error failed to open 
library lidar (from within file 
'/home/ferreira/repositories/MonetDB-Apr2019/BUILD/lib/monetdb5/lib_lidar.so'): 
libpq.so.5: cannot open shared object file: No such file or directory
+#main thread:!ERROR:SyntaxException:parseError:
+#main 
thread:!ERROR:SyntaxException:parseError:^LoaderException:loadLibrary:Loading 
error failed to open library lidar (from within file 
'/home/ferreira/repositories/MonetDB-Apr2019/BUILD/lib/monetdb5/lib_lidar.so'): 
libpq.so.5: cannot open shared object file: No such file or directory
+#main thread:!ERROR:LoaderException:loadLibrary:Loading error failed to open 
library shp (from within file 
'/home/ferreira/repositories/MonetDB-Apr2019/BUILD/lib/monetdb5/lib_shp.so'): 
libpq.so.5: cannot open shared object file: No such file or directory
+#main thread:!ERROR:SyntaxException:parseError:
+#main 
thread:!ERROR:SyntaxException:parseError:^LoaderException:loadLibrary:Loading 
error failed to open library shp (from within file 
'/home/ferreira/repositories/MonetDB-Apr2019/BUILD/lib/monetdb5/lib_shp.so'): 
libpq.so.5: cannot open shared object file: No such file or directory
+#client2:!ERROR:ParseException:SQLparser:42S02!SELECT: no such table 't1'
+#main thread:!ERROR:MALException:client.quit:Server stopped
+
+# 14:45:03 >  
+# 14:45:03 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-8569" "--port=37484"
+# 14:45:03 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-8569/.s.monetdb.37484
+QUERY = select "a" from "SB"."t1"; --error
+ERROR = !SELECT: no such table 't1'
+CODE  = 42S02
+
+# 14:45:03 >  
+# 14:45:03 >  "Done."
+# 14:45:03 >  
+
diff --git a/sql/test/rename/Tests/rename10.stable.out 
b/sql/test/rename/Tests/rename10.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/rename/Tests/rename10.stable.out
@@ -0,0 +1,48 @@
+stdout of test 'rename10` in directory 'sql/test/rename` itself:
+
+
+# 14:45:03 >  
+# 14:45:03 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=37484" "--set" 
"mapi_usock=/var/tmp/mtest-8569/.s.monetdb.37484" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_rename"
 "--set" "embedded_c=true"
+# 14:45:03 >  
+
+# MonetDB 5 server v11.33.2 (hg id: df9f1d0b6f5f+)
+# 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:37484/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-8569/.s.monetdb.37484
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 14:45:03 >  
+# 14:45:03 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-8569" "--port=37484"
+# 14:45:03 >  
+
+#create schema "SA";
+#create schema "SB";
+#create table "SA"."t1" (a int);
+#insert into "SA"."t1" values (1);
+[ 1    ]
+#start transaction;
+#alter table "SA"."t1" set schema "SB";
+#drop table "SB"."t1";
+#rollback;
+#select "a" from "SA"."t1";
+% SA.t1 # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1    ]
+#drop schema "SA" cascade;
+#drop schema "SB" cascade;
+
+# 14:45:03 >  
+# 14:45:03 >  "Done."
+# 14:45:03 >  
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to