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

Reply via email to