Changeset: d094ee4b76b7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d094ee4b76b7 Added Files: sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.err sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.out Modified Files: sql/backends/monet5/rel_bin.c sql/include/sql_catalog.h sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.sql Branch: default Log Message:
Merge with Nov2019 diffs (truncated from 346 to 300 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -3688,7 +3688,7 @@ rel2bin_insert(backend *be, sql_rel *rel } /* before */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_insert_triggers(be, up, updates, 0)) return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", up->base.name); @@ -3702,8 +3702,9 @@ rel2bin_insert(backend *be, sql_rel *rel stmt *is = m->data; sql_idx *i = n->data; - if ((hash_index(i->type) && list_length(i->columns) <= 1) || - i->type == no_idx) + if (non_updatable_index(i->type)) /* Some indexes don't hold delta structures */ + continue; + if (hash_index(i->type) && list_length(i->columns) <= 1) is = NULL; if (i->key && constraint) { stmt *ckeys = sql_insert_key(be, inserts->op4.lval, i->key, is, pin); @@ -3728,7 +3729,7 @@ rel2bin_insert(backend *be, sql_rel *rel if (!insert) return NULL; - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_insert_triggers(be, up, updates, 1)) return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", up->base.name); @@ -3748,7 +3749,7 @@ rel2bin_insert(backend *be, sql_rel *rel ret = s; } - if(be->cur_append) //building the total number of rows affected across all tables + if (be->cur_append) //building the total number of rows affected across all tables ret->nr = add_to_merge_partitions_accumulator(be, ret->nr); if (ddl) @@ -4553,7 +4554,6 @@ sql_update_triggers(backend *be, sql_tab return res; } - static void sql_update_check_null(backend *be, sql_table *t, stmt **updates) { @@ -4603,7 +4603,7 @@ sql_update(backend *be, sql_table *t, st } /* before */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_update_triggers(be, up, rows, updates, 0)) return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", up->base.name); @@ -4623,7 +4623,7 @@ sql_update(backend *be, sql_table *t, st return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: cascade failed for table '%s'", t->base.name); /* after */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_update_triggers(be, up, rows, updates, 1)) return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", up->base.name); @@ -4695,13 +4695,16 @@ rel2bin_update(backend *be, sql_rel *rel for (m = rel->exps->h; m; m = m->next) { sql_exp *ce = m->data; sql_idx *i = find_sql_idx(t, exp_name(ce)+1); + stmt *update_idx, *is = NULL; if (i) { - stmt *update_idx = bin_find_column(be, update, ce->l, ce->r), *is = NULL; - + if (non_updatable_index(i->type)) /* Some indexes don't hold delta structures */ + continue; + + update_idx = bin_find_column(be, update, ce->l, ce->r); if (update_idx) is = update_idx; - if ((hash_index(i->type) && list_length(i->columns) <= 1) || i->type == no_idx) { + if (hash_index(i->type) && list_length(i->columns) <= 1) { is = NULL; update_idx = NULL; } @@ -4713,7 +4716,7 @@ rel2bin_update(backend *be, sql_rel *rel } /* before */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_update_triggers(be, up, tids, updates, 0)) return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", up->base.name); @@ -4735,7 +4738,7 @@ rel2bin_update(backend *be, sql_rel *rel return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: cascade failed for table '%s'", t->base.name); /* after */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_update_triggers(be, up, tids, updates, 1)) return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", up->base.name); @@ -4752,7 +4755,7 @@ rel2bin_update(backend *be, sql_rel *rel cnt = s; } - if(be->cur_append) //building the total number of rows affected across all tables + if (be->cur_append) //building the total number of rows affected across all tables cnt->nr = add_to_merge_partitions_accumulator(be, cnt->nr); if (sql->cascade_action) @@ -4923,7 +4926,7 @@ sql_delete(backend *be, sql_table *t, st } /* before */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_delete_triggers(be, up, v, 0, 1, 3)) return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers failed for table '%s'", up->base.name); @@ -4947,7 +4950,7 @@ sql_delete(backend *be, sql_table *t, st } /* after */ - if(be->cur_append && !be->first_statement_generated) { + if (be->cur_append && !be->first_statement_generated) { for(sql_table *up = t->p ; up ; up = up->p) { if (!sql_delete_triggers(be, up, v, 1, 1, 3)) return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers failed for table '%s'", up->base.name); @@ -4957,7 +4960,7 @@ sql_delete(backend *be, sql_table *t, st return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers failed for table '%s'", t->base.name); if (rows) s = stmt_aggr(be, rows, NULL, NULL, sql_bind_aggr(sql->sa, sql->session->schema, "count", NULL), 1, 0, 1); - if(be->cur_append) //building the total number of rows affected across all tables + if (be->cur_append) //building the total number of rows affected across all tables s->nr = add_to_merge_partitions_accumulator(be, s->nr); return s; } @@ -5249,7 +5252,7 @@ rel2bin_list(backend *be, sql_rel *rel, (void)refs; - if(find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create affected rows accumulator */ + if (find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create affected rows accumulator */ create_merge_partitions_accumulator(be); if (rel->l) /* first construct the sub relation */ @@ -5271,7 +5274,7 @@ rel2bin_psm(backend *be, sql_rel *rel) list *l = sa_list(sql->sa); stmt *sub = NULL; - for(n = rel->exps->h; n; n = n->next) { + for (n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; stmt *s = exp_bin(be, e, sub, NULL, NULL, NULL, NULL, NULL); if(!s) @@ -5300,8 +5303,8 @@ rel2bin_partition_limits(backend *be, sq assert(rel->exps); assert(rel->flag == ddl_alter_table_add_range_partition || rel->flag == ddl_alter_table_add_list_partition); - if(rel->exps) { - for(n = rel->exps->h; n; n = n->next) { + if (rel->exps) { + for (n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; stmt *s = exp_bin(be, e, l, r, NULL, NULL, NULL, NULL); append(slist, s); @@ -5317,7 +5320,7 @@ rel2bin_exception(backend *be, sql_rel * node *n = NULL; list *slist = sa_list(be->mvc->sa); - if(find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create affected rows accumulator */ + if (find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create affected rows accumulator */ create_merge_partitions_accumulator(be); if (rel->l) /* first construct the sub relation */ @@ -5325,8 +5328,8 @@ rel2bin_exception(backend *be, sql_rel * if (rel->r) /* first construct the sub relation */ r = subrel_bin(be, rel->r, refs); - if(rel->exps) { - for(n = rel->exps->h; n; n = n->next) { + if (rel->exps) { + for (n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; stmt *s = exp_bin(be, e, l, r, NULL, NULL, NULL, NULL); append(slist, s); @@ -5715,7 +5718,7 @@ output_rel_bin(backend *be, sql_rel *rel if (!is_ddl(rel->op) && s && s->type != st_none && sql->type == Q_TABLE) s = stmt_output(be, s); if (sqltype == Q_UPDATE && s && (s->type != st_list || be->cur_append)) { - if(be->cur_append) { /* finish the output bat */ + if (be->cur_append) { /* finish the output bat */ s->nr = be->cur_append; be->cur_append = 0; be->first_statement_generated = false; 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 @@ -464,6 +464,7 @@ typedef enum idx_type { #define hash_index(t) (t == hash_idx || t == oph_idx ) #define idx_has_column(t) (hash_index(t) || t == join_idx) #define oid_index(t) (t == join_idx) +#define non_updatable_index(t) (t == ordered_idx || t == no_idx) typedef struct sql_idx { sql_base base; diff --git a/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.sql b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.sql --- a/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.sql +++ b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.sql @@ -2,5 +2,8 @@ start transaction; create table a(a int, b int, id bigserial); create ordered index a_pk on a(id); create index a_idx1 on a(a); -insert into a(a) values(1); +insert into a(a) values(1), (2); +update a set a = 3, b = 3 where a = 1; +delete from a where a = 3; +truncate table a; rollback; diff --git a/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.err b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.err @@ -0,0 +1,30 @@ +stderr of test 'index-insert-crash.Bug-6781` in directory 'sql/test/BugTracker-2019` itself: + + +# 16:41:05 > +# 16:41:05 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=39858" "--set" "mapi_usock=/var/tmp/mtest-320772/.s.monetdb.39858" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_BugTracker-2019" "--set" "embedded_c=true" +# 16:41:05 > + +# 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 = 39858 +# cmdline opt mapi_usock = /var/tmp/mtest-320772/.s.monetdb.39858 +# cmdline opt gdk_dbpath = /home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_BugTracker-2019 +# cmdline opt embedded_c = true + +# 16:41:06 > +# 16:41:06 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-320772" "--port=39858" +# 16:41:06 > + + +# 16:41:06 > +# 16:41:06 > "Done." +# 16:41:06 > + diff --git a/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.out b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2019/Tests/index-insert-crash.Bug-6781.stable.out @@ -0,0 +1,82 @@ +stdout of test 'index-insert-crash.Bug-6781` in directory 'sql/test/BugTracker-2019` itself: + + +# 16:41:05 > +# 16:41:05 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=39858" "--set" "mapi_usock=/var/tmp/mtest-320772/.s.monetdb.39858" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_BugTracker-2019" "--set" "embedded_c=true" +# 16:41:05 > + +# MonetDB 5 server v11.35.0 (hg id: fa18e9dd4cf2+) +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2019', using 8 threads +# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers +# Found 15.504 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:39858/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-320772/.s.monetdb.39858 +# 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 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list