From a3ccad0f21e48e30c98f91528e3fcbbf2c1d509a Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 12 Feb 2019 15:38:01 +1100 Subject: [PATCH 01/10] Aggregate functions: only create list if args exist Also always empty list rather than only if there is no error. --- sql/item_func.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index 72cfd284606..da0e669ae9d 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -6515,17 +6515,20 @@ Item_func_sp::fix_fields(THD *thd, Item **ref) if (m_sp->agg_type() == GROUP_AGGREGATE) { - List list; - list.empty(); - for (uint i=0; i < arg_count; i++) - list.push_back(*(args+i)); - Item_sum_sp *item_sp; Query_arena *arena, backup; arena= thd->activate_stmt_arena_if_needed(&backup); if (arg_count) + { + List list; + list.empty(); + for (uint i=0; i < arg_count; i++) + list.push_back(*(args+i)); + item_sp= new (thd->mem_root) Item_sum_sp(thd, context, m_name, sp, list); + list.empty(); + } else item_sp= new (thd->mem_root) Item_sum_sp(thd, context, m_name, sp); @@ -6539,7 +6542,6 @@ Item_func_sp::fix_fields(THD *thd, Item **ref) if (err) DBUG_RETURN(TRUE); - list.empty(); DBUG_RETURN(FALSE); } From 8a3a332bc083d4900431da65e2375a1f89ad02f6 Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Wed, 13 Feb 2019 17:40:03 +0400 Subject: [PATCH 02/10] Cleanup Item_func_sp::fix_fields() No need to call list.empty(): first one is called by List constructor, second one doesn't make sense as the object is destroyed immediately afterwards. --- sql/item_func.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index da0e669ae9d..86f00ecb412 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -6522,12 +6522,9 @@ Item_func_sp::fix_fields(THD *thd, Item **ref) if (arg_count) { List list; - list.empty(); - for (uint i=0; i < arg_count; i++) - list.push_back(*(args+i)); - + for (uint i= 0; i < arg_count; i++) + list.push_back(args[i]); item_sp= new (thd->mem_root) Item_sum_sp(thd, context, m_name, sp, list); - list.empty(); } else item_sp= new (thd->mem_root) Item_sum_sp(thd, context, m_name, sp); From 44898d28f0f2185a4a8ff109c58972d28b8cae95 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 6 Feb 2019 08:28:48 +1100 Subject: [PATCH 03/10] my_close: Don't retry on close According to close(2) "Retrying the close() after a failure return is the wrong thing to do" Even the EINTR case its maybe closed. Take the prudent approach here an risk leaking one file descriptor rather than closing one that is nolonger ours. --- mysys/my_open.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mysys/my_open.c b/mysys/my_open.c index 54e53089da9..92e46610100 100644 --- a/mysys/my_open.c +++ b/mysys/my_open.c @@ -89,10 +89,7 @@ int my_close(File fd, myf MyFlags) my_file_info[fd].type= UNOPEN; } #ifndef _WIN32 - do - { - err= close(fd); - } while (err == -1 && errno == EINTR); + err= close(fd); #else err= my_win_close(fd); #endif From 438811b4b28fab6c775522bc35b53923c8e1e9c4 Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 13 Feb 2019 18:21:19 +0200 Subject: [PATCH 04/10] Fixed two bugs related to column level constraints - CREATE TABLE ... SELECT drops constraints for columns that are both in the create and select part. - Fixed by copying the constraint in Column_definiton::redefine_stage1_common() - If one has both a default expression and check constraint for a column, one can get the error "Expression for field `a` is refering to uninitialized field `a`. - Fixed by ignoring default expressions for current column when checking for CHECK constraint --- mysql-test/main/constraints.result | 17 +++++++++++++++++ mysql-test/main/constraints.test | 20 ++++++++++++++++++++ sql/field.cc | 1 + sql/table.cc | 25 +++++++++++++++++-------- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/mysql-test/main/constraints.result b/mysql-test/main/constraints.result index 3c061989fd3..aba226cdd33 100644 --- a/mysql-test/main/constraints.result +++ b/mysql-test/main/constraints.result @@ -111,3 +111,20 @@ long_enough_name CREATE TABLE `long_enough_name` ( CONSTRAINT `constr` CHECK (`f6` >= 0) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE long_enough_name; +create table t1 (a int check (a>10)) select 100 as 'a'; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL CHECK (`a` > 10) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a text default(length(now())) check (length(a) > 1)); +insert into t1 values (); +insert into t1 values ("ccc"); +insert into t1 values (""); +ERROR 23000: CONSTRAINT `t1.a` failed for `test`.`t1` +select * from t1; +a +19 +ccc +drop table t1; diff --git a/mysql-test/main/constraints.test b/mysql-test/main/constraints.test index fe51e5060dc..c06f585d04f 100644 --- a/mysql-test/main/constraints.test +++ b/mysql-test/main/constraints.test @@ -102,3 +102,23 @@ SELECT * FROM long_enough_name AS tbl; SHOW CREATE TABLE long_enough_name; DROP TABLE long_enough_name; + +# +# Check that we don't loose constraints as part of CREATE ... SELECT +# + +create table t1 (a int check (a>10)) select 100 as 'a'; +show create table t1; +drop table t1; + +# +# Check that we constraints on field with default expressions work +# + +create table t1 (a text default(length(now())) check (length(a) > 1)); +insert into t1 values (); +insert into t1 values ("ccc"); +--error ER_CONSTRAINT_FAILED +insert into t1 values (""); +select * from t1; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index fbaf3c6ea91..a20525b2764 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -11047,6 +11047,7 @@ Column_definition::redefine_stage1_common(const Column_definition *dup_field, interval= dup_field->interval; vcol_info= dup_field->vcol_info; invisible= dup_field->invisible; + check_constraint= dup_field->check_constraint; } diff --git a/sql/table.cc b/sql/table.cc index a44e0fcc0a5..d4b1be17c11 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -51,7 +51,8 @@ static Virtual_column_info * unpack_vcol_info_from_frm(THD *, MEM_ROOT *, TABLE *, String *, Virtual_column_info **, bool *); -static bool check_vcol_forward_refs(Field *, Virtual_column_info *); +static bool check_vcol_forward_refs(Field *, Virtual_column_info *, + bool check_constraint); /* INFORMATION_SCHEMA name */ LEX_CSTRING INFORMATION_SCHEMA_NAME= {STRING_WITH_LEN("information_schema")}; @@ -1135,9 +1136,9 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, for (field_ptr= table->field; *field_ptr; field_ptr++) { Field *field= *field_ptr; - if (check_vcol_forward_refs(field, field->vcol_info) || - check_vcol_forward_refs(field, field->check_constraint) || - check_vcol_forward_refs(field, field->default_value)) + if (check_vcol_forward_refs(field, field->vcol_info, 0) || + check_vcol_forward_refs(field, field->check_constraint, 1) || + check_vcol_forward_refs(field, field->default_value, 0)) goto end; } @@ -3087,11 +3088,19 @@ end: DBUG_RETURN(vcol_info); } -static bool check_vcol_forward_refs(Field *field, Virtual_column_info *vcol) +static bool check_vcol_forward_refs(Field *field, Virtual_column_info *vcol, + bool check_constraint) { - bool res= vcol && - vcol->expr->walk(&Item::check_field_expression_processor, 0, - field); + bool res; + uint32 flags= field->flags; + if (check_constraint) + { + /* Check constraints can refer it itself */ + field->flags|= NO_DEFAULT_VALUE_FLAG; + } + res= (vcol && + vcol->expr->walk(&Item::check_field_expression_processor, 0, field)); + field->flags= flags; return res; } From 7fa67e391f92912f58557453ab114781d72099f6 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 21 May 2018 15:16:36 +1000 Subject: [PATCH 05/10] heap: remove NEW_HASH_FUNCTION This was added in 29fa72526a22 (in 2000) and nothing defines NEW_HASH_FUNCTION. A low collision is the wrong tradeoff, it should be focused on throughput. d405bee0580eb30e53e5391bbb49ef44fa3d73ad shows the existing function is pretty cpu intensive and needs to be improved as well. --- storage/heap/hp_hash.c | 132 ----------------------------------------- 1 file changed, 132 deletions(-) diff --git a/storage/heap/hp_hash.c b/storage/heap/hp_hash.c index 46ac0270300..38228c708bd 100644 --- a/storage/heap/hp_hash.c +++ b/storage/heap/hp_hash.c @@ -209,8 +209,6 @@ void hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) return; } -#ifndef NEW_HASH_FUNCTION - /* Calc hashvalue for a key */ ulong hp_hashnr(register HP_KEYDEF *keydef, register const uchar *key) @@ -350,136 +348,6 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec) return(nr); } -#else - -/* - * Fowler/Noll/Vo hash - * - * The basis of the hash algorithm was taken from an idea sent by email to the - * IEEE Posix P1003.2 mailing list from Phong Vo (kpv@research.att.com) and - * Glenn Fowler (gsf@research.att.com). Landon Curt Noll (chongo@toad.com) - * later improved on their algorithm. - * - * The magic is in the interesting relationship between the special prime - * 16777619 (2^24 + 403) and 2^32 and 2^8. - * - * This hash produces the fewest collisions of any function that we've seen so - * far, and works well on both numbers and strings. - */ - -ulong hp_hashnr(register HP_KEYDEF *keydef, register const uchar *key) -{ - /* - Note, if a key consists of a combination of numeric and - a text columns, it most likely won't work well. - Making text columns work with NEW_HASH_FUNCTION - needs also changes in strings/ctype-xxx.c. - */ - ulong nr= 1, nr2= 4; - HA_KEYSEG *seg,*endseg; - - for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) - { - uchar *pos=(uchar*) key; - key+=seg->length; - if (seg->null_bit) - { - key++; - if (*pos) - { - nr^= (nr << 1) | 1; - /* Add key pack length (2) to key for VARCHAR segments */ - if (seg->type == HA_KEYTYPE_VARTEXT1) - key+= 2; - continue; - } - pos++; - } - if (seg->type == HA_KEYTYPE_TEXT) - { - seg->charset->coll->hash_sort(seg->charset, pos, ((uchar*)key)-pos, - &nr, &nr2); - } - else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ - { - uint pack_length= 2; /* Key packing is constant */ - uint length= uint2korr(pos); - seg->charset->coll->hash_sort(seg->charset, pos+pack_length, length, - &nr, &nr2); - key+= pack_length; - } - else - { - for ( ; pos < (uchar*) key ; pos++) - { - nr *=16777619; - nr ^=(uint) *pos; - } - } - } -#ifdef ONLY_FOR_HASH_DEBUGGING - DBUG_PRINT("exit", ("hash: 0x%lx", nr)); -#endif - return(nr); -} - - /* Calc hashvalue for a key in a record */ - -ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec) -{ - ulong nr= 1, nr2= 4; - HA_KEYSEG *seg,*endseg; - - for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) - { - uchar *pos=(uchar*) rec+seg->start; - if (seg->null_bit) - { - if (rec[seg->null_pos] & seg->null_bit) - { - nr^= (nr << 1) | 1; - continue; - } - } - if (seg->type == HA_KEYTYPE_TEXT) - { - uint char_length= seg->length; /* TODO: fix to use my_charpos() */ - seg->charset->coll->hash_sort(seg->charset, pos, char_length, - &nr, &nr2); - } - else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ - { - uint pack_length= seg->bit_start; - uint length= (pack_length == 1 ? (uint) *(uchar*) pos : uint2korr(pos)); - seg->charset->coll->hash_sort(seg->charset, pos+pack_length, - length, &nr, &nr2); - } - else - { - uchar *end= pos+seg->length; - if (seg->type == HA_KEYTYPE_BIT && seg->bit_length) - { - uchar bits= get_rec_bits(rec + seg->bit_pos, - seg->bit_start, seg->bit_length); - nr *=16777619; - nr ^=(uint) bits; - end--; - } - for ( ; pos < end ; pos++) - { - nr *=16777619; - nr ^=(uint) *pos; - } - } - } -#ifdef ONLY_FOR_HASH_DEBUGGING - DBUG_PRINT("exit", ("hash: 0x%lx", nr)); -#endif - return(nr); -} - -#endif - /* Compare keys for two records. Returns 0 if they are identical From ce0678f6cb367c2f3bf897d467846b47aa710529 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 22 May 2018 07:49:44 +1000 Subject: [PATCH 06/10] hash (storage): hp_hashnr is local Remove 'register' quantifer from args too. --- storage/heap/heapdef.h | 1 - storage/heap/hp_hash.c | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/heap/heapdef.h b/storage/heap/heapdef.h index 4fcdffb66b1..fa1f559e211 100644 --- a/storage/heap/heapdef.h +++ b/storage/heap/heapdef.h @@ -81,7 +81,6 @@ extern uchar *hp_search(HP_INFO *info,HP_KEYDEF *keyinfo,const uchar *key, uint nextflag); extern uchar *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key, HASH_INFO *pos); -extern ulong hp_hashnr(HP_KEYDEF *keyinfo,const uchar *key); extern ulong hp_rec_hashnr(HP_KEYDEF *keyinfo,const uchar *rec); extern void hp_movelink(HASH_INFO *pos,HASH_INFO *next_link, HASH_INFO *newlink); diff --git a/storage/heap/hp_hash.c b/storage/heap/hp_hash.c index 38228c708bd..d90b7731600 100644 --- a/storage/heap/hp_hash.c +++ b/storage/heap/hp_hash.c @@ -19,6 +19,7 @@ #include "heapdef.h" #include +static ulong hp_hashnr(HP_KEYDEF *keydef, const uchar *key); /* Find out how many rows there is in the given range @@ -211,7 +212,7 @@ void hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) /* Calc hashvalue for a key */ -ulong hp_hashnr(register HP_KEYDEF *keydef, register const uchar *key) +static ulong hp_hashnr(HP_KEYDEF *keydef, const uchar *key) { /*register*/ ulong nr=1, nr2=4; From e8b6c15010e6fffe17e27c165b8c60b51a8f66a7 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Wed, 13 Feb 2019 23:26:23 +0400 Subject: [PATCH 07/10] connect.xml.result fixed. --- storage/connect/mysql-test/connect/r/xml.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/connect/mysql-test/connect/r/xml.result b/storage/connect/mysql-test/connect/r/xml.result index 99739b1ec10..6a0c9db27b3 100644 --- a/storage/connect/mysql-test/connect/r/xml.result +++ b/storage/connect/mysql-test/connect/r/xml.result @@ -323,7 +323,7 @@ HEX(c) 3F3F3F3F3F3F3F Warnings: Level Warning Code 1366 -Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column 'c' at row 1 +Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column `test`.`t1`.`c` at row 1 Level Warning Code 1105 Message Out of range value ÁÂÃÄÅÆÇ for column 'c' at row 1 From dcaabf07fdfb608fe3e6485e392bc10757891ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 15 Feb 2019 09:33:49 +0200 Subject: [PATCH 08/10] MDEV-18109: Galera 4: run galera_sr test suite Fix some of the galera_sr suite test failures. Remove tests that are not going to be run because required feature is not supported. modified: mysql-test/suite/galera_sr/disabled.def deleted: mysql-test/suite/galera_sr/r/GCF-574.result modified: mysql-test/suite/galera_sr/r/galera_sr_cc_slave.result modified: mysql-test/suite/galera_sr/r/galera_sr_kill_all_norecovery.result modified: mysql-test/suite/galera_sr/r/galera_sr_load_data.result deleted: mysql-test/suite/galera_sr/r/galera_sr_sbr.result modified: mysql-test/suite/galera_sr/r/mysql-wsrep-features#148.result deleted: mysql-test/suite/galera_sr/r/mysql-wsrep-features#29.result deleted: mysql-test/suite/galera_sr/t/GCF-574.test modified: mysql-test/suite/galera_sr/t/galera_sr_cc_slave.test modified: mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.cnf modified: mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test modified: mysql-test/suite/galera_sr/t/galera_sr_load_data.test deleted: mysql-test/suite/galera_sr/t/galera_sr_sbr.test modified: mysql-test/suite/galera_sr/t/mysql-wsrep-features#148.test deleted: mysql-test/suite/galera_sr/t/mysql-wsrep-features#29.test --- mysql-test/suite/galera_sr/disabled.def | 4 +-- mysql-test/suite/galera_sr/r/GCF-574.result | 11 ------- .../galera_sr/r/galera_sr_cc_slave.result | 2 ++ .../r/galera_sr_kill_all_norecovery.result | 2 ++ .../galera_sr/r/galera_sr_load_data.result | 1 + .../suite/galera_sr/r/galera_sr_sbr.result | 16 ---------- .../r/mysql-wsrep-features#148.result | 9 ++---- .../r/mysql-wsrep-features#29.result | 14 --------- mysql-test/suite/galera_sr/t/GCF-574.test | 27 ---------------- .../suite/galera_sr/t/galera_sr_cc_slave.test | 8 +++++ .../t/galera_sr_kill_all_norecovery.cnf | 4 +++ .../t/galera_sr_kill_all_norecovery.test | 7 +++++ .../galera_sr/t/galera_sr_load_data.test | 10 ++++++ .../suite/galera_sr/t/galera_sr_sbr.test | 31 ------------------- .../galera_sr/t/mysql-wsrep-features#148.test | 6 ++-- .../galera_sr/t/mysql-wsrep-features#29.test | 23 -------------- 16 files changed, 42 insertions(+), 133 deletions(-) delete mode 100644 mysql-test/suite/galera_sr/r/GCF-574.result delete mode 100644 mysql-test/suite/galera_sr/r/galera_sr_sbr.result delete mode 100644 mysql-test/suite/galera_sr/r/mysql-wsrep-features#29.result delete mode 100644 mysql-test/suite/galera_sr/t/GCF-574.test delete mode 100644 mysql-test/suite/galera_sr/t/galera_sr_sbr.test delete mode 100644 mysql-test/suite/galera_sr/t/mysql-wsrep-features#29.test diff --git a/mysql-test/suite/galera_sr/disabled.def b/mysql-test/suite/galera_sr/disabled.def index 94f328bf31b..8bed54eb5c6 100644 --- a/mysql-test/suite/galera_sr/disabled.def +++ b/mysql-test/suite/galera_sr/disabled.def @@ -1,3 +1 @@ -mysql-wsrep-features#29 : binlog_format=STATEMENT not supported with SR -GCF-574 : CTAS is not supported together with SR -galera_sr_sbr : binlog_format=STATEMENT not supported with SR +galera_sr_table_contents : missing file diff --git a/mysql-test/suite/galera_sr/r/GCF-574.result b/mysql-test/suite/galera_sr/r/GCF-574.result deleted file mode 100644 index bbf817c8c6c..00000000000 --- a/mysql-test/suite/galera_sr/r/GCF-574.result +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); -SET SESSION wsrep_trx_fragment_size = 1; -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; -wsrep_last_committed_delta -1 -SELECT COUNT(*) = 10000 FROM t1; -COUNT(*) = 10000 -1 -DROP TABLE t1; -DROP TABLE ten; diff --git a/mysql-test/suite/galera_sr/r/galera_sr_cc_slave.result b/mysql-test/suite/galera_sr/r/galera_sr_cc_slave.result index 671745c8686..d439380e2ce 100644 --- a/mysql-test/suite/galera_sr/r/galera_sr_cc_slave.result +++ b/mysql-test/suite/galera_sr/r/galera_sr_cc_slave.result @@ -1,5 +1,7 @@ connection node_2; connection node_1; +connection node_1; +connection node_2; connection node_2; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; COUNT(*) = 0 diff --git a/mysql-test/suite/galera_sr/r/galera_sr_kill_all_norecovery.result b/mysql-test/suite/galera_sr/r/galera_sr_kill_all_norecovery.result index 7525cd6d4b7..d9d91b5e3c5 100644 --- a/mysql-test/suite/galera_sr/r/galera_sr_kill_all_norecovery.result +++ b/mysql-test/suite/galera_sr/r/galera_sr_kill_all_norecovery.result @@ -1,5 +1,7 @@ connection node_2; connection node_1; +connection node_1; +connection node_2; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET SESSION wsrep_trx_fragment_size = 1; SET AUTOCOMMIT=OFF; diff --git a/mysql-test/suite/galera_sr/r/galera_sr_load_data.result b/mysql-test/suite/galera_sr/r/galera_sr_load_data.result index 354f9ca718a..99885b42fa0 100644 --- a/mysql-test/suite/galera_sr/r/galera_sr_load_data.result +++ b/mysql-test/suite/galera_sr/r/galera_sr_load_data.result @@ -10,4 +10,5 @@ COUNT(*) = 20000 1 wsrep_last_committed_diff 1 +connection node_1; DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/galera_sr_sbr.result b/mysql-test/suite/galera_sr/r/galera_sr_sbr.result deleted file mode 100644 index c83db3d5ea6..00000000000 --- a/mysql-test/suite/galera_sr/r/galera_sr_sbr.result +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE t1 (id INT) ENGINE=InnoDB; -SET SESSION wsrep_trx_fragment_size = 1; -SET SESSION BINLOG_FORMAT='STATEMENT'; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (1); -INSERT INTO t1 VALUES (2); -INSERT INTO t1 VALUES (3); -INSERT INTO t1 VALUES (4); -INSERT INTO t1 VALUES (5); -SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -COMMIT; -SELECT COUNT(*) = 5 FROM t1; -COUNT(*) = 5 -1 -DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#148.result b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#148.result index a85c0f302d0..98bf13e9d2b 100644 --- a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#148.result +++ b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#148.result @@ -6,9 +6,7 @@ CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (6),(7),(8),(9),(10),(1); connection node_2; SET GLOBAL wsrep_slave_threads = 2; -SET GLOBAL DEBUG = 'd,sync.wsrep_apply_cb'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET GLOBAL debug_dbug = 'd,sync.wsrep_apply_cb'; connection node_1; SET SESSION wsrep_trx_fragment_size = 1; SET AUTOCOMMIT=OFF; @@ -28,9 +26,7 @@ connection node_1; Got one of the listed errors connection node_2; SET GLOBAL wsrep_slave_threads = 1; -SET GLOBAL DEBUG = ''; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET GLOBAL debug_dbug = ''; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; @@ -40,3 +36,4 @@ COUNT(*) = 10 1 DROP TABLE t1; DROP TABLE t2; +SET DEBUG_SYNC = RESET; diff --git a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#29.result b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#29.result deleted file mode 100644 index 29b17ea07d6..00000000000 --- a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#29.result +++ /dev/null @@ -1,14 +0,0 @@ -SET SESSION wsrep_trx_fragment_size = 1; -SET SESSION binlog_format = STATEMENT; -create table t1 (id int not null, f_id int not null, f int not null, -primary key(f_id, id)) engine=innodb; -create table t2 (id int not null,s_id int not null,s varchar(200), -primary key(id)) engine=innodb; -INSERT INTO t1 VALUES (8, 1, 3); -INSERT INTO t1 VALUES (1, 2, 1); -INSERT INTO t2 VALUES (1, 0, ''); -INSERT INTO t2 VALUES (8, 1, ''); -DELETE ml.* FROM t1 AS ml LEFT JOIN t2 AS mm ON (mm.id=ml.id) -WHERE mm.id IS NULL; -DROP TABLE t1; -DROP TABLE t2; diff --git a/mysql-test/suite/galera_sr/t/GCF-574.test b/mysql-test/suite/galera_sr/t/GCF-574.test deleted file mode 100644 index c9d7c405d14..00000000000 --- a/mysql-test/suite/galera_sr/t/GCF-574.test +++ /dev/null @@ -1,27 +0,0 @@ ---source include/galera_cluster.inc ---source include/have_innodb.inc - -# -# Test CREATE TABLE ... SELECT with Streaming Replication -# - ---connection node_1 -CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); - ---let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` - -SET SESSION wsrep_trx_fragment_size = 1; -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; - ---let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` ---disable_query_log ---eval SELECT ($wsrep_last_committed_after - $wsrep_last_committed_before) > 1 AS wsrep_last_committed_delta; ---enable_query_log - ---connection node_2 -SELECT COUNT(*) = 10000 FROM t1; - ---connection node_1 -DROP TABLE t1; -DROP TABLE ten; diff --git a/mysql-test/suite/galera_sr/t/galera_sr_cc_slave.test b/mysql-test/suite/galera_sr/t/galera_sr_cc_slave.test index 8c790ac7cd2..7ba0f253b4a 100644 --- a/mysql-test/suite/galera_sr/t/galera_sr_cc_slave.test +++ b/mysql-test/suite/galera_sr/t/galera_sr_cc_slave.test @@ -7,6 +7,11 @@ # leave the cluster. # +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source ../../galera/include/auto_increment_offset_save.inc + # Start with a clean slate --connection node_2 SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; @@ -95,3 +100,6 @@ SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; DROP TABLE t1; CALL mtr.add_suppression("points to own listening address, blacklisting"); + +# Restore original auto_increment_offset values. +--source ../../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.cnf b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.cnf index 6422d7541ba..82c001e0131 100644 --- a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.cnf +++ b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.cnf @@ -2,3 +2,7 @@ [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.recovery=false' +auto_increment_offset=1 + +[mysqld.2] +auto_increment_offset=2 diff --git a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test index 042e3d3ef57..5a1f9e7997a 100644 --- a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test +++ b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test @@ -6,6 +6,11 @@ --source include/galera_cluster.inc --source include/big_test.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source ../../galera/include/auto_increment_offset_save.inc + CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET SESSION wsrep_trx_fragment_size = 1; SET AUTOCOMMIT=OFF; @@ -50,4 +55,6 @@ SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; +--source ../../galera/include/auto_increment_offset_restore.inc + DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/t/galera_sr_load_data.test b/mysql-test/suite/galera_sr/t/galera_sr_load_data.test index 70f0926ed1b..363443a9e64 100644 --- a/mysql-test/suite/galera_sr/t/galera_sr_load_data.test +++ b/mysql-test/suite/galera_sr/t/galera_sr_load_data.test @@ -24,6 +24,9 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; --connection node_1 --disable_query_log +--disable_warnings +set global wsrep_load_data_splitting=ON; +--enable_warnings --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/galera_sr_load_data.csv' INTO TABLE t1; --enable_query_log @@ -36,4 +39,11 @@ SELECT COUNT(*) = 20000 FROM t1; --eval SELECT $wsrep_last_committed_after - $wsrep_last_committed_before = 3 AS wsrep_last_committed_diff --enable_query_log +--connection node_1 +--disable_query_log +--disable_warnings +set global wsrep_load_data_splitting=OFF; +--enable_warnings +--enable_query_log + DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/t/galera_sr_sbr.test b/mysql-test/suite/galera_sr/t/galera_sr_sbr.test deleted file mode 100644 index a24a520af60..00000000000 --- a/mysql-test/suite/galera_sr/t/galera_sr_sbr.test +++ /dev/null @@ -1,31 +0,0 @@ ---source include/galera_cluster.inc ---source include/have_innodb.inc - -# -# Test that SR does not assert in the presence of statement-based replication events -# - ---connection node_1 -CREATE TABLE t1 (id INT) ENGINE=InnoDB; -SET SESSION wsrep_trx_fragment_size = 1; -SET SESSION BINLOG_FORMAT='STATEMENT'; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (1); -INSERT INTO t1 VALUES (2); -INSERT INTO t1 VALUES (3); -INSERT INTO t1 VALUES (4); -INSERT INTO t1 VALUES (5); - ---connection node_2 -SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; ---let $wait_condition = SELECT COUNT(*) > 0 FROM t1; ---source include/wait_condition.inc - ---connection node_1 -COMMIT; - ---connection node_2 -SELECT COUNT(*) = 5 FROM t1; - -DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#148.test b/mysql-test/suite/galera_sr/t/mysql-wsrep-features#148.test index 5210b9ce99e..e0a443061df 100644 --- a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#148.test +++ b/mysql-test/suite/galera_sr/t/mysql-wsrep-features#148.test @@ -16,7 +16,7 @@ INSERT INTO t2 VALUES (6),(7),(8),(9),(10),(1); --connection node_2 SET GLOBAL wsrep_slave_threads = 2; -SET GLOBAL DEBUG = 'd,sync.wsrep_apply_cb'; +SET GLOBAL debug_dbug = 'd,sync.wsrep_apply_cb'; # Begin SR transaction --connection node_1 @@ -48,7 +48,7 @@ COMMIT; --connection node_2 SET GLOBAL wsrep_slave_threads = 1; -SET GLOBAL DEBUG = ''; +SET GLOBAL debug_dbug = ''; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; @@ -58,3 +58,5 @@ SELECT COUNT(*) = 10 FROM t1; DROP TABLE t1; DROP TABLE t2; + +SET DEBUG_SYNC = RESET; diff --git a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#29.test b/mysql-test/suite/galera_sr/t/mysql-wsrep-features#29.test deleted file mode 100644 index 2349fe9979f..00000000000 --- a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#29.test +++ /dev/null @@ -1,23 +0,0 @@ -# -# mysql-wsrep-features#29 Unwarranted deadlock error with SR and a single-node cluster -# - -SET SESSION wsrep_trx_fragment_size = 1; -SET SESSION binlog_format = STATEMENT; - -create table t1 (id int not null, f_id int not null, f int not null, -primary key(f_id, id)) engine=innodb; - -create table t2 (id int not null,s_id int not null,s varchar(200), -primary key(id)) engine=innodb; - -INSERT INTO t1 VALUES (8, 1, 3); -INSERT INTO t1 VALUES (1, 2, 1); -INSERT INTO t2 VALUES (1, 0, ''); -INSERT INTO t2 VALUES (8, 1, ''); - -DELETE ml.* FROM t1 AS ml LEFT JOIN t2 AS mm ON (mm.id=ml.id) -WHERE mm.id IS NULL; - -DROP TABLE t1; -DROP TABLE t2; From e1af460146eda298ea403ec01f854aa4babea250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 15 Feb 2019 13:56:04 +0200 Subject: [PATCH 09/10] MDEV-18579 Assertion !ctx->online || num_fts_index == 0 instant_alter_column_possible(): Add the other MDEV-17459 work-around condition. The existence of fulltext indexes only prevents instant DROP COLUMN or changing the order of columns. Other forms of instant ALTER TABLE are no problem. Before commit 4e7ee166a9c76eb3546356aabfd2dbc759671cd0 that merged the MDEV-18295 fix from 10.3, the work-around of MDEV-17459 in instant_alter_column_possible() was categorically refusing any ALGORITHM=INSTANT if any FULLTEXT INDEX was present. After that commit, a related condition was only present in prepare_inplace_alter_table_dict() but not in the other callers of instant_alter_column_possible(). --- mysql-test/suite/innodb/r/instant_alter.result | 11 ++++++++++- mysql-test/suite/innodb/t/instant_alter.test | 5 +++++ storage/innobase/handler/handler0alter.cc | 9 +++------ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result index f864221def5..f51da4df960 100644 --- a/mysql-test/suite/innodb/r/instant_alter.result +++ b/mysql-test/suite/innodb/r/instant_alter.result @@ -734,6 +734,9 @@ INSERT INTO t1 VALUES (1,1); ALTER TABLE t1 ADD COLUMN f INT AFTER a; ALTER TABLE t1 DROP b, DROP f; DROP TABLE t1; +CREATE TABLE t1(t TEXT NOT NULL, FULLTEXT(t)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +ALTER TABLE t1 MODIFY COLUMN t TEXT; +DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, c2 INT UNIQUE, c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'), @@ -1414,6 +1417,9 @@ INSERT INTO t1 VALUES (1,1); ALTER TABLE t1 ADD COLUMN f INT AFTER a; ALTER TABLE t1 DROP b, DROP f; DROP TABLE t1; +CREATE TABLE t1(t TEXT NOT NULL, FULLTEXT(t)) ENGINE=InnoDB ROW_FORMAT=COMPACT; +ALTER TABLE t1 MODIFY COLUMN t TEXT; +DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, c2 INT UNIQUE, c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'), @@ -2094,10 +2100,13 @@ INSERT INTO t1 VALUES (1,1); ALTER TABLE t1 ADD COLUMN f INT AFTER a; ALTER TABLE t1 DROP b, DROP f; DROP TABLE t1; +CREATE TABLE t1(t TEXT NOT NULL, FULLTEXT(t)) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +ALTER TABLE t1 MODIFY COLUMN t TEXT; +DROP TABLE t1; disconnect analyze; SELECT variable_value-@old_instant instants FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants -170 +171 SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency; diff --git a/mysql-test/suite/innodb/t/instant_alter.test b/mysql-test/suite/innodb/t/instant_alter.test index b1679023e11..1c9c7a456a0 100644 --- a/mysql-test/suite/innodb/t/instant_alter.test +++ b/mysql-test/suite/innodb/t/instant_alter.test @@ -633,6 +633,11 @@ ALTER TABLE t1 ADD COLUMN f INT AFTER a; ALTER TABLE t1 DROP b, DROP f; DROP TABLE t1; +# MDEV-18579 Assertion !ctx->online || num_fts_index == 0 +eval CREATE TABLE t1(t TEXT NOT NULL, FULLTEXT(t)) $engine; +ALTER TABLE t1 MODIFY COLUMN t TEXT; +DROP TABLE t1; + dec $format; } disconnect analyze; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 65c105928e3..a02163fd986 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -1472,7 +1472,8 @@ instant_alter_column_possible( & (ALTER_STORED_COLUMN_ORDER | ALTER_DROP_STORED_COLUMN | ALTER_ADD_STORED_BASE_COLUMN)) { #if 1 // MDEV-17459: adjust fts_fetch_doc_from_rec() and friends; remove this - if (ib_table.fts) return false; + if (ib_table.fts || innobase_fulltext_exist(altered_table)) + return false; #endif #if 1 // MDEV-17468: fix bugs with indexed virtual columns & remove this for (const dict_index_t* index = ib_table.indexes.start; @@ -6408,11 +6409,7 @@ new_clustered_failed: || !ctx->new_table->persistent_autoinc); if (ctx->need_rebuild() && instant_alter_column_possible( - *user_table, ha_alter_info, old_table, altered_table) -#if 1 // MDEV-17459: adjust fts_fetch_doc_from_rec() and friends; remove this - && !innobase_fulltext_exist(altered_table) -#endif - ) { + *user_table, ha_alter_info, old_table, altered_table)) { for (uint a = 0; a < ctx->num_to_add_index; a++) { ctx->add_index[a]->table = ctx->new_table; ctx->add_index[a] = dict_index_add_to_cache( From 568dd5293ca7ef34f74d5d0529288edba6b7281e Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Fri, 15 Feb 2019 16:14:18 +0100 Subject: [PATCH 10/10] MDEV-18592 Warning if temp-file (with "#sql-" prefix) is missing during prepare --- storage/innobase/log/log0recv.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index f59bee021a1..4ea8bdbef91 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -3071,10 +3071,12 @@ recv_init_missing_space(dberr_t err, const recv_spaces_t::const_iterator& i) { if (srv_operation == SRV_OPERATION_RESTORE || srv_operation == SRV_OPERATION_RESTORE_EXPORT) { - ib::warn() << "Tablespace " << i->first << " was not" - " found at " << i->second.name << " when" - " restoring a (partial?) backup. All redo log" - " for this file will be ignored!"; + if (i->second.name.find(TEMP_TABLE_PATH_PREFIX) != std::string::npos) { + ib::warn() << "Tablespace " << i->first << " was not" + " found at " << i->second.name << " when" + " restoring a (partial?) backup. All redo log" + " for this file will be ignored!"; + } return(err); }