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