From 17343b4c373ffe45d4f3e8b8ffaa031fff5e63ba Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 16 Jun 2008 08:04:45 +0500 Subject: Bug #35999 When using the embedded server a wrong message comes. HAVE_REPLICATION was on for the embedded server as the #define was in wrong place. include/my_global.h: Bug #35999 When using the embedded server a wrong message comes. #define HAVE_REPLICATION moved after the 'include config.h' so it won't be enabled with the embedded server. --- include/my_global.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index 6cfc4d67305..4feed96e7d6 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -18,11 +18,6 @@ #ifndef _global_h #define _global_h -#ifndef EMBEDDED_LIBRARY -#define HAVE_REPLICATION -#define HAVE_EXTERNAL_CLIENT -#endif - /* InnoDB depends on some MySQL internals which other plugins should not need. This is because of InnoDB's foreign key support, "safe" binlog @@ -101,6 +96,11 @@ #endif #endif /* !EMBEDDED_LIBRARY */ +#ifndef EMBEDDED_LIBRARY +#define HAVE_REPLICATION +#define HAVE_EXTERNAL_CLIENT +#endif + /* Some defines to avoid ifdefs in the code */ #ifndef NETWARE_YIELD #define NETWARE_YIELD -- cgit v1.2.1 From 8e682f8c1709709867c932e6dd939f94112f337d Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Mon, 3 Nov 2008 13:10:59 -0500 Subject: Symlink master sock if it is moved elsewhere for path-length reasons. --- mysql-test/mysql-test-run.pl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index f67ce4db761..b342421ca2e 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2436,6 +2436,12 @@ sub setup_vardir() { mkpath("$opt_vardir/tmp"); mkpath($opt_tmpdir) if $opt_tmpdir ne "$opt_vardir/tmp"; + if ($master->[0]->{'path_sock'} !~ m/^$opt_tmpdir/) + { + mtr_report("Symlinking $master->[0]->{'path_sock'}"); + symlink($master->[0]->{'path_sock'}, "$opt_tmpdir/master.sock"); + } + # Create new data dirs foreach my $data_dir (@data_dir_lst) { -- cgit v1.2.1 From a5ec6953e1fa9fc718cde08babbb1ceb812dea73 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Mon, 10 Nov 2008 21:13:24 +0100 Subject: Bug#40595: Non-matching rows not released with READ-COMMITTED on tables with partitions Problem was that the handler function try_semi_consistent_read was not propagated to the innodb handler. Solution was to implement that function in the partitioning handler. mysql-test/r/partition_innodb.result: Bug#40595: Non-matching rows not released with READ-COMMITTED on tables with partitions Updated test result. mysql-test/t/partition_innodb.test: Bug#40595: Non-matching rows not released with READ-COMMITTED on tables with partitions Added test case for bug#40595. Note: the replace_regex is taking long time. I have not found any better regex (it takes time using 'sed' too). sql/ha_partition.cc: Bug#40595: Non-matching rows not released with READ-COMMITTED on tables with partitions Added function to the partitioning handler for handling semi consistent reads (unlock_row was already implemented, and this is needed for unlock_row to work properly in innodb). It uses pruning for optimizing the call. sql/ha_partition.h: Bug#40595: Non-matching rows not released with READ-COMMITTED on tables with partitions Added function to the partitioning handler for handling semi consistent reads (unlock_row was already implemented, and this is needed for unlock_row to work properly in innodb). --- mysql-test/r/partition_innodb.result | 22 +++++++++++++++++++++ mysql-test/t/partition_innodb.test | 38 ++++++++++++++++++++++++++++++++++++ sql/ha_partition.cc | 36 +++++++++++++++++++++++++++++++++- sql/ha_partition.h | 4 ++++ 4 files changed, 99 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/partition_innodb.result b/mysql-test/r/partition_innodb.result index 3692626f9ac..ad4d08e89ff 100644 --- a/mysql-test/r/partition_innodb.result +++ b/mysql-test/r/partition_innodb.result @@ -1,3 +1,25 @@ +drop table if exists t1; +CREATE TABLE t1 (id INT PRIMARY KEY, data INT) ENGINE = InnoDB +PARTITION BY RANGE(id) ( +PARTITION p0 VALUES LESS THAN (5), +PARTITION p1 VALUES LESS THAN (10), +PARTITION p2 VALUES LESS THAN MAXVALUE +); +INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), +(9,9), (10,10), (11,11); +SET @old_tx_isolation := @@session.tx_isolation; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; +SET autocommit = 0; +UPDATE t1 SET DATA = data*2 WHERE id = 3; +SHOW ENGINE InnoDB STATUS; +Type Name Status +InnoDB 2 lock struct(s) 1 row lock(s) +UPDATE t1 SET data = data*2 WHERE data = 2; +SHOW ENGINE InnoDB STATUS; +Type Name Status +InnoDB 6 lock struct(s) 2 row lock(s) +SET @@session.tx_isolation = @old_tx_isolation; +DROP TABLE t1; # Bug#37721, test of ORDER BY on PK and WHERE on INDEX CREATE TABLE t1 ( a INT, diff --git a/mysql-test/t/partition_innodb.test b/mysql-test/t/partition_innodb.test index c29b3458d19..b9ba03cf2de 100644 --- a/mysql-test/t/partition_innodb.test +++ b/mysql-test/t/partition_innodb.test @@ -1,6 +1,44 @@ --source include/have_partition.inc --source include/have_innodb.inc +--disable_warnings +drop table if exists t1; +--enable_warnings + +# +# Bug#40595: Non-matching rows not released with READ-COMMITTED on tables +# with partitions +CREATE TABLE t1 (id INT PRIMARY KEY, data INT) ENGINE = InnoDB +PARTITION BY RANGE(id) ( + PARTITION p0 VALUES LESS THAN (5), + PARTITION p1 VALUES LESS THAN (10), + PARTITION p2 VALUES LESS THAN MAXVALUE +); + +INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), + (9,9), (10,10), (11,11); + +SET @old_tx_isolation := @@session.tx_isolation; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; + +SET autocommit = 0; + +UPDATE t1 SET DATA = data*2 WHERE id = 3; + +# NOTE: This regex takes quite a long time (> 1 sec). +--replace_regex /.*[^[:alnum:]]+([0-9]+ lock struct.s.), heap size [0-9]+, ([0-9]+ row lock.s.), undo log entries .*/\1 \2/ +SHOW ENGINE InnoDB STATUS; + +UPDATE t1 SET data = data*2 WHERE data = 2; + +# NOTE: This regex takes quite a long time (> 1 sec). +--replace_regex /.*[^[:alnum:]]+([0-9]+ lock struct.s.), heap size [0-9]+, ([0-9]+ row lock.s.), undo log entries .*/\1 \2/ +SHOW ENGINE InnoDB STATUS; + +SET @@session.tx_isolation = @old_tx_isolation; + +DROP TABLE t1; + # # Bug37721: ORDER BY when WHERE contains non-partitioned index column # wrong order since it did not use pk as second compare diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 3324bbc2f45..a1131a99fa4 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2813,8 +2813,42 @@ uint ha_partition::lock_count() const void ha_partition::unlock_row() { + DBUG_ENTER("ha_partition::unlock_row"); m_file[m_last_part]->unlock_row(); - return; + DBUG_VOID_RETURN; +} + + +/** + Use semi consistent read if possible + + SYNOPSIS + try_semi_consistent_read() + yes Turn on semi consistent read + + RETURN VALUE + NONE + + DESCRIPTION + See handler.h: + Tell the engine whether it should avoid unnecessary lock waits. + If yes, in an UPDATE or DELETE, if the row under the cursor was locked + by another transaction, the engine may try an optimistic read of + the last committed row value under the cursor. + Note: prune_partitions are already called before this call, so using + pruning is OK. +*/ +void ha_partition::try_semi_consistent_read(bool yes) +{ + handler **file; + DBUG_ENTER("ha_partition::try_semi_consistent_read"); + + for (file= m_file; *file; file++) + { + if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file))) + (*file)->try_semi_consistent_read(yes); + } + DBUG_VOID_RETURN; } diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 78cf47dd1aa..dd06d8d647b 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -325,6 +325,10 @@ public: Call to unlock rows not to be updated in transaction */ virtual void unlock_row(); + /* + Call to hint about semi consistent read + */ + virtual void try_semi_consistent_read(bool); /* ------------------------------------------------------------------------- -- cgit v1.2.1 From 60d5e900891bc849d7a6180b708290fe7a3e93ab Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Mon, 10 Nov 2008 21:18:04 +0100 Subject: Bug#36279 - mysql built with Visual Studio 2005 does not display japanese characters. Fix - removed obsolvete setlocale from my_init.c . In MBCS environments it caused unwanted character-to-byte translations in fputc() in client code and wrong output as result. --- mysys/my_init.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/mysys/my_init.c b/mysys/my_init.c index 8154a5fce51..07469e48e6c 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -305,8 +305,6 @@ static void my_win_init(void) const char *targetKey = "Software\\MySQL" ; DBUG_ENTER("my_win_init"); - setlocale(LC_CTYPE, ""); /* To get right sortorder */ - #if defined(_MSC_VER) #if _MSC_VER < 1300 /* -- cgit v1.2.1 From c5da8fbe16caefe077116c35df01d37280bada1c Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Mon, 10 Nov 2008 22:12:15 +0100 Subject: Bug#34025: mysql_config is not returning -ldl lib flag needed when using embedded server mysql_config did not output -ldl (or equivalent) when needed for --libmysqld-libs, so its output could be insufficient to build an application using the embedded server. LIBDL was already set in configure; it's now propagated all the way into the relevant mysql_config scripts. scripts/Makefile.am: We "manually" replace configure's constants in .sh scripts using sed, so AC_SUBST() alone is not good enough. Add LIBDL to the substitution list; we'll be needing it for mysql_config --libmysqld-libs scripts/mysql_config.pl.in: Add LIBDL (usually -ldl) to output of mysql_config --libmysqld-libs (perl version) scripts/mysql_config.sh: Add LIBDL (usually -ldl) to output of mysql_config --libmysqld-libs (shell version) --- scripts/Makefile.am | 1 + scripts/mysql_config.pl.in | 2 +- scripts/mysql_config.sh | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index ac43bb7b0a4..0292617c7a5 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -162,6 +162,7 @@ SUFFIXES = .sh -e 's!@''CFLAGS''@!@CFLAGS@!'\ -e 's!@''CXXFLAGS''@!@CXXFLAGS@!'\ -e 's!@''LDFLAGS''@!@LDFLAGS@!'\ + -e 's!@''LIBDL''@!@LIBDL@!'\ -e 's!@''CLIENT_LIBS''@!@CLIENT_LIBS@!' \ -e 's!@''ZLIB_LIBS''@!@ZLIB_LIBS@!' \ -e 's!@''LIBS''@!@LIBS@!' \ diff --git a/scripts/mysql_config.pl.in b/scripts/mysql_config.pl.in index 3ae8baf7db0..21896711fa8 100644 --- a/scripts/mysql_config.pl.in +++ b/scripts/mysql_config.pl.in @@ -202,7 +202,7 @@ $flags->{libs} = $flags->{libs_r} = [@ldflags,@lib_r_opts,'@ZLIB_DEPS@','@LIBS@','@openssl_libs@']; $flags->{embedded_libs} = - [@ldflags,@lib_e_opts,'@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@innodb_system_libs@','@openssl_libs@']; + [@ldflags,@lib_e_opts,'@LIBDL@','@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@innodb_system_libs@','@openssl_libs@']; $flags->{include} = ["-I$pkgincludedir"]; $flags->{cflags} = [@{$flags->{include}},split(" ",'@CFLAGS@')]; diff --git a/scripts/mysql_config.sh b/scripts/mysql_config.sh index c16d9bb62e5..efc82544bc0 100644 --- a/scripts/mysql_config.sh +++ b/scripts/mysql_config.sh @@ -107,7 +107,7 @@ fi libs=" $ldflags -L$pkglibdir -lmysqlclient @ZLIB_DEPS@ @NON_THREADED_LIBS@" libs="$libs @openssl_libs@ @STATIC_NSS_FLAGS@ " libs_r=" $ldflags -L$pkglibdir -lmysqlclient_r @ZLIB_DEPS@ @LIBS@ @openssl_libs@ " -embedded_libs=" $ldflags -L$pkglibdir -lmysqld @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@ @openssl_libs@ " +embedded_libs=" $ldflags -L$pkglibdir -lmysqld @LIBDL@ @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@ @openssl_libs@ " if [ -r "$pkglibdir/libmygcc.a" ]; then # When linking against the static library with a different version of GCC -- cgit v1.2.1 From ab9ecae47b4515b416167220f5da26f7fa28917d Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Tue, 11 Nov 2008 13:10:51 +0400 Subject: BUG#38842 - Fix for 25951 seems incorrect With fix for bug 25951 index hints are ignored for fulltext searches, as handling of fulltext indexes is different from handling regular indexes. Meaning it is not possible to implement true index hints support for fulltext indexes within the scope of current fulltext architecture. The problem is that prior to fix for bug 25951, some useful index hints still could be given for boolean mode searches. This patch implements special index hints support for fulltext indexes with the following characteristics: - all index hints are still ignored for NLQ mode searches - it cannot work without an index; - for 5.1 and up index hints FOR ORDER BY and FOR GROUP BY are still ignored for fulltext indexes; - boolean mode searches honor USE/FORCE/IGNORE INDEX hints; - as opposed to index hints for regular indexes, index hints for fulltext BOOLEAN mode searches affect the usage of the index for the whole query. mysql-test/r/fulltext.result: A test case for BUG#38842. mysql-test/t/fulltext.test: A test case for BUG#38842. sql/item_func.cc: For boolean mode searches, which can work without fulltext index, use keys_in_use_for_query bitmap instead of keys_in_use. The effect is that boolean mode searches now honor index hints. --- mysql-test/r/fulltext.result | 28 ++++++++++++++++++++++++++++ mysql-test/t/fulltext.test | 27 +++++++++++++++++++++++++++ sql/item_func.cc | 4 +++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 29fb430bb97..e73f8af405c 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -469,3 +469,31 @@ SELECT * FROM t1 WHERE MATCH(a) AGAINST ('"aaaa"' IN BOOLEAN MODE); a aaaaa aaaa DROP TABLE t1; +CREATE TABLE t1 (a VARCHAR(255), b INT, FULLTEXT(a), KEY(b)); +INSERT INTO t1 VALUES('test', 1),('test', 1),('test', 1),('test', 1), +('test', 1),('test', 2),('test', 3),('test', 4); +EXPLAIN SELECT * FROM t1 +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext b,a a 0 1 Using where +EXPLAIN SELECT * FROM t1 USE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext a a 0 1 Using where +EXPLAIN SELECT * FROM t1 FORCE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext a a 0 1 Using where +EXPLAIN SELECT * FROM t1 IGNORE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref b b 5 const 4 Using where +EXPLAIN SELECT * FROM t1 USE INDEX(b) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref b b 5 const 4 Using where +EXPLAIN SELECT * FROM t1 FORCE INDEX(b) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref b b 5 const 4 Using where +DROP TABLE t1; diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index e5f1db14b7f..fa087d89efb 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -396,3 +396,30 @@ SELECT * FROM t1 WHERE MATCH(a) AGAINST ('"aaaa"' IN BOOLEAN MODE); DROP TABLE t1; # End of 4.1 tests + +# +# BUG#38842 - Fix for 25951 seems incorrect +# +CREATE TABLE t1 (a VARCHAR(255), b INT, FULLTEXT(a), KEY(b)); +INSERT INTO t1 VALUES('test', 1),('test', 1),('test', 1),('test', 1), + ('test', 1),('test', 2),('test', 3),('test', 4); + +EXPLAIN SELECT * FROM t1 +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +EXPLAIN SELECT * FROM t1 USE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +EXPLAIN SELECT * FROM t1 FORCE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +EXPLAIN SELECT * FROM t1 IGNORE INDEX(a) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +EXPLAIN SELECT * FROM t1 USE INDEX(b) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +EXPLAIN SELECT * FROM t1 FORCE INDEX(b) +WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1; + +DROP TABLE t1; diff --git a/sql/item_func.cc b/sql/item_func.cc index e663e1fcf83..66fbf1eb4d2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -5022,7 +5022,9 @@ bool Item_func_match::fix_index() for (keynr=0 ; keynr < table->s->keys ; keynr++) { if ((table->key_info[keynr].flags & HA_FULLTEXT) && - (table->s->keys_in_use.is_set(keynr))) + (flags & FT_BOOL ? table->keys_in_use_for_query.is_set(keynr) : + table->s->keys_in_use.is_set(keynr))) + { ft_to_key[fts]=keynr; ft_cnt[fts]=0; -- cgit v1.2.1 From 029def6c8aec8aead1098ece577fa3a26fefa7a5 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 13 Nov 2008 12:38:30 +0400 Subject: Bug#36035 I_S.TABLES.UPDATE_TIME not being set on INSERT for Windows added FLUSH TABLES after INSERT because UPDATE_TIME is updated with delay on Win. mysql-test/suite/funcs_1/datadict/is_tables.inc: test fix mysql-test/suite/funcs_1/r/is_tables.result: result fix --- mysql-test/suite/funcs_1/datadict/is_tables.inc | 1 + mysql-test/suite/funcs_1/r/is_tables.result | 1 + 2 files changed, 2 insertions(+) diff --git a/mysql-test/suite/funcs_1/datadict/is_tables.inc b/mysql-test/suite/funcs_1/datadict/is_tables.inc index 6d47c33e715..d1e4608a572 100644 --- a/mysql-test/suite/funcs_1/datadict/is_tables.inc +++ b/mysql-test/suite/funcs_1/datadict/is_tables.inc @@ -346,6 +346,7 @@ WHERE table_name = 't1_my_tablex'; # Enforce a time difference bigger than the smallest unit (1 second). --real_sleep 1.1 INSERT INTO db_datadict.t1_my_tablex SET f1 = 3; +FLUSH TABLES; SELECT UPDATE_TIME > @UPDATE_TIME AS "Is current UPDATE_TIME bigger than before last INSERT?" FROM information_schema.tables diff --git a/mysql-test/suite/funcs_1/r/is_tables.result b/mysql-test/suite/funcs_1/r/is_tables.result index 1ed97e52c6c..ab45ca509e7 100644 --- a/mysql-test/suite/funcs_1/r/is_tables.result +++ b/mysql-test/suite/funcs_1/r/is_tables.result @@ -310,6 +310,7 @@ SELECT UPDATE_TIME, checksum INTO @UPDATE_TIME, @checksum FROM information_schema.tables WHERE table_name = 't1_my_tablex'; INSERT INTO db_datadict.t1_my_tablex SET f1 = 3; +FLUSH TABLES; SELECT UPDATE_TIME > @UPDATE_TIME AS "Is current UPDATE_TIME bigger than before last INSERT?" FROM information_schema.tables -- cgit v1.2.1 From 0dff72726bb45305d318f96b109f5dfbfdfb85bb Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 13 Nov 2008 13:50:20 +0400 Subject: Bug#35789 wrong datatypes for collation and charset columns in EVENTS, ROUTINES, TRIGGERS changed 'charset', 'collation' field length from 64 to MY_CS_NAME_SIZE(32) in tables: SCHEMATA, TABLES, COLUMNS, CHARACTER_SETS, COLLATIONS, COLLATION_CHARACTER_SET_APPLICABILITY mysql-test/r/create.result: result fix mysql-test/r/information_schema.result: result fix mysql-test/r/show_check.result: result fix mysql-test/suite/funcs_1/r/is_character_sets.result: result fix mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result: result fix mysql-test/suite/funcs_1/r/is_collations.result: result fix mysql-test/suite/funcs_1/r/is_columns.result: result fix mysql-test/suite/funcs_1/r/is_columns_is.result: result fix mysql-test/suite/funcs_1/r/is_routines.result: result fix mysql-test/suite/funcs_1/r/is_schemata.result: result fix mysql-test/suite/funcs_1/r/is_tables.result: result fix sql/sql_show.cc: changed 'charset', 'collation' field length from 64 to MY_CS_NAME_SIZE(32) in tables: SCHEMATA, TABLES, COLUMNS, CHARACTER_SETS, COLLATIONS, COLLATION_CHARACTER_SET_APPLICABILITY additional fix: ROUTINES.SQL_MODE is changed to be VARCHAR(addon for Bug#29153) --- mysql-test/r/create.result | 4 +- mysql-test/r/information_schema.result | 17 ++++---- mysql-test/r/show_check.result | 20 ++++----- .../suite/funcs_1/r/is_character_sets.result | 12 +++--- ...is_collation_character_set_applicability.result | 12 +++--- mysql-test/suite/funcs_1/r/is_collations.result | 12 +++--- mysql-test/suite/funcs_1/r/is_columns.result | 12 +++--- mysql-test/suite/funcs_1/r/is_columns_is.result | 48 +++++++++++----------- mysql-test/suite/funcs_1/r/is_routines.result | 6 +-- mysql-test/suite/funcs_1/r/is_schemata.result | 12 +++--- mysql-test/suite/funcs_1/r/is_tables.result | 6 +-- sql/sql_show.cc | 33 +++++++++------ 12 files changed, 100 insertions(+), 94 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index c7997369f4d..947890d2085 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -1754,8 +1754,8 @@ create table t1 like information_schema.character_sets; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATE_NAME` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '', `DESCRIPTION` varchar(60) NOT NULL DEFAULT '', `MAXLEN` bigint(3) NOT NULL DEFAULT '0' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 7da540dd8f6..8f4caa3d6d1 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -517,8 +517,8 @@ drop table t1; SHOW CREATE TABLE INFORMATION_SCHEMA.character_sets; Table Create Table CHARACTER_SETS CREATE TEMPORARY TABLE `CHARACTER_SETS` ( - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATE_NAME` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '', `DESCRIPTION` varchar(60) NOT NULL DEFAULT '', `MAXLEN` bigint(3) NOT NULL DEFAULT '0' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 @@ -526,8 +526,8 @@ set names latin2; SHOW CREATE TABLE INFORMATION_SCHEMA.character_sets; Table Create Table CHARACTER_SETS CREATE TEMPORARY TABLE `CHARACTER_SETS` ( - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATE_NAME` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '', `DESCRIPTION` varchar(60) NOT NULL DEFAULT '', `MAXLEN` bigint(3) NOT NULL DEFAULT '0' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 @@ -541,8 +541,8 @@ alter table t1 default character set utf8; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATE_NAME` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '', `DESCRIPTION` varchar(60) NOT NULL DEFAULT '', `MAXLEN` bigint(3) NOT NULL DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=utf8 @@ -716,8 +716,8 @@ select column_type from information_schema.columns where table_schema="information_schema" and table_name="COLUMNS" and (column_name="character_set_name" or column_name="collation_name"); column_type -varchar(64) -varchar(64) +varchar(32) +varchar(32) select TABLE_ROWS from information_schema.tables where table_schema="information_schema" and table_name="COLUMNS"; TABLE_ROWS @@ -764,7 +764,6 @@ information_schema PARTITIONS PARTITION_DESCRIPTION information_schema PLUGINS PLUGIN_DESCRIPTION information_schema PROCESSLIST INFO information_schema ROUTINES ROUTINE_DEFINITION -information_schema ROUTINES SQL_MODE information_schema TRIGGERS ACTION_CONDITION information_schema TRIGGERS ACTION_STATEMENT information_schema VIEWS VIEW_DEFINITION diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index b9a5ddbf8ec..ddc08dca7bb 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -130,7 +130,7 @@ def TABLES AUTO_INCREMENT Auto_increment 8 21 0 Y 32800 0 63 def TABLES CREATE_TIME Create_time 12 19 0 Y 128 0 63 def TABLES UPDATE_TIME Update_time 12 19 0 Y 128 0 63 def TABLES CHECK_TIME Check_time 12 19 0 Y 128 0 63 -def TABLES TABLE_COLLATION Collation 253 64 0 Y 0 0 8 +def TABLES TABLE_COLLATION Collation 253 32 0 Y 0 0 8 def TABLES CHECKSUM Checksum 8 21 0 Y 32800 0 63 def TABLES CREATE_OPTIONS Create_options 253 255 0 Y 0 0 8 def TABLES TABLE_COMMENT Comment 253 80 0 N 1 0 8 @@ -858,17 +858,17 @@ set names utf8; ---------------------------------------------------------------- SHOW CHARACTER SET LIKE 'utf8'; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def CHARACTER_SETS CHARACTER_SET_NAME Charset 253 192 4 N 1 0 33 +def CHARACTER_SETS CHARACTER_SET_NAME Charset 253 96 4 N 1 0 33 def CHARACTER_SETS DESCRIPTION Description 253 180 13 N 1 0 33 -def CHARACTER_SETS DEFAULT_COLLATE_NAME Default collation 253 192 15 N 1 0 33 +def CHARACTER_SETS DEFAULT_COLLATE_NAME Default collation 253 96 15 N 1 0 33 def CHARACTER_SETS MAXLEN Maxlen 8 3 1 N 32769 0 63 Charset Description Default collation Maxlen utf8 UTF-8 Unicode utf8_general_ci 3 ---------------------------------------------------------------- SHOW COLLATION LIKE 'latin1_bin'; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATIONS COLLATION_NAME Collation 253 192 10 N 1 0 33 -def COLLATIONS CHARACTER_SET_NAME Charset 253 192 6 N 1 0 33 +def COLLATIONS COLLATION_NAME Collation 253 96 10 N 1 0 33 +def COLLATIONS CHARACTER_SET_NAME Charset 253 96 6 N 1 0 33 def COLLATIONS ID Id 8 11 2 N 32769 0 63 def COLLATIONS IS_DEFAULT Default 253 9 0 N 1 0 33 def COLLATIONS IS_COMPILED Compiled 253 9 3 N 1 0 33 @@ -935,7 +935,7 @@ def TABLES TABLE_NAME TABLE_NAME 253 192 2 N 1 0 33 def TABLES TABLE_TYPE TABLE_TYPE 253 192 10 N 1 0 33 def TABLES ENGINE ENGINE 253 192 6 Y 0 0 33 def TABLES ROW_FORMAT ROW_FORMAT 253 30 5 Y 0 0 33 -def TABLES TABLE_COLLATION TABLE_COLLATION 253 192 17 Y 0 0 33 +def TABLES TABLE_COLLATION TABLE_COLLATION 253 96 17 Y 0 0 33 def TABLES CREATE_OPTIONS CREATE_OPTIONS 253 765 0 Y 0 0 33 def TABLES TABLE_COMMENT TABLE_COMMENT 253 240 0 N 1 0 33 TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE ROW_FORMAT TABLE_COLLATION CREATE_OPTIONS TABLE_COMMENT @@ -966,8 +966,8 @@ def COLUMNS COLUMN_NAME COLUMN_NAME 253 192 1 N 1 0 33 def COLUMNS COLUMN_DEFAULT COLUMN_DEFAULT 252 589815 0 Y 16 0 33 def COLUMNS IS_NULLABLE IS_NULLABLE 253 9 2 N 1 0 33 def COLUMNS DATA_TYPE DATA_TYPE 253 192 3 N 1 0 33 -def COLUMNS CHARACTER_SET_NAME CHARACTER_SET_NAME 253 192 0 Y 0 0 33 -def COLUMNS COLLATION_NAME COLLATION_NAME 253 192 0 Y 0 0 33 +def COLUMNS CHARACTER_SET_NAME CHARACTER_SET_NAME 253 96 0 Y 0 0 33 +def COLUMNS COLLATION_NAME COLLATION_NAME 253 96 0 Y 0 0 33 def COLUMNS COLUMN_TYPE COLUMN_TYPE 252 589815 7 N 17 0 33 def COLUMNS COLUMN_KEY COLUMN_KEY 253 9 3 N 1 0 33 def COLUMNS EXTRA EXTRA 253 81 0 N 1 0 33 @@ -1125,7 +1125,7 @@ def ROUTINES IS_DETERMINISTIC IS_DETERMINISTIC 253 9 2 N 1 0 33 def ROUTINES SQL_DATA_ACCESS SQL_DATA_ACCESS 253 192 12 N 1 0 33 def ROUTINES SQL_PATH SQL_PATH 253 192 0 Y 0 0 33 def ROUTINES SECURITY_TYPE SECURITY_TYPE 253 21 7 N 1 0 33 -def ROUTINES SQL_MODE SQL_MODE 252 589815 0 N 17 0 33 +def ROUTINES SQL_MODE SQL_MODE 253 24576 0 N 1 0 33 def ROUTINES ROUTINE_COMMENT ROUTINE_COMMENT 253 192 0 N 1 0 33 def ROUTINES DEFINER DEFINER 253 231 14 N 1 0 33 SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE SQL_MODE ROUTINE_COMMENT DEFINER @@ -1180,7 +1180,7 @@ def ROUTINES IS_DETERMINISTIC IS_DETERMINISTIC 253 9 2 N 1 0 33 def ROUTINES SQL_DATA_ACCESS SQL_DATA_ACCESS 253 192 12 N 1 0 33 def ROUTINES SQL_PATH SQL_PATH 253 192 0 Y 0 0 33 def ROUTINES SECURITY_TYPE SECURITY_TYPE 253 21 7 N 1 0 33 -def ROUTINES SQL_MODE SQL_MODE 252 589815 0 N 17 0 33 +def ROUTINES SQL_MODE SQL_MODE 253 24576 0 N 1 0 33 def ROUTINES ROUTINE_COMMENT ROUTINE_COMMENT 253 192 0 N 1 0 33 def ROUTINES DEFINER DEFINER 253 231 14 N 1 0 33 SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE SQL_MODE ROUTINE_COMMENT DEFINER diff --git a/mysql-test/suite/funcs_1/r/is_character_sets.result b/mysql-test/suite/funcs_1/r/is_character_sets.result index 4c24a4a829a..2aaa1985020 100644 --- a/mysql-test/suite/funcs_1/r/is_character_sets.result +++ b/mysql-test/suite/funcs_1/r/is_character_sets.result @@ -28,22 +28,22 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.CHARACTER_SETS; Field Type Null Key Default Extra -CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATE_NAME varchar(64) NO +CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATE_NAME varchar(32) NO DESCRIPTION varchar(60) NO MAXLEN bigint(3) NO 0 SHOW CREATE TABLE information_schema.CHARACTER_SETS; Table Create Table CHARACTER_SETS CREATE TEMPORARY TABLE `CHARACTER_SETS` ( - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATE_NAME` varchar(64) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '', `DESCRIPTION` varchar(60) NOT NULL DEFAULT '', `MAXLEN` bigint(3) NOT NULL DEFAULT '0' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.CHARACTER_SETS; Field Type Null Key Default Extra -CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATE_NAME varchar(64) NO +CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATE_NAME varchar(32) NO DESCRIPTION varchar(60) NO MAXLEN bigint(3) NO 0 # Testcases 3.2.2.2 and 3.2.2.3 are checked in suite/funcs_1/t/charset_collation*.test diff --git a/mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result b/mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result index 43dc14784f4..7eba964bdf6 100644 --- a/mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result +++ b/mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result @@ -28,18 +28,18 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.COLLATION_CHARACTER_SET_APPLICABILITY; Field Type Null Key Default Extra -COLLATION_NAME varchar(64) NO -CHARACTER_SET_NAME varchar(64) NO +COLLATION_NAME varchar(32) NO +CHARACTER_SET_NAME varchar(32) NO SHOW CREATE TABLE information_schema.COLLATION_CHARACTER_SET_APPLICABILITY; Table Create Table COLLATION_CHARACTER_SET_APPLICABILITY CREATE TEMPORARY TABLE `COLLATION_CHARACTER_SET_APPLICABILITY` ( - `COLLATION_NAME` varchar(64) NOT NULL DEFAULT '', - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '' + `COLLATION_NAME` varchar(32) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY; Field Type Null Key Default Extra -COLLATION_NAME varchar(64) NO -CHARACTER_SET_NAME varchar(64) NO +COLLATION_NAME varchar(32) NO +CHARACTER_SET_NAME varchar(32) NO # Testcases 3.2.4.2 and 3.2.4.3 are checked in suite/funcs_1/t/charset_collation*.test ######################################################################## # Testcases 3.2.1.3-3.2.1.5 + 3.2.1.8-3.2.1.12: INSERT/UPDATE/DELETE and diff --git a/mysql-test/suite/funcs_1/r/is_collations.result b/mysql-test/suite/funcs_1/r/is_collations.result index ca9259b67eb..234aeff8ff2 100644 --- a/mysql-test/suite/funcs_1/r/is_collations.result +++ b/mysql-test/suite/funcs_1/r/is_collations.result @@ -28,8 +28,8 @@ DROP FUNCTION test.f1; ######################################################################### DESCRIBE information_schema.COLLATIONS; Field Type Null Key Default Extra -COLLATION_NAME varchar(64) NO -CHARACTER_SET_NAME varchar(64) NO +COLLATION_NAME varchar(32) NO +CHARACTER_SET_NAME varchar(32) NO ID bigint(11) NO 0 IS_DEFAULT varchar(3) NO IS_COMPILED varchar(3) NO @@ -37,8 +37,8 @@ SORTLEN bigint(3) NO 0 SHOW CREATE TABLE information_schema.COLLATIONS; Table Create Table COLLATIONS CREATE TEMPORARY TABLE `COLLATIONS` ( - `COLLATION_NAME` varchar(64) NOT NULL DEFAULT '', - `CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', + `COLLATION_NAME` varchar(32) NOT NULL DEFAULT '', + `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', `ID` bigint(11) NOT NULL DEFAULT '0', `IS_DEFAULT` varchar(3) NOT NULL DEFAULT '', `IS_COMPILED` varchar(3) NOT NULL DEFAULT '', @@ -46,8 +46,8 @@ COLLATIONS CREATE TEMPORARY TABLE `COLLATIONS` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.COLLATIONS; Field Type Null Key Default Extra -COLLATION_NAME varchar(64) NO -CHARACTER_SET_NAME varchar(64) NO +COLLATION_NAME varchar(32) NO +CHARACTER_SET_NAME varchar(32) NO ID bigint(11) NO 0 IS_DEFAULT varchar(3) NO IS_COMPILED varchar(3) NO diff --git a/mysql-test/suite/funcs_1/r/is_columns.result b/mysql-test/suite/funcs_1/r/is_columns.result index 99a497d806d..e0780a60e2e 100644 --- a/mysql-test/suite/funcs_1/r/is_columns.result +++ b/mysql-test/suite/funcs_1/r/is_columns.result @@ -40,8 +40,8 @@ CHARACTER_MAXIMUM_LENGTH bigint(21) unsigned YES NULL CHARACTER_OCTET_LENGTH bigint(21) unsigned YES NULL NUMERIC_PRECISION bigint(21) unsigned YES NULL NUMERIC_SCALE bigint(21) unsigned YES NULL -CHARACTER_SET_NAME varchar(64) YES NULL -COLLATION_NAME varchar(64) YES NULL +CHARACTER_SET_NAME varchar(32) YES NULL +COLLATION_NAME varchar(32) YES NULL COLUMN_TYPE longtext NO NULL COLUMN_KEY varchar(3) NO EXTRA varchar(27) NO @@ -62,8 +62,8 @@ COLUMNS CREATE TEMPORARY TABLE `COLUMNS` ( `CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL, `NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL, `NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL, - `CHARACTER_SET_NAME` varchar(64) DEFAULT NULL, - `COLLATION_NAME` varchar(64) DEFAULT NULL, + `CHARACTER_SET_NAME` varchar(32) DEFAULT NULL, + `COLLATION_NAME` varchar(32) DEFAULT NULL, `COLUMN_TYPE` longtext NOT NULL, `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '', `EXTRA` varchar(27) NOT NULL DEFAULT '', @@ -84,8 +84,8 @@ CHARACTER_MAXIMUM_LENGTH bigint(21) unsigned YES NULL CHARACTER_OCTET_LENGTH bigint(21) unsigned YES NULL NUMERIC_PRECISION bigint(21) unsigned YES NULL NUMERIC_SCALE bigint(21) unsigned YES NULL -CHARACTER_SET_NAME varchar(64) YES NULL -COLLATION_NAME varchar(64) YES NULL +CHARACTER_SET_NAME varchar(32) YES NULL +COLLATION_NAME varchar(32) YES NULL COLUMN_TYPE longtext NO NULL COLUMN_KEY varchar(3) NO EXTRA varchar(27) NO diff --git a/mysql-test/suite/funcs_1/r/is_columns_is.result b/mysql-test/suite/funcs_1/r/is_columns_is.result index 84daef5f8da..7a2257713d2 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_is.result +++ b/mysql-test/suite/funcs_1/r/is_columns_is.result @@ -3,22 +3,22 @@ WHERE table_schema = 'information_schema' AND table_name <> 'profiling' ORDER BY table_schema, table_name, column_name; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT -NULL information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select +NULL information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema CHARACTER_SETS DESCRIPTION 3 NO varchar 60 180 NULL NULL utf8 utf8_general_ci varchar(60) select NULL information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL bigint(3) select -NULL information_schema COLLATIONS CHARACTER_SET_NAME 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema COLLATIONS COLLATION_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema COLLATIONS CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select +NULL information_schema COLLATIONS COLLATION_NAME 1 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema COLLATIONS ID 3 0 NO bigint NULL NULL 19 0 NULL NULL bigint(11) select NULL information_schema COLLATIONS IS_COMPILED 5 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select NULL information_schema COLLATIONS IS_DEFAULT 4 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select NULL information_schema COLLATIONS SORTLEN 6 0 NO bigint NULL NULL 19 0 NULL NULL bigint(3) select -NULL information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME 2 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select +NULL information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME 1 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema COLUMNS CHARACTER_MAXIMUM_LENGTH 9 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select NULL information_schema COLUMNS CHARACTER_OCTET_LENGTH 10 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select -NULL information_schema COLUMNS CHARACTER_SET_NAME 13 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema COLUMNS COLLATION_NAME 14 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema COLUMNS CHARACTER_SET_NAME 13 NULL YES varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select +NULL information_schema COLUMNS COLLATION_NAME 14 NULL YES varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema COLUMNS COLUMN_COMMENT 19 NO varchar 255 765 NULL NULL utf8 utf8_general_ci varchar(255) select NULL information_schema COLUMNS COLUMN_DEFAULT 6 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select NULL information_schema COLUMNS COLUMN_KEY 16 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select @@ -200,11 +200,11 @@ NULL information_schema ROUTINES ROUTINE_TYPE 5 NO varchar 9 27 NULL NULL utf8 NULL information_schema ROUTINES SECURITY_TYPE 15 NO varchar 7 21 NULL NULL utf8 utf8_general_ci varchar(7) select NULL information_schema ROUTINES SPECIFIC_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema ROUTINES SQL_DATA_ACCESS 13 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema ROUTINES SQL_MODE 18 NULL NO longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select +NULL information_schema ROUTINES SQL_MODE 18 NO varchar 8192 24576 NULL NULL utf8 utf8_general_ci varchar(8192) select NULL information_schema ROUTINES SQL_PATH 14 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema SCHEMATA CATALOG_NAME 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select -NULL information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select +NULL information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema SCHEMATA SCHEMA_NAME 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema SCHEMATA SQL_PATH 5 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select NULL information_schema SCHEMA_PRIVILEGES GRANTEE 1 NO varchar 81 243 NULL NULL utf8 utf8_general_ci varchar(81) select @@ -244,7 +244,7 @@ NULL information_schema TABLES INDEX_LENGTH 12 NULL YES bigint NULL NULL 19 0 NU NULL information_schema TABLES MAX_DATA_LENGTH 11 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select NULL information_schema TABLES ROW_FORMAT 7 NULL YES varchar 10 30 NULL NULL utf8 utf8_general_ci varchar(10) select NULL information_schema TABLES TABLE_CATALOG 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select -NULL information_schema TABLES TABLE_COLLATION 18 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select +NULL information_schema TABLES TABLE_COLLATION 18 NULL YES varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema TABLES TABLE_COMMENT 21 NO varchar 80 240 NULL NULL utf8 utf8_general_ci varchar(80) select NULL information_schema TABLES TABLE_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema TABLES TABLE_ROWS 8 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select @@ -357,18 +357,18 @@ WHERE table_schema = 'information_schema' AND table_name <> 'profiling' ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION; COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE -3.0000 information_schema CHARACTER_SETS CHARACTER_SET_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema CHARACTER_SETS CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) +3.0000 information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema CHARACTER_SETS DESCRIPTION varchar 60 180 utf8 utf8_general_ci varchar(60) NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3) -3.0000 information_schema COLLATIONS COLLATION_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema COLLATIONS CHARACTER_SET_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema COLLATIONS COLLATION_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) +3.0000 information_schema COLLATIONS CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) NULL information_schema COLLATIONS ID bigint NULL NULL NULL NULL bigint(11) 3.0000 information_schema COLLATIONS IS_DEFAULT varchar 3 9 utf8 utf8_general_ci varchar(3) 3.0000 information_schema COLLATIONS IS_COMPILED varchar 3 9 utf8 utf8_general_ci varchar(3) NULL information_schema COLLATIONS SORTLEN bigint NULL NULL NULL NULL bigint(3) -3.0000 information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) +3.0000 information_schema COLLATION_CHARACTER_SET_APPLICABILITY CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema COLUMNS TABLE_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema COLUMNS TABLE_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema COLUMNS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) @@ -381,8 +381,8 @@ NULL information_schema COLUMNS CHARACTER_MAXIMUM_LENGTH bigint NULL NULL NULL N NULL information_schema COLUMNS CHARACTER_OCTET_LENGTH bigint NULL NULL NULL NULL bigint(21) unsigned NULL information_schema COLUMNS NUMERIC_PRECISION bigint NULL NULL NULL NULL bigint(21) unsigned NULL information_schema COLUMNS NUMERIC_SCALE bigint NULL NULL NULL NULL bigint(21) unsigned -3.0000 information_schema COLUMNS CHARACTER_SET_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema COLUMNS COLLATION_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema COLUMNS CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) +3.0000 information_schema COLUMNS COLLATION_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 1.0000 information_schema COLUMNS COLUMN_TYPE longtext 4294967295 4294967295 utf8 utf8_general_ci longtext 3.0000 information_schema COLUMNS COLUMN_KEY varchar 3 9 utf8 utf8_general_ci varchar(3) 3.0000 information_schema COLUMNS EXTRA varchar 27 81 utf8 utf8_general_ci varchar(27) @@ -550,7 +550,7 @@ NULL information_schema PROCESSLIST TIME bigint NULL NULL NULL NULL bigint(7) 3.0000 information_schema ROUTINES SECURITY_TYPE varchar 7 21 utf8 utf8_general_ci varchar(7) NULL information_schema ROUTINES CREATED datetime NULL NULL NULL NULL datetime NULL information_schema ROUTINES LAST_ALTERED datetime NULL NULL NULL NULL datetime -1.0000 information_schema ROUTINES SQL_MODE longtext 4294967295 4294967295 utf8 utf8_general_ci longtext +3.0000 information_schema ROUTINES SQL_MODE varchar 8192 24576 utf8 utf8_general_ci varchar(8192) 3.0000 information_schema ROUTINES ROUTINE_COMMENT varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema ROUTINES DEFINER varchar 77 231 utf8 utf8_general_ci varchar(77) 3.0000 information_schema ROUTINES CHARACTER_SET_CLIENT varchar 32 96 utf8 utf8_general_ci varchar(32) @@ -558,8 +558,8 @@ NULL information_schema ROUTINES LAST_ALTERED datetime NULL NULL NULL NULL datet 3.0000 information_schema ROUTINES DATABASE_COLLATION varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema SCHEMATA CATALOG_NAME varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema SCHEMATA SCHEMA_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema SCHEMATA DEFAULT_COLLATION_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) +3.0000 information_schema SCHEMATA DEFAULT_COLLATION_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema SCHEMATA SQL_PATH varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema SCHEMA_PRIVILEGES GRANTEE varchar 81 243 utf8 utf8_general_ci varchar(81) 3.0000 information_schema SCHEMA_PRIVILEGES TABLE_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) @@ -602,7 +602,7 @@ NULL information_schema TABLES AUTO_INCREMENT bigint NULL NULL NULL NULL bigint( NULL information_schema TABLES CREATE_TIME datetime NULL NULL NULL NULL datetime NULL information_schema TABLES UPDATE_TIME datetime NULL NULL NULL NULL datetime NULL information_schema TABLES CHECK_TIME datetime NULL NULL NULL NULL datetime -3.0000 information_schema TABLES TABLE_COLLATION varchar 64 192 utf8 utf8_general_ci varchar(64) +3.0000 information_schema TABLES TABLE_COLLATION varchar 32 96 utf8 utf8_general_ci varchar(32) NULL information_schema TABLES CHECKSUM bigint NULL NULL NULL NULL bigint(21) unsigned 3.0000 information_schema TABLES CREATE_OPTIONS varchar 255 765 utf8 utf8_general_ci varchar(255) 3.0000 information_schema TABLES TABLE_COMMENT varchar 80 240 utf8 utf8_general_ci varchar(80) diff --git a/mysql-test/suite/funcs_1/r/is_routines.result b/mysql-test/suite/funcs_1/r/is_routines.result index ba564c42f91..e7a900f5c0b 100644 --- a/mysql-test/suite/funcs_1/r/is_routines.result +++ b/mysql-test/suite/funcs_1/r/is_routines.result @@ -45,7 +45,7 @@ SQL_PATH varchar(64) YES NULL SECURITY_TYPE varchar(7) NO CREATED datetime NO 0000-00-00 00:00:00 LAST_ALTERED datetime NO 0000-00-00 00:00:00 -SQL_MODE longtext NO NULL +SQL_MODE varchar(8192) NO ROUTINE_COMMENT varchar(64) NO DEFINER varchar(77) NO CHARACTER_SET_CLIENT varchar(32) NO @@ -71,7 +71,7 @@ ROUTINES CREATE TEMPORARY TABLE `ROUTINES` ( `SECURITY_TYPE` varchar(7) NOT NULL DEFAULT '', `CREATED` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `LAST_ALTERED` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `SQL_MODE` longtext NOT NULL, + `SQL_MODE` varchar(8192) NOT NULL DEFAULT '', `ROUTINE_COMMENT` varchar(64) NOT NULL DEFAULT '', `DEFINER` varchar(77) NOT NULL DEFAULT '', `CHARACTER_SET_CLIENT` varchar(32) NOT NULL DEFAULT '', @@ -97,7 +97,7 @@ SQL_PATH varchar(64) YES NULL SECURITY_TYPE varchar(7) NO CREATED datetime NO 0000-00-00 00:00:00 LAST_ALTERED datetime NO 0000-00-00 00:00:00 -SQL_MODE longtext NO NULL +SQL_MODE varchar(8192) NO ROUTINE_COMMENT varchar(64) NO DEFINER varchar(77) NO CHARACTER_SET_CLIENT varchar(32) NO diff --git a/mysql-test/suite/funcs_1/r/is_schemata.result b/mysql-test/suite/funcs_1/r/is_schemata.result index 33ab912efce..2850655148e 100644 --- a/mysql-test/suite/funcs_1/r/is_schemata.result +++ b/mysql-test/suite/funcs_1/r/is_schemata.result @@ -30,24 +30,24 @@ DESCRIBE information_schema.SCHEMATA; Field Type Null Key Default Extra CATALOG_NAME varchar(512) YES NULL SCHEMA_NAME varchar(64) NO -DEFAULT_CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATION_NAME varchar(64) NO +DEFAULT_CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL SHOW CREATE TABLE information_schema.SCHEMATA; Table Create Table SCHEMATA CREATE TEMPORARY TABLE `SCHEMATA` ( `CATALOG_NAME` varchar(512) DEFAULT NULL, `SCHEMA_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_CHARACTER_SET_NAME` varchar(64) NOT NULL DEFAULT '', - `DEFAULT_COLLATION_NAME` varchar(64) NOT NULL DEFAULT '', + `DEFAULT_CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', + `DEFAULT_COLLATION_NAME` varchar(32) NOT NULL DEFAULT '', `SQL_PATH` varchar(512) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.SCHEMATA; Field Type Null Key Default Extra CATALOG_NAME varchar(512) YES NULL SCHEMA_NAME varchar(64) NO -DEFAULT_CHARACTER_SET_NAME varchar(64) NO -DEFAULT_COLLATION_NAME varchar(64) NO +DEFAULT_CHARACTER_SET_NAME varchar(32) NO +DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL SELECT catalog_name, schema_name, sql_path FROM information_schema.schemata diff --git a/mysql-test/suite/funcs_1/r/is_tables.result b/mysql-test/suite/funcs_1/r/is_tables.result index ab45ca509e7..1ab863b9b7d 100644 --- a/mysql-test/suite/funcs_1/r/is_tables.result +++ b/mysql-test/suite/funcs_1/r/is_tables.result @@ -45,7 +45,7 @@ AUTO_INCREMENT bigint(21) unsigned YES NULL CREATE_TIME datetime YES NULL UPDATE_TIME datetime YES NULL CHECK_TIME datetime YES NULL -TABLE_COLLATION varchar(64) YES NULL +TABLE_COLLATION varchar(32) YES NULL CHECKSUM bigint(21) unsigned YES NULL CREATE_OPTIONS varchar(255) YES NULL TABLE_COMMENT varchar(80) NO @@ -69,7 +69,7 @@ TABLES CREATE TEMPORARY TABLE `TABLES` ( `CREATE_TIME` datetime DEFAULT NULL, `UPDATE_TIME` datetime DEFAULT NULL, `CHECK_TIME` datetime DEFAULT NULL, - `TABLE_COLLATION` varchar(64) DEFAULT NULL, + `TABLE_COLLATION` varchar(32) DEFAULT NULL, `CHECKSUM` bigint(21) unsigned DEFAULT NULL, `CREATE_OPTIONS` varchar(255) DEFAULT NULL, `TABLE_COMMENT` varchar(80) NOT NULL DEFAULT '' @@ -93,7 +93,7 @@ AUTO_INCREMENT bigint(21) unsigned YES NULL CREATE_TIME datetime YES NULL UPDATE_TIME datetime YES NULL CHECK_TIME datetime YES NULL -TABLE_COLLATION varchar(64) YES NULL +TABLE_COLLATION varchar(32) YES NULL CHECKSUM bigint(21) unsigned YES NULL CREATE_OPTIONS varchar(255) YES NULL TABLE_COMMENT varchar(80) NO diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1b6f5131c48..3e788db13d2 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -6013,9 +6013,10 @@ ST_FIELD_INFO schema_fields_info[]= {"CATALOG_NAME", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, {"SCHEMA_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Database", SKIP_OPEN_TABLE}, - {"DEFAULT_CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 0, 0, + {"DEFAULT_CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, + SKIP_OPEN_TABLE}, + {"DEFAULT_COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, - {"DEFAULT_COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, {"SQL_PATH", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} }; @@ -6049,7 +6050,8 @@ ST_FIELD_INFO tables_fields_info[]= {"CREATE_TIME", 0, MYSQL_TYPE_DATETIME, 0, 1, "Create_time", OPEN_FULL_TABLE}, {"UPDATE_TIME", 0, MYSQL_TYPE_DATETIME, 0, 1, "Update_time", OPEN_FULL_TABLE}, {"CHECK_TIME", 0, MYSQL_TYPE_DATETIME, 0, 1, "Check_time", OPEN_FULL_TABLE}, - {"TABLE_COLLATION", 64, MYSQL_TYPE_STRING, 0, 1, "Collation", OPEN_FRM_ONLY}, + {"TABLE_COLLATION", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 1, "Collation", + OPEN_FRM_ONLY}, {"CHECKSUM", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Checksum", OPEN_FULL_TABLE}, {"CREATE_OPTIONS", 255, MYSQL_TYPE_STRING, 0, 1, "Create_options", @@ -6080,8 +6082,10 @@ ST_FIELD_INFO columns_fields_info[]= 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FRM_ONLY}, {"NUMERIC_SCALE", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONGLONG, 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FRM_ONLY}, - {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0, OPEN_FRM_ONLY}, - {"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 1, "Collation", OPEN_FRM_ONLY}, + {"CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 1, 0, + OPEN_FRM_ONLY}, + {"COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 1, "Collation", + OPEN_FRM_ONLY}, {"COLUMN_TYPE", 65535, MYSQL_TYPE_STRING, 0, 0, "Type", OPEN_FRM_ONLY}, {"COLUMN_KEY", 3, MYSQL_TYPE_STRING, 0, 0, "Key", OPEN_FRM_ONLY}, {"EXTRA", 27, MYSQL_TYPE_STRING, 0, 0, "Extra", OPEN_FRM_ONLY}, @@ -6093,10 +6097,10 @@ ST_FIELD_INFO columns_fields_info[]= ST_FIELD_INFO charsets_fields_info[]= { - {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Charset", - SKIP_OPEN_TABLE}, - {"DEFAULT_COLLATE_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Default collation", + {"CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, "Charset", SKIP_OPEN_TABLE}, + {"DEFAULT_COLLATE_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, + "Default collation", SKIP_OPEN_TABLE}, {"DESCRIPTION", 60, MYSQL_TYPE_STRING, 0, 0, "Description", SKIP_OPEN_TABLE}, {"MAXLEN", 3, MYSQL_TYPE_LONGLONG, 0, 0, "Maxlen", SKIP_OPEN_TABLE}, @@ -6106,8 +6110,9 @@ ST_FIELD_INFO charsets_fields_info[]= ST_FIELD_INFO collation_fields_info[]= { - {"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Collation", SKIP_OPEN_TABLE}, - {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Charset", + {"COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, "Collation", + SKIP_OPEN_TABLE}, + {"CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, "Charset", SKIP_OPEN_TABLE}, {"ID", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Id", SKIP_OPEN_TABLE}, @@ -6170,8 +6175,10 @@ ST_FIELD_INFO events_fields_info[]= ST_FIELD_INFO coll_charset_app_fields_info[]= { - {"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, - {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, + {"COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, + SKIP_OPEN_TABLE}, + {"CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, + SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} }; @@ -6200,7 +6207,7 @@ ST_FIELD_INFO proc_fields_info[]= SKIP_OPEN_TABLE}, {"CREATED", 0, MYSQL_TYPE_DATETIME, 0, 0, "Created", SKIP_OPEN_TABLE}, {"LAST_ALTERED", 0, MYSQL_TYPE_DATETIME, 0, 0, "Modified", SKIP_OPEN_TABLE}, - {"SQL_MODE", 65535, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, + {"SQL_MODE", 32*256, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, {"ROUTINE_COMMENT", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Comment", SKIP_OPEN_TABLE}, {"DEFINER", 77, MYSQL_TYPE_STRING, 0, 0, "Definer", SKIP_OPEN_TABLE}, -- cgit v1.2.1 From 53b3052352c0e8ff6f58a7a4ce7db8a8a85083dd Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 13 Nov 2008 16:09:11 +0400 Subject: Bug#39955 SELECT on INFORMATION_SCHEMA.GLOBAL_VARIABLES takes too long VARIABLE_VALUE field is decreased to 1024 symbols. (affected I_S tables: GLOBAL_VARIABLES, SESSION_VARIABLES, GLOBAL_STATUS, SESSION_STATUS). The only variable which can be longer than 1024 is init_connect. The variable will be truncated with warning. Additional fix: Added where condition filter which speed up queries which have where condition with expressions which use VARIABLE_NAME field. mysql-test/r/information_schema.result: test result mysql-test/r/show_check.result: result fix mysql-test/suite/funcs_1/r/is_columns_is.result: result fix mysql-test/t/information_schema.test: test case sql/sql_show.cc: VARIABLE_VALUE field is decreased to 1024 symbols. (affected I_S tables: GLOBAL_VARIABLES, SESSION_VARIABLES, GLOBAL_STATUS, SESSION_STATUS). The only variable which can be longer than 1024 is init_connect. The variable will be truncated with warning. Additional fix: Added where condition filter which speed up queries which have where condition with expressions which use VARIABLE_NAME field. --- mysql-test/r/information_schema.result | 47 ++++++++++++++++++++++++ mysql-test/r/show_check.result | 6 +-- mysql-test/suite/funcs_1/r/is_columns_is.result | 16 ++++---- mysql-test/t/information_schema.test | 27 ++++++++++++++ sql/sql_show.cc | 49 ++++++++++++++++--------- 5 files changed, 116 insertions(+), 29 deletions(-) diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 8f4caa3d6d1..0ed501252f6 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -1651,4 +1651,51 @@ id select_type table type possible_keys key key_len ref rows Extra explain select count(*) from information_schema.views; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE views ALL NULL NULL NULL NULL NULL Open_frm_only; Scanned all databases +set global init_connect="drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;"; +select * from information_schema.global_variables where variable_name='init_connect'; +VARIABLE_NAME VARIABLE_VALUE +INIT_CONNECT drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists t1; +drop table if exists t1;drop table if exists +Warnings: +Warning 1265 Data truncated for column 'VARIABLE_VALUE' at row 1 +set global init_connect=""; End of 5.1 tests. diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index ddc08dca7bb..d054e5cdc05 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -100,19 +100,19 @@ drop table t1; show variables like "wait_timeout%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def VARIABLES VARIABLE_NAME Variable_name 253 64 12 N 1 0 8 -def VARIABLES VARIABLE_VALUE Value 253 20480 5 Y 0 0 8 +def VARIABLES VARIABLE_VALUE Value 253 1024 5 Y 0 0 8 Variable_name Value wait_timeout 28800 show variables like "WAIT_timeout%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def VARIABLES VARIABLE_NAME Variable_name 253 64 12 N 1 0 8 -def VARIABLES VARIABLE_VALUE Value 253 20480 5 Y 0 0 8 +def VARIABLES VARIABLE_VALUE Value 253 1024 5 Y 0 0 8 Variable_name Value wait_timeout 28800 show variables like "this_doesn't_exists%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def VARIABLES VARIABLE_NAME Variable_name 253 64 0 N 1 0 8 -def VARIABLES VARIABLE_VALUE Value 253 20480 0 Y 0 0 8 +def VARIABLES VARIABLE_VALUE Value 253 1024 0 Y 0 0 8 Variable_name Value show table status from test like "this_doesn't_exists%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr diff --git a/mysql-test/suite/funcs_1/r/is_columns_is.result b/mysql-test/suite/funcs_1/r/is_columns_is.result index 7a2257713d2..15466887ecc 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_is.result +++ b/mysql-test/suite/funcs_1/r/is_columns_is.result @@ -110,9 +110,9 @@ NULL information_schema FILES UPDATE_COUNT 13 NULL YES bigint NULL NULL 19 0 NUL NULL information_schema FILES UPDATE_TIME 34 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select NULL information_schema FILES VERSION 25 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select NULL information_schema GLOBAL_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL YES varchar 20480 61440 NULL NULL utf8 utf8_general_ci varchar(20480) select +NULL information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL YES varchar 1024 3072 NULL NULL utf8 utf8_general_ci varchar(1024) select NULL information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL YES varchar 20480 61440 NULL NULL utf8 utf8_general_ci varchar(20480) select +NULL information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL YES varchar 1024 3072 NULL NULL utf8 utf8_general_ci varchar(1024) select NULL information_schema KEY_COLUMN_USAGE COLUMN_NAME 7 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select NULL information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select @@ -213,9 +213,9 @@ NULL information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE 4 NO varchar 64 192 NU NULL information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select NULL information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema SESSION_STATUS VARIABLE_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL YES varchar 20480 61440 NULL NULL utf8 utf8_general_ci varchar(20480) select +NULL information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL YES varchar 1024 3072 NULL NULL utf8 utf8_general_ci varchar(1024) select NULL information_schema SESSION_VARIABLES VARIABLE_NAME 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select -NULL information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL YES varchar 20480 61440 NULL NULL utf8 utf8_general_ci varchar(20480) select +NULL information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL YES varchar 1024 3072 NULL NULL utf8 utf8_general_ci varchar(1024) select NULL information_schema STATISTICS CARDINALITY 10 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) select NULL information_schema STATISTICS COLLATION 9 NULL YES varchar 1 3 NULL NULL utf8 utf8_general_ci varchar(1) select NULL information_schema STATISTICS COLUMN_NAME 8 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select @@ -464,9 +464,9 @@ NULL information_schema FILES CHECKSUM bigint NULL NULL NULL NULL bigint(21) uns 3.0000 information_schema FILES STATUS varchar 20 60 utf8 utf8_general_ci varchar(20) 3.0000 information_schema FILES EXTRA varchar 255 765 utf8 utf8_general_ci varchar(255) 3.0000 information_schema GLOBAL_STATUS VARIABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 20480 61440 utf8 utf8_general_ci varchar(20480) +3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 1024 3072 utf8 utf8_general_ci varchar(1024) 3.0000 information_schema GLOBAL_VARIABLES VARIABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 20480 61440 utf8 utf8_general_ci varchar(20480) +3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 1024 3072 utf8 utf8_general_ci varchar(1024) 3.0000 information_schema KEY_COLUMN_USAGE CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema KEY_COLUMN_USAGE CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema KEY_COLUMN_USAGE CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) @@ -567,9 +567,9 @@ NULL information_schema ROUTINES LAST_ALTERED datetime NULL NULL NULL NULL datet 3.0000 information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema SCHEMA_PRIVILEGES IS_GRANTABLE varchar 3 9 utf8 utf8_general_ci varchar(3) 3.0000 information_schema SESSION_STATUS VARIABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 20480 61440 utf8 utf8_general_ci varchar(20480) +3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 1024 3072 utf8 utf8_general_ci varchar(1024) 3.0000 information_schema SESSION_VARIABLES VARIABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) -3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 20480 61440 utf8 utf8_general_ci varchar(20480) +3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 1024 3072 utf8 utf8_general_ci varchar(1024) 3.0000 information_schema STATISTICS TABLE_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema STATISTICS TABLE_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema STATISTICS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 4027293da66..667a9279e84 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -1346,4 +1346,31 @@ explain select count(*) from information_schema.tables; explain select count(*) from information_schema.columns; explain select count(*) from information_schema.views; +# +# Bug#39955 SELECT on INFORMATION_SCHEMA.GLOBAL_VARIABLES takes too long +# +set global init_connect="drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;\ +drop table if exists t1;drop table if exists t1;"; +select * from information_schema.global_variables where variable_name='init_connect'; +set global init_connect=""; + --echo End of 5.1 tests. diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3e788db13d2..0d51c7457c3 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -83,6 +83,7 @@ static void store_key_options(THD *thd, String *packet, TABLE *table, static void append_algorithm(TABLE_LIST *table, String *buff); +static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table); /*************************************************************************** ** List all table types supported @@ -2072,7 +2073,8 @@ static bool show_status_array(THD *thd, const char *wild, enum enum_var_type value_type, struct system_status_var *status_var, const char *prefix, TABLE *table, - bool ucase_names) + bool ucase_names, + COND *cond) { MY_ALIGNED_BYTE_ARRAY(buff_data, SHOW_VAR_FUNC_BUFF_SIZE, long); char * const buff= (char *) &buff_data; @@ -2082,8 +2084,12 @@ static bool show_status_array(THD *thd, const char *wild, int len; LEX_STRING null_lex_str; SHOW_VAR tmp, *var; + COND *partial_cond= 0; + enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; + bool res= FALSE; DBUG_ENTER("show_status_array"); + thd->count_cuted_fields= CHECK_FIELD_WARN; null_lex_str.str= 0; // For sys_var->value_ptr() null_lex_str.length= 0; @@ -2091,6 +2097,7 @@ static bool show_status_array(THD *thd, const char *wild, if (*prefix) *prefix_end++= '_'; len=name_buffer + sizeof(name_buffer) - prefix_end; + partial_cond= make_cond_for_info_schema(cond, table->pos_in_table_list); for (; variables->name; variables++) { @@ -2099,6 +2106,9 @@ static bool show_status_array(THD *thd, const char *wild, if (ucase_names) make_upper(name_buffer); + restore_record(table, s->default_values); + table->field[0]->store(name_buffer, strlen(name_buffer), + system_charset_info); /* if var->type is SHOW_FUNC, call the function. Repeat as necessary, if new var is again SHOW_FUNC @@ -2110,12 +2120,13 @@ static bool show_status_array(THD *thd, const char *wild, if (show_type == SHOW_ARRAY) { show_status_array(thd, wild, (SHOW_VAR *) var->value, value_type, - status_var, name_buffer, table, ucase_names); + status_var, name_buffer, table, ucase_names, partial_cond); } else { if (!(wild && wild[0] && wild_case_compare(system_charset_info, - name_buffer, wild))) + name_buffer, wild)) && + (!partial_cond || partial_cond->val_int())) { char *value=var->value; const char *pos, *end; // We assign a lot of const's @@ -2202,21 +2213,23 @@ static bool show_status_array(THD *thd, const char *wild, DBUG_ASSERT(0); break; } - restore_record(table, s->default_values); - table->field[0]->store(name_buffer, strlen(name_buffer), - system_charset_info); table->field[1]->store(pos, (uint32) (end - pos), system_charset_info); + thd->count_cuted_fields= CHECK_FIELD_IGNORE; table->field[1]->set_notnull(); pthread_mutex_unlock(&LOCK_global_system_variables); if (schema_table_store_record(thd, table)) - DBUG_RETURN(TRUE); + { + res= TRUE; + goto end; + } } } } - - DBUG_RETURN(FALSE); +end: + thd->count_cuted_fields= save_count_cuted_fields; + DBUG_RETURN(res); } @@ -5244,7 +5257,7 @@ int fill_variables(THD *thd, TABLE_LIST *tables, COND *cond) rw_rdlock(&LOCK_system_variables_hash); res= show_status_array(thd, wild, enumerate_sys_vars(thd, sorted_vars), - option_type, NULL, "", tables->table, upper_case_names); + option_type, NULL, "", tables->table, upper_case_names, cond); rw_unlock(&LOCK_system_variables_hash); DBUG_RETURN(res); } @@ -5287,7 +5300,7 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond) res= show_status_array(thd, wild, (SHOW_VAR *)all_status_vars.buffer, option_type, tmp1, "", tables->table, - upper_case_names); + upper_case_names, cond); pthread_mutex_unlock(&LOCK_status); DBUG_RETURN(res); } @@ -6456,7 +6469,7 @@ ST_FIELD_INFO variables_fields_info[]= { {"VARIABLE_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Variable_name", SKIP_OPEN_TABLE}, - {"VARIABLE_VALUE", 20480, MYSQL_TYPE_STRING, 0, 1, "Value", SKIP_OPEN_TABLE}, + {"VARIABLE_VALUE", 1024, MYSQL_TYPE_STRING, 0, 1, "Value", SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} }; @@ -6615,9 +6628,9 @@ ST_SCHEMA_TABLE schema_tables[]= {"FILES", files_fields_info, create_schema_table, fill_schema_files, 0, 0, -1, -1, 0, 0}, {"GLOBAL_STATUS", variables_fields_info, create_schema_table, - fill_status, make_old_format, 0, -1, -1, 0, 0}, + fill_status, make_old_format, 0, 0, -1, 0, 0}, {"GLOBAL_VARIABLES", variables_fields_info, create_schema_table, - fill_variables, make_old_format, 0, -1, -1, 0, 0}, + fill_variables, make_old_format, 0, 0, -1, 0, 0}, {"KEY_COLUMN_USAGE", key_column_usage_fields_info, create_schema_table, get_all_tables, 0, get_schema_key_column_usage_record, 4, 5, 0, OPEN_TABLE_ONLY}, @@ -6642,14 +6655,14 @@ ST_SCHEMA_TABLE schema_tables[]= {"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table, fill_schema_schema_privileges, 0, 0, -1, -1, 0, 0}, {"SESSION_STATUS", variables_fields_info, create_schema_table, - fill_status, make_old_format, 0, -1, -1, 0, 0}, + fill_status, make_old_format, 0, 0, -1, 0, 0}, {"SESSION_VARIABLES", variables_fields_info, create_schema_table, - fill_variables, make_old_format, 0, -1, -1, 0, 0}, + fill_variables, make_old_format, 0, 0, -1, 0, 0}, {"STATISTICS", stat_fields_info, create_schema_table, get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0, OPEN_TABLE_ONLY|OPTIMIZE_I_S_TABLE}, {"STATUS", variables_fields_info, create_schema_table, fill_status, - make_old_format, 0, -1, -1, 1, 0}, + make_old_format, 0, 0, -1, 1, 0}, {"TABLES", tables_fields_info, create_schema_table, get_all_tables, make_old_format, get_schema_tables_record, 1, 2, 0, OPTIMIZE_I_S_TABLE}, @@ -6665,7 +6678,7 @@ ST_SCHEMA_TABLE schema_tables[]= {"USER_PRIVILEGES", user_privileges_fields_info, create_schema_table, fill_schema_user_privileges, 0, 0, -1, -1, 0, 0}, {"VARIABLES", variables_fields_info, create_schema_table, fill_variables, - make_old_format, 0, -1, -1, 1, 0}, + make_old_format, 0, 0, -1, 1, 0}, {"VIEWS", view_fields_info, create_schema_table, get_all_tables, 0, get_schema_views_record, 1, 2, 0, OPEN_VIEW_ONLY|OPTIMIZE_I_S_TABLE}, -- cgit v1.2.1 From fc27d0380a7a78f6bc33ba55dd3357b14e674893 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 13 Nov 2008 16:11:51 +0400 Subject: Bug#38909 CREATE_OPTIONS in information_schema produces wrong results table->partition_info is unitialized when we open frm file only. The fix is check share->partition_info_len which is set on frm opening stage. mysql-test/r/information_schema_part.result: test result mysql-test/t/information_schema_part.test: test case sql/sql_show.cc: table->partition_info is unitialized when we open frm file only. The fix is check share->partition_info_len which is set on frm opening stage. --- mysql-test/r/information_schema_part.result | 6 ++++++ mysql-test/t/information_schema_part.test | 10 ++++++++++ sql/sql_show.cc | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/information_schema_part.result b/mysql-test/r/information_schema_part.result index 74d52e9521f..04dc9ccf2c0 100644 --- a/mysql-test/r/information_schema_part.result +++ b/mysql-test/r/information_schema_part.result @@ -145,3 +145,9 @@ table_schema = "test" AND table_name = "t1"; PARTITION_DESCRIPTION 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 drop table t1; +drop table if exists t1; +create table t1 (f1 int key) partition by key(f1) partitions 2; +select create_options from information_schema.tables where table_schema="test"; +create_options +partitioned +drop table t1; diff --git a/mysql-test/t/information_schema_part.test b/mysql-test/t/information_schema_part.test index 4cbf21ca1d3..f1415d12f79 100644 --- a/mysql-test/t/information_schema_part.test +++ b/mysql-test/t/information_schema_part.test @@ -121,3 +121,13 @@ SHOW CREATE TABLE t1; SELECT PARTITION_DESCRIPTION FROM information_schema.partitions WHERE table_schema = "test" AND table_name = "t1"; drop table t1; + +# +# Bug#38909 CREATE_OPTIONS in information_schema produces wrong results +# +--disable_warnings +drop table if exists t1; +--enable_warnings +create table t1 (f1 int key) partition by key(f1) partitions 2; +select create_options from information_schema.tables where table_schema="test"; +drop table t1; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0d51c7457c3..76496db4817 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3511,6 +3511,7 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables, TABLE_SHARE *share= show_table->s; handler *file= show_table->file; handlerton *tmp_db_type= share->db_type(); + bool is_partitioned= FALSE; if (share->tmp_table == SYSTEM_TMP_TABLE) table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs); else if (share->tmp_table) @@ -3527,7 +3528,10 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables, #ifdef WITH_PARTITION_STORAGE_ENGINE if (share->db_type() == partition_hton && share->partition_info_len) + { tmp_db_type= share->default_part_db_type; + is_partitioned= TRUE; + } #endif tmp_buff= (char *) ha_resolve_storage_engine_name(tmp_db_type); table->field[4]->store(tmp_buff, strlen(tmp_buff), cs); @@ -3572,9 +3576,7 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables, NullS); } #ifdef WITH_PARTITION_STORAGE_ENGINE - if (show_table->s->db_type() == partition_hton && - show_table->part_info != NULL && - show_table->part_info->no_parts > 0) + if (is_partitioned) ptr= strmov(ptr, " partitioned"); #endif if (share->transactional != HA_CHOICE_UNDEF) -- cgit v1.2.1 From c049fc6bd62f9ef3b836a04be49ddc0fd0e4edc0 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 13 Nov 2008 17:06:48 +0400 Subject: Bug#39541 CHECK TABLE on information_schema myisam tables produces error issue 'The storage engine for the table doesn't support check' note for I_S tables mysql-test/r/mysqlcheck.result: test result mysql-test/t/mysqlcheck.test: test case sql/sql_table.cc: issue 'The storage engine for the table doesn't support check' note for I_S tables --- mysql-test/r/mysqlcheck.result | 6 ++++++ mysql-test/t/mysqlcheck.test | 7 +++++++ sql/sql_table.cc | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result index 8d7a2d41649..89f853e88f7 100644 --- a/mysql-test/r/mysqlcheck.result +++ b/mysql-test/r/mysqlcheck.result @@ -57,4 +57,10 @@ drop view v_bug25347; drop table t_bug25347; drop database d_bug25347; use test; +create view v1 as select * from information_schema.routines; +check table v1, information_schema.routines; +Table Op Msg_type Msg_text +test.v1 check status OK +information_schema.routines check note The storage engine for the table doesn't support check +drop view v1; End of 5.0 tests diff --git a/mysql-test/t/mysqlcheck.test b/mysql-test/t/mysqlcheck.test index 8d5e1a1c4c5..09ca98d01ad 100644 --- a/mysql-test/t/mysqlcheck.test +++ b/mysql-test/t/mysqlcheck.test @@ -58,4 +58,11 @@ drop table t_bug25347; drop database d_bug25347; use test; +# +# Bug#39541 CHECK TABLE on information_schema myisam tables produces error +# +create view v1 as select * from information_schema.routines; +check table v1, information_schema.routines; +drop view v1; + --echo End of 5.0 tests diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 1724513eb8f..8baeca9ccf7 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2322,6 +2322,12 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, goto send_result; } + if (table->schema_table) + { + result_code= HA_ADMIN_NOT_IMPLEMENTED; + goto send_result; + } + if ((table->table->db_stat & HA_READ_ONLY) && open_for_modify) { char buff[FN_REFLEN + MYSQL_ERRMSG_SIZE]; -- cgit v1.2.1 From f5583481e3439a74e22170eab631755cc094c32c Mon Sep 17 00:00:00 2001 From: Patrick Crews Date: Thu, 13 Nov 2008 16:01:01 -0500 Subject: Bug#40645 Test main.federated_innodb does not always clean up after itself Reordered include files so that no mess will be left if this test is run without InnoDB Previously, this test would leave a database named 'federated' in such a case and would cause tests that examined existing databases to fail. --- mysql-test/t/federated_innodb.test | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mysql-test/t/federated_innodb.test b/mysql-test/t/federated_innodb.test index 772e37a2929..0617cb15d97 100644 --- a/mysql-test/t/federated_innodb.test +++ b/mysql-test/t/federated_innodb.test @@ -1,5 +1,10 @@ -source include/federated.inc; +# NOTE: Keep any include/ files that will kill / skip a test BEFORE any others +# having federated.inc before have_innodb.inc allows for an orphaned database +# that can cause other tests to fail. +# See Bug #40645 Test main.federated_innodb does not always clean up after itself + source include/have_innodb.inc; +source include/federated.inc; # # Bug#25513 Federated transaction failures -- cgit v1.2.1 From f2a610e1e072f3b50709be3f419ea3ac1d7a3aa5 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Fri, 14 Nov 2008 02:01:41 +0100 Subject: Bug #20430 mysqld.exe windows service stuck in "SERVICE_STOP_PENDING" status The problem appears to be a race condition, when service is being stopped right after startup. We set the service status to SERVICE_RUNNING way too early it cannot yet handle stop requests - initialization has not finished and hEventShutdown that signals server to stop is not yet created. If somebody issues "net stop MySQL" at this time, MySQL is not informed about the stop and continues to run as usual, while NTService::ServiceMain() stucks forever waiting for mysql's "main" thread to finish. Solution is to remain in SERVICE_START_PENDING status until after server initialization is fully complete and only then change the status to SERVICE_RUNNING. In SERVICE_START_PENDING we do not accept service control requests, i.e it is not possible to stop service in that time. sql/mysqld.cc: Set service status to running after all initialization is complete sql/nt_servc.cc: New method SetRunning() to be called by application to set service status to SERVICE_RUNNING when apllication has finished initialization. sql/nt_servc.h: New method SetRunning() to be called by application when initialization completes --- sql/mysqld.cc | 3 +++ sql/nt_servc.cc | 12 ++++++++---- sql/nt_servc.h | 14 +++++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index c3e5449b22b..ba6c8c6169f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3840,6 +3840,9 @@ we force server id to 2, but this MySQL server will not act as a slave."); : mysqld_unix_port), mysqld_port, MYSQL_COMPILATION_COMMENT); +#if defined(_WIN32) && !defined(EMBEDDED_LIBRARY) + Service.SetRunning(); +#endif #if defined(__NT__) || defined(HAVE_SMEM) handle_connections_methods(); diff --git a/sql/nt_servc.cc b/sql/nt_servc.cc index a04f284a3de..e570898f373 100644 --- a/sql/nt_servc.cc +++ b/sql/nt_servc.cc @@ -245,10 +245,6 @@ void NTService::ServiceMain(DWORD argc, LPTSTR *argv) if (!pService->StartService()) goto error; - // Check that the service is now running. - if (!pService->SetStatus(SERVICE_RUNNING,NO_ERROR, 0, 0, 0)) - goto error; - // wait for exit event WaitForSingleObject (pService->hExitEvent, INFINITE); @@ -264,6 +260,14 @@ error: return; } + +void NTService::SetRunning() +{ + if (pService) + pService->SetStatus(SERVICE_RUNNING,NO_ERROR, 0, 0, 0); +} + + /* ------------------------------------------------------------------------ StartService() - starts the appliaction thread -------------------------------------------------------------------------- */ diff --git a/sql/nt_servc.h b/sql/nt_servc.h index a3c12569114..9b689e434e1 100644 --- a/sql/nt_servc.h +++ b/sql/nt_servc.h @@ -56,7 +56,19 @@ class NTService BOOL IsService(LPCSTR ServiceName); BOOL got_service_option(char **argv, char *service_option); BOOL is_super_user(); - void Stop(void); //to be called from app. to stop service + + /* + SetRunning() is to be called by the application + when initialization completes and it can accept + stop request + */ + void SetRunning(void); + + /* + Stop() is to be called by the application to stop + the service + */ + void Stop(void); protected: LPSTR ServiceName; -- cgit v1.2.1 From e3de8d361efbe43d505665ddc959fef77400ca8a Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Fri, 14 Nov 2008 11:40:46 +0400 Subject: Fix for bug#37527: mysqlcheck fails to report entire database when InnoDB frm file corruption Problem: mysqlcheck runs 'SHOW FULL TABLE' queries to get table lists. The query may fail for some reasons (e.g. null .frm file) then mysqlcheck doesn't process the database tables. Fix: try to run 'SHOW TABLES' if 'SHOW FULL TABLES' failed. client/mysqlcheck.c: Fix for bug#37527: mysqlcheck fails to report entire database when InnoDB frm file corruption - run "SHOW TABLES" query if "SHOW /*!50002 FULL*/ TABLES" failed; - print error info if both failed. mysql-test/r/mysqlcheck.result: Fix for bug#37527: mysqlcheck fails to report entire database when InnoDB frm file corruption - test result. mysql-test/t/mysqlcheck.test: Fix for bug#37527: mysqlcheck fails to report entire database when InnoDB frm file corruption - test case. --- client/mysqlcheck.c | 9 +++++++-- mysql-test/r/mysqlcheck.result | 7 +++++++ mysql-test/t/mysqlcheck.test | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 473e172adf9..513d1974ed0 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -488,9 +488,14 @@ static int process_all_tables_in_db(char *database) LINT_INIT(res); if (use_db(database)) return 1; - if (mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") || - !((res= mysql_store_result(sock)))) + if ((mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") && + mysql_query(sock, "SHOW TABLES")) || + !(res= mysql_store_result(sock))) + { + my_printf_error(0, "Error: Couldn't get table list for database %s: %s", + MYF(0), database, mysql_error(sock)); return 1; + } num_columns= mysql_num_fields(res); diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result index 89f853e88f7..f8dad6a7769 100644 --- a/mysql-test/r/mysqlcheck.result +++ b/mysql-test/r/mysqlcheck.result @@ -63,4 +63,11 @@ Table Op Msg_type Msg_text test.v1 check status OK information_schema.routines check note The storage engine for the table doesn't support check drop view v1; +CREATE TABLE t1(a INT); +CREATE TABLE t2(a INT); +test.t1 +Error : Incorrect information in file: './test/t1.frm' +error : Corrupt +test.t2 OK +DROP TABLE t1, t2; End of 5.0 tests diff --git a/mysql-test/t/mysqlcheck.test b/mysql-test/t/mysqlcheck.test index 09ca98d01ad..91006d280a8 100644 --- a/mysql-test/t/mysqlcheck.test +++ b/mysql-test/t/mysqlcheck.test @@ -65,4 +65,24 @@ create view v1 as select * from information_schema.routines; check table v1, information_schema.routines; drop view v1; + +# +# Bug#37527: mysqlcheck fails to report entire database +# when frm file corruption +# +CREATE TABLE t1(a INT); +CREATE TABLE t2(a INT); +# backup then null t1.frm +--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm +--write_file $MYSQLTEST_VARDIR/master-data/test/t1.frm +EOF +--exec $MYSQL_CHECK test +# restore t1.frm +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm +--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak $MYSQLTEST_VARDIR/master-data/test/t1.frm +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak +DROP TABLE t1, t2; + + --echo End of 5.0 tests -- cgit v1.2.1 From dbc062bf2c5fe8a38151e72eb7a3c110da6d856b Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Fri, 14 Nov 2008 11:42:29 +0400 Subject: Test case for bug #34774: key prefix on text field in federated tables can cause server to crash! The bug will be fixed by patch for #34779: "crash in checksum table on federated tables with blobs containing nulls" Only a test case commited. mysql-test/r/federated.result: Test case for bug #34774: key prefix on text field in federated tables can cause server to crash! - test result. mysql-test/t/federated.test: Test case for bug #34774: key prefix on text field in federated tables can cause server to crash! - test case. --- mysql-test/r/federated.result | 9 +++++++++ mysql-test/t/federated.test | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result index 45b615864ac..f0de3e9b04a 100644 --- a/mysql-test/r/federated.result +++ b/mysql-test/r/federated.result @@ -2085,6 +2085,15 @@ Table Checksum test.t1 2465757603 DROP TABLE t1; DROP TABLE t1; +CREATE TABLE t1 (a TEXT, b TEXT, KEY(b(1))); +INSERT INTO t1 VALUES (NULL, NULL), (NULL, NULL), (NULL, NULL), (NULL, NULL); +CREATE TABLE t1 +(a TEXT, b TEXT, KEY(b(1))) ENGINE=FEDERATED +CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; +SELECT t1.a FROM t1, t1 as t2 WHERE t2.b NOT LIKE t1.b; +a +DROP TABLE t1; +DROP TABLE t1; End of 5.0 tests SET @@GLOBAL.CONCURRENT_INSERT= @OLD_MASTER_CONCURRENT_INSERT; SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT; diff --git a/mysql-test/t/federated.test b/mysql-test/t/federated.test index 8bbb87ccd9c..c977cb65fa0 100644 --- a/mysql-test/t/federated.test +++ b/mysql-test/t/federated.test @@ -1824,6 +1824,25 @@ DROP TABLE t1; connection master; DROP TABLE t1; + +# +# Bug #34774 key prefix on text field in federated tables can cause +# server to crash! +# +connection slave; +CREATE TABLE t1 (a TEXT, b TEXT, KEY(b(1))); +INSERT INTO t1 VALUES (NULL, NULL), (NULL, NULL), (NULL, NULL), (NULL, NULL); +connection master; +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 + (a TEXT, b TEXT, KEY(b(1))) ENGINE=FEDERATED + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; +SELECT t1.a FROM t1, t1 as t2 WHERE t2.b NOT LIKE t1.b; +connection slave; +DROP TABLE t1; +connection master; +DROP TABLE t1; + connection default; --echo End of 5.0 tests -- cgit v1.2.1 From 42607435af2c48e89160140c079eec4b4286dfe5 Mon Sep 17 00:00:00 2001 From: Matthias Leich Date: Fri, 14 Nov 2008 17:18:20 +0100 Subject: Fix for Bug#39979 main.events_time_zone does not clean up + minor improvements. --- mysql-test/r/events_time_zone.result | 11 +++-- mysql-test/t/events_time_zone.test | 83 +++++++++++++++++++++++++----------- 2 files changed, 65 insertions(+), 29 deletions(-) diff --git a/mysql-test/r/events_time_zone.result b/mysql-test/r/events_time_zone.result index b20aa445183..155a9d155af 100644 --- a/mysql-test/r/events_time_zone.result +++ b/mysql-test/r/events_time_zone.result @@ -14,6 +14,7 @@ RETURN FLOOR((i % (step * n) + 0.1) / step); END// SET @step3= @step * 3; SET @step6= @step * 6; +SET @unix_time= UNIX_TIMESTAMP() - 1; SET @unix_time= @unix_time - @unix_time % @step6; INSERT INTO mysql.time_zone VALUES (NULL, 'N'); SET @tzid= LAST_INSERT_ID(); @@ -21,7 +22,7 @@ INSERT INTO mysql.time_zone_transition_type VALUES (@tzid, 0, 0, 0, 'b16420_0'); INSERT INTO mysql.time_zone_transition_type VALUES (@tzid, 1, @step3 - @step, 1, 'b16420_1'); -INSERT INTO mysql.time_zone_name VALUES ('bug16420', @tzid); +INSERT INTO mysql.time_zone_name VALUES ('', @tzid); CREATE TABLE t1 (count INT, unix_time INT, local_time INT, comment CHAR(80)); CREATE TABLE t2 (count INT); INSERT INTO t2 VALUES (1); @@ -48,7 +49,7 @@ END// SET TIME_ZONE= '+00:00'; CREATE EVENT e1 ON SCHEDULE EVERY @step SECOND STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1(""); -SET TIME_ZONE= 'bug16420'; +SET TIME_ZONE= ''; CREATE EVENT e2 ON SCHEDULE EVERY @step SECOND STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1(""); SET GLOBAL EVENT_SCHEDULER= ON; @@ -86,6 +87,7 @@ DELETE FROM mysql.time_zone_name WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone WHERE time_zone_id = @tzid; +ALTER TABLE mysql.time_zone AUTO_INCREMENT = 6; SET TIME_ZONE= '+00:00'; CREATE TABLE t1 (event CHAR(2), dt DATE, offset INT); INSERT INTO mysql.time_zone VALUES (NULL, 'N'); @@ -111,8 +113,8 @@ INSERT INTO mysql.time_zone_transition VALUES (@tzid, @now + 7 * @step, 2); INSERT INTO mysql.time_zone_transition VALUES (@tzid, @now + 12 * @step, 3); -INSERT INTO mysql.time_zone_name VALUES ('bug16420_2', @tzid); -SET TIME_ZONE= 'bug16420_2'; +INSERT INTO mysql.time_zone_name VALUES ('', @tzid); +SET TIME_ZONE= ''; SET GLOBAL EVENT_SCHEDULER= ON; SET GLOBAL EVENT_SCHEDULER= OFF; Below we should see the following: @@ -143,6 +145,7 @@ DELETE FROM mysql.time_zone_name WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone WHERE time_zone_id = @tzid; +ALTER TABLE mysql.time_zone AUTO_INCREMENT = 6; DROP FUNCTION round_to_step; DROP TABLE t_step; DROP DATABASE mysqltest_db1; diff --git a/mysql-test/t/events_time_zone.test b/mysql-test/t/events_time_zone.test index af3466a339c..ccae7847618 100644 --- a/mysql-test/t/events_time_zone.test +++ b/mysql-test/t/events_time_zone.test @@ -1,11 +1,40 @@ -# This test case is sensitive to execution timing. You may control -# this sensitivity by the parameter below. Small values will result -# in fast but more unstable execution, large values will improve -# stability at the cost of speed. Basically, N is a number of seconds -# to wait for operation to complete. Should be positive. Test runs -# about 25*N seconds (it sleeps most of the time, so CPU speed is not -# relevant). +# 1. This test case is sensitive to execution timing. You may control +# this sensitivity by the parameter below. Small values will result +# in fast but more unstable execution, large values will improve +# stability at the cost of speed. Basically, N is a number of seconds +# to wait for operation to complete. Should be positive. Test runs +# about 25*N seconds (it sleeps most of the time, so CPU speed is not +# relevant). let $N = 5; +# +# 2. Some subtests +# - create a new time zone +# - run some statements +# - delete the new time zone. +# But the time zone name used gets somewhere cached and it cannot be +# "reused" later in the same or another session for a new time zone. +# Experiments (2008-11 MySQL 5.1) showed that none of the available +# RESET/FLUSH commands removes these entries. +# 2008-11 MySQL 5.1 Bug#39979 main.events_time_zone does not clean up +# second bad effect +# Therefore we compute unique and unusual timezone names to minimize +# the likelihood that a later test uses the same name. +# +# 3. The subtests mentioned in 2. cause that the AUTO_INCREMENT value +# within "SHOW CREATE TABLE mysql.timezone" differ from the initial one. +# (Bug#39979 main.events_time_zone does not clean up) +# Therefore we reset this value after each of these subtests. +# +# Note(mleich): +# There is a significant likelihood that future improvements of the server +# cause that the solutions for the issues mentioned in 2. and 3. will no +# more work. +# A mysql-test-run.pl feature which allows to enforce +# 1. Server shutdown (-> Problem mentioned in 2. disappears) +# 2. Reset all data to initial state (-> Problem mentioned in 3. disappears) +# 3. Server start +# after a tests would be a perfect replacement. +# --source include/big_test.inc @@ -73,19 +102,15 @@ delimiter ;// SET @step3= @step * 3; SET @step6= @step * 6; -# Disable query log to hide current time. ---disable_query_log SET @unix_time= UNIX_TIMESTAMP() - 1; ---enable_query_log - SET @unix_time= @unix_time - @unix_time % @step6; INSERT INTO mysql.time_zone VALUES (NULL, 'N'); SET @tzid= LAST_INSERT_ID(); INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 0, 0, 0, 'b16420_0'); + VALUES (@tzid, 0, 0, 0, 'b16420_0'); INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 1, @step3 - @step, 1, 'b16420_1'); + VALUES (@tzid, 1, @step3 - @step, 1, 'b16420_1'); let $transition_unix_time= `SELECT @unix_time`; let $count= 30; @@ -99,7 +124,9 @@ while ($count) dec $count; } --enable_query_log -INSERT INTO mysql.time_zone_name VALUES ('bug16420', @tzid); +let $tz_name = `SELECT CONCAT('b16420_a',UNIX_TIMESTAMP())`; +--replace_result $tz_name +eval INSERT INTO mysql.time_zone_name VALUES ('$tz_name', @tzid); CREATE TABLE t1 (count INT, unix_time INT, local_time INT, comment CHAR(80)); CREATE TABLE t2 (count INT); @@ -135,7 +162,8 @@ SET TIME_ZONE= '+00:00'; CREATE EVENT e1 ON SCHEDULE EVERY @step SECOND STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1(""); -SET TIME_ZONE= 'bug16420'; +--replace_result $tz_name +eval SET TIME_ZONE= '$tz_name'; CREATE EVENT e2 ON SCHEDULE EVERY @step SECOND STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1(""); @@ -196,6 +224,8 @@ DELETE FROM mysql.time_zone_name WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone WHERE time_zone_id = @tzid; +let $time_zone_auto_inc = `SELECT MAX(Time_zone_id) + 1 FROM mysql.time_zone`; +eval ALTER TABLE mysql.time_zone AUTO_INCREMENT = $time_zone_auto_inc; #---------------------------------------------------------------------- @@ -216,13 +246,13 @@ SET @offset_month_03= UNIX_TIMESTAMP('2030-03-31 12:00:00') - @now - 5*@step; SET @offset_month_04= UNIX_TIMESTAMP('2030-04-30 12:00:00') - @now - 13*@step; INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 0, @offset_month_01, 0, 'b16420_0'); + VALUES (@tzid, 0, @offset_month_01, 0, 'b16420_0'); INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 1, @offset_month_02, 1, 'b16420_1'); + VALUES (@tzid, 1, @offset_month_02, 1, 'b16420_1'); INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 2, @offset_month_03, 1, 'b16420_2'); + VALUES (@tzid, 2, @offset_month_03, 1, 'b16420_2'); INSERT INTO mysql.time_zone_transition_type - VALUES (@tzid, 3, @offset_month_04, 1, 'b16420_3'); + VALUES (@tzid, 3, @offset_month_04, 1, 'b16420_3'); INSERT INTO mysql.time_zone_transition VALUES (@tzid, @now, 0); INSERT INTO mysql.time_zone_transition @@ -231,11 +261,12 @@ INSERT INTO mysql.time_zone_transition VALUES (@tzid, @now + 7 * @step, 2); INSERT INTO mysql.time_zone_transition VALUES (@tzid, @now + 12 * @step, 3); -# We have to user a new time zone name, because 'bug16420' has been -# cached already. -INSERT INTO mysql.time_zone_name VALUES ('bug16420_2', @tzid); +let $tz_name = `SELECT CONCAT('b16420_b',UNIX_TIMESTAMP())`; +--replace_result $tz_name +eval INSERT INTO mysql.time_zone_name VALUES ('$tz_name', @tzid); -SET TIME_ZONE= 'bug16420_2'; +--replace_result $tz_name +eval SET TIME_ZONE= '$tz_name'; SET GLOBAL EVENT_SCHEDULER= ON; @@ -280,6 +311,8 @@ DELETE FROM mysql.time_zone_name WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone_transition WHERE time_zone_id = @tzid; DELETE FROM mysql.time_zone WHERE time_zone_id = @tzid; +let $time_zone_auto_inc = `SELECT MAX(Time_zone_id) + 1 FROM mysql.time_zone`; +eval ALTER TABLE mysql.time_zone AUTO_INCREMENT = $time_zone_auto_inc; DROP FUNCTION round_to_step; DROP TABLE t_step; @@ -291,8 +324,8 @@ eval USE $old_db; --enable_query_log let $wait_condition= - select count(*) = 0 from information_schema.processlist - where db='mysqltest_db1' and command = 'Connect' and user=current_user(); + SELECT COUNT(*) = 0 FROM information_schema.processlist + WHERE db='mysqltest_db1' AND command = 'Connect' AND user=current_user(); --source include/wait_condition.inc --echo End of 5.1 tests. -- cgit v1.2.1 From 56b9586fd1d94ebd70662417a1d2ac1921da4ad2 Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Fri, 14 Nov 2008 21:25:57 +0400 Subject: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade Obsolete arc/ directory and view .frm file backup support has been removed by the patch for bug 17823. However, that bugfix caused a problem with "live downgrades" of the server: if we rename some view 4 times under 5.1.29/5.0.72 and then try to rename it under 5.1.28/5.0.70 on the same database, the server fails with a error: query 'RENAME TABLE ... TO ...' failed: 6: Error on delete of '....frm-0001' (Errcode: 2) Also .frm file of that view may be lost (renamed to .frm~). The server failed because it tried to rename latest 3 backup .frm files renaming the view: the server used an integer value of the "revision" field of .frm file to extract those file names. After the fix for bug 17823 those files were not created/maintained any more, however the "revision" field was incremented as usual. So, the server failed renaming non existent files. This fix solves the problem by removing the support for "revision" .frm file field: 1. New server silently ignores existent "revision" fields in old .frm files and never write it down; 2. Old server assumes, that missing "revision" field in new .frm files means default value of 0. 3. Accordingly to the fix for bug 17823 the new server drops arc/ directory on alter/rename view, so after "live downgrade" old server begins maintenance of the arc/ directory from scratch without conflicts with .frm files. sql/parse_file.cc: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade 1. static write_parameter(): the old_version parameter and the section for FILE_OPTIONS_REV have been re moved. 2. write_parameter(): the max_versions parameter has been removed; 3. sql_create_definition_file(): removal of dead code; 4. rename_in_schema_file(): revision and num_view_backups parameters and dead code have been removed; 5. File_parser::parse(): FILE_OPTIONS_REV section has been removed. sql/parse_file.h: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade 1. The FILE_OPTIONS_REV constant has been removed. 2. sql_create_definition_file and rename_in_schema_file functions: obsolete versions, revision and num_view_backups parameters have been removed. sql/sql_db.cc: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade Commentary update. sql/sql_trigger.cc: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade sql_create_definition_file() calls have been updates to new parameter lists. sql/sql_view.cc: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade 1. The mysql_create_view function code is used for both CREATE VIEW and ALTER queries, but query cache is necessary for ALTER command only. Check for a non first view revision has been replaced with a direct check for ALTER query. 2. The num_view_backups global constant has been removed. 3. view_parameters: the "revision" .frm field support has been removed. 4. sql_create_definition_file and rename_in_schema_file function calls have been updates to new parameter lists. sql/table.h: Bug #40021: Renaming view fails, archived .frm for view is missing after downgrade TABLE_LIST: the revision field has been removed. --- sql/parse_file.cc | 93 +++--------------------------------------------------- sql/parse_file.h | 6 ++-- sql/sql_db.cc | 2 -- sql/sql_trigger.cc | 8 ++--- sql/sql_view.cc | 33 ++++--------------- sql/table.h | 1 - 6 files changed, 17 insertions(+), 126 deletions(-) diff --git a/sql/parse_file.cc b/sql/parse_file.cc index 2b947fcac4f..ade0709cf0d 100644 --- a/sql/parse_file.cc +++ b/sql/parse_file.cc @@ -88,7 +88,6 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s) file pointer to IO_CACHE structure for writing base pointer to data structure parameter pointer to parameter descriptor - old_version for returning back old version number value RETURN FALSE - OK @@ -96,8 +95,7 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s) */ static my_bool -write_parameter(IO_CACHE *file, gptr base, File_option *parameter, - ulonglong *old_version) +write_parameter(IO_CACHE *file, gptr base, File_option *parameter) { char num_buf[20]; // buffer for numeric operations // string for numeric operations @@ -125,15 +123,6 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter, DBUG_RETURN(TRUE); break; } - case FILE_OPTIONS_REV: - { - ulonglong *val_i= (ulonglong *)(base + parameter->offset); - *old_version= (*val_i)++; - num.set(*val_i, &my_charset_bin); - if (my_b_append(file, (const byte *)num.ptr(), num.length())) - DBUG_RETURN(TRUE); - break; - } case FILE_OPTIONS_TIMESTAMP: { /* string have to be allocated already */ @@ -205,7 +194,6 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter, base base address for parameter reading (structure like TABLE) parameters parameters description - max_versions number of versions to save RETURN FALSE - OK @@ -215,13 +203,11 @@ write_parameter(IO_CACHE *file, gptr base, File_option *parameter, my_bool sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, const LEX_STRING *type, - gptr base, File_option *parameters, - uint max_versions) + gptr base, File_option *parameters) { File handler; IO_CACHE file; char path[FN_REFLEN+1]; // +1 to put temporary file name for sure - ulonglong old_version= ULONGLONG_MAX; int path_end; File_option *param; DBUG_ENTER("sql_create_definition_file"); @@ -255,7 +241,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, if (my_b_append(&file, (const byte *)param->name.str, param->name.length) || my_b_append(&file, (const byte *)STRING_WITH_LEN("=")) || - write_parameter(&file, base, param, &old_version) || + write_parameter(&file, base, param) || my_b_append(&file, (const byte *)STRING_WITH_LEN("\n"))) goto err_w_cache; } @@ -269,55 +255,6 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, } path[path_end]='\0'; -#ifdef FRM_ARCHIVE - // archive copies management: disabled unused feature (see bug #17823). - if (!access(path, F_OK)) - { - if (old_version != ULONGLONG_MAX && max_versions != 0) - { - // save backup - char path_arc[FN_REFLEN]; - // backup old version - char path_to[FN_REFLEN]; - - // check archive directory existence - fn_format(path_arc, "arc", dir->str, "", MY_UNPACK_FILENAME); - if (access(path_arc, F_OK)) - { - if (my_mkdir(path_arc, 0777, MYF(MY_WME))) - { - DBUG_RETURN(TRUE); - } - } - - my_snprintf(path_to, FN_REFLEN, "%s/%s-%04lu", - path_arc, file_name->str, (ulong) old_version); - if (my_rename(path, path_to, MYF(MY_WME))) - { - DBUG_RETURN(TRUE); - } - - // remove very old version - if (old_version > max_versions) - { - my_snprintf(path_to, FN_REFLEN, "%s/%s-%04lu", - path_arc, file_name->str, - (ulong)(old_version - max_versions)); - if (!access(path_arc, F_OK) && my_delete(path_to, MYF(MY_WME))) - { - DBUG_RETURN(TRUE); - } - } - } - else - { - if (my_delete(path, MYF(MY_WME))) // no backups - { - DBUG_RETURN(TRUE); - } - } - } -#endif//FRM_ARCHIVE { // rename temporary file @@ -346,8 +283,6 @@ err_w_file: schema name of given schema old_name original file name new_name new file name - revision revision number - num_view_backups number of backups RETURN 0 - OK @@ -356,8 +291,7 @@ err_w_file: */ my_bool rename_in_schema_file(THD *thd, const char *schema, const char *old_name, - const char *new_name, ulonglong revision, - uint num_view_backups) + const char *new_name) { char old_path[FN_REFLEN], new_path[FN_REFLEN], arc_path[FN_REFLEN]; @@ -376,23 +310,6 @@ my_bool rename_in_schema_file(THD *thd, strxnmov(arc_path, FN_REFLEN, mysql_data_home, "/", schema, "/arc", NullS); (void) unpack_filename(arc_path, arc_path); -#ifdef FRM_ARCHIVE - if (revision > 0 && !access(arc_path, F_OK)) - { - ulonglong limit= ((revision > num_view_backups) ? - revision - num_view_backups : 0); - for (; revision > limit ; revision--) - { - my_snprintf(old_path, FN_REFLEN, "%s/%s%s-%04lu", - arc_path, old_name, reg_ext, (ulong)revision); - (void) unpack_filename(old_path, old_path); - my_snprintf(new_path, FN_REFLEN, "%s/%s%s-%04lu", - arc_path, new_name, reg_ext, (ulong)revision); - (void) unpack_filename(new_path, new_path); - my_rename(old_path, new_path, MYF(0)); - } - } -#else//FRM_ARCHIVE { // remove obsolete 'arc' directory and files if any MY_DIR *new_dirp; if ((new_dirp = my_dir(arc_path, MYF(MY_DONT_SORT)))) @@ -401,7 +318,6 @@ my_bool rename_in_schema_file(THD *thd, (void) mysql_rm_arc_files(thd, new_dirp, arc_path); } } -#endif//FRM_ARCHIVE return 0; } @@ -838,7 +754,6 @@ File_parser::parse(gptr base, MEM_ROOT *mem_root, break; } case FILE_OPTIONS_ULONGLONG: - case FILE_OPTIONS_REV: if (!(eol= strchr(ptr, '\n'))) { my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0), diff --git a/sql/parse_file.h b/sql/parse_file.h index ec920b58667..ad7d1629e0a 100644 --- a/sql/parse_file.h +++ b/sql/parse_file.h @@ -23,7 +23,6 @@ enum file_opt_type { FILE_OPTIONS_STRING, /* String (LEX_STRING) */ FILE_OPTIONS_ESTRING, /* Escaped string (LEX_STRING) */ FILE_OPTIONS_ULONGLONG, /* ulonglong parameter (ulonglong) */ - FILE_OPTIONS_REV, /* Revision version number (ulonglong) */ FILE_OPTIONS_TIMESTAMP, /* timestamp (LEX_STRING have to be allocated with length 20 (19+1) */ FILE_OPTIONS_STRLIST, /* list of escaped strings @@ -81,11 +80,10 @@ File_parser *sql_parse_prepare(const LEX_STRING *file_name, my_bool sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, const LEX_STRING *type, - gptr base, File_option *parameters, uint versions); + gptr base, File_option *parameters); my_bool rename_in_schema_file(THD *thd, const char *schema, const char *old_name, - const char *new_name, ulonglong revision, - uint num_view_backups); + const char *new_name); class File_parser: public Sql_alloc { diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 8fbb407555a..c3cf7429222 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -909,7 +909,6 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, /* .frm archive: Those archives are obsolete, but following code should exist to remove existent "arc" directories. - See #ifdef FRM_ARCHIVE directives for obsolete code. */ char newpath[FN_REFLEN]; MY_DIR *new_dirp; @@ -1069,7 +1068,6 @@ static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error) NOTE A support of "arc" directories is obsolete, however this function should exist to remove existent "arc" directories. - See #ifdef FRM_ARCHIVE directives for obsolete code. */ long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path) { diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index bead50e1da8..d3b5289cd68 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -479,7 +479,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables, trigname.trigger_table.length= tables->table_name_length; if (sql_create_definition_file(&dir, &trigname_file, &trigname_file_type, - (gptr)&trigname, trigname_file_parameters, 0)) + (gptr)&trigname, trigname_file_parameters)) return 1; /* @@ -569,7 +569,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables, /* Create trigger definition file. */ if (!sql_create_definition_file(&dir, &file, &triggers_file_type, - (gptr)this, triggers_file_parameters, 0)) + (gptr)this, triggers_file_parameters)) return 0; err_with_cleanup: @@ -656,7 +656,7 @@ static bool save_trigger_file(Table_triggers_list *triggers, const char *db, file.str= file_buff; return sql_create_definition_file(&dir, &file, &triggers_file_type, - (gptr)triggers, triggers_file_parameters, 0); + (gptr)triggers, triggers_file_parameters); } @@ -1427,7 +1427,7 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name, trigname.trigger_table= *new_table_name; if (sql_create_definition_file(&dir, &trigname_file, &trigname_file_type, - (gptr)&trigname, trigname_file_parameters, 0)) + (gptr)&trigname, trigname_file_parameters)) return trigger; } diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 8e6d3ed583a..f65a62bed75 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -660,7 +660,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views, } VOID(pthread_mutex_unlock(&LOCK_open)); - if (view->revision != 1) + if (mode != VIEW_CREATE_NEW) query_cache_invalidate3(thd, view, 0); start_waiting_global_read_lock(thd); if (res) @@ -678,12 +678,8 @@ err: } -/* index of revision number in following table */ -static const int revision_number_position= 8; -/* index of last required parameter for making view */ -static const int required_view_parameters= 10; -/* number of backups */ -static const int num_view_backups= 3; +/* number of required parameters for making view */ +static const int required_view_parameters= 9; /* table of VIEW .frm field descriptors @@ -716,9 +712,6 @@ static File_option view_parameters[]= {{(char*) STRING_WITH_LEN("with_check_option")}, my_offsetof(TABLE_LIST, with_check), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("revision")}, - my_offsetof(TABLE_LIST, revision), - FILE_OPTIONS_REV}, {{(char*) STRING_WITH_LEN("timestamp")}, my_offsetof(TABLE_LIST, timestamp), FILE_OPTIONS_TIMESTAMP}, @@ -880,18 +873,9 @@ loop_out: } /* - read revision number - TODO: read dependence list, too, to process cascade/restrict TODO: special cascade/restrict procedure for alter? */ - if (parser->parse((gptr)view, thd->mem_root, - view_parameters + revision_number_position, 1, - &file_parser_dummy_hook)) - { - error= thd->net.report_error? -1 : 0; - goto err; - } } else { @@ -933,7 +917,7 @@ loop_out: } if (sql_create_definition_file(&dir, &file, view_file_type, - (gptr)view, view_parameters, num_view_backups)) + (gptr)view, view_parameters)) { error= thd->net.report_error? -1 : 1; goto err; @@ -1868,8 +1852,7 @@ mysql_rename_view(THD *thd, goto err; /* rename view and it's backups */ - if (rename_in_schema_file(thd, view->db, view->table_name, new_name, - view_def.revision - 1, num_view_backups)) + if (rename_in_schema_file(thd, view->db, view->table_name, new_name)) goto err; strxnmov(dir_buff, FN_REFLEN, mysql_data_home, "/", view->db, "/", NullS); @@ -1883,12 +1866,10 @@ mysql_rename_view(THD *thd, - file_buff); if (sql_create_definition_file(&pathstr, &file, view_file_type, - (gptr)&view_def, view_parameters, - num_view_backups)) + (gptr)&view_def, view_parameters)) { /* restore renamed view in case of error */ - rename_in_schema_file(thd, view->db, new_name, view->table_name, - view_def.revision - 1, num_view_backups); + rename_in_schema_file(thd, view->db, new_name, view->table_name); goto err; } } else diff --git a/sql/table.h b/sql/table.h index 08326e2fbe0..0884f5ba3d2 100644 --- a/sql/table.h +++ b/sql/table.h @@ -657,7 +657,6 @@ struct TABLE_LIST st_lex_user definer; /* definer of view */ ulonglong file_version; /* version of file's field set */ ulonglong updatable_view; /* VIEW can be updated */ - ulonglong revision; /* revision control number */ ulonglong algorithm; /* 0 any, 1 tmp tables , 2 merging */ ulonglong view_suid; /* view is suid (TRUE dy default) */ ulonglong with_check; /* WITH CHECK OPTION */ -- cgit v1.2.1 From 58fddfccddd0857cd7ab15d13d42efc37e8191ef Mon Sep 17 00:00:00 2001 From: Matthias Leich Date: Fri, 14 Nov 2008 19:20:16 +0100 Subject: Fix for Bug#40644 main.group_concat_max_len_func random failures + minor improvements --- mysql-test/r/group_concat_max_len_func.result | 74 +++++++++++++----------- mysql-test/t/group_concat_max_len_func.test | 83 +++++++++++++++------------ 2 files changed, 88 insertions(+), 69 deletions(-) diff --git a/mysql-test/r/group_concat_max_len_func.result b/mysql-test/r/group_concat_max_len_func.result index 715a84ce72b..52d67b8d274 100644 --- a/mysql-test/r/group_concat_max_len_func.result +++ b/mysql-test/r/group_concat_max_len_func.result @@ -1,31 +1,41 @@ SET @save = @@global.group_concat_max_len; -drop table if exists t1; +DROP TABLE IF EXISTS t1; ## Creating new table t1 ## CREATE TABLE t1 ( -id INT NOT NULL auto_increment, +id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), -rollno int NOT NULL, +rollno INT NOT NULL, name VARCHAR(30) ); '#--------------------FN_DYNVARS_034_01-------------------------#' -## Setting initial value of variable to 4 ## +## Setting initial value of variable to 4 ## SET @@global.group_concat_max_len = 4; -## Inserting some rows in table ## -INSERT into t1(rollno, name) values(1, 'Record_1'); -INSERT into t1(rollno, name) values(2, 'Record_2'); -INSERT into t1(rollno, name) values(1, 'Record_3'); -INSERT into t1(rollno, name) values(3, 'Record_4'); -INSERT into t1(rollno, name) values(1, 'Record_5'); -INSERT into t1(rollno, name) values(3, 'Record_6'); -INSERT into t1(rollno, name) values(4, 'Record_7'); -INSERT into t1(rollno, name) values(4, 'Record_8'); -## Creating two new connections ## +## Inserting some rows in table ## +INSERT INTO t1(rollno, name) VALUES(1, 'Record_1'); +INSERT INTO t1(rollno, name) VALUES(2, 'Record_2'); +INSERT INTO t1(rollno, name) VALUES(1, 'Record_3'); +INSERT INTO t1(rollno, name) VALUES(3, 'Record_4'); +INSERT INTO t1(rollno, name) VALUES(1, 'Record_5'); +INSERT INTO t1(rollno, name) VALUES(3, 'Record_6'); +INSERT INTO t1(rollno, name) VALUES(4, 'Record_7'); +INSERT INTO t1(rollno, name) VALUES(4, 'Record_8'); +SELECT * FROM t1 ORDER BY id; +id rollno name +1 1 Record_1 +2 2 Record_2 +3 1 Record_3 +4 3 Record_4 +5 1 Record_5 +6 3 Record_6 +7 4 Record_7 +8 4 Record_8 +## Creating two new connections ## '#--------------------FN_DYNVARS_034_02-------------------------#' ## Connecting with test_con1 ## -## Accessing data and using group_concat on column whose value is greater than 4 ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; -id rollno group_concat(name) +## Accessing data and using group_concat on column whose value is greater than 4 ## +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +id rollno GROUP_CONCAT(name) 1 1 Reco 2 2 Reco 4 3 Reco @@ -33,10 +43,10 @@ id rollno group_concat(name) Warnings: Warning 1260 4 line(s) were cut by GROUP_CONCAT() ## Changing session value of variable and verifying its behavior, ## -## warning should come here ## +## warning should come here ## SET @@session.group_concat_max_len = 10; -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; -id rollno group_concat(name) +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +id rollno GROUP_CONCAT(name) 1 1 Record_1,R 2 2 Record_2 4 3 Record_4,R @@ -44,18 +54,18 @@ id rollno group_concat(name) Warnings: Warning 1260 3 line(s) were cut by GROUP_CONCAT() '#--------------------FN_DYNVARS_034_03-------------------------#' -## Connecting with new connection test_con2 ## -## Verifying initial value of variable. It should be 4 ## +## Connecting with new connection test_con2 ## +## Verifying initial value of variable. It should be 4 ## SELECT @@session.group_concat_max_len = 4; @@session.group_concat_max_len = 4 1 -## Setting session value of variable to 20 and verifying variable is concating ## -## column's value to 20 or not ## +## Setting session value of variable to 20 and verifying variable is concating ## +## column's value to 20 or not ## SET @@session.group_concat_max_len = 20; ## Verifying value of name column, it should not me more than 20 characters ## ## Warning should come here ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; -id rollno group_concat(name) +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +id rollno GROUP_CONCAT(name) 1 1 Record_1,Record_3,Re 2 2 Record_2 4 3 Record_4,Record_6 @@ -63,17 +73,17 @@ id rollno group_concat(name) Warnings: Warning 1260 1 line(s) were cut by GROUP_CONCAT() '#--------------------FN_DYNVARS_034_04-------------------------#' -## Setting session value of variable to 26. No warning should appear here ## -## because the value after concatination is less than 30 ## +## Setting session value of variable to 26. No warning should appear here ## +## because the value after concatination is less than 30 ## SET @@session.group_concat_max_len = 26; -## Verifying value of name column, it should not give warning now ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; -id rollno group_concat(name) +## Verifying value of name column, it should not give warning now ## +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +id rollno GROUP_CONCAT(name) 1 1 Record_1,Record_3,Record_5 2 2 Record_2 4 3 Record_4,Record_6 7 4 Record_7,Record_8 ## Dropping table t1 ## -DROP table t1; +DROP TABLE t1; ## Disconnecting both the connection ## SET @@global.group_concat_max_len = @save; diff --git a/mysql-test/t/group_concat_max_len_func.test b/mysql-test/t/group_concat_max_len_func.test index d1dc8df43a0..29a4ff5becb 100644 --- a/mysql-test/t/group_concat_max_len_func.test +++ b/mysql-test/t/group_concat_max_len_func.test @@ -11,18 +11,23 @@ # Creation Date: 2008-03-07 # # Author: Salman Rawala # # # +# Last modification: # +# 2008-11-14 mleich Fix Bug#40644 main.group_concat_max_len_func random # +# failures # +# + minor improvements # +# # # Description: Test Cases of Dynamic System Variable group_concat_max_len # # that checks the functionality of this variable # # # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html # +# Reference: # +# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html # # # ############################################################################### SET @save = @@global.group_concat_max_len; --disable_warnings -drop table if exists t1; +DROP TABLE IF EXISTS t1; --enable_warnings ######################### @@ -32,34 +37,38 @@ drop table if exists t1; --echo ## Creating new table t1 ## CREATE TABLE t1 ( -id INT NOT NULL auto_increment, +id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), -rollno int NOT NULL, +rollno INT NOT NULL, name VARCHAR(30) ); --echo '#--------------------FN_DYNVARS_034_01-------------------------#' ######################################################################## # Setting initial value of group_concat_max_len, inserting some rows -# & creating 2 new connections +# & creating 2 new connections ######################################################################## ---echo ## Setting initial value of variable to 4 ## +--echo ## Setting initial value of variable to 4 ## SET @@global.group_concat_max_len = 4; ---echo ## Inserting some rows in table ## -INSERT into t1(rollno, name) values(1, 'Record_1'); -INSERT into t1(rollno, name) values(2, 'Record_2'); -INSERT into t1(rollno, name) values(1, 'Record_3'); -INSERT into t1(rollno, name) values(3, 'Record_4'); -INSERT into t1(rollno, name) values(1, 'Record_5'); -INSERT into t1(rollno, name) values(3, 'Record_6'); -INSERT into t1(rollno, name) values(4, 'Record_7'); -INSERT into t1(rollno, name) values(4, 'Record_8'); - ---echo ## Creating two new connections ## -CONNECT (test_con1,localhost,root,,); -CONNECT (test_con2,localhost,root,,); +--echo ## Inserting some rows in table ## +INSERT INTO t1(rollno, name) VALUES(1, 'Record_1'); +INSERT INTO t1(rollno, name) VALUES(2, 'Record_2'); +INSERT INTO t1(rollno, name) VALUES(1, 'Record_3'); +INSERT INTO t1(rollno, name) VALUES(3, 'Record_4'); +INSERT INTO t1(rollno, name) VALUES(1, 'Record_5'); +INSERT INTO t1(rollno, name) VALUES(3, 'Record_6'); +INSERT INTO t1(rollno, name) VALUES(4, 'Record_7'); +INSERT INTO t1(rollno, name) VALUES(4, 'Record_8'); +# The following "auxiliary" select ensures that all records are on disk +# = result sets got by parallel sessions cannot suffer from effects +# caused by the MyISAM feature "concurrent_inserts". +SELECT * FROM t1 ORDER BY id; + +--echo ## Creating two new connections ## +connect (test_con1,localhost,root,,); +connect (test_con2,localhost,root,,); --echo '#--------------------FN_DYNVARS_034_02-------------------------#' @@ -68,16 +77,16 @@ CONNECT (test_con2,localhost,root,,); ############################################################################### --echo ## Connecting with test_con1 ## -CONNECTION test_con1; +connection test_con1; ---echo ## Accessing data and using group_concat on column whose value is greater than 4 ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; +--echo ## Accessing data and using group_concat on column whose value is greater than 4 ## +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; --echo ## Changing session value of variable and verifying its behavior, ## ---echo ## warning should come here ## +--echo ## warning should come here ## SET @@session.group_concat_max_len = 10; -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; --echo '#--------------------FN_DYNVARS_034_03-------------------------#' @@ -85,19 +94,19 @@ SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; # Verifying behavior of variable by increasing session value of variable # ############################################################################## ---echo ## Connecting with new connection test_con2 ## +--echo ## Connecting with new connection test_con2 ## connection test_con2; ---echo ## Verifying initial value of variable. It should be 4 ## +--echo ## Verifying initial value of variable. It should be 4 ## SELECT @@session.group_concat_max_len = 4; ---echo ## Setting session value of variable to 20 and verifying variable is concating ## ---echo ## column's value to 20 or not ## +--echo ## Setting session value of variable to 20 and verifying variable is concating ## +--echo ## column's value to 20 or not ## SET @@session.group_concat_max_len = 20; --echo ## Verifying value of name column, it should not me more than 20 characters ## --echo ## Warning should come here ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; --echo '#--------------------FN_DYNVARS_034_04-------------------------#' @@ -106,12 +115,12 @@ SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; # greater than the maximum concat length of name column # ############################################################################### ---echo ## Setting session value of variable to 26. No warning should appear here ## ---echo ## because the value after concatination is less than 30 ## +--echo ## Setting session value of variable to 26. No warning should appear here ## +--echo ## because the value after concatination is less than 30 ## SET @@session.group_concat_max_len = 26; ---echo ## Verifying value of name column, it should not give warning now ## -SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; +--echo ## Verifying value of name column, it should not give warning now ## +SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; ############################################################ @@ -119,11 +128,11 @@ SELECT id, rollno, group_concat(name) FROM t1 GROUP BY rollno; ############################################################ --echo ## Dropping table t1 ## -DROP table t1; +DROP TABLE t1; --echo ## Disconnecting both the connection ## -DISCONNECT test_con2; -DISCONNECT test_con1; +disconnect test_con2; +disconnect test_con1; connection default; -- cgit v1.2.1 From 9ca6e03b66e7b3c9546bdeaf7dd37cfe7f0541c5 Mon Sep 17 00:00:00 2001 From: Kristofer Pettersson Date: Mon, 17 Nov 2008 15:17:21 +0100 Subject: Bug#40778 thd_security_context has bad architecture; allocates on unprotected memroot The function thd_security_context allocates memory on an unprotected MEM_ROOT if the message length becomes longer than requested and the initial buffer memory needs to be reallocated. This patch fixes the design error by copying parts of the reallocated buffer to the destination buffer. This works because the destination buffer isn't owned by the String object and thus isn't freed when a new buffer is allocated. Any new memory allocated by the String object is reclaimed when the object is destroyed at the end of the function call. --- sql/sql_class.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 956466d3a17..26792a995a0 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -311,7 +311,7 @@ void thd_inc_row_count(THD *thd) Dumps a text description of a thread, its security context (user, host) and the current query. - @param thd current thread context + @param thd thread context @param buffer pointer to preferred result buffer @param length length of buffer @param max_query_len how many chars of query to copy (0 for all) @@ -385,7 +385,17 @@ char *thd_security_context(THD *thd, char *buffer, unsigned int length, } if (str.c_ptr_safe() == buffer) return buffer; - return thd->strmake(str.ptr(), str.length()); + + /* + We have to copy the new string to the destination buffer because the string + was reallocated to a larger buffer to be able to fit. + */ + DBUG_ASSERT(buffer != NULL); + length= min(str.length(), length-1); + memcpy(buffer, str.c_ptr_quick(), length); + /* Make sure that the new string is null terminated */ + buffer[length]= '\0'; + return buffer; } /** -- cgit v1.2.1 From 88a88636271aee2b89000a99c18d551813f0dcc5 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 17 Nov 2008 19:41:09 +0400 Subject: Bug#31616 div_precision_increment description looks wrong Item_func_div didn't calculate the precision of the result properly. The result of 5/0.0001 is 5000 so we have to add decimals of the divisor to the planned precision. per-file comments: mysql-test/r/type_newdecimal.result Bug#31616 div_precision_increment description looks wrong test result fixed mysql-test/t/type_newdecimal.test Bug#31616 div_precision_increment description looks wrong test case sql/item_func.cc Bug#31616 div_precision_increment description looks wrong precision must be increased with args[1]->decimals parameter --- mysql-test/r/type_newdecimal.result | 15 +++++++++++++++ mysql-test/t/type_newdecimal.test | 10 ++++++++++ sql/item_func.cc | 6 ++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/type_newdecimal.result b/mysql-test/r/type_newdecimal.result index 1bb07534a7f..90b6f524692 100644 --- a/mysql-test/r/type_newdecimal.result +++ b/mysql-test/r/type_newdecimal.result @@ -1524,4 +1524,19 @@ select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * 1.01500000 * 1.01500000 * 0.99500000) 0.812988073953673124592306939480 +create table t1 as select 5.05 / 0.014; +Warnings: +Note 1265 Data truncated for column '5.05 / 0.014' at row 1 +show warnings; +Level Code Message +Note 1265 Data truncated for column '5.05 / 0.014' at row 1 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `5.05 / 0.014` decimal(10,6) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from t1; +5.05 / 0.014 +360.714286 +DROP TABLE t1; End of 5.0 tests diff --git a/mysql-test/t/type_newdecimal.test b/mysql-test/t/type_newdecimal.test index c44abdb144e..a5331582df6 100644 --- a/mysql-test/t/type_newdecimal.test +++ b/mysql-test/t/type_newdecimal.test @@ -1225,4 +1225,14 @@ DROP TABLE t1; select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * 1.01500000 * 1.01500000 * 0.99500000); +# +# Bug #31616 div_precision_increment description looks wrong +# + +create table t1 as select 5.05 / 0.014; +show warnings; +show create table t1; +select * from t1; +DROP TABLE t1; + --echo End of 5.0 tests diff --git a/sql/item_func.cc b/sql/item_func.cc index e663e1fcf83..dfe1082fd73 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1316,8 +1316,10 @@ my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value) void Item_func_div::result_precision() { - uint arg_prec= args[0]->decimal_precision() + prec_increment; - uint precision=min(arg_prec, DECIMAL_MAX_PRECISION); + uint precision=min(args[0]->decimal_precision() + + args[1]->decimals + prec_increment, + DECIMAL_MAX_PRECISION); + /* Integer operations keep unsigned_flag if one of arguments is unsigned */ if (result_type() == INT_RESULT) unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag; -- cgit v1.2.1 From 1199dfcbfa996b7053e7aba113b639a74162052b Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 17 Nov 2008 20:06:03 +0400 Subject: Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. GLOBAL STATUS is calculated by studying the list of threads. In the embedded server threads were not linked to the internal list, so the calculation always returns 0. Fixed by 'linking' the embedded-server threads to the same list per-file comments: libmysqld/lib_sql.cc Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. Add newly created 'threads' to the internal thread list. Remove them from the list as they're freed. mysql-test/r/information_schema.result Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. test result mysql-test/t/information_schema.test Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. test case added --- libmysqld/lib_sql.cc | 2 ++ mysql-test/r/information_schema.result | 9 +++++++++ mysql-test/t/information_schema.test | 10 ++++++++++ 3 files changed, 21 insertions(+) diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 6e82812239e..e78c656d565 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -384,6 +384,7 @@ static void emb_free_embedded_thd(MYSQL *mysql) thd->clear_data_list(); thread_count--; thd->store_globals(); + thd->unlink(); delete thd; mysql->thd=0; } @@ -627,6 +628,7 @@ void *create_embedded_thd(int client_flag) bzero((char*) &thd->net, sizeof(thd->net)); thread_count++; + threads.append(thd); return thd; err: delete(thd); diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 0ed501252f6..85af461eb14 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -1698,4 +1698,13 @@ drop table if exists t1;drop table if exists Warnings: Warning 1265 Data truncated for column 'VARIABLE_VALUE' at row 1 set global init_connect=""; +create table t0 select * from information_schema.global_status where VARIABLE_NAME='COM_SELECT'; +SELECT 1; +1 +1 +select a.VARIABLE_VALUE - b.VARIABLE_VALUE from t0 b, information_schema.global_status a +where a.VARIABLE_NAME = b.VARIABLE_NAME; +a.VARIABLE_VALUE - b.VARIABLE_VALUE +2 +drop table t0; End of 5.1 tests. diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 667a9279e84..bcb22c44076 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -1373,4 +1373,14 @@ drop table if exists t1;drop table if exists t1;"; select * from information_schema.global_variables where variable_name='init_connect'; set global init_connect=""; +# +# Bug #34517 SHOW GLOBAL STATUS does not work properly in embedded server. +# + +create table t0 select * from information_schema.global_status where VARIABLE_NAME='COM_SELECT'; +SELECT 1; +select a.VARIABLE_VALUE - b.VARIABLE_VALUE from t0 b, information_schema.global_status a + where a.VARIABLE_NAME = b.VARIABLE_NAME; +drop table t0; + --echo End of 5.1 tests. -- cgit v1.2.1 From 116b87f7bb4d70a1e2d614bd1da0dce0f2d2b8fd Mon Sep 17 00:00:00 2001 From: Patrick Crews Date: Mon, 17 Nov 2008 15:25:27 -0500 Subject: Bug#33970 Test main.csv_alter_table disabled. Re-enabling this test in 5.1 tree since the bug that caused disabling (Bug#33696 CSV storage engine allows nullable colums via ALTER TABLE statements) doesn't appear in 5.1 (6.0 only) Recorded .result file and removed test from the main.disabled.def file. --- mysql-test/r/csv_alter_table.result | 40 +++++++++++++++++++++++++++++++++++++ mysql-test/t/disabled.def | 1 - 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 mysql-test/r/csv_alter_table.result diff --git a/mysql-test/r/csv_alter_table.result b/mysql-test/r/csv_alter_table.result new file mode 100644 index 00000000000..b406e40b15d --- /dev/null +++ b/mysql-test/r/csv_alter_table.result @@ -0,0 +1,40 @@ +# ===== csv_alter_table.1 ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a int NOT NULL) ENGINE = CSV; +ALTER TABLE t1 ADD COLUMN b CHAR(5) NOT NULL; +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +b char(5) NO NULL +ALTER TABLE t1 DROP COLUMN b; +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +ALTER TABLE t1 MODIFY a BIGINT NOT NULL; +DESC t1; +Field Type Null Key Default Extra +a bigint(20) NO NULL +ALTER TABLE t1 CHANGE a a INT NOT NULL; +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +DROP TABLE t1; +# ===== csv_alter_table.2 ===== +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a int NOT NULL) ENGINE = CSV; +ALTER TABLE t1 ADD COLUMN b CHAR(5); +ERROR 42000: The storage engine for the table doesn't support nullable columns +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +ALTER TABLE t1 MODIFY a BIGINT; +ERROR 42000: The storage engine for the table doesn't support nullable columns +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +ALTER TABLE t1 CHANGE a a INT; +ERROR 42000: The storage engine for the table doesn't support nullable columns +DESC t1; +Field Type Null Key Default Extra +a int(11) NO NULL +DROP TABLE t1; diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index 8c89d01f0f8..c01bb4b9e44 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -10,6 +10,5 @@ # ############################################################################## federated_transactions : Bug#29523 Transactions do not work -csv_alter_table : Bug#33696 2008-01-21 pcrews no .result file - bug allows NULL columns in CSV tables log_tables.test : Bug #37798: main.log_tables fails randomly on powermacg5 and windows slow_query_log_func.test : Bug #37962: *_func tests containing sleeps/race conditions -- cgit v1.2.1 From 3e02f955749443d378c197c0e710315313ec41e0 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Tue, 18 Nov 2008 13:52:03 +0400 Subject: merging --- mysql-test/r/type_newdecimal.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/type_newdecimal.result b/mysql-test/r/type_newdecimal.result index 0487cd56da4..f2b08d1c6b7 100644 --- a/mysql-test/r/type_newdecimal.result +++ b/mysql-test/r/type_newdecimal.result @@ -1543,7 +1543,7 @@ Note 1265 Data truncated for column '5.05 / 0.014' at row 1 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `5.05 / 0.014` decimal(10,6) default NULL + `5.05 / 0.014` decimal(10,6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 select * from t1; 5.05 / 0.014 -- cgit v1.2.1 From 480046c52e5938582a67223606f3813336b4405a Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Tue, 18 Nov 2008 11:45:44 -0500 Subject: Bug#39178: non-RSA keys in connection to a RSA-keyed yaSSL-using server \ using crashes server When the server is configured to use a RSA key, and when the client sends a cipher-suite list that contains a non-RSA key as acceptable, the server would try to process that key even though it was impossible. Now, yaSSL sets its own acceptable-cipher list according to what kind of key the server is started with, and will never explore and try to pair impossible combinations. This involves a partial import of the current YaSSL tree, not the whole thing, so as to try to avoid introducing new bugs. (Updated to avoid many whitespace changes and make diff smaller.) --- extra/yassl/include/cert_wrapper.hpp | 3 + extra/yassl/include/openssl/prefix_ssl.h | 1 + extra/yassl/include/openssl/ssl.h | 9 +- extra/yassl/include/yassl_imp.hpp | 4 +- extra/yassl/include/yassl_int.hpp | 12 ++- extra/yassl/include/yassl_types.hpp | 12 ++- extra/yassl/src/cert_wrapper.cpp | 36 +++++-- extra/yassl/src/ssl.cpp | 25 ++++- extra/yassl/src/yassl_error.cpp | 7 +- extra/yassl/src/yassl_imp.cpp | 155 ++++++++++++++++++++----------- extra/yassl/src/yassl_int.cpp | 108 ++++++++++++++++----- mysql-test/r/openssl_1.result | 17 +++- mysql-test/t/openssl_1.test | 43 ++++++++- 13 files changed, 330 insertions(+), 102 deletions(-) diff --git a/extra/yassl/include/cert_wrapper.hpp b/extra/yassl/include/cert_wrapper.hpp index ce8003aa4cf..572b9f87293 100644 --- a/extra/yassl/include/cert_wrapper.hpp +++ b/extra/yassl/include/cert_wrapper.hpp @@ -34,6 +34,7 @@ #include "yassl_types.hpp" // SignatureAlgorithm #include "buffer.hpp" // input_buffer #include "asn.hpp" // SignerList +#include "openssl/ssl.h" // internal and external use #include STL_LIST_FILE #include STL_ALGORITHM_FILE @@ -87,6 +88,7 @@ class CertManager { bool verifyNone_; // no error if verify fails bool failNoCert_; bool sendVerify_; + VerifyCallback verifyCallback_; // user verify callback public: CertManager(); ~CertManager(); @@ -118,6 +120,7 @@ public: void setFailNoCert(); void setSendVerify(); void setPeerX509(X509*); + void setVerifyCallback(VerifyCallback); private: CertManager(const CertManager&); // hide copy CertManager& operator=(const CertManager&); // and assign diff --git a/extra/yassl/include/openssl/prefix_ssl.h b/extra/yassl/include/openssl/prefix_ssl.h index 3a3a8c26c9c..138d9fb8821 100644 --- a/extra/yassl/include/openssl/prefix_ssl.h +++ b/extra/yassl/include/openssl/prefix_ssl.h @@ -52,6 +52,7 @@ #define SSL_load_error_strings yaSSL_load_error_strings #define SSL_set_session yaSSL_set_session #define SSL_get_session yaSSL_get_session +#define SSL_flush_sessions yaSSL_flush_sessions #define SSL_SESSION_set_timeout yaSSL_SESSION_set_timeout #define SSL_CTX_set_session_cache_mode yaSSL_CTX_set_session_cache_mode #define SSL_get_peer_certificate yaSSL_get_peer_certificate diff --git a/extra/yassl/include/openssl/ssl.h b/extra/yassl/include/openssl/ssl.h index c0b87f804ad..de09f1ebe4b 100644 --- a/extra/yassl/include/openssl/ssl.h +++ b/extra/yassl/include/openssl/ssl.h @@ -170,8 +170,9 @@ enum { /* X509 Constants */ X509_V_ERR_CRL_SIGNATURE_FAILURE = 10, X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 11, X509_V_ERR_CRL_HAS_EXPIRED = 12, - X509_V_ERR_CERT_REVOKED = 13 - + X509_V_ERR_CERT_REVOKED = 13, + X509_V_FLAG_CRL_CHECK = 14, + X509_V_FLAG_CRL_CHECK_ALL = 15 }; @@ -202,7 +203,8 @@ SSL_CTX* SSL_CTX_new(SSL_METHOD*); SSL* SSL_new(SSL_CTX*); int SSL_set_fd (SSL*, YASSL_SOCKET_T); YASSL_SOCKET_T SSL_get_fd(const SSL*); -int SSL_connect(SSL*); +int SSL_connect(SSL*); // if you get an error from connect + // see note at top of REAMDE int SSL_write(SSL*, const void*, int); int SSL_read(SSL*, void*, int); int SSL_accept(SSL*); @@ -227,6 +229,7 @@ void SSL_load_error_strings(void); int SSL_set_session(SSL *ssl, SSL_SESSION *session); SSL_SESSION* SSL_get_session(SSL* ssl); +void SSL_flush_sessions(SSL_CTX *ctx, long tm); long SSL_SESSION_set_timeout(SSL_SESSION*, long); long SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long mode); X509* SSL_get_peer_certificate(SSL*); diff --git a/extra/yassl/include/yassl_imp.hpp b/extra/yassl/include/yassl_imp.hpp index f6434443cb0..8893ba8a8ba 100644 --- a/extra/yassl/include/yassl_imp.hpp +++ b/extra/yassl/include/yassl_imp.hpp @@ -667,10 +667,12 @@ struct Parameters { Cipher suites_[MAX_SUITE_SZ]; char cipher_name_[MAX_SUITE_NAME]; char cipher_list_[MAX_CIPHERS][MAX_SUITE_NAME]; + bool removeDH_; // for server's later use Parameters(ConnectionEnd, const Ciphers&, ProtocolVersion, bool haveDH); - void SetSuites(ProtocolVersion pv, bool removeDH = false); + void SetSuites(ProtocolVersion pv, bool removeDH = false, + bool removeRSA = false, bool removeDSA = false); void SetCipherNames(); private: Parameters(const Parameters&); // hide copy diff --git a/extra/yassl/include/yassl_int.hpp b/extra/yassl/include/yassl_int.hpp index b207f0bffbd..d18dc41860c 100644 --- a/extra/yassl/include/yassl_int.hpp +++ b/extra/yassl/include/yassl_int.hpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -268,12 +268,14 @@ class Sessions { STL::list list_; RandomPool random_; // for session cleaning Mutex mutex_; // no-op for single threaded + int count_; // flush counter - Sessions() {} // only GetSessions can create + Sessions() : count_(0) {} // only GetSessions can create public: SSL_SESSION* lookup(const opaque*, SSL_SESSION* copy = 0); void add(const SSL&); void remove(const opaque*); + void Flush(); ~Sessions(); @@ -425,8 +427,10 @@ private: pem_password_cb passwordCb_; void* userData_; bool sessionCacheOff_; + bool sessionCacheFlushOff_; Stats stats_; Mutex mutex_; // for Stats + VerifyCallback verifyCallback_; public: explicit SSL_CTX(SSL_METHOD* meth); ~SSL_CTX(); @@ -437,18 +441,22 @@ public: const Ciphers& GetCiphers() const; const DH_Parms& GetDH_Parms() const; const Stats& GetStats() const; + const VerifyCallback getVerifyCallback() const; pem_password_cb GetPasswordCb() const; void* GetUserData() const; bool GetSessionCacheOff() const; + bool GetSessionCacheFlushOff() const; void setVerifyPeer(); void setVerifyNone(); void setFailNoCert(); + void setVerifyCallback(VerifyCallback); bool SetCipherList(const char*); bool SetDH(const DH&); void SetPasswordCb(pem_password_cb cb); void SetUserData(void*); void SetSessionCacheOff(); + void SetSessionCacheFlushOff(); void IncrementStats(StatsField); void AddCA(x509* ca); diff --git a/extra/yassl/include/yassl_types.hpp b/extra/yassl/include/yassl_types.hpp index e4b81f98fff..28535792828 100644 --- a/extra/yassl/include/yassl_types.hpp +++ b/extra/yassl/include/yassl_types.hpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,13 @@ #include "type_traits.hpp" +#ifdef _MSC_VER + // disable conversion warning + // 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy + #pragma warning(disable:4244 4996) +#endif + + namespace yaSSL { #define YASSL_LIB @@ -163,7 +170,7 @@ const int RMD_LEN = 20; // RIPEMD-160 digest length const int PREFIX = 3; // up to 3 prefix letters for secret rounds const int KEY_PREFIX = 7; // up to 7 prefix letters for key rounds const int FORTEZZA_MAX = 128; // Maximum Fortezza Key length -const int MAX_SUITE_SZ = 64; // 32 max suites * sizeof(suite) +const int MAX_SUITE_SZ = 128; // 64 max suites * sizeof(suite) const int MAX_SUITE_NAME = 48; // max length of suite name const int MAX_CIPHERS = 32; // max supported ciphers for cipher list const int SIZEOF_ENUM = 1; // SSL considers an enum 1 byte, not 4 @@ -205,6 +212,7 @@ const int SEED_LEN = RAN_LEN * 2; // TLS seed, client + server random const int DEFAULT_TIMEOUT = 500; // Default Session timeout in seconds const int MAX_RECORD_SIZE = 16384; // 2^14, max size by standard const int COMPRESS_EXTRA = 1024; // extra compression possible addition +const int SESSION_FLUSH_COUNT = 256; // when to flush session cache typedef uint8 Cipher; // first byte is always 0x00 for SSLv3 & TLS diff --git a/extra/yassl/src/cert_wrapper.cpp b/extra/yassl/src/cert_wrapper.cpp index 5eacf9083f9..1af5705d11d 100644 --- a/extra/yassl/src/cert_wrapper.cpp +++ b/extra/yassl/src/cert_wrapper.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include "runtime.hpp" #include "cert_wrapper.hpp" #include "yassl_int.hpp" +#include "error.hpp" #if defined(USE_CML_LIB) #include "cmapi_cpp.h" @@ -90,7 +91,7 @@ opaque* x509::use_buffer() //CertManager CertManager::CertManager() : peerX509_(0), verifyPeer_(false), verifyNone_(false), failNoCert_(false), - sendVerify_(false) + sendVerify_(false), verifyCallback_(0) {} @@ -154,6 +155,12 @@ void CertManager::setSendVerify() } +void CertManager::setVerifyCallback(VerifyCallback vc) +{ + verifyCallback_ = vc; +} + + void CertManager::AddPeerCert(x509* x) { peerList_.push_back(x); // take ownership @@ -236,7 +243,7 @@ uint CertManager::get_privateKeyLength() const int CertManager::Validate() { CertList::reverse_iterator last = peerList_.rbegin(); - int count = peerList_.size(); + size_t count = peerList_.size(); while ( count > 1 ) { TaoCrypt::Source source((*last)->get_buffer(), (*last)->get_length()); @@ -257,7 +264,8 @@ int CertManager::Validate() TaoCrypt::Source source((*last)->get_buffer(), (*last)->get_length()); TaoCrypt::CertDecoder cert(source, true, &signers_, verifyNone_); - if (int err = cert.GetError().What()) + int err = cert.GetError().What(); + if ( err && err != TaoCrypt::SIG_OTHER_E) return err; uint sz = cert.GetPublicKey().size(); @@ -269,13 +277,25 @@ int CertManager::Validate() else peerKeyType_ = dsa_sa_algo; - int iSz = strlen(cert.GetIssuer()) + 1; - int sSz = strlen(cert.GetCommonName()) + 1; - int bSz = strlen(cert.GetBeforeDate()) + 1; - int aSz = strlen(cert.GetAfterDate()) + 1; + size_t iSz = strlen(cert.GetIssuer()) + 1; + size_t sSz = strlen(cert.GetCommonName()) + 1; + int bSz = (int)strlen(cert.GetBeforeDate()) + 1; + int aSz = (int)strlen(cert.GetAfterDate()) + 1; peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(), sSz, cert.GetBeforeDate(), bSz, cert.GetAfterDate(), aSz); + + if (err == TaoCrypt::SIG_OTHER_E && verifyCallback_) { + X509_STORE_CTX store; + store.error = err; + store.error_depth = static_cast(count) - 1; + store.current_cert = peerX509_; + + int ok = verifyCallback_(0, &store); + if (ok) return 0; + } + + if (err == TaoCrypt::SIG_OTHER_E) return err; } return 0; } diff --git a/extra/yassl/src/ssl.cpp b/extra/yassl/src/ssl.cpp index f09a43be56e..29aa034f885 100644 --- a/extra/yassl/src/ssl.cpp +++ b/extra/yassl/src/ssl.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -245,6 +245,7 @@ YASSL_SOCKET_T SSL_get_fd(const SSL* ssl) } +// if you get an error from connect see note at top of README int SSL_connect(SSL* ssl) { if (ssl->GetError() == YasslError(SSL_ERROR_WANT_READ)) @@ -447,6 +448,9 @@ long SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long mode) if (mode == SSL_SESS_CACHE_OFF) ctx->SetSessionCacheOff(); + if (mode == SSL_SESS_CACHE_NO_AUTO_CLEAR) + ctx->SetSessionCacheFlushOff(); + return SSL_SUCCESS; } @@ -493,6 +497,15 @@ long SSL_get_default_timeout(SSL* /*ssl*/) } +void SSL_flush_sessions(SSL_CTX *ctx, long /* tm */) +{ + if (ctx->GetSessionCacheOff()) + return; + + GetSessions().Flush(); +} + + const char* SSL_get_cipher_name(SSL* ssl) { return SSL_get_cipher(ssl); @@ -560,7 +573,7 @@ int SSL_get_error(SSL* ssl, int /*previous*/) only need to turn on for client, becuase server on by default if built in but calling for server will tell you whether it's available or not */ -int SSL_set_compression(SSL* ssl) +int SSL_set_compression(SSL* ssl) /* Chad didn't rename to ya~ because it is prob. bug. */ { return ssl->SetCompression(); } @@ -604,7 +617,7 @@ char* X509_NAME_oneline(X509_NAME* name, char* buffer, int sz) { if (!name->GetName()) return buffer; - int len = strlen(name->GetName()) + 1; + int len = (int)strlen(name->GetName()) + 1; int copySz = min(len, sz); if (!buffer) { @@ -693,7 +706,7 @@ int SSL_CTX_use_PrivateKey_file(SSL_CTX* ctx, const char* file, int format) } -void SSL_CTX_set_verify(SSL_CTX* ctx, int mode, VerifyCallback /*vc*/) +void SSL_CTX_set_verify(SSL_CTX* ctx, int mode, VerifyCallback vc) { if (mode & SSL_VERIFY_PEER) ctx->setVerifyPeer(); @@ -703,6 +716,8 @@ void SSL_CTX_set_verify(SSL_CTX* ctx, int mode, VerifyCallback /*vc*/) if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) ctx->setFailNoCert(); + + ctx->setVerifyCallback(vc); } @@ -1450,6 +1465,8 @@ unsigned long err_helper(bool peek = false) default : return 0; } + + return 0; // shut up compiler } diff --git a/extra/yassl/src/yassl_error.cpp b/extra/yassl/src/yassl_error.cpp index dc120028e13..a1ef8578da6 100644 --- a/extra/yassl/src/yassl_error.cpp +++ b/extra/yassl/src/yassl_error.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,11 @@ #include "openssl/ssl.h" // SSL_ERROR_WANT_READ #include // strncpy +#ifdef _MSC_VER + // 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy + #pragma warning(disable: 4996) +#endif + namespace yaSSL { diff --git a/extra/yassl/src/yassl_imp.cpp b/extra/yassl/src/yassl_imp.cpp index b43d9c27355..4430ef0213c 100644 --- a/extra/yassl/src/yassl_imp.cpp +++ b/extra/yassl/src/yassl_imp.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -136,9 +136,19 @@ void DH_Server::build(SSL& ssl) const CertManager& cert = ssl.getCrypto().get_certManager(); if (ssl.getSecurity().get_parms().sig_algo_ == rsa_sa_algo) + { + if (cert.get_keyType() != rsa_sa_algo) { + ssl.SetError(privateKey_error); + return; + } auth.reset(NEW_YS RSA(cert.get_privateKey(), cert.get_privateKeyLength(), false)); + } else { + if (cert.get_keyType() != dsa_sa_algo) { + ssl.SetError(privateKey_error); + return; + } auth.reset(NEW_YS DSS(cert.get_privateKey(), cert.get_privateKeyLength(), false)); sigSz += DSS_ENCODED_EXTRA; @@ -436,18 +446,21 @@ Parameters::Parameters(ConnectionEnd ce, const Ciphers& ciphers, pending_ = true; // suite not set yet strncpy(cipher_name_, "NONE", 5); + removeDH_ = !haveDH; // only use on server side for set suites + if (ciphers.setSuites_) { // use user set list suites_size_ = ciphers.suiteSz_; memcpy(suites_, ciphers.suites_, ciphers.suiteSz_); SetCipherNames(); } else - SetSuites(pv, ce == server_end && !haveDH); // defaults + SetSuites(pv, ce == server_end && removeDH_); // defaults } -void Parameters::SetSuites(ProtocolVersion pv, bool removeDH) +void Parameters::SetSuites(ProtocolVersion pv, bool removeDH, bool removeRSA, + bool removeDSA) { int i = 0; // available suites, best first @@ -456,67 +469,87 @@ void Parameters::SetSuites(ProtocolVersion pv, bool removeDH) if (isTLS(pv)) { if (!removeDH) { - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA; - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_DSS_WITH_AES_256_CBC_SHA; + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA; + } + if (!removeDSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_DSS_WITH_AES_256_CBC_SHA; + } + } + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_RSA_WITH_AES_256_CBC_SHA; } - suites_[i++] = 0x00; - suites_[i++] = TLS_RSA_WITH_AES_256_CBC_SHA; - if (!removeDH) { - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA; - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_DSS_WITH_AES_128_CBC_SHA; + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA; + } + if (!removeDSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_DSS_WITH_AES_128_CBC_SHA; + } + } + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_RSA_WITH_AES_128_CBC_SHA; + suites_[i++] = 0x00; + suites_[i++] = TLS_RSA_WITH_AES_256_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_RSA_WITH_AES_128_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_RSA_WITH_3DES_EDE_CBC_RMD160; } - suites_[i++] = 0x00; - suites_[i++] = TLS_RSA_WITH_AES_128_CBC_SHA; - - suites_[i++] = 0x00; - suites_[i++] = TLS_RSA_WITH_AES_256_CBC_RMD160; - suites_[i++] = 0x00; - suites_[i++] = TLS_RSA_WITH_AES_128_CBC_RMD160; - suites_[i++] = 0x00; - suites_[i++] = TLS_RSA_WITH_3DES_EDE_CBC_RMD160; - if (!removeDH) { + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_RSA_WITH_AES_256_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_RSA_WITH_AES_128_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD160; + } + if (!removeDSA) { + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_DSS_WITH_AES_256_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_DSS_WITH_AES_128_CBC_RMD160; + suites_[i++] = 0x00; + suites_[i++] = TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD160; + } + } + } + + if (!removeRSA) { suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_RSA_WITH_AES_256_CBC_RMD160; - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_RSA_WITH_AES_128_CBC_RMD160; + suites_[i++] = SSL_RSA_WITH_RC4_128_SHA; suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD160; + suites_[i++] = SSL_RSA_WITH_RC4_128_MD5; suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_DSS_WITH_AES_256_CBC_RMD160; + suites_[i++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA; suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_DSS_WITH_AES_128_CBC_RMD160; - suites_[i++] = 0x00; - suites_[i++] = TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD160; - } + suites_[i++] = SSL_RSA_WITH_DES_CBC_SHA; } - - suites_[i++] = 0x00; - suites_[i++] = SSL_RSA_WITH_RC4_128_SHA; - suites_[i++] = 0x00; - suites_[i++] = SSL_RSA_WITH_RC4_128_MD5; - - suites_[i++] = 0x00; - suites_[i++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA; - suites_[i++] = 0x00; - suites_[i++] = SSL_RSA_WITH_DES_CBC_SHA; - if (!removeDH) { - suites_[i++] = 0x00; - suites_[i++] = SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA; - suites_[i++] = 0x00; - suites_[i++] = SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA; - - suites_[i++] = 0x00; - suites_[i++] = SSL_DHE_RSA_WITH_DES_CBC_SHA; - suites_[i++] = 0x00; - suites_[i++] = SSL_DHE_DSS_WITH_DES_CBC_SHA; + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA; + } + if (!removeDSA) { + suites_[i++] = 0x00; + suites_[i++] = SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA; + } + if (!removeRSA) { + suites_[i++] = 0x00; + suites_[i++] = SSL_DHE_RSA_WITH_DES_CBC_SHA; + } + if (!removeDSA) { + suites_[i++] = 0x00; + suites_[i++] = SSL_DHE_DSS_WITH_DES_CBC_SHA; + } } suites_size_ = i; @@ -532,7 +565,7 @@ void Parameters::SetCipherNames() for (int j = 0; j < suites; j++) { int index = suites_[j*2 + 1]; // every other suite is suite id - int len = strlen(cipher_names[index]) + 1; + size_t len = strlen(cipher_names[index]) + 1; strncpy(cipher_list_[pos++], cipher_names[index], len); } cipher_list_[pos][0] = 0; @@ -1469,7 +1502,19 @@ void ClientHello::Process(input_buffer&, SSL& ssl) // downgrade to SSLv3 ssl.useSecurity().use_connection().TurnOffTLS(); ProtocolVersion pv = ssl.getSecurity().get_connection().version_; - ssl.useSecurity().use_parms().SetSuites(pv); // reset w/ SSL suites + bool removeDH = ssl.getSecurity().get_parms().removeDH_; + bool removeRSA = false; + bool removeDSA = false; + + const CertManager& cm = ssl.getCrypto().get_certManager(); + if (cm.get_keyType() == rsa_sa_algo) + removeDSA = true; + else + removeRSA = true; + + // reset w/ SSL suites + ssl.useSecurity().use_parms().SetSuites(pv, removeDH, removeRSA, + removeDSA); } else if (ssl.isTLSv1_1() && client_version_.minor_ == 1) // downgrade to TLSv1, but use same suites diff --git a/extra/yassl/src/yassl_int.cpp b/extra/yassl/src/yassl_int.cpp index 0b6cb89e77e..b7f91d72166 100644 --- a/extra/yassl/src/yassl_int.cpp +++ b/extra/yassl/src/yassl_int.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2007 MySQL AB + Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,28 +40,28 @@ void* operator new(size_t sz, yaSSL::new_t) { - void* ptr = malloc(sz ? sz : 1); - if (!ptr) abort(); + void* ptr = malloc(sz ? sz : 1); + if (!ptr) abort(); - return ptr; + return ptr; } void operator delete(void* ptr, yaSSL::new_t) { - if (ptr) free(ptr); + if (ptr) free(ptr); } void* operator new[](size_t sz, yaSSL::new_t nt) { - return ::operator new(sz, nt); + return ::operator new(sz, nt); } void operator delete[](void* ptr, yaSSL::new_t nt) { - ::operator delete(ptr, nt); + ::operator delete(ptr, nt); } namespace yaSSL { @@ -308,6 +308,20 @@ SSL::SSL(SSL_CTX* ctx) SetError(YasslError(err)); return; } + else if (serverSide) { + // remove RSA or DSA suites depending on cert key type + ProtocolVersion pv = secure_.get_connection().version_; + + bool removeDH = secure_.use_parms().removeDH_; + bool removeRSA = false; + bool removeDSA = false; + + if (cm.get_keyType() == rsa_sa_algo) + removeDSA = true; + else + removeRSA = true; + secure_.use_parms().SetSuites(pv, removeDH, removeRSA, removeDSA); + } } else if (serverSide) { SetError(no_key_file); @@ -320,6 +334,7 @@ SSL::SSL(SSL_CTX* ctx) cm.setVerifyNone(); if (ctx->getMethod()->failNoCert()) cm.setFailNoCert(); + cm.setVerifyCallback(ctx->getVerifyCallback()); if (serverSide) crypto_.SetDH(ctx->GetDH_Parms()); @@ -1034,12 +1049,12 @@ void SSL::fillData(Data& data) { if (GetError()) return; uint dataSz = data.get_length(); // input, data size to fill - uint elements = buffers_.getData().size(); + size_t elements = buffers_.getData().size(); data.set_length(0); // output, actual data filled dataSz = min(dataSz, bufferedData()); - for (uint i = 0; i < elements; i++) { + for (size_t i = 0; i < elements; i++) { input_buffer* front = buffers_.getData().front(); uint frontSz = front->get_remaining(); uint readSz = min(dataSz - data.get_length(), frontSz); @@ -1063,8 +1078,8 @@ void SSL::fillData(Data& data) void SSL::PeekData(Data& data) { if (GetError()) return; - uint dataSz = data.get_length(); // input, data size to fill - uint elements = buffers_.getData().size(); + uint dataSz = data.get_length(); // input, data size to fill + size_t elements = buffers_.getData().size(); data.set_length(0); // output, actual data filled dataSz = min(dataSz, bufferedData()); @@ -1098,9 +1113,9 @@ void SSL::flushBuffer() buffers_.getHandShake().end(), SumBuffer()).total_; output_buffer out(sz); - uint elements = buffers_.getHandShake().size(); + size_t elements = buffers_.getHandShake().size(); - for (uint i = 0; i < elements; i++) { + for (size_t i = 0; i < elements; i++) { output_buffer* front = buffers_.getHandShake().front(); out.write(front->get_buffer(), front->get_size()); @@ -1276,6 +1291,7 @@ void SSL::matchSuite(const opaque* peer, uint length) if (secure_.use_parms().suites_[i] == peer[j]) { secure_.use_parms().suite_[0] = 0x00; secure_.use_parms().suite_[1] = peer[j]; + return; } @@ -1284,7 +1300,7 @@ void SSL::matchSuite(const opaque* peer, uint length) void SSL::set_session(SSL_SESSION* s) -{ +{ if (getSecurity().GetContext()->GetSessionCacheOff()) return; @@ -1565,13 +1581,19 @@ Errors& GetErrors() typedef Mutex::Lock Lock; + void Sessions::add(const SSL& ssl) { if (ssl.getSecurity().get_connection().sessionID_Set_) { - Lock guard(mutex_); - list_.push_back(NEW_YS SSL_SESSION(ssl, random_)); + Lock guard(mutex_); + list_.push_back(NEW_YS SSL_SESSION(ssl, random_)); + count_++; } + + if (count_ > SESSION_FLUSH_COUNT) + if (!ssl.getSecurity().GetContext()->GetSessionCacheFlushOff()) + Flush(); } @@ -1660,6 +1682,25 @@ void Sessions::remove(const opaque* id) } +// flush expired sessions from cache +void Sessions::Flush() +{ + Lock guard(mutex_); + sess_iterator next = list_.begin(); + uint current = lowResTimer(); + + while (next != list_.end()) { + sess_iterator si = next; + ++next; + if ( ((*si)->GetBornOn() + (*si)->GetTimeOut()) < current) { + del_ptr_zero()(*si); + list_.erase(si); + } + } + count_ = 0; // reset flush counter +} + + // remove a self thread error void Errors::Remove() { @@ -1764,7 +1805,8 @@ bool SSL_METHOD::multipleProtocol() const SSL_CTX::SSL_CTX(SSL_METHOD* meth) : method_(meth), certificate_(0), privateKey_(0), passwordCb_(0), - userData_(0), sessionCacheOff_(false) + userData_(0), sessionCacheOff_(false), sessionCacheFlushOff_(false), + verifyCallback_(0) {} @@ -1791,6 +1833,12 @@ SSL_CTX::GetCA_List() const } +const VerifyCallback SSL_CTX::getVerifyCallback() const +{ + return verifyCallback_; +} + + const x509* SSL_CTX::getCert() const { return certificate_; @@ -1851,6 +1899,12 @@ bool SSL_CTX::GetSessionCacheOff() const } +bool SSL_CTX::GetSessionCacheFlushOff() const +{ + return sessionCacheFlushOff_; +} + + void SSL_CTX::SetUserData(void* data) { userData_ = data; @@ -1863,6 +1917,12 @@ void SSL_CTX::SetSessionCacheOff() } +void SSL_CTX::SetSessionCacheFlushOff() +{ + sessionCacheFlushOff_ = true; +} + + void SSL_CTX::setVerifyPeer() { method_->setVerifyPeer(); @@ -1881,6 +1941,12 @@ void SSL_CTX::setFailNoCert() } +void SSL_CTX::setVerifyCallback(VerifyCallback vc) +{ + verifyCallback_ = vc; +} + + bool SSL_CTX::SetDH(const DH& dh) { dhParms_.p_ = dh.p->int_; @@ -1906,7 +1972,7 @@ bool SSL_CTX::SetCipherList(const char* list) int idx = 0; for(;;) { - int len; + size_t len; prev = haystack; haystack = strstr(haystack, needle); @@ -2316,7 +2382,7 @@ X509::X509(const char* i, size_t iSz, const char* s, size_t sSz, : issuer_(i, iSz), subject_(s, sSz), beforeDate_(b, bSz), afterDate_(a, aSz) {} - + X509_NAME* X509::GetIssuer() { @@ -2354,10 +2420,10 @@ ASN1_STRING* X509_NAME::GetEntry(int i) memcpy(entry_.data, &name_[i], sz_ - i); if (entry_.data[sz_ -i - 1]) { entry_.data[sz_ - i] = 0; - entry_.length = sz_ - i; + entry_.length = int(sz_) - i; } else - entry_.length = sz_ - i - 1; + entry_.length = int(sz_) - i - 1; entry_.type = 0; return &entry_; diff --git a/mysql-test/r/openssl_1.result b/mysql-test/r/openssl_1.result index a042d0a5dc3..70151acda22 100644 --- a/mysql-test/r/openssl_1.result +++ b/mysql-test/r/openssl_1.result @@ -73,11 +73,10 @@ variable_name LIKE 'SSL_CALLBACK_CACHE_HITS'; END$$ SELECT variable_name, variable_value FROM thread_status; variable_name variable_value -SSL_ACCEPTS 0 -SSL_CALLBACK_CACHE_HITS 0 +SSL_ACCEPTS # +SSL_CALLBACK_CACHE_HITS # DROP TABLE thread_status; SET GLOBAL event_scheduler=0; -End of 5.1 tests SHOW STATUS LIKE 'Ssl_cipher'; Variable_name Value Ssl_cipher AES128-SHA @@ -192,3 +191,15 @@ UNLOCK TABLES; SSL error: Unable to get private key from 'MYSQL_TEST_DIR/std_data/client-cert.pem' mysqldump: Got error: 2026: SSL connection error when trying to connect DROP TABLE t1; +Variable_name Value +Ssl_cipher DHE-RSA-AES256-SHA +Variable_name Value +Ssl_cipher EDH-RSA-DES-CBC3-SHA +Variable_name Value +Ssl_cipher EDH-RSA-DES-CBC-SHA +Variable_name Value +Ssl_cipher RC4-SHA +select 'is still running; no cipher request crashed the server' as result from dual; +result +is still running; no cipher request crashed the server +End of 5.1 tests diff --git a/mysql-test/t/openssl_1.test b/mysql-test/t/openssl_1.test index 111c723e19c..1f5ada76366 100644 --- a/mysql-test/t/openssl_1.test +++ b/mysql-test/t/openssl_1.test @@ -145,12 +145,12 @@ DELIMITER ;$$ let $wait_condition=select count(*) = 0 from information_schema.events where event_name='event_status'; --source include/wait_condition.inc +# The actual value doesn't matter and can vary based on test ordering and on ssl library. +--replace_column 2 # SELECT variable_name, variable_value FROM thread_status; DROP TABLE thread_status; SET GLOBAL event_scheduler=0; ---echo End of 5.1 tests - # # Test to connect using a list of ciphers @@ -190,3 +190,42 @@ INSERT INTO t1 VALUES (1), (2); --exec $MYSQL_DUMP --skip-create --skip-comments --ssl --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test 2>&1 DROP TABLE t1; + +# +# Bug#39172: Asking for DH+non-RSA key with server set to use other key caused +# YaSSL to crash the server. +# + +# Common ciphers to openssl and yassl +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=DHE-RSA-AES256-SHA +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=EDH-RSA-DES-CBC3-SHA +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=EDH-RSA-DES-CBC-SHA +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl_cipher';" --ssl-cipher=RC4-SHA +--disable_output + +# Below here caused crashes. ################ +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=NOT----EXIST +# These probably exist but the server's keys can't be used to accept these kinds of connections. +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=DHE-DSS-AES128-RMD +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=DHE-DSS-AES128-SHA +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=DHE-DSS-AES256-RMD +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=DHE-DSS-AES256-SHA +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=DHE-DSS-DES-CBC3-RMD +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=EDH-DSS-DES-CBC3-SHA +--error 1,0 +--exec $MYSQL --host=localhost -e "SHOW STATUS LIKE 'Ssl-cipher';" --ssl-cipher=EDH-DSS-DES-CBC-SHA +# End of crashers. ########################## + +# If this gives a result, then the bug is fixed. +--enable_output +select 'is still running; no cipher request crashed the server' as result from dual; + +## +--echo End of 5.1 tests -- cgit v1.2.1 From 4d3f05b09b4fa5e4cf7c77c2222fd6513e772f36 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Wed, 19 Nov 2008 13:57:23 +0400 Subject: Bug#38293 Libmysqld crash in mysql_library_init if language file missing That's a Win-specific error. When we create libmysqld.dll we have many libraries like mysys, dbug, strings, etc linked into that dll, so the application built upon this library shouldn't link these libraries to itself, rather use those inside the dll. Fixed by redirecting calls into the libmysqld.dll per-file comments: dbug/dbug.c Bug#38293 Libmysqld crash in mysql_library_init if language file missing fake _db_something definitions added include/my_dbug.h Bug#38293 Libmysqld crash in mysql_library_init if language file missing fake _db_something declarations added libmysqld/examples/CMakeLists.txt Bug#38293 Libmysqld crash in mysql_library_init if language file missing superfluous libraries removed from linking libmysqld/libmysqld.def Bug#38293 Libmysqld crash in mysql_library_init if language file missing set of mysys functions added to the export section --- dbug/dbug.c | 9 ++++++ include/my_dbug.h | 16 +++++++++++ libmysqld/examples/CMakeLists.txt | 6 ++-- libmysqld/libmysqld.def | 60 +++++++++++++++++++++++++++++++++++++++ mysys/mf_tempdir.c | 2 ++ mysys/my_getopt.c | 19 ++++++++----- sql/mysqld.cc | 31 +++++++++++++------- 7 files changed, 122 insertions(+), 21 deletions(-) diff --git a/dbug/dbug.c b/dbug/dbug.c index 1cebbbcf72a..bbd1abb9598 100644 --- a/dbug/dbug.c +++ b/dbug/dbug.c @@ -2407,4 +2407,13 @@ int i_am_a_dummy_function() { return 0; } +#ifdef __WIN__ +char _db_doprnt_; +char _db_enter_; +char _db_pargs_; +char _db_process_; +char _db_push_; +char _db_return_; +#endif /*__WIN__*/ + #endif diff --git a/include/my_dbug.h b/include/my_dbug.h index a77e439b5db..fa7941faf1c 100644 --- a/include/my_dbug.h +++ b/include/my_dbug.h @@ -108,6 +108,22 @@ extern FILE *_db_fp_(void); #define DBUG_EXPLAIN(buf,len) #define DBUG_EXPLAIN_INITIAL(buf,len) #define IF_DBUG(A) + +#ifdef __WIN__ +/* + On windows all the dll export has to be declared in the *.def file + so as we export these symbols in DEBUG mode we have to export + these in the RELEASE mode also. So below are the dummy symbols + for the RELEASE export +*/ +extern char _db_doprnt_; +extern char _db_enter_; +extern char _db_pargs_; +extern char _db_process_; +extern char _db_push_; +extern char _db_return_; +#endif /*__WIN__*/ + #endif #ifdef __cplusplus } diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt index a07d089c757..ca383d59b24 100644 --- a/libmysqld/examples/CMakeLists.txt +++ b/libmysqld/examples/CMakeLists.txt @@ -29,13 +29,13 @@ ADD_DEFINITIONS(-DEMBEDDED_LIBRARY) ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc ../../client/mysql.cc ../../client/readline.cc ../../client/sql_string.cc) -TARGET_LINK_LIBRARIES(mysql_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32) +TARGET_LINK_LIBRARIES(mysql_embedded debug wsock32) ADD_DEPENDENCIES(mysql_embedded libmysqld) ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c) -TARGET_LINK_LIBRARIES(mysqltest_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32) +TARGET_LINK_LIBRARIES(mysqltest_embedded debug wsock32) ADD_DEPENDENCIES(mysqltest_embedded libmysqld) ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c) -TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug mysys yassl taocrypt zlib strings wsock32) +TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug wsock32) ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld) diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def index 2aa75c0b23c..431c0efdaa0 100644 --- a/libmysqld/libmysqld.def +++ b/libmysqld/libmysqld.def @@ -2,6 +2,66 @@ LIBRARY LIBMYSQLD DESCRIPTION 'MySQL 5.1 Embedded Server Library' VERSION 5.1 EXPORTS + _db_process_ + _db_enter_ + _db_return_ + _db_push_ + _db_doprnt_ + _db_pargs_ + strnmov + get_charset + my_memmem + my_snprintf + pthread_exit + pthread_cond_signal + dynstr_append_mem + init_dynamic_string + dynstr_free + hash_free + my_vsnprintf + dynstr_append + my_close + my_open + dynstr_set + dynstr_append_os_quoted + my_delete + my_seek + my_write + create_temp_file + fn_format + dirname_part + my_hash_insert + hash_search + test_if_hard_path + my_copy + my_mkdir + my_sleep + my_strtod + pthread_cond_wait + my_strnncoll_simple + get_dynamic + my_regerror + init_dynamic_array2 + pthread_create + pthread_cond_init + my_regcomp + my_regexec + my_regex_end + my_regfree + longlong2str + my_set_exception_pointers + my_print_stacktrace + my_thread_stack_size + my_safe_print_str + my_stat + _hash_init + pthread_attr_setstacksize + pthread_attr_init + my_dirend + wild_compare + my_dir + my_micro_time + find_type_or_exit _dig_vec_upper _dig_vec_lower bmove_upp diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c index b2c18c74347..d6492c90965 100644 --- a/mysys/mf_tempdir.c +++ b/mysys/mf_tempdir.c @@ -85,6 +85,8 @@ char *my_tmpdir(MY_TMPDIR *tmpdir) void free_tmpdir(MY_TMPDIR *tmpdir) { uint i; + if (!tmpdir->full_list.elements) + return; for (i=0; i<=tmpdir->max; i++) my_free(tmpdir->list[i], MYF(0)); delete_dynamic(&tmpdir->full_list); diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 6a7ee748930..0f8055860d4 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -397,9 +397,10 @@ invalid value '%s'", my_progname, optp->name, optend); continue; } - get_one_option(optp->id, optp, - *((my_bool*) value) ? - (char*) "1" : disabled_my_option); + if (get_one_option(optp->id, optp, + *((my_bool*) value) ? + (char*) "1" : disabled_my_option)) + return EXIT_ARGUMENT_INVALID; continue; } argument= optend; @@ -457,7 +458,8 @@ invalid value '%s'", optp->arg_type == NO_ARG) { *((my_bool*) optp->value)= (my_bool) 1; - get_one_option(optp->id, optp, argument); + if (get_one_option(optp->id, optp, argument)) + return EXIT_UNSPECIFIED_ERROR; continue; } else if (optp->arg_type == REQUIRED_ARG || @@ -476,7 +478,8 @@ invalid value '%s'", { if (optp->var_type == GET_BOOL) *((my_bool*) optp->value)= (my_bool) 1; - get_one_option(optp->id, optp, argument); + if (get_one_option(optp->id, optp, argument)) + return EXIT_UNSPECIFIED_ERROR; continue; } /* Check if there are more arguments after this one */ @@ -501,7 +504,8 @@ invalid value '%s'", my_progname, argument, optp->name); return error; } - get_one_option(optp->id, optp, argument); + if (get_one_option(optp->id, optp, argument)) + return EXIT_UNSPECIFIED_ERROR; break; } } @@ -524,7 +528,8 @@ invalid value '%s'", my_progname, argument, optp->name); return error; } - get_one_option(optp->id, optp, argument); + if (get_one_option(optp->id, optp, argument)) + return EXIT_UNSPECIFIED_ERROR; (*argc)--; /* option handled (short or long), decrease argument count */ } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a3b0123ee4a..99583ca8ea9 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -733,7 +733,7 @@ uint connection_count= 0; /* Function declarations */ pthread_handler_t signal_hand(void *arg); -static void mysql_init_variables(void); +static int mysql_init_variables(void); static void get_options(int *argc,char **argv); extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *); static void set_server_version(void); @@ -3131,12 +3131,12 @@ static int init_common_variables(const char *conf_file_name, int argc, if (!rpl_filter || !binlog_filter) { sql_perror("Could not allocate replication and binlog filters"); - exit(1); + return 1; } - if (init_thread_environment()) + if (init_thread_environment() || + mysql_init_variables()) return 1; - mysql_init_variables(); #ifdef HAVE_TZNAME { @@ -3735,7 +3735,10 @@ version 5.0 and above. It is replaced by the binary log."); { /* as opt_bin_log==0, no need to free opt_bin_logname */ if (!(opt_bin_logname= my_strdup(opt_update_logname, MYF(MY_WME)))) - exit(EXIT_OUT_OF_MEMORY); + { + sql_print_error("Out of memory"); + return EXIT_OUT_OF_MEMORY; + } sql_print_error("The update log is no longer supported by MySQL in \ version 5.0 and above. It is replaced by the binary log. Now starting MySQL \ with --log-bin='%s' instead.",opt_bin_logname); @@ -7404,7 +7407,7 @@ To see what values a running MySQL server is using, type\n\ as these are initialized by my_getopt. */ -static void mysql_init_variables(void) +static int mysql_init_variables(void) { /* Things reset to zero */ opt_skip_slave_start= opt_reckless_slave = 0; @@ -7485,7 +7488,10 @@ static void mysql_init_variables(void) key_caches.empty(); if (!(dflt_key_cache= get_or_create_key_cache(default_key_cache_base.str, default_key_cache_base.length))) - exit(1); + { + sql_print_error("Cannot allocate the keycache"); + return 1; + } /* set key_cache_hash.default_value = dflt_key_cache */ multi_keycache_init(); @@ -7628,6 +7634,7 @@ static void mysql_init_variables(void) tmpenv = DEFAULT_MYSQL_HOME; (void) strmake(mysql_home, tmpenv, sizeof(mysql_home)-1); #endif + return 0; } @@ -7687,9 +7694,11 @@ mysqld_get_one_option(int optid, #endif break; #include +#ifndef EMBEDDED_LIBRARY case 'V': print_version(); exit(0); +#endif /*EMBEDDED_LIBRARY*/ case 'W': if (!argument) global_system_variables.log_warnings++; @@ -7914,14 +7923,14 @@ mysqld_get_one_option(int optid, if (gethostname(myhostname,sizeof(myhostname)) < 0) { sql_perror("Can't start server: cannot get my own hostname!"); - exit(1); + return 1; } ent=gethostbyname(myhostname); } if (!ent) { sql_perror("Can't start server: cannot resolve hostname!"); - exit(1); + return 1; } my_bind_addr = (ulong) ((in_addr*)ent->h_addr_list[0])->s_addr; } @@ -8118,8 +8127,8 @@ mysqld_get_one_option(int optid, case OPT_FT_BOOLEAN_SYNTAX: if (ft_boolean_check_syntax_string((uchar*) argument)) { - fprintf(stderr, "Invalid ft-boolean-syntax string: %s\n", argument); - exit(1); + sql_print_error("Invalid ft-boolean-syntax string: %s\n", argument); + return 1; } strmake(ft_boolean_syntax, argument, sizeof(ft_boolean_syntax)-1); break; -- cgit v1.2.1 From 36c4b37b16f5f44c97aae330856b742fa708b85f Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Wed, 19 Nov 2008 15:51:31 +0400 Subject: Bug#38293 Libmysqld crash in mysql_library_init if language file missing additional fix - the 'debug' keyword removed --- libmysqld/examples/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt index ca383d59b24..137dd11d28e 100644 --- a/libmysqld/examples/CMakeLists.txt +++ b/libmysqld/examples/CMakeLists.txt @@ -29,13 +29,13 @@ ADD_DEFINITIONS(-DEMBEDDED_LIBRARY) ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc ../../client/mysql.cc ../../client/readline.cc ../../client/sql_string.cc) -TARGET_LINK_LIBRARIES(mysql_embedded debug wsock32) +TARGET_LINK_LIBRARIES(mysql_embedded wsock32) ADD_DEPENDENCIES(mysql_embedded libmysqld) ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c) -TARGET_LINK_LIBRARIES(mysqltest_embedded debug wsock32) +TARGET_LINK_LIBRARIES(mysqltest_embedded wsock32) ADD_DEPENDENCIES(mysqltest_embedded libmysqld) ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c) -TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug wsock32) +TARGET_LINK_LIBRARIES(mysql_client_test_embedded wsock32) ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld) -- cgit v1.2.1 From 09ac30f679146ac874acfeaac7f790fe21946f6d Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 19 Nov 2008 16:02:38 +0100 Subject: Bug#39494 : key_buffer_size > 4GB does not work on 64 bit Windows Cache size is truncated via 32bit ulong in ha_init_key_cache() and ha_resize_key_cache() This change fixes the cast to size_t instead of ulong. This cast is safe, because key_buffer_size parameter is limited to SIZE_T_MAX --- sql/handler.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 6d5c0c93f75..47c2ff40119 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3627,7 +3627,7 @@ int ha_init_key_cache(const char *name, KEY_CACHE *key_cache) if (!key_cache->key_cache_inited) { pthread_mutex_lock(&LOCK_global_system_variables); - ulong tmp_buff_size= (ulong) key_cache->param_buff_size; + size_t tmp_buff_size= (size_t) key_cache->param_buff_size; uint tmp_block_size= (uint) key_cache->param_block_size; uint division_limit= key_cache->param_division_limit; uint age_threshold= key_cache->param_age_threshold; @@ -3651,7 +3651,7 @@ int ha_resize_key_cache(KEY_CACHE *key_cache) if (key_cache->key_cache_inited) { pthread_mutex_lock(&LOCK_global_system_variables); - long tmp_buff_size= (long) key_cache->param_buff_size; + size_t tmp_buff_size= (size_t) key_cache->param_buff_size; long tmp_block_size= (long) key_cache->param_block_size; uint division_limit= key_cache->param_division_limit; uint age_threshold= key_cache->param_age_threshold; -- cgit v1.2.1 From 87c97b4785cb0634bcb0cfda81115ccf05c9b258 Mon Sep 17 00:00:00 2001 From: Matthias Leich Date: Wed, 19 Nov 2008 19:17:26 +0100 Subject: Fix for Bug#26890 main.multi_update times out The test itself is not faulty. The testcase timeout problem happens if this IMHO mid size resource (space in vardir, virtual memory, amount of disk I/O) consuming test meets a weak (excessive disk I/O caused by parallel applications or paging) testing box. The modifications: - Move the most time and disk I/O consuming subtest for Bug 1820 into its own script (multi_update2) This will reduce the likelihood that we exceed the testcase timeout. - Replace error numbers with error names - Minor improvements of the formatting - --- mysql-test/r/multi_update.result | 23 -------------- mysql-test/r/multi_update2.result | 25 +++++++++++++++ mysql-test/t/multi_update.test | 57 +++++++---------------------------- mysql-test/t/multi_update2-master.opt | 1 + mysql-test/t/multi_update2.test | 43 ++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 mysql-test/r/multi_update2.result create mode 100644 mysql-test/t/multi_update2-master.opt create mode 100644 mysql-test/t/multi_update2.test diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index 18394bfc88a..b85fb559e8c 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -378,29 +378,6 @@ where 0=1; delete t1, t2 from t2,t1 where t1.id1=t2.id2 and 0=1; drop table t1,t2; -create table t1 ( a int not null, b int not null) ; -alter table t1 add index i1(a); -delete from t1 where a > 2000000; -create table t2 like t1; -insert into t2 select * from t1; -select 't2 rows before small delete', count(*) from t1; -t2 rows before small delete count(*) -t2 rows before small delete 2000000 -delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 2; -select 't2 rows after small delete', count(*) from t2; -t2 rows after small delete count(*) -t2 rows after small delete 1999999 -select 't1 rows after small delete', count(*) from t1; -t1 rows after small delete count(*) -t1 rows after small delete 1999999 -delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 100*1000; -select 't2 rows after big delete', count(*) from t2; -t2 rows after big delete count(*) -t2 rows after big delete 1900001 -select 't1 rows after big delete', count(*) from t1; -t1 rows after big delete count(*) -t1 rows after big delete 1900001 -drop table t1,t2; CREATE TABLE t1 ( a int ); CREATE TABLE t2 ( a int ); DELETE t1 FROM t1, t2 AS t3; diff --git a/mysql-test/r/multi_update2.result b/mysql-test/r/multi_update2.result new file mode 100644 index 00000000000..3712e638f40 --- /dev/null +++ b/mysql-test/r/multi_update2.result @@ -0,0 +1,25 @@ +DROP TABLE IF EXISTS t1,t2; +CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL) ; +# The protocolling of many inserts into t1 is suppressed. +ALTER TABLE t1 ADD INDEX i1(a); +DELETE FROM t1 WHERE a > 2000000; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 SELECT * FROM t1; +SELECT 't2 rows before small delete', COUNT(*) FROM t1; +t2 rows before small delete COUNT(*) +t2 rows before small delete 2000000 +DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 2; +SELECT 't2 rows after small delete', COUNT(*) FROM t2; +t2 rows after small delete COUNT(*) +t2 rows after small delete 1999999 +SELECT 't1 rows after small delete', COUNT(*) FROM t1; +t1 rows after small delete COUNT(*) +t1 rows after small delete 1999999 +DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 100*1000; +SELECT 't2 rows after big delete', COUNT(*) FROM t2; +t2 rows after big delete COUNT(*) +t2 rows after big delete 1900001 +SELECT 't1 rows after big delete', COUNT(*) FROM t1; +t1 rows after big delete COUNT(*) +t1 rows after big delete 1900001 +DROP TABLE t1,t2; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index 37cdfcf5f26..2bb3b17340c 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -9,9 +9,9 @@ drop table if exists t1,t2,t3; drop database if exists mysqltest; drop view if exists v1; ---error 0,1141,1147 +--error 0,ER_NONEXISTING_GRANT,ER_NONEXISTING_TABLE_GRANT revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; ---error 0,1141,1147 +--error 0,ER_NONEXISTING_GRANT,ER_NONEXISTING_TABLE_GRANT revoke all privileges on mysqltest.* from mysqltest_1@localhost; delete from mysql.user where user=_binary'mysqltest_1'; --enable_warnings @@ -159,9 +159,9 @@ create table t2 (n int(10) not null primary key, d int(10)); insert into t1 values(1,1); insert into t2 values(1,10),(2,20); LOCK TABLES t1 write, t2 read; ---error 1099 +--error ER_TABLE_NOT_LOCKED_FOR_WRITE DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n; ---error 1099 +--error ER_TABLE_NOT_LOCKED_FOR_WRITE UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; unlock tables; @@ -182,7 +182,7 @@ create table t1 (n int(10), d int(10)); create table t2 (n int(10), d int(10)); insert into t1 values(1,1); insert into t2 values(1,10),(2,20); ---error 1175 +--error ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; set sql_safe_updates=0; drop table t1,t2; @@ -195,7 +195,7 @@ set timestamp=1038000000; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; select n,d,unix_timestamp(t) from t1; select n,d,unix_timestamp(t) from t2; ---error 1064 +--error ER_PARSE_ERROR UPDATE t1,t2 SET 1=2 WHERE t1.n=t2.n; drop table t1,t2; set timestamp=0; @@ -322,41 +322,6 @@ delete t1, t2 from t2,t1 drop table t1,t2; -# -# Test for bug #1820. -# - -create table t1 ( a int not null, b int not null) ; ---disable_query_log -insert into t1 values (1,1),(2,2),(3,3),(4,4); -let $1=19; -set @d=4; -while ($1) -{ - eval insert into t1 select a+@d,b+@d from t1; - eval set @d=@d*2; - dec $1; -} - ---enable_query_log -alter table t1 add index i1(a); -delete from t1 where a > 2000000; -create table t2 like t1; -insert into t2 select * from t1; - -select 't2 rows before small delete', count(*) from t1; -delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 2; -select 't2 rows after small delete', count(*) from t2; -select 't1 rows after small delete', count(*) from t1; - -## Try deleting many rows - -delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 100*1000; -select 't2 rows after big delete', count(*) from t2; -select 't1 rows after big delete', count(*) from t1; - -drop table t1,t2; - # # Test alias (this is not correct in 4.0) # @@ -366,7 +331,7 @@ CREATE TABLE t2 ( a int ); DELETE t1 FROM t1, t2 AS t3; DELETE t4 FROM t1, t1 AS t4; DELETE t3 FROM t1 AS t3, t1 AS t4; ---error 1109 +--error ER_UNKNOWN_TABLE DELETE t1 FROM t1 AS t3, t2 AS t4; INSERT INTO t1 values (1),(2); INSERT INTO t2 values (1),(2); @@ -421,7 +386,7 @@ drop database mysqltest; create table t1 (a int, primary key (a)); create table t2 (a int, primary key (a)); create table t3 (a int, primary key (a)); --- error 1109 +-- error ER_UNKNOWN_TABLE delete t1,t3 from t1,t2 where t1.a=t2.a and t2.a=(select t3.a from t3 where t1.a=t3.a); drop table t1, t2, t3; @@ -430,9 +395,9 @@ drop table t1, t2, t3; # create table t1 (col1 int); create table t2 (col1 int); --- error 1093 +-- error ER_UPDATE_TABLE_USED update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1; --- error 1093 +-- error ER_UPDATE_TABLE_USED delete t1 from t1,t2 where t1.col1 < (select max(col1) from t1) and t1.col1 = t2.col1; drop table t1,t2; @@ -457,7 +422,7 @@ drop table t1, t2; # create table t1(a int); create table t2(a int); ---error 1093 +--error ER_UPDATE_TABLE_USED delete from t1,t2 using t1,t2 where t1.a=(select a from t1); drop table t1, t2; # End of 4.1 tests diff --git a/mysql-test/t/multi_update2-master.opt b/mysql-test/t/multi_update2-master.opt new file mode 100644 index 00000000000..9f1a29461ff --- /dev/null +++ b/mysql-test/t/multi_update2-master.opt @@ -0,0 +1 @@ +--set-variable=tmp_table_size=1024 diff --git a/mysql-test/t/multi_update2.test b/mysql-test/t/multi_update2.test new file mode 100644 index 00000000000..47f9bc7bad7 --- /dev/null +++ b/mysql-test/t/multi_update2.test @@ -0,0 +1,43 @@ +# +# Test of update statement that uses many tables. +# + +--disable_warnings +DROP TABLE IF EXISTS t1,t2; +--enable_warnings + +# +# Bug#1820 Rows not deleted from second table on multi-table delete +# + +CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL) ; +--echo # The protocolling of many inserts into t1 is suppressed. +--disable_query_log +INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4); +let $1=19; +set @d=4; +while ($1) +{ + eval INSERT INTO t1 SELECT a+@d,b+@d FROM t1; + eval SET @d=@d*2; + dec $1; +} + +--enable_query_log +ALTER TABLE t1 ADD INDEX i1(a); +DELETE FROM t1 WHERE a > 2000000; +CREATE TABLE t2 LIKE t1; +INSERT INTO t2 SELECT * FROM t1; + +SELECT 't2 rows before small delete', COUNT(*) FROM t1; +DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 2; +SELECT 't2 rows after small delete', COUNT(*) FROM t2; +SELECT 't1 rows after small delete', COUNT(*) FROM t1; + +## Try deleting many rows + +DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 100*1000; +SELECT 't2 rows after big delete', COUNT(*) FROM t2; +SELECT 't1 rows after big delete', COUNT(*) FROM t1; + +DROP TABLE t1,t2; -- cgit v1.2.1 From e5ae4e2392077508248637981d3276bae8a26e72 Mon Sep 17 00:00:00 2001 From: Staale Smedseng Date: Thu, 20 Nov 2008 08:51:48 +0100 Subject: A fix for Bug#22891 "session level max_allowed_packet can be set but is ignored". This patch makes @@session.max_allowed_packed and @@session.net_buffer_length read-only as suggested in the bug report. The user will have to use SET GLOBAL (and reconnect) to alter the session values of these variables. The error string ER_VARIABLE_IS_READONLY is introduced. Tests are modified accordingly. sql/set_var.cc: The class sys_var_thd_ulong_session_readonly is introduced as a specialization of sys_var_thd_ulong implementing a read-only session variable. The class overrides check() and check_default() to achieve the read-only property for the session part of the variable. sql/set_var.h: The class sys_var_thd_ulong_session_readonly is introduced as a specialization of sys_var_thd_ulong implementing a read-only session variable. The class overrides check() and check_default() to achieve the read-only property for the session part of the variable. sql/share/errmsg.txt: New error ER_VARIABLE_IS_READONLY. --- mysql-test/r/func_compress.result | 2 +- mysql-test/r/max_allowed_packet_basic.result | 53 ++++++++++---------- mysql-test/r/max_allowed_packet_func.result | 19 ++------ mysql-test/r/net_buffer_length_basic.result | 72 ++-------------------------- mysql-test/r/packet.result | 12 +---- mysql-test/r/union.result | 8 ++-- mysql-test/r/variables.result | 47 +++++++----------- mysql-test/t/func_compress.test | 5 +- mysql-test/t/innodb_bug34300.test | 4 +- mysql-test/t/max_allowed_packet_basic.test | 27 ++++++++--- mysql-test/t/max_allowed_packet_func.test | 19 +++----- mysql-test/t/net_buffer_length_basic.test | 49 ++++++------------- mysql-test/t/packet.test | 24 +++++----- mysql-test/t/union.test | 10 ++-- mysql-test/t/variables.test | 22 ++++----- sql/set_var.cc | 16 ++++++- sql/set_var.h | 23 +++++++++ sql/share/errmsg.txt | 3 ++ 18 files changed, 176 insertions(+), 239 deletions(-) diff --git a/mysql-test/r/func_compress.result b/mysql-test/r/func_compress.result index 715f319198c..def03deb351 100644 --- a/mysql-test/r/func_compress.result +++ b/mysql-test/r/func_compress.result @@ -68,7 +68,7 @@ Warnings: Error 1259 ZLIB: Input data corrupted Error 1256 Uncompressed data size too large; the maximum size is 1048576 (probably, length of uncompressed data was corrupted) drop table t1; -set @@max_allowed_packet=1048576*100; +set @@global.max_allowed_packet=1048576*100; select compress(repeat('aaaaaaaaaa', IF(XXX, 10, 10000000))) is null; compress(repeat('aaaaaaaaaa', IF(XXX, 10, 10000000))) is null 0 diff --git a/mysql-test/r/max_allowed_packet_basic.result b/mysql-test/r/max_allowed_packet_basic.result index 3940cc1b2f2..0745d5a36e1 100644 --- a/mysql-test/r/max_allowed_packet_basic.result +++ b/mysql-test/r/max_allowed_packet_basic.result @@ -2,10 +2,7 @@ SET @start_global_value = @@global.max_allowed_packet; SELECT @start_global_value; @start_global_value 1048576 -SET @start_session_value = @@session.max_allowed_packet; -SELECT @start_session_value; -@start_session_value -1048576 +SET @@global.max_allowed_packet = DEFAULT; '#--------------------FN_DYNVARS_070_01-------------------------#' SET @@global.max_allowed_packet = 1000; Warnings: @@ -15,7 +12,9 @@ SELECT @@global.max_allowed_packet; @@global.max_allowed_packet 1048576 SET @@session.max_allowed_packet = 20000; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SET @@session.max_allowed_packet = DEFAULT; +ERROR 42000: Variable 'max_allowed_packet' doesn't have a default value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet 1048576 @@ -24,10 +23,6 @@ SET @@global.max_allowed_packet = DEFAULT; SELECT @@global.max_allowed_packet = 1048576; @@global.max_allowed_packet = 1048576 1 -SET @@session.max_allowed_packet = DEFAULT; -SELECT @@session.max_allowed_packet = 1048576; -@@session.max_allowed_packet = 1048576 -1 '#--------------------FN_DYNVARS_070_03-------------------------#' SET @@global.max_allowed_packet = 1024; SELECT @@global.max_allowed_packet; @@ -48,25 +43,30 @@ SELECT @@global.max_allowed_packet; 1073740800 '#--------------------FN_DYNVARS_070_04-------------------------#' SET @@session.max_allowed_packet = 1024; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 SET @@session.max_allowed_packet = 1025; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 SET @@session.max_allowed_packet = 65535; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -64512 +1048576 SET @@session.max_allowed_packet = 1073741824; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1073741824 +1048576 SET @@session.max_allowed_packet = 1073741823; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1073740800 +1048576 '#------------------FN_DYNVARS_070_05-----------------------#' SET @@global.max_allowed_packet = 0; Warnings: @@ -103,37 +103,33 @@ SELECT @@global.max_allowed_packet; @@global.max_allowed_packet 1073741824 SET @@session.max_allowed_packet = 0; -Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '0' +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 SET @@session.max_allowed_packet = 1023; -Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '1023' +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 SET @@session.max_allowed_packet = -2; -Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '0' +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 SET @@session.max_allowed_packet = 65530.34.; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 SET @@session.max_allowed_packet = 10737418241; -Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '10737418241' +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1073741824 +1048576 'Bug # 34837: Errors are not coming on assigning invalid values to variable'; SET @@session.max_allowed_packet = test; ERROR 42000: Incorrect argument type to variable 'max_allowed_packet' SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1073741824 +1048576 '#------------------FN_DYNVARS_070_06-----------------------#' SELECT @@global.max_allowed_packet = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES @@ -166,6 +162,7 @@ SELECT @@max_allowed_packet = @@global.max_allowed_packet; 0 '#---------------------FN_DYNVARS_070_10----------------------#' SET @@max_allowed_packet = 100000; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@max_allowed_packet = @@local.max_allowed_packet; @@max_allowed_packet = @@local.max_allowed_packet 1 @@ -174,9 +171,10 @@ SELECT @@local.max_allowed_packet = @@session.max_allowed_packet; 1 '#---------------------FN_DYNVARS_070_11----------------------#' SET max_allowed_packet = 1024; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@max_allowed_packet; @@max_allowed_packet -1024 +1048576 SELECT local.max_allowed_packet; ERROR 42S02: Unknown table 'local' in field list SELECT session.max_allowed_packet; @@ -187,7 +185,6 @@ SET @@global.max_allowed_packet = @start_global_value; SELECT @@global.max_allowed_packet; @@global.max_allowed_packet 1048576 -SET @@session.max_allowed_packet = @start_session_value; SELECT @@session.max_allowed_packet; @@session.max_allowed_packet 1048576 diff --git a/mysql-test/r/max_allowed_packet_func.result b/mysql-test/r/max_allowed_packet_func.result index 9e44bcfb7b1..43da24fa280 100644 --- a/mysql-test/r/max_allowed_packet_func.result +++ b/mysql-test/r/max_allowed_packet_func.result @@ -10,24 +10,15 @@ name BLOB '#--------------------FN_DYNVARS_070_01-------------------------#' ## Setting value of max_allowed packet and net_buffer_length to 1024 ## SET @@session.max_allowed_packet = 1024; -SET @@session.net_buffer_length = 1024; +ERROR HY000: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value SELECT @@session.max_allowed_packet; @@session.max_allowed_packet -1024 +1048576 +SET @@session.net_buffer_length = 1024; +ERROR HY000: SESSION variable 'net_buffer_length' is read-only. Use SET GLOBAL to assign the value SELECT @@session.net_buffer_length; @@session.net_buffer_length -1024 -## Inserting and fetching data of length greater than 1024 ## -INSERT into t1(name) values("aaassssssssddddddddffffffgggggggg, askdlfjalsdkjfalksdjflaksdjfalkjdflaksjdflakjdflajsflajflajdfalsjfdlajfladjslfajdflajdsflajsflakjsdfla;kjflsdjkf;aljfa;lkdsfjla;sjlkajffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllakjsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa;;;;;;;;;;;;;;;;;;;;;;;;;;;dsklfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkljffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"); -SELECT length("aaaaaasssssssssssdddddddfffffgggg, askdlfjalsdkjfalksdjflaksdjfalkjdflaksjdflakjdflajsflajflajdfalsjfdlajfladjslfajdflajdsflajsflakjsdfla;kjflsdjkf;aljfa;lkdsfjla;sjlkajffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllakjsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa;;;;;;;;;;;;;;;;;;;;;;;;;;;dsklfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkljffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk") as len; -len -1470 -## Verifying record in table t1 ## -SELECT * from t1; -id name -1 aaassssssssddddddddffffffgggggggg, askdlfjalsdkjfalksdjflaksdjfalkjdflaksjdflakjdflajsflajflajdfalsjfdlajfladjslfajdflajdsflajsflakjsdfla;kjflsdjkf;aljfa;lkdsfjla;sjlkajffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllakjsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa;;;;;;;;;;;;;;;;;;;;;;;;;;;dsklfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkljffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -'Bug#35381: Error is not coming on inserting and fetching data of length' -'greater than max_allowed_packet size at session level'; +16384 '#--------------------FN_DYNVARS_070_02-------------------------#' ## Setting value of max_allowed packet and net_buffer_length to 1024 ## SET @@global.max_allowed_packet = 1024; diff --git a/mysql-test/r/net_buffer_length_basic.result b/mysql-test/r/net_buffer_length_basic.result index ddaad3dfa91..be7e9082332 100644 --- a/mysql-test/r/net_buffer_length_basic.result +++ b/mysql-test/r/net_buffer_length_basic.result @@ -1,5 +1,5 @@ SET @start_global_value = @@global.net_buffer_length; -SET @start_session_value = @@session.net_buffer_length; +SET @@global.net_buffer_length = DEFAULT; '#--------------------FN_DYNVARS_109_01-------------------------#' SET @@global.net_buffer_length = 10000; SET @@global.net_buffer_length = DEFAULT; @@ -7,7 +7,9 @@ SELECT @@global.net_buffer_length; @@global.net_buffer_length 16384 SET @@session.net_buffer_length = 20000; +ERROR HY000: SESSION variable 'net_buffer_length' is read-only. Use SET GLOBAL to assign the value SET @@session.net_buffer_length = DEFAULT; +ERROR 42000: Variable 'net_buffer_length' doesn't have a default value SELECT @@session.net_buffer_length; @@session.net_buffer_length 16384 @@ -16,10 +18,6 @@ SET @@global.net_buffer_length = DEFAULT; SELECT @@global.net_buffer_length = 16384; @@global.net_buffer_length = 16384 1 -SET @@session.net_buffer_length = DEFAULT; -SELECT @@session.net_buffer_length = 16384; -@@session.net_buffer_length = 16384 -1 '#--------------------FN_DYNVARS_109_03-------------------------#' SET @@global.net_buffer_length = 1024; SELECT @@global.net_buffer_length; @@ -43,27 +41,6 @@ SELECT @@global.net_buffer_length; 64512 'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; '#--------------------FN_DYNVARS_109_04-------------------------#' -SET @@session.net_buffer_length = 1024; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1024 -SET @@session.net_buffer_length = 1025; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1024 -SET @@session.net_buffer_length = 1048576; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1048576 -SET @@session.net_buffer_length = 1048575; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1047552 -SET @@session.net_buffer_length = 65535; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -64512 -'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; '#------------------FN_DYNVARS_109_05-----------------------#' SET @@global.net_buffer_length = 0; Warnings: @@ -105,42 +82,12 @@ ERROR 42000: Incorrect argument type to variable 'net_buffer_length' SELECT @@global.net_buffer_length; @@global.net_buffer_length 1048576 -SET @@session.net_buffer_length = 0; -Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '0' -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1024 -SET @@session.net_buffer_length = -2; -Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '0' -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1024 -SET @@session.net_buffer_length = 1048577; -Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '1048577' -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1048576 -SET @@session.net_buffer_length = 1048576002; -Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '1048576002' -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -1048576 -SET @@session.net_buffer_length = 65530.34.; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.' at line 1 -SET @@session.net_buffer_length = 65550; -SELECT @@session.net_buffer_length; -@@session.net_buffer_length -65536 'Bug # 34837: Errors are not coming on assigning invalid values to variable'; SET @@session.net_buffer_length = test; ERROR 42000: Incorrect argument type to variable 'net_buffer_length' SELECT @@session.net_buffer_length; @@session.net_buffer_length -65536 +16384 '#------------------FN_DYNVARS_109_06-----------------------#' SELECT @@global.net_buffer_length = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES @@ -172,18 +119,10 @@ SELECT @@net_buffer_length = @@global.net_buffer_length; @@net_buffer_length = @@global.net_buffer_length 0 '#---------------------FN_DYNVARS_109_10----------------------#' -SET @@net_buffer_length = 100000; -SELECT @@net_buffer_length = @@local.net_buffer_length; -@@net_buffer_length = @@local.net_buffer_length -1 -SELECT @@local.net_buffer_length = @@session.net_buffer_length; -@@local.net_buffer_length = @@session.net_buffer_length -1 '#---------------------FN_DYNVARS_109_11----------------------#' -SET net_buffer_length = 1024; SELECT @@net_buffer_length; @@net_buffer_length -1024 +16384 SELECT local.net_buffer_length; ERROR 42S02: Unknown table 'local' in field list SELECT session.net_buffer_length; @@ -191,4 +130,3 @@ ERROR 42S02: Unknown table 'session' in field list SELECT net_buffer_length = @@session.net_buffer_length; ERROR 42S22: Unknown column 'net_buffer_length' in 'field list' SET @@global.net_buffer_length = @start_global_value; -SET @@session.net_buffer_length = @start_session_value; diff --git a/mysql-test/r/packet.result b/mysql-test/r/packet.result index df0d9ff9adc..fa2fb33d278 100644 --- a/mysql-test/r/packet.result +++ b/mysql-test/r/packet.result @@ -1,32 +1,22 @@ set global max_allowed_packet=100; Warnings: Warning 1292 Truncated incorrect max_allowed_packet value: '100' -set max_allowed_packet=100; -Warnings: -Warning 1292 Truncated incorrect max_allowed_packet value: '100' set global net_buffer_length=100; Warnings: Warning 1292 Truncated incorrect net_buffer_length value: '100' -set net_buffer_length=100; -Warnings: -Warning 1292 Truncated incorrect net_buffer_length value: '100' SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; len 1024 select repeat('a',2000); repeat('a',2000) -NULL -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (1024) - truncated +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa select @@net_buffer_length, @@max_allowed_packet; @@net_buffer_length @@max_allowed_packet 1024 1024 SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; ERROR 08S01: Got a packet bigger than 'max_allowed_packet' bytes set global max_allowed_packet=default; -set max_allowed_packet=default; set global net_buffer_length=default; -set net_buffer_length=default; SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; len 100 diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 3f99a053df4..2a10f34d081 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -1343,10 +1343,10 @@ t3 CREATE TABLE `t3` ( `left(a,100000000)` longtext ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop tables t1,t2,t3; -SELECT @tmp_max:= @@max_allowed_packet; -@tmp_max:= @@max_allowed_packet +SELECT @tmp_max:= @@global.max_allowed_packet; +@tmp_max:= @@global.max_allowed_packet 1048576 -SET max_allowed_packet=25000000; +SET @@global.max_allowed_packet=25000000; CREATE TABLE t1 (a mediumtext); CREATE TABLE t2 (b varchar(20)); INSERT INTO t1 VALUES ('a'); @@ -1384,7 +1384,7 @@ t3 CREATE TABLE `t3` ( `a` varbinary(510) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLES t1,t2,t3; -SET max_allowed_packet:= @tmp_max; +SET @@global.max_allowed_packet:= @tmp_max; create table t1 ( id int not null auto_increment, primary key (id), col1 int); insert into t1 (col1) values (2),(3),(4),(5),(6); select 99 union all select id from t1 order by 1; diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index aee84c98e4f..c52f7f3578e 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -228,7 +228,6 @@ VARIABLE_NAME VARIABLE_VALUE MYISAM_MAX_SORT_FILE_SIZE FILE_SIZE set global net_retry_count=10, session net_retry_count=10; set global net_buffer_length=1024, net_write_timeout=200, net_read_timeout=300; -set session net_buffer_length=2048, net_write_timeout=500, net_read_timeout=600; show global variables like 'net_%'; Variable_name Value net_buffer_length 1024 @@ -243,57 +242,45 @@ NET_RETRY_COUNT 10 NET_WRITE_TIMEOUT 200 show session variables like 'net_%'; Variable_name Value -net_buffer_length 2048 -net_read_timeout 600 +net_buffer_length 16384 +net_read_timeout 30 net_retry_count 10 -net_write_timeout 500 +net_write_timeout 60 select * from information_schema.session_variables where variable_name like 'net_%' order by 1; VARIABLE_NAME VARIABLE_VALUE -NET_BUFFER_LENGTH 2048 -NET_READ_TIMEOUT 600 +NET_BUFFER_LENGTH 16384 +NET_READ_TIMEOUT 30 NET_RETRY_COUNT 10 -NET_WRITE_TIMEOUT 500 -set session net_buffer_length=8000, global net_read_timeout=900, net_write_timeout=1000; +NET_WRITE_TIMEOUT 60 +set global net_buffer_length=8000, global net_read_timeout=900, net_write_timeout=1000; show global variables like 'net_%'; Variable_name Value -net_buffer_length 1024 +net_buffer_length 7168 net_read_timeout 900 net_retry_count 10 net_write_timeout 1000 select * from information_schema.global_variables where variable_name like 'net_%' order by 1; VARIABLE_NAME VARIABLE_VALUE -NET_BUFFER_LENGTH 1024 +NET_BUFFER_LENGTH 7168 NET_READ_TIMEOUT 900 NET_RETRY_COUNT 10 NET_WRITE_TIMEOUT 1000 -show session variables like 'net_%'; -Variable_name Value -net_buffer_length 7168 -net_read_timeout 600 -net_retry_count 10 -net_write_timeout 500 -select * from information_schema.session_variables where variable_name like 'net_%' order by 1; -VARIABLE_NAME VARIABLE_VALUE -NET_BUFFER_LENGTH 7168 -NET_READ_TIMEOUT 600 -NET_RETRY_COUNT 10 -NET_WRITE_TIMEOUT 500 -set net_buffer_length=1; +set global net_buffer_length=1; Warnings: Warning 1292 Truncated incorrect net_buffer_length value: '1' -show variables like 'net_buffer_length'; +show global variables like 'net_buffer_length'; Variable_name Value net_buffer_length 1024 -select * from information_schema.session_variables where variable_name like 'net_buffer_length'; +select * from information_schema.global_variables where variable_name like 'net_buffer_length'; VARIABLE_NAME VARIABLE_VALUE NET_BUFFER_LENGTH 1024 -set net_buffer_length=2000000000; +set global net_buffer_length=2000000000; Warnings: Warning 1292 Truncated incorrect net_buffer_length value: '2000000000' -show variables like 'net_buffer_length'; +show global variables like 'net_buffer_length'; Variable_name Value net_buffer_length 1048576 -select * from information_schema.session_variables where variable_name like 'net_buffer_length'; +select * from information_schema.global_variables where variable_name like 'net_buffer_length'; VARIABLE_NAME VARIABLE_VALUE NET_BUFFER_LENGTH 1048576 set character set cp1251_koi8; @@ -461,7 +448,7 @@ select @@long_query_time; @@long_query_time 100.000001 set low_priority_updates=1; -set max_allowed_packet=100; +set global max_allowed_packet=100; Warnings: Warning 1292 Truncated incorrect max_allowed_packet value: '100' set global max_binlog_cache_size=100; @@ -485,7 +472,7 @@ select @@max_user_connections; 100 set global max_write_lock_count=100; set myisam_sort_buffer_size=100; -set net_buffer_length=100; +set global net_buffer_length=100; Warnings: Warning 1292 Truncated incorrect net_buffer_length value: '100' set net_read_timeout=100; diff --git a/mysql-test/t/func_compress.test b/mysql-test/t/func_compress.test index 68f07f258bf..7f17fd2180f 100644 --- a/mysql-test/t/func_compress.test +++ b/mysql-test/t/func_compress.test @@ -43,8 +43,11 @@ drop table t1; # note that when LOW_MEMORY is set the "test" below is meaningless # -set @@max_allowed_packet=1048576*100; +set @@global.max_allowed_packet=1048576*100; --replace_result "''" XXX "'1'" XXX + +# reconnect to make the new max packet size take effect +--connect (newconn, localhost, root,,) eval select compress(repeat('aaaaaaaaaa', IF('$LOW_MEMORY', 10, 10000000))) is null; # diff --git a/mysql-test/t/innodb_bug34300.test b/mysql-test/t/innodb_bug34300.test index 4b4a3fdc8a3..114bcf98c25 100644 --- a/mysql-test/t/innodb_bug34300.test +++ b/mysql-test/t/innodb_bug34300.test @@ -8,7 +8,9 @@ -- disable_query_log -- disable_result_log -SET @@max_allowed_packet=16777216; +# set packet size and reconnect +SET @@global.max_allowed_packet=16777216; +--connect (newconn, localhost, root,,) DROP TABLE IF EXISTS bug34300; CREATE TABLE bug34300 ( diff --git a/mysql-test/t/max_allowed_packet_basic.test b/mysql-test/t/max_allowed_packet_basic.test index beb9b62d6de..8be0e5f670e 100644 --- a/mysql-test/t/max_allowed_packet_basic.test +++ b/mysql-test/t/max_allowed_packet_basic.test @@ -36,8 +36,13 @@ SET @start_global_value = @@global.max_allowed_packet; SELECT @start_global_value; -SET @start_session_value = @@session.max_allowed_packet; -SELECT @start_session_value; + +# give a known value to @@session.max_allowed_packet by assigning to +# @@global and setting up a new connection (for deterministic result +# file diffing) +SET @@global.max_allowed_packet = DEFAULT; +connect (conn1, localhost, root,,); + --echo '#--------------------FN_DYNVARS_070_01-------------------------#' @@ -49,7 +54,9 @@ SET @@global.max_allowed_packet = 1000; SET @@global.max_allowed_packet = DEFAULT; SELECT @@global.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 20000; +--Error ER_NO_DEFAULT SET @@session.max_allowed_packet = DEFAULT; SELECT @@session.max_allowed_packet; @@ -62,9 +69,6 @@ SELECT @@session.max_allowed_packet; SET @@global.max_allowed_packet = DEFAULT; SELECT @@global.max_allowed_packet = 1048576; -SET @@session.max_allowed_packet = DEFAULT; -SELECT @@session.max_allowed_packet = 1048576; - --echo '#--------------------FN_DYNVARS_070_03-------------------------#' ############################################################################ @@ -86,14 +90,19 @@ SELECT @@global.max_allowed_packet; # Change the value of max_allowed_packet to a valid value for SESSION Scope # ############################################################################# +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1024; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1025; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 65535; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1073741824; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1073741823; SELECT @@session.max_allowed_packet; @@ -118,14 +127,18 @@ SELECT @@global.max_allowed_packet; SET @@global.max_allowed_packet = test; SELECT @@global.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 0; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1023; SELECT @@session.max_allowed_packet; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = -2; SELECT @@session.max_allowed_packet; --Error ER_PARSE_ERROR SET @@session.max_allowed_packet = 65530.34.; +--Error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 10737418241; SELECT @@session.max_allowed_packet; --echo 'Bug # 34837: Errors are not coming on assigning invalid values to variable'; @@ -180,6 +193,7 @@ SELECT @@max_allowed_packet = @@global.max_allowed_packet; # Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable # ######################################################################################################## +--Error ER_VARIABLE_IS_READONLY SET @@max_allowed_packet = 100000; SELECT @@max_allowed_packet = @@local.max_allowed_packet; SELECT @@local.max_allowed_packet = @@session.max_allowed_packet; @@ -190,6 +204,7 @@ SELECT @@local.max_allowed_packet = @@session.max_allowed_packet; # Check if max_allowed_packet can be accessed with and without @@ sign # ############################################################################# +--Error ER_VARIABLE_IS_READONLY SET max_allowed_packet = 1024; SELECT @@max_allowed_packet; --Error ER_UNKNOWN_TABLE @@ -204,9 +219,9 @@ SELECT max_allowed_packet = @@session.max_allowed_packet; # Restore initial value # #################################### +connection default; SET @@global.max_allowed_packet = @start_global_value; SELECT @@global.max_allowed_packet; -SET @@session.max_allowed_packet = @start_session_value; SELECT @@session.max_allowed_packet; diff --git a/mysql-test/t/max_allowed_packet_func.test b/mysql-test/t/max_allowed_packet_func.test index 37ca15f85f0..8437d480a37 100644 --- a/mysql-test/t/max_allowed_packet_func.test +++ b/mysql-test/t/max_allowed_packet_func.test @@ -43,26 +43,19 @@ name BLOB --echo '#--------------------FN_DYNVARS_070_01-------------------------#' ############################################################################### -# Setting initial value of max_allowed_packet to 1024 at session level and -# verifying its behavior after inserting data greater than 1024 bytes +# Setting initial value of max_allowed_packet to 1024 at session level +# should result in an error (session variable is readonly) ############################################################################### --echo ## Setting value of max_allowed packet and net_buffer_length to 1024 ## +--error ER_VARIABLE_IS_READONLY SET @@session.max_allowed_packet = 1024; -SET @@session.net_buffer_length = 1024; SELECT @@session.max_allowed_packet; -SELECT @@session.net_buffer_length; - ---echo ## Inserting and fetching data of length greater than 1024 ## -INSERT into t1(name) values("aaassssssssddddddddffffffgggggggg, askdlfjalsdkjfalksdjflaksdjfalkjdflaksjdflakjdflajsflajflajdfalsjfdlajfladjslfajdflajdsflajsflakjsdfla;kjflsdjkf;aljfa;lkdsfjla;sjlkajffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllakjsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa;;;;;;;;;;;;;;;;;;;;;;;;;;;dsklfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkljffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"); - -SELECT length("aaaaaasssssssssssdddddddfffffgggg, askdlfjalsdkjfalksdjflaksdjfalkjdflaksjdflakjdflajsflajflajdfalsjfdlajfladjslfajdflajdsflajsflakjsdfla;kjflsdjkf;aljfa;lkdsfjla;sjlkajffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllakjsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa;;;;;;;;;;;;;;;;;;;;;;;;;;;dsklfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkljffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk") as len; ---echo ## Verifying record in table t1 ## -SELECT * from t1; +--error ER_VARIABLE_IS_READONLY +SET @@session.net_buffer_length = 1024; +SELECT @@session.net_buffer_length; ---echo 'Bug#35381: Error is not coming on inserting and fetching data of length' ---echo 'greater than max_allowed_packet size at session level'; --echo '#--------------------FN_DYNVARS_070_02-------------------------#' ############################################################################### diff --git a/mysql-test/t/net_buffer_length_basic.test b/mysql-test/t/net_buffer_length_basic.test index 80403bfec2b..6e1e0559c61 100644 --- a/mysql-test/t/net_buffer_length_basic.test +++ b/mysql-test/t/net_buffer_length_basic.test @@ -38,9 +38,13 @@ SET @start_global_value = @@global.net_buffer_length; # Due to differences in results of linux and windows #SELECT @start_global_value; -SET @start_session_value = @@session.net_buffer_length; -#SELECT @start_session_value; +# give a known value to @@session.net_buffer_length by assigning to +# @@global and setting up a new connection (for deterministic result +# file diffing) +SET @@global.net_buffer_length = DEFAULT; +connect(con1,localhost,root,,); +connection con1; --echo '#--------------------FN_DYNVARS_109_01-------------------------#' ################################################################# @@ -51,7 +55,9 @@ SET @@global.net_buffer_length = 10000; SET @@global.net_buffer_length = DEFAULT; SELECT @@global.net_buffer_length; +--Error ER_VARIABLE_IS_READONLY SET @@session.net_buffer_length = 20000; +--Error ER_NO_DEFAULT SET @@session.net_buffer_length = DEFAULT; SELECT @@session.net_buffer_length; @@ -64,9 +70,6 @@ SELECT @@session.net_buffer_length; SET @@global.net_buffer_length = DEFAULT; SELECT @@global.net_buffer_length = 16384; -SET @@session.net_buffer_length = DEFAULT; -SELECT @@session.net_buffer_length = 16384; - --echo '#--------------------FN_DYNVARS_109_03-------------------------#' ########################################################################### @@ -91,17 +94,7 @@ SELECT @@global.net_buffer_length; # Change the value of net_buffer_length to a valid value for SESSION Scope # ############################################################################ -SET @@session.net_buffer_length = 1024; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 1025; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 1048576; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 1048575; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 65535; -SELECT @@session.net_buffer_length; ---echo 'Bug# 34877: Invalid Values are coming in variable on assigning valid values'; +# Bug#22891: SESSION net_buffer_length is now read-only; assignments skipped --echo '#------------------FN_DYNVARS_109_05-----------------------#' @@ -126,18 +119,8 @@ SELECT @@global.net_buffer_length; SET @@global.net_buffer_length = test; SELECT @@global.net_buffer_length; -SET @@session.net_buffer_length = 0; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = -2; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 1048577; -SELECT @@session.net_buffer_length; -SET @@session.net_buffer_length = 1048576002; -SELECT @@session.net_buffer_length; ---Error ER_PARSE_ERROR -SET @@session.net_buffer_length = 65530.34.; -SET @@session.net_buffer_length = 65550; -SELECT @@session.net_buffer_length; +# Bug#22891: SESSION net_buffer_length is now read-only; assignments skipped + --echo 'Bug # 34837: Errors are not coming on assigning invalid values to variable'; --Error ER_WRONG_TYPE_FOR_VAR @@ -190,9 +173,7 @@ SELECT @@net_buffer_length = @@global.net_buffer_length; # Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable # ######################################################################################################## -SET @@net_buffer_length = 100000; -SELECT @@net_buffer_length = @@local.net_buffer_length; -SELECT @@local.net_buffer_length = @@session.net_buffer_length; +# Bug#22891: SESSION net_buffer_length is now read-only; assignments skipped --echo '#---------------------FN_DYNVARS_109_11----------------------#' @@ -200,7 +181,7 @@ SELECT @@local.net_buffer_length = @@session.net_buffer_length; # Check if net_buffer_length can be accessed with and without @@ sign # ############################################################################ -SET net_buffer_length = 1024; +# Bug#22891: SESSION net_buffer_length is now read-only; assignments skipped SELECT @@net_buffer_length; --Error ER_UNKNOWN_TABLE SELECT local.net_buffer_length; @@ -214,11 +195,11 @@ SELECT net_buffer_length = @@session.net_buffer_length; # Restore initial value # #################################### +connection default; + SET @@global.net_buffer_length = @start_global_value; # Due to differences in results of linux and windows #SELECT @@global.net_buffer_length; -SET @@session.net_buffer_length = @start_session_value; -#SELECT @@session.net_buffer_length; ###################################################### diff --git a/mysql-test/t/packet.test b/mysql-test/t/packet.test index 4de284b7824..93b46766d99 100644 --- a/mysql-test/t/packet.test +++ b/mysql-test/t/packet.test @@ -8,30 +8,30 @@ # Check protocol handling # -connect (con1,localhost,root,,); - -connection con1; +# setting values below minimum threshold of 1024 will cause truncating set global max_allowed_packet=100; -set max_allowed_packet=100; set global net_buffer_length=100; -set net_buffer_length=100; -# Have to be > 1024 as min value of net_buffer_length is 1024 + +# is not yet in effect SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; -# Should return NULL as 2000 is bigger than max_allowed_packet select repeat('a',2000); # -# Connection 2 should get error for too big packets +# Connection 1 should get error for too big packets # -connect (con2,localhost,root,,); -connection con2; +connect (con1,localhost,root,,); +connection con1; select @@net_buffer_length, @@max_allowed_packet; --error 1153 SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; + +# +# Reset to default values and reconnect +# set global max_allowed_packet=default; -set max_allowed_packet=default; set global net_buffer_length=default; -set net_buffer_length=default; +connect (con2,localhost,root,,); +connection con2; SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; select length(repeat('a',2000)); diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index f58cd54250b..ad4d57b7128 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -861,8 +861,10 @@ drop tables t1,t2,t3; # exceeds mediumtext maximum length # -SELECT @tmp_max:= @@max_allowed_packet; -SET max_allowed_packet=25000000; +SELECT @tmp_max:= @@global.max_allowed_packet; +SET @@global.max_allowed_packet=25000000; +# switching connection to allow the new max_allowed_packet take effect +--connect (newconn, localhost, root,,) CREATE TABLE t1 (a mediumtext); CREATE TABLE t2 (b varchar(20)); INSERT INTO t1 VALUES ('a'); @@ -884,7 +886,9 @@ INSERT INTO t1 VALUES ('a'); CREATE TABLE t3 SELECT REPEAT(a,2) AS a FROM t1 UNION SELECT b FROM t2; SHOW CREATE TABLE t3; DROP TABLES t1,t2,t3; -SET max_allowed_packet:= @tmp_max; +--connection default +SET @@global.max_allowed_packet:= @tmp_max; +--disconnect newconn # # Bug #10032 Bug in parsing UNION with ORDER BY when one node does not use FROM diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 221f46605cd..e98436fa62c 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -146,25 +146,23 @@ show global variables like 'myisam_max_sort_file_size'; --replace_result 9223372036853727232 FILE_SIZE 2146435072 FILE_SIZE select * from information_schema.global_variables where variable_name like 'myisam_max_sort_file_size'; +# bug#22891: modified to take read-only SESSION net_buffer_length into account set global net_retry_count=10, session net_retry_count=10; set global net_buffer_length=1024, net_write_timeout=200, net_read_timeout=300; -set session net_buffer_length=2048, net_write_timeout=500, net_read_timeout=600; show global variables like 'net_%'; select * from information_schema.global_variables where variable_name like 'net_%' order by 1; show session variables like 'net_%'; select * from information_schema.session_variables where variable_name like 'net_%' order by 1; -set session net_buffer_length=8000, global net_read_timeout=900, net_write_timeout=1000; +set global net_buffer_length=8000, global net_read_timeout=900, net_write_timeout=1000; show global variables like 'net_%'; select * from information_schema.global_variables where variable_name like 'net_%' order by 1; -show session variables like 'net_%'; -select * from information_schema.session_variables where variable_name like 'net_%' order by 1; -set net_buffer_length=1; -show variables like 'net_buffer_length'; -select * from information_schema.session_variables where variable_name like 'net_buffer_length'; +set global net_buffer_length=1; +show global variables like 'net_buffer_length'; +select * from information_schema.global_variables where variable_name like 'net_buffer_length'; #warning 1292 -set net_buffer_length=2000000000; -show variables like 'net_buffer_length'; -select * from information_schema.session_variables where variable_name like 'net_buffer_length'; +set global net_buffer_length=2000000000; +show global variables like 'net_buffer_length'; +select * from information_schema.global_variables where variable_name like 'net_buffer_length'; set character set cp1251_koi8; show variables like "character_set_client"; @@ -274,7 +272,7 @@ select @@long_query_time; set long_query_time=100.000001; select @@long_query_time; set low_priority_updates=1; -set max_allowed_packet=100; +set global max_allowed_packet=100; set global max_binlog_cache_size=100; set global max_binlog_size=100; set global max_connect_errors=100; @@ -288,7 +286,7 @@ set global max_user_connections=100; select @@max_user_connections; set global max_write_lock_count=100; set myisam_sort_buffer_size=100; -set net_buffer_length=100; +set global net_buffer_length=100; set net_read_timeout=100; set net_write_timeout=100; set global query_cache_limit=100; diff --git a/sql/set_var.cc b/sql/set_var.cc index 3e15cce2cea..7d1acc8e4fb 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -296,7 +296,7 @@ static sys_var_thd_bool sys_sql_low_priority_updates(&vars, "sql_low_priority_up &SV::low_priority_updates, fix_low_priority_updates); #endif -static sys_var_thd_ulong sys_max_allowed_packet(&vars, "max_allowed_packet", +static sys_var_thd_ulong_session_readonly sys_max_allowed_packet(&vars, "max_allowed_packet", &SV::max_allowed_packet); static sys_var_long_ptr sys_max_binlog_cache_size(&vars, "max_binlog_cache_size", &max_binlog_cache_size); @@ -369,7 +369,7 @@ static sys_var_thd_enum sys_myisam_stats_method(&vars, "myisam_stats_met &myisam_stats_method_typelib, NULL); -static sys_var_thd_ulong sys_net_buffer_length(&vars, "net_buffer_length", +static sys_var_thd_ulong_session_readonly sys_net_buffer_length(&vars, "net_buffer_length", &SV::net_buffer_length); static sys_var_thd_ulong sys_net_read_timeout(&vars, "net_read_timeout", &SV::net_read_timeout, @@ -2734,6 +2734,18 @@ uchar *sys_var_max_user_conn::value_ptr(THD *thd, enum_var_type type, } +bool sys_var_thd_ulong_session_readonly::check(THD *thd, set_var *var) +{ + if (var->type != OPT_GLOBAL) + { + my_error(ER_VARIABLE_IS_READONLY, MYF(0), "SESSION", name, "GLOBAL"); + return TRUE; + } + + return sys_var_thd_ulong::check(thd, var); +} + + bool sys_var_thd_lc_time_names::check(THD *thd, set_var *var) { MY_LOCALE *locale_match; diff --git a/sql/set_var.h b/sql/set_var.h index 9681c955a98..ab819694e09 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -1024,6 +1024,29 @@ public: }; +/** + * @brief This is a specialization of sys_var_thd_ulong that implements a + read-only session variable. The class overrides check() and check_default() + to achieve the read-only property for the session part of the variable. + */ +class sys_var_thd_ulong_session_readonly : public sys_var_thd_ulong +{ +public: + sys_var_thd_ulong_session_readonly(sys_var_chain *chain_arg, + const char *name_arg, ulong SV::*offset_arg, + sys_check_func c_func= NULL, + sys_after_update_func au_func= NULL, + Binlog_status_enum bl_status_arg= NOT_IN_BINLOG): + sys_var_thd_ulong(chain_arg, name_arg, offset_arg, c_func, au_func, bl_status_arg) + { } + bool check(THD *thd, set_var *var); + bool check_default(enum_var_type type) + { + return type != OPT_GLOBAL || !option_limits; + } +}; + + class sys_var_microseconds :public sys_var_thd { ulonglong SV::*offset; diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index b86007408fb..fd75fee9737 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -6151,3 +6151,6 @@ WARN_PLUGIN_DELETE_BUILTIN WARN_PLUGIN_BUSY eng "Plugin is busy and will be uninstalled on shutdown" + +ER_VARIABLE_IS_READONLY + eng "%s variable '%s' is read-only. Use SET %s to assign the value" -- cgit v1.2.1 From 1cd8b9f700a3d20e0af43896b366cef6ef0e7d4c Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Thu, 20 Nov 2008 14:08:36 +0400 Subject: Fix for bug#40875: Memory leak in FEDERATED handler Problem: memory leak occurs when we open a federated table that has its share in the hash. Fix: free not used memory. Note: the fix should NOT be merged to 5.1 (the code changed). sql/ha_federated.cc: Fix for bug#40875: Memory leak in FEDERATED handler - free memory (tmp_share.scheme) allocated in the parse_url() if it isn't used anymore. --- sql/ha_federated.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc index b4788dd9c87..d4144a41a2a 100644 --- a/sql/ha_federated.cc +++ b/sql/ha_federated.cc @@ -1320,6 +1320,14 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table) thr_lock_init(&share->lock); pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST); } + else + { + /* + Free tmp_share.scheme allocated in the parse_url() + as we found share in the hash and tmp_share isn't needed anymore. + */ + my_free((gptr) tmp_share.scheme, MYF(MY_ALLOW_ZERO_PTR)); + } share->use_count++; pthread_mutex_unlock(&federated_mutex); -- cgit v1.2.1 From c3dc1d6dfb010c923e4c1721005fbc050bd7dd23 Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Thu, 20 Nov 2008 15:25:26 +0400 Subject: Fix for bug#40770: Server Crash when running with triggers including variable settings (rpl_sys) Problem: under certain conditions (e.g. user variables usage in triggers) accessing a user defined variable we may use a variables hash table that belongs to already deleted thread. It happens if thd= new THD; has the same address as just deleted thd as we use if (stored_thd == thd) to check. That may lead to unpredictable results, server crash etc. Fix: use thread_id instead of thd address to distinguish threads. Note: no simple and repeatable test case. sql/item_func.cc: Fix for bug#40770: Server Crash when running with triggers including variable settings (rpl_sys) - store and use thd->thread_id to distinguish threads instead of thread address as it may be the same as just deleted thread had, i.e. we may get (old_thd == new_thd) after delete old_thd; new_thd= new THD; - set entry_thread_id only when we get a real entry, clear it if the hash search fails. sql/item_func.h: Fix for bug#40770: Server Crash when running with triggers including variable settings (rpl_sys) - Item_func_set_user_var::entry_thread_id introduced. --- sql/item_func.cc | 7 +++++-- sql/item_func.h | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index f9338e6016b..e117adc3cd0 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -3810,11 +3810,14 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, bool Item_func_set_user_var::set_entry(THD *thd, bool create_if_not_exists) { - if (thd == entry_thd && entry) + if (entry && thd->thread_id == entry_thread_id) goto end; // update entry->update_query_id for PS - entry_thd= thd; if (!(entry= get_variable(&thd->user_vars, name, create_if_not_exists))) + { + entry_thread_id= 0; return TRUE; + } + entry_thread_id= thd->thread_id; /* Remember the last query which updated it, this way a query can later know if this variable is a constant item in the query (it is if update_query_id diff --git a/sql/item_func.h b/sql/item_func.h index 08906ae826e..3acda817d26 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1295,16 +1295,16 @@ class Item_func_set_user_var :public Item_func enum Item_result cached_result_type; user_var_entry *entry; /* - The entry_thd variable is used: + The entry_thread_id variable is used: 1) to skip unnecessary updates of the entry field (see above); 2) to reset the entry field that was initialized in the other thread (for example, an item tree of a trigger that updates user variables - may be shared between several connections, and the entry_thd field + may be shared between several connections, and the entry_thread_id field prevents updates of one connection user variables from a concurrent connection calling the same trigger that initially updated some user variable it the first connection context). */ - THD *entry_thd; + my_thread_id entry_thread_id; char buffer[MAX_FIELD_WIDTH]; String value; my_decimal decimal_buff; @@ -1321,7 +1321,7 @@ public: LEX_STRING name; // keep it public Item_func_set_user_var(LEX_STRING a,Item *b) :Item_func(b), cached_result_type(INT_RESULT), - entry(NULL), entry_thd(NULL), name(a) + entry(NULL), entry_thread_id(0), name(a) {} enum Functype functype() const { return SUSERVAR_FUNC; } double val_real(); -- cgit v1.2.1 From 490bc421014689f37f7954bcf82dec5a522d2225 Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Thu, 20 Nov 2008 09:51:01 -0500 Subject: Update to change for bug 39178. Revert error-handling change, perhaps temporarily if yassl maintainer has plans for other error handling. --- extra/yassl/src/cert_wrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/yassl/src/cert_wrapper.cpp b/extra/yassl/src/cert_wrapper.cpp index 1af5705d11d..ebec0882265 100644 --- a/extra/yassl/src/cert_wrapper.cpp +++ b/extra/yassl/src/cert_wrapper.cpp @@ -265,7 +265,7 @@ int CertManager::Validate() TaoCrypt::CertDecoder cert(source, true, &signers_, verifyNone_); int err = cert.GetError().What(); - if ( err && err != TaoCrypt::SIG_OTHER_E) + if ( err ) return err; uint sz = cert.GetPublicKey().size(); -- cgit v1.2.1 From 39efef853ba172b07c3df3869e98d4b894192acc Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Fri, 21 Nov 2008 13:48:22 +0400 Subject: Fix for bug#36772: When using UTF8, CONVERT with GROUP BY returns truncated results Problem: performig conversion from {INT, DECIMAL, REAL} to CHAR we incorrectly set its max length in some cases that may lead to truncated results returned. Fix: properly set CONVERT({INT, DECIMAL, REAL}, CHAR) result's max length. mysql-test/r/ctype_utf8.result: Fix for bug#36772: When using UTF8, CONVERT with GROUP BY returns truncated results - test result. mysql-test/t/ctype_utf8.test: Fix for bug#36772: When using UTF8, CONVERT with GROUP BY returns truncated results - test case. sql/item_timefunc.cc: Fix for bug#36772: When using UTF8, CONVERT with GROUP BY returns truncated results - calculating Item_char_typecast::max_length use initial argument's charset mbmaxlen instead of from_cs->mbmaxlen, as from_cs may differ in some case (see comment above). --- mysql-test/r/ctype_utf8.result | 32 ++++++++++++++++++++++++++++++++ mysql-test/t/ctype_utf8.test | 17 +++++++++++++++++ sql/item_timefunc.cc | 13 ++++++++----- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 5ca1d578d2a..a4d7ca2558f 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -1813,3 +1813,35 @@ select hex(_utf8 B'001111111111'); ERROR HY000: Invalid utf8 character string: 'FF' select (_utf8 X'616263FF'); ERROR HY000: Invalid utf8 character string: 'FF' +CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL); +INSERT INTO t1 VALUES (70000, 1092), (70001, 1085), (70002, 1065); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +CONVERT(a, CHAR) CONVERT(b, CHAR) +70002 1065 +70001 1085 +70000 1092 +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1; +CONVERT(a, CHAR) CONVERT(b, CHAR) +70000 1092 +70001 1085 +70002 1065 +ALTER TABLE t1 ADD UNIQUE (b); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +CONVERT(a, CHAR) CONVERT(b, CHAR) +70002 1065 +70001 1085 +70000 1092 +DROP INDEX b ON t1; +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +CONVERT(a, CHAR) CONVERT(b, CHAR) +70002 1065 +70001 1085 +70000 1092 +ALTER TABLE t1 ADD INDEX (b); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) from t1 GROUP BY b; +CONVERT(a, CHAR) CONVERT(b, CHAR) +70002 1065 +70001 1085 +70000 1092 +DROP TABLE t1; +End of 5.0 tests diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index d184200ad5a..5111660bcbe 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1437,3 +1437,20 @@ select hex(_utf8 X'616263FF'); select hex(_utf8 B'001111111111'); --error ER_INVALID_CHARACTER_STRING select (_utf8 X'616263FF'); + +# +# Bug #36772: When using UTF8, CONVERT with GROUP BY returns truncated results +# +CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL); +INSERT INTO t1 VALUES (70000, 1092), (70001, 1085), (70002, 1065); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1; +ALTER TABLE t1 ADD UNIQUE (b); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +DROP INDEX b ON t1; +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b; +ALTER TABLE t1 ADD INDEX (b); +SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) from t1 GROUP BY b; +DROP TABLE t1; + +--echo End of 5.0 tests diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 0cb3c963dad..e9e92952908 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2550,6 +2550,8 @@ void Item_char_typecast::fix_length_and_dec() and thus avoid unnecessary character set conversion. - If the argument is not a number, then from_cs is set to the argument's charset. + + Note (TODO): we could use repertoire technique here. */ from_cs= (args[0]->result_type() == INT_RESULT || args[0]->result_type() == DECIMAL_RESULT || @@ -2557,12 +2559,13 @@ void Item_char_typecast::fix_length_and_dec() (cast_cs->mbminlen == 1 ? cast_cs : &my_charset_latin1) : args[0]->collation.collation; charset_conversion= (cast_cs->mbmaxlen > 1) || - !my_charset_same(from_cs, cast_cs) && - from_cs != &my_charset_bin && - cast_cs != &my_charset_bin; + (!my_charset_same(from_cs, cast_cs) && + from_cs != &my_charset_bin && + cast_cs != &my_charset_bin); collation.set(cast_cs, DERIVATION_IMPLICIT); - char_length= (cast_length >= 0) ? cast_length : - args[0]->max_length/from_cs->mbmaxlen; + char_length= (cast_length >= 0) ? + cast_length : + args[0]->max_length / args[0]->collation.collation->mbmaxlen; max_length= char_length * cast_cs->mbmaxlen; } -- cgit v1.2.1 From ff5685d701f29d2d8eb0d00dcaa4b63b9bbdeb67 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Fri, 21 Nov 2008 11:15:26 +0100 Subject: Fix broken link in embedded server (Windows) --- libmysqld/libmysqld.def | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def index 431c0efdaa0..865475cb56c 100644 --- a/libmysqld/libmysqld.def +++ b/libmysqld/libmysqld.def @@ -17,7 +17,7 @@ EXPORTS dynstr_append_mem init_dynamic_string dynstr_free - hash_free + my_hash_free my_vsnprintf dynstr_append my_close @@ -31,7 +31,7 @@ EXPORTS fn_format dirname_part my_hash_insert - hash_search + my_hash_search test_if_hard_path my_copy my_mkdir @@ -54,7 +54,7 @@ EXPORTS my_thread_stack_size my_safe_print_str my_stat - _hash_init + _my_hash_init pthread_attr_setstacksize pthread_attr_init my_dirend -- cgit v1.2.1 From bd6376f1d17240956c1b1f243aaadde2611fcb56 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Fri, 21 Nov 2008 16:39:59 +0400 Subject: Bug#34760 Character set autodetection appears to fail the problem is the same as reported in bug#20835, so the fix is backport of bug#20835 patch. mysql-test/r/subselect.result: test result mysql-test/t/subselect.test: test case --- mysql-test/r/subselect.result | 15 +++++++++++++++ mysql-test/t/subselect.test | 19 ++++++++++++++++++- sql/item_cmpfunc.cc | 3 ++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index c5bae840214..6eeb652e3c1 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -4407,4 +4407,19 @@ pk a 3 30 2 20 DROP TABLE t1,t2; +CREATE TABLE t1 (s1 char(1)); +INSERT INTO t1 VALUES ('a'); +SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1); +s1 +a +DROP TABLE t1; +CREATE TABLE t1(id BIGINT); +CREATE TABLE t2(id1 BIGINT, id2 BIGINT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t2 VALUES (2,1),(3,1); +SELECT * FROM t1 i WHERE 1 IN (SELECT l.id2 FROM t2 l WHERE i.id=l.id1); +id +2 +3 +DROP TABLE t1, t2; End of 5.0 tests. diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 2dfad2c58dd..d28e31fb545 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -3307,5 +3307,22 @@ SELECT * FROM t1 WHERE EXISTS (SELECT DISTINCT a FROM t2 WHERE t1.a < t2.a ORDER BY b); DROP TABLE t1,t2; ---echo End of 5.0 tests. +# +# Bug#20835 (literal string with =any values) +# +CREATE TABLE t1 (s1 char(1)); +INSERT INTO t1 VALUES ('a'); +SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1); +DROP TABLE t1; +# +# Bug#40519 Subselect query using bigint fails +# +CREATE TABLE t1(id BIGINT); +CREATE TABLE t2(id1 BIGINT, id2 BIGINT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t2 VALUES (2,1),(3,1); +SELECT * FROM t1 i WHERE 1 IN (SELECT l.id2 FROM t2 l WHERE i.id=l.id1); +DROP TABLE t1, t2; + +--echo End of 5.0 tests. diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 0410c781590..4bfae376acc 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1434,7 +1434,8 @@ bool Item_in_optimizer::fix_left(THD *thd, Item **ref) } not_null_tables_cache= args[0]->not_null_tables(); with_sum_func= args[0]->with_sum_func; - const_item_cache= args[0]->const_item(); + if ((const_item_cache= args[0]->const_item())) + cache->store(args[0]); return 0; } -- cgit v1.2.1 From 3f2044cd6ea79467335720744db7e2d9b575896e Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Fri, 21 Nov 2008 18:15:11 +0400 Subject: warning of notused function fixed --- sql/mysqld.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6db372c15e2..1ceabadc860 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -7351,6 +7351,7 @@ SHOW_VAR status_vars[]= { {NullS, NullS, SHOW_LONG} }; +#ifndef EMBEDDED_LIBRARY static void print_version(void) { set_server_version(); @@ -7362,7 +7363,6 @@ static void print_version(void) server_version,SYSTEM_TYPE,MACHINE_TYPE, MYSQL_COMPILATION_COMMENT); } -#ifndef EMBEDDED_LIBRARY static void usage(void) { if (!(default_charset_info= get_charset_by_csname(default_character_set_name, -- cgit v1.2.1 From caf290203f5fdd15a046f1361dcf725ac6253fc4 Mon Sep 17 00:00:00 2001 From: Horst Hunger Date: Fri, 21 Nov 2008 15:36:13 +0100 Subject: Fix for bug#36873 containing the review results. --- mysql-test/r/wait_timeout_func.result | 58 ++++++++++--------- mysql-test/t/wait_timeout_func.test | 106 ++++++++++++++++------------------ 2 files changed, 80 insertions(+), 84 deletions(-) diff --git a/mysql-test/r/wait_timeout_func.result b/mysql-test/r/wait_timeout_func.result index 35fe10a1889..01b4a71df87 100644 --- a/mysql-test/r/wait_timeout_func.result +++ b/mysql-test/r/wait_timeout_func.result @@ -1,30 +1,32 @@ -drop table if exists t1; -## Creating new table t1 ## -CREATE TABLE t1 -( -id INT NOT NULL auto_increment, -PRIMARY KEY (id), -name VARCHAR(30) -); +SET @start_value= @@global.wait_timeout; '#--------------------FN_DYNVARS_186_01-------------------------#' -## Creating new connection test_con1 ## -## Setting value of variable to 5 ## -SET @@session.wait_timeout = 5; -## Inserting record in table t1 ## -INSERT into t1(name) values('Record_1'); -## Using sleep to check timeout ## -'#--------------------FN_DYNVARS_186_02-------------------------#' -## Setting value of variable ## -SET @@global.wait_timeout = 5; -## Creating new connection test_con2 ## -INSERT into t1(name) values('Record_2'); -## Using sleep to check timeout ## +SET @start_time= UNIX_TIMESTAMP(); +connect (test_con1, localhost, root,,); +SELECT @@session.wait_timeout = @@global.wait_timeout AS 'Expect 1'; +Expect 1 +1 +SET @@session.wait_timeout = ; +connect (test_con2, localhost, root,,); +SET @@session.wait_timeout = - 1; +connection default; +wait until connections ready +SELECT info FROM information_schema.processlist; +info +SELECT info FROM information_schema.processlist '#--------------------FN_DYNVARS_186_03-------------------------#' -## Setting value of variable to 1 ## -SET @@global.wait_timeout = 1; -## Creating new connection ## -INSERT into t1(name) values('Record_3'); -## Using sleep to check timeout ## -## We cannot test it further because the server stops due to wait_timeout ## -SELECT * from t1; -ERROR HY000: MySQL server has gone away +SET @@global.wait_timeout= ; +SELECT @@session.wait_timeout = @start_value AS 'Expect 1'; +Expect 1 +1 +connect (test_con3, localhost, root,,); +SELECT @@session.wait_timeout = @@global.wait_timeout AS 'Expect 1'; +Expect 1 +1 +connection default; +SELECT info FROM information_schema.processlist; +info +SELECT info FROM information_schema.processlist +SELECT UNIX_TIMESTAMP() - @start_time >= + ;; +UNIX_TIMESTAMP() - @start_time >= + ; +1 +SET @@global.wait_timeout= @start_value; diff --git a/mysql-test/t/wait_timeout_func.test b/mysql-test/t/wait_timeout_func.test index e825b5a3a39..6b7c8d016d2 100644 --- a/mysql-test/t/wait_timeout_func.test +++ b/mysql-test/t/wait_timeout_func.test @@ -11,93 +11,87 @@ # Creation Date: 2008-03-07 # # Author: Salman Rawala # # # +# Modified: HHunger 2008-08-27 Simplified the test and replaced the sleeps. # +# # # Description: Test Cases of Dynamic System Variable wait_timeout # # that checks the functionality of this variable # # # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html#option_mysqld_wait_timeouts # +# Reference: # +# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html # # # ############################################################################### --source include/not_embedded.inc ---disable_warnings -drop table if exists t1; ---enable_warnings - -############################## -# Creating two new tables # -############################## - ---echo ## Creating new table t1 ## -CREATE TABLE t1 -( -id INT NOT NULL auto_increment, -PRIMARY KEY (id), -name VARCHAR(30) -); +SET @start_value= @@global.wait_timeout; --echo '#--------------------FN_DYNVARS_186_01-------------------------#' ####################################################################### -# Setting initial value of interactive_timeout greater than sleep and -# verifying its behavior on session scope +# 1. test of scope session ####################################################################### ---echo ## Creating new connection test_con1 ## +SET @start_time= UNIX_TIMESTAMP(); +--echo connect (test_con1, localhost, root,,); connect (test_con1, localhost, root,,); connection test_con1; ---echo ## Setting value of variable to 5 ## -SET @@session.wait_timeout = 5; - ---echo ## Inserting record in table t1 ## -INSERT into t1(name) values('Record_1'); - ---echo ## Using sleep to check timeout ## -sleep 4; - - ---echo '#--------------------FN_DYNVARS_186_02-------------------------#' -####################################################################### -# Setting initial value of interactive_timeout greater than sleep and -# verifying its behavior on global scope -####################################################################### +# If not explicitly changed, @@session.wait_timeout equals @@global.wait_timeout. +SELECT @@session.wait_timeout = @@global.wait_timeout AS 'Expect 1'; ---echo ## Setting value of variable ## -SET @@global.wait_timeout = 5; +# Find a small value <> @@global.wait_timeout. +let $session_value = +`SELECT IF(@@global.wait_timeout <> 2 OR @@global.wait_timeout IS NULL, 2, 3)`; +--replace_result $session_value +eval SET @@session.wait_timeout = $session_value; ---echo ## Creating new connection test_con2 ## +--echo connect (test_con2, localhost, root,,); connect (test_con2, localhost, root,,); connection test_con2; -INSERT into t1(name) values('Record_2'); - ---echo ## Using sleep to check timeout ## -sleep 4; - +--replace_result $session_value +eval SET @@session.wait_timeout = $session_value - 1; +--echo connection default; +connection default; +--echo wait until connections ready +let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist; +--source include/wait_condition.inc +SELECT info FROM information_schema.processlist; --echo '#--------------------FN_DYNVARS_186_03-------------------------#' ####################################################################### -# Setting initial value of interactive_timeout less than sleep and -# verifying its behavior on global scope +# 2. test of scope global ####################################################################### ---echo ## Setting value of variable to 1 ## -SET @@global.wait_timeout = 1; +# Find a small value <> @@global.wait_timeout. +let $global_value = $session_value + 1; +--replace_result $global_value +eval SET @@global.wait_timeout= $global_value; ---echo ## Creating new connection ## +# Changing the @@global.wait_timeout has no influence on the +# @@session.wait_timeout of already established sessions. +SELECT @@session.wait_timeout = @start_value AS 'Expect 1'; + +--echo connect (test_con3, localhost, root,,); connect (test_con3, localhost, root,,); connection test_con3; -INSERT into t1(name) values('Record_3'); - ---echo ## Using sleep to check timeout ## -sleep 5; - ---echo ## We cannot test it further because the server stops due to wait_timeout ## ---Error 2006 -SELECT * from t1; +# If not explicitly changed, @@session.wait_timeout equals @@global.wait_timeout. +SELECT @@session.wait_timeout = @@global.wait_timeout AS 'Expect 1'; + +--echo connection default; +connection default; +# We can be sure that the connections test_con1 and test_con2 must be +# established because both have already executed a SET @@session.wait_timeout. +# This means they are or at least were visible within the processlist. +# Therefore we can now simply wait till both disappear from the processlist. +let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist; +--source include/wait_condition.inc +SELECT info FROM information_schema.processlist; + +--replace_result $global_value $session_value ; +eval SELECT UNIX_TIMESTAMP() - @start_time >= $global_value + $session_value; +SET @@global.wait_timeout= @start_value; -- cgit v1.2.1 From d082cf340ce870691e4c944c0cc0c85ce65223cc Mon Sep 17 00:00:00 2001 From: Matthias Leich Date: Fri, 21 Nov 2008 22:28:23 +0100 Subject: - Fix for Bug#39854 events_scheduling fails sporadically on pushbuild - restore original state of event_scheduler at the end of the test - minor fixes around comments, formatting --- mysql-test/r/events_scheduling.result | 9 +++++---- mysql-test/t/events_scheduling.test | 33 ++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/mysql-test/r/events_scheduling.result b/mysql-test/r/events_scheduling.result index b7d4578bede..63140bffaa4 100644 --- a/mysql-test/r/events_scheduling.result +++ b/mysql-test/r/events_scheduling.result @@ -1,7 +1,8 @@ CREATE DATABASE IF NOT EXISTS events_test; USE events_test; +SET @event_scheduler=@@global.event_scheduler; SET GLOBAL event_scheduler=OFF; -Try agian to make sure it's allowed +Try again to make sure it's allowed SET GLOBAL event_scheduler=OFF; SHOW VARIABLES LIKE 'event_scheduler'; Variable_name Value @@ -64,8 +65,8 @@ INSERT INTO table_4 VALUES (1); SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_1; IF(SUM(a) >= 4, 'OK', 'ERROR') OK -SELECT IF(SUM(a) >= 5, 'OK', 'ERROR') FROM table_2; -IF(SUM(a) >= 5, 'OK', 'ERROR') +SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_2; +IF(SUM(a) >= 4, 'OK', 'ERROR') OK SELECT IF(SUM(a) >= 1, 'OK', 'ERROR') FROM table_3; IF(SUM(a) >= 1, 'OK', 'ERROR') @@ -94,4 +95,4 @@ DROP TABLE table_2; DROP TABLE table_3; DROP TABLE table_4; DROP DATABASE events_test; -SET GLOBAL event_scheduler=OFF; +SET GLOBAL event_scheduler=@event_scheduler; diff --git a/mysql-test/t/events_scheduling.test b/mysql-test/t/events_scheduling.test index a5133166495..87cfa42e283 100644 --- a/mysql-test/t/events_scheduling.test +++ b/mysql-test/t/events_scheduling.test @@ -1,11 +1,12 @@ -# Can't test with embedded server that doesn't support grants +# Can't test with embedded server that doesn't support events -- source include/not_embedded.inc CREATE DATABASE IF NOT EXISTS events_test; USE events_test; +SET @event_scheduler=@@global.event_scheduler; SET GLOBAL event_scheduler=OFF; ---echo Try agian to make sure it's allowed +--echo Try again to make sure it's allowed SET GLOBAL event_scheduler=OFF; SHOW VARIABLES LIKE 'event_scheduler'; SET GLOBAL event_scheduler=1; @@ -57,34 +58,44 @@ ON COMPLETION PRESERVE DO INSERT INTO table_4 VALUES (1); +# Wait for the events to fire and check the data afterwards + # Let event_1 insert at least 4 records into the table let $wait_condition=select count(*) >= 4 from table_1; --source include/wait_condition.inc +# Minimum of passed time is 6 seconds assuming +# - event executions starts immediate after creation +# - 4 times event_1 means an insert at ect, ect+2, ect+4, ect+6 +# ect = event creation time -# Let event_2 reach the end of its execution interval +# Let event_2 reach the end of its execution interval let $wait_condition=select count(*) = 0 from information_schema.events where event_name='event_2' and status='enabled'; --source include/wait_condition.inc +# Minimum of passed time is 6 seconds. +# See wait_condition for event_1 above and ENDS condition for event_2. -# Let event_3, which is ON COMPLETION NOT PRESERVE execute and drop itself +# Let event_3, which is ON COMPLETION NOT PRESERVE execute and drop itself let $wait_condition=select count(*) = 0 from information_schema.events where event_name='event_3'; --source include/wait_condition.inc -# Let event_4 reach the end of its execution interval +# Let event_4 reach the end of its execution interval let $wait_condition=select count(*) = 0 from information_schema.events where event_name='event_4' and status='enabled'; --source include/wait_condition.inc -# Wait for the events to fire and check the data afterwards - let $wait_condition=SELECT SUM(a) >= 4 FROM table_1; source include/wait_condition.inc; SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_1; -let $wait_condition=SELECT SUM(a) >= 5 FROM table_2; +# In case of a testing box under heavy load it cannot be guaranteed that +# it is really often enough checked if event_2 has to be executed. +# -> Bug#39854 events_scheduling fails sporadically on pushbuild +# Therefore we lowered here the original expectation of 5 to 4. +let $wait_condition=SELECT SUM(a) >= 4 FROM table_2; source include/wait_condition.inc; -SELECT IF(SUM(a) >= 5, 'OK', 'ERROR') FROM table_2; +SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_2; let $wait_condition=SELECT SUM(a) >= 1 FROM table_3; source include/wait_condition.inc; @@ -112,9 +123,9 @@ DROP TABLE table_2; DROP TABLE table_3; DROP TABLE table_4; DROP DATABASE events_test; -SET GLOBAL event_scheduler=OFF; +SET GLOBAL event_scheduler=@event_scheduler; -# +# # End of tests # -- cgit v1.2.1 From 80a0a5793d7a7585e31d63b74cb583aee04b221e Mon Sep 17 00:00:00 2001 From: Matthias Leich Date: Fri, 21 Nov 2008 22:36:29 +0100 Subject: Fox for Bug#40889 funcs_1: wrong code within triggers_03e_db_level.inc causes warnings --- mysql-test/suite/funcs_1/triggers/triggers_03e_db_level.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/suite/funcs_1/triggers/triggers_03e_db_level.inc b/mysql-test/suite/funcs_1/triggers/triggers_03e_db_level.inc index e3012ed0ca0..e5933eb84a8 100644 --- a/mysql-test/suite/funcs_1/triggers/triggers_03e_db_level.inc +++ b/mysql-test/suite/funcs_1/triggers/triggers_03e_db_level.inc @@ -185,7 +185,7 @@ let $message= use db with trigger privilege on db level and without...:; select f1 from t1 order by f1; --disable_warnings disconnect no_privs; - --enable warnings + --enable_warnings connection yes_privs; select current_user; -- cgit v1.2.1 From f92c5731453fd73077bb4a8034a5c351d89f091f Mon Sep 17 00:00:00 2001 From: Ingo Struewing Date: Sat, 22 Nov 2008 00:22:21 +0100 Subject: Bug#28234 - global/session scope - documentation vs implementation Several system variables did not behave like system variables should do. When trying to SET them or use them in SELECT, they were reported as "unknown system variable". But they appeared in SHOW VARIABLES. This has been fixed by removing the "fixed_vars" array of variables and integrating the variables into the normal system variables chain. All of these variables do now behave as read-only global-only variables. Trying to SET them tells they are read-only, trying to SELECT the session value tells they are global only. Selecting the global value works. It delivers the same value as SHOW VARIABLES. mysql-test/r/variables-notembedded.result: Bug#28234 - global/session scope - documentation vs implementation New test result. mysql-test/r/variables.result: Bug#28234 - global/session scope - documentation vs implementation New test result. mysql-test/t/variables-notembedded.test: Bug#28234 - global/session scope - documentation vs implementation Added a test for each moved variable that is not present in an embedded server. mysql-test/t/variables.test: Bug#28234 - global/session scope - documentation vs implementation Added a test for each moved variable that is also present in an embedded server. sql/item_func.cc: Bug#28234 - global/session scope - documentation vs implementation Added SHOW_BOOL to some Item_func_get_system_var methods. sql/set_var.cc: Bug#28234 - global/session scope - documentation vs implementation Moved all variables from the "fixed_vars" array into the normal system variables chain by using the new variable class sys_var_const. Removed the fixed_show_vars array and its initialization in enumerate_sys_vars(). Removed mysql_append_static_vars(), which added fixed_vars arrays to the fixed_show_vars array. sql/set_var.h: Bug#28234 - global/session scope - documentation vs implementation Added the new system variable class sys_var_const. Removed declaration of mysql_append_static_vars(). sql/slave.cc: Bug#28234 - global/session scope - documentation vs implementation Moved the definition of show_slave_skip_errors() from sql_repl.cc to here and renamed it to print_slave_skip_errors(). Changed print_slave_skip_errors() to create a static buffer with a printable version of the error numbers set. Added a call of print_slave_skip_errors() to init_slave_skip_errors(). sql/slave.h: Bug#28234 - global/session scope - documentation vs implementation Added declaration of slave_skip_error_names. sql/sql_repl.cc: Bug#28234 - global/session scope - documentation vs implementation Moved all variables from the "fixed_vars" array into the normal system variables chain by using the new variable class sys_var_const. Moved the definition of show_slave_skip_errors() to slave.cc and modified it to compute the string once at server initialization only. Removed the call to mysql_append_static_vars(). --- mysql-test/r/variables-notembedded.result | 92 ++++++++ mysql-test/r/variables.result | 339 ++++++++++++++++++++++++++++++ mysql-test/t/variables-notembedded.test | 80 +++++++ mysql-test/t/variables.test | 296 ++++++++++++++++++++++++++ sql/item_func.cc | 10 + sql/set_var.cc | 226 ++++++++++++-------- sql/set_var.h | 29 ++- sql/slave.cc | 61 ++++++ sql/slave.h | 1 + sql/sql_repl.cc | 74 ++----- 10 files changed, 1063 insertions(+), 145 deletions(-) diff --git a/mysql-test/r/variables-notembedded.result b/mysql-test/r/variables-notembedded.result index 48a1719e2c7..571b6605674 100644 --- a/mysql-test/r/variables-notembedded.result +++ b/mysql-test/r/variables-notembedded.result @@ -15,3 +15,95 @@ slave_skip_errors 3,100,137,643,1752 ---- Clean Up ---- set global slave_net_timeout=default; set global sql_slave_skip_counter= 0; + +# +SHOW VARIABLES like 'log_slave_updates'; +Variable_name Value +log_slave_updates OFF +SELECT @@session.log_slave_updates; +ERROR HY000: Variable 'log_slave_updates' is a GLOBAL variable +SELECT @@global.log_slave_updates; +@@global.log_slave_updates +0 +SET @@session.log_slave_updates= true; +ERROR HY000: Variable 'log_slave_updates' is a read only variable +SET @@global.log_slave_updates= true; +ERROR HY000: Variable 'log_slave_updates' is a read only variable +# +SHOW VARIABLES like 'relay_log'; +Variable_name Value +relay_log +SELECT @@session.relay_log; +ERROR HY000: Variable 'relay_log' is a GLOBAL variable +SELECT @@global.relay_log; +@@global.relay_log +NULL +SET @@session.relay_log= 'x'; +ERROR HY000: Variable 'relay_log' is a read only variable +SET @@global.relay_log= 'x'; +ERROR HY000: Variable 'relay_log' is a read only variable +# +SHOW VARIABLES like 'relay_log_index'; +Variable_name Value +relay_log_index +SELECT @@session.relay_log_index; +ERROR HY000: Variable 'relay_log_index' is a GLOBAL variable +SELECT @@global.relay_log_index; +@@global.relay_log_index +NULL +SET @@session.relay_log_index= 'x'; +ERROR HY000: Variable 'relay_log_index' is a read only variable +SET @@global.relay_log_index= 'x'; +ERROR HY000: Variable 'relay_log_index' is a read only variable +# +SHOW VARIABLES like 'relay_log_info_file'; +Variable_name Value +relay_log_info_file relay-log.info +SELECT @@session.relay_log_info_file; +ERROR HY000: Variable 'relay_log_info_file' is a GLOBAL variable +SELECT @@global.relay_log_info_file; +@@global.relay_log_info_file +relay-log.info +SET @@session.relay_log_info_file= 'x'; +ERROR HY000: Variable 'relay_log_info_file' is a read only variable +SET @@global.relay_log_info_file= 'x'; +ERROR HY000: Variable 'relay_log_info_file' is a read only variable +# +SHOW VARIABLES like 'relay_log_space_limit'; +Variable_name Value +relay_log_space_limit 0 +SELECT @@session.relay_log_space_limit; +ERROR HY000: Variable 'relay_log_space_limit' is a GLOBAL variable +SELECT @@global.relay_log_space_limit; +@@global.relay_log_space_limit +0 +SET @@session.relay_log_space_limit= 7; +ERROR HY000: Variable 'relay_log_space_limit' is a read only variable +SET @@global.relay_log_space_limit= 7; +ERROR HY000: Variable 'relay_log_space_limit' is a read only variable +# +SHOW VARIABLES like 'slave_load_tmpdir'; +Variable_name Value +slave_load_tmpdir # +SELECT @@session.slave_load_tmpdir; +ERROR HY000: Variable 'slave_load_tmpdir' is a GLOBAL variable +SELECT @@global.slave_load_tmpdir; +@@global.slave_load_tmpdir +# +SET @@session.slave_load_tmpdir= 'x'; +ERROR HY000: Variable 'slave_load_tmpdir' is a read only variable +SET @@global.slave_load_tmpdir= 'x'; +ERROR HY000: Variable 'slave_load_tmpdir' is a read only variable +# +SHOW VARIABLES like 'slave_skip_errors'; +Variable_name Value +slave_skip_errors 3,100,137,643,1752 +SELECT @@session.slave_skip_errors; +ERROR HY000: Variable 'slave_skip_errors' is a GLOBAL variable +SELECT @@global.slave_skip_errors; +@@global.slave_skip_errors +3,100,137,643,1752 +SET @@session.slave_skip_errors= 7; +ERROR HY000: Variable 'slave_skip_errors' is a read only variable +SET @@global.slave_skip_errors= 7; +ERROR HY000: Variable 'slave_skip_errors' is a read only variable diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index c52f7f3578e..878416b4537 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -1011,3 +1011,342 @@ SET GLOBAL log_output = 0; ERROR 42000: Variable 'log_output' can't be set to the value of '0' # -- End of Bug#34820. + +# +SHOW VARIABLES like 'ft_max_word_len'; +Variable_name Value +ft_max_word_len 84 +SELECT @@session.ft_max_word_len; +ERROR HY000: Variable 'ft_max_word_len' is a GLOBAL variable +SELECT @@global.ft_max_word_len; +@@global.ft_max_word_len +84 +SET @@session.ft_max_word_len= 7; +ERROR HY000: Variable 'ft_max_word_len' is a read only variable +SET @@global.ft_max_word_len= 7; +ERROR HY000: Variable 'ft_max_word_len' is a read only variable +# +SHOW VARIABLES like 'ft_min_word_len'; +Variable_name Value +ft_min_word_len 4 +SELECT @@session.ft_min_word_len; +ERROR HY000: Variable 'ft_min_word_len' is a GLOBAL variable +SELECT @@global.ft_min_word_len; +@@global.ft_min_word_len +4 +SET @@session.ft_min_word_len= 7; +ERROR HY000: Variable 'ft_min_word_len' is a read only variable +SET @@global.ft_min_word_len= 7; +ERROR HY000: Variable 'ft_min_word_len' is a read only variable +# +SHOW VARIABLES like 'ft_query_expansion_limit'; +Variable_name Value +ft_query_expansion_limit 20 +SELECT @@session.ft_query_expansion_limit; +ERROR HY000: Variable 'ft_query_expansion_limit' is a GLOBAL variable +SELECT @@global.ft_query_expansion_limit; +@@global.ft_query_expansion_limit +20 +SET @@session.ft_query_expansion_limit= 7; +ERROR HY000: Variable 'ft_query_expansion_limit' is a read only variable +SET @@global.ft_query_expansion_limit= 7; +ERROR HY000: Variable 'ft_query_expansion_limit' is a read only variable +# +SHOW VARIABLES like 'ft_stopword_file'; +Variable_name Value +ft_stopword_file (built-in) +SELECT @@session.ft_stopword_file; +ERROR HY000: Variable 'ft_stopword_file' is a GLOBAL variable +SELECT @@global.ft_stopword_file; +@@global.ft_stopword_file +(built-in) +SET @@session.ft_stopword_file= 'x'; +ERROR HY000: Variable 'ft_stopword_file' is a read only variable +SET @@global.ft_stopword_file= 'x'; +ERROR HY000: Variable 'ft_stopword_file' is a read only variable +# +SHOW VARIABLES like 'back_log'; +Variable_name Value +back_log 50 +SELECT @@session.back_log; +ERROR HY000: Variable 'back_log' is a GLOBAL variable +SELECT @@global.back_log; +@@global.back_log +50 +SET @@session.back_log= 7; +ERROR HY000: Variable 'back_log' is a read only variable +SET @@global.back_log= 7; +ERROR HY000: Variable 'back_log' is a read only variable +# +SHOW VARIABLES like 'large_files_support'; +Variable_name Value +large_files_support # +SELECT @@session.large_files_support; +ERROR HY000: Variable 'large_files_support' is a GLOBAL variable +SELECT @@global.large_files_support; +@@global.large_files_support +# +SET @@session.large_files_support= true; +ERROR HY000: Variable 'large_files_support' is a read only variable +SET @@global.large_files_support= true; +ERROR HY000: Variable 'large_files_support' is a read only variable +# +SHOW VARIABLES like 'character_sets_dir'; +Variable_name Value +character_sets_dir # +SELECT @@session.character_sets_dir; +ERROR HY000: Variable 'character_sets_dir' is a GLOBAL variable +SELECT @@global.character_sets_dir; +@@global.character_sets_dir +# +SET @@session.character_sets_dir= 'x'; +ERROR HY000: Variable 'character_sets_dir' is a read only variable +SET @@global.character_sets_dir= 'x'; +ERROR HY000: Variable 'character_sets_dir' is a read only variable +# +SHOW VARIABLES like 'init_file'; +Variable_name Value +init_file # +SELECT @@session.init_file; +ERROR HY000: Variable 'init_file' is a GLOBAL variable +SELECT @@global.init_file; +@@global.init_file +# +SET @@session.init_file= 'x'; +ERROR HY000: Variable 'init_file' is a read only variable +SET @@global.init_file= 'x'; +ERROR HY000: Variable 'init_file' is a read only variable +# +SHOW VARIABLES like 'language'; +Variable_name Value +language # +SELECT @@session.language; +ERROR HY000: Variable 'language' is a GLOBAL variable +SELECT @@global.language; +@@global.language +# +SET @@session.language= 'x'; +ERROR HY000: Variable 'language' is a read only variable +SET @@global.language= 'x'; +ERROR HY000: Variable 'language' is a read only variable +# +SHOW VARIABLES like 'large_page_size'; +Variable_name Value +large_page_size # +SELECT @@session.large_page_size; +ERROR HY000: Variable 'large_page_size' is a GLOBAL variable +SELECT @@global.large_page_size; +@@global.large_page_size +# +SET @@session.large_page_size= 7; +ERROR HY000: Variable 'large_page_size' is a read only variable +SET @@global.large_page_size= 7; +ERROR HY000: Variable 'large_page_size' is a read only variable +# +SHOW VARIABLES like 'large_pages'; +Variable_name Value +large_pages # +SELECT @@session.large_pages; +ERROR HY000: Variable 'large_pages' is a GLOBAL variable +SELECT @@global.large_pages; +@@global.large_pages +# +SET @@session.large_pages= true; +ERROR HY000: Variable 'large_pages' is a read only variable +SET @@global.large_pages= true; +ERROR HY000: Variable 'large_pages' is a read only variable +# +SHOW VARIABLES like 'log_bin'; +Variable_name Value +log_bin OFF +SELECT @@session.log_bin; +ERROR HY000: Variable 'log_bin' is a GLOBAL variable +SELECT @@global.log_bin; +@@global.log_bin +0 +SET @@session.log_bin= true; +ERROR HY000: Variable 'log_bin' is a read only variable +SET @@global.log_bin= true; +ERROR HY000: Variable 'log_bin' is a read only variable +# +SHOW VARIABLES like 'log_error'; +Variable_name Value +log_error # +SELECT @@session.log_error; +ERROR HY000: Variable 'log_error' is a GLOBAL variable +SELECT @@global.log_error; +@@global.log_error +# +SET @@session.log_error= 'x'; +ERROR HY000: Variable 'log_error' is a read only variable +SET @@global.log_error= 'x'; +ERROR HY000: Variable 'log_error' is a read only variable +# +SHOW VARIABLES like 'lower_case_file_system'; +Variable_name Value +lower_case_file_system # +SELECT @@session.lower_case_file_system; +ERROR HY000: Variable 'lower_case_file_system' is a GLOBAL variable +SELECT @@global.lower_case_file_system; +@@global.lower_case_file_system +# +SET @@session.lower_case_file_system= true; +ERROR HY000: Variable 'lower_case_file_system' is a read only variable +SET @@global.lower_case_file_system= true; +ERROR HY000: Variable 'lower_case_file_system' is a read only variable +# +SHOW VARIABLES like 'lower_case_table_names'; +Variable_name Value +lower_case_table_names # +SELECT @@session.lower_case_table_names; +ERROR HY000: Variable 'lower_case_table_names' is a GLOBAL variable +SELECT @@global.lower_case_table_names; +@@global.lower_case_table_names +# +SET @@session.lower_case_table_names= 7; +ERROR HY000: Variable 'lower_case_table_names' is a read only variable +SET @@global.lower_case_table_names= 7; +ERROR HY000: Variable 'lower_case_table_names' is a read only variable +# +SHOW VARIABLES like 'myisam_recover_options'; +Variable_name Value +myisam_recover_options OFF +SELECT @@session.myisam_recover_options; +ERROR HY000: Variable 'myisam_recover_options' is a GLOBAL variable +SELECT @@global.myisam_recover_options; +@@global.myisam_recover_options +OFF +SET @@session.myisam_recover_options= 'x'; +ERROR HY000: Variable 'myisam_recover_options' is a read only variable +SET @@global.myisam_recover_options= 'x'; +ERROR HY000: Variable 'myisam_recover_options' is a read only variable +# +SHOW VARIABLES like 'open_files_limit'; +Variable_name Value +open_files_limit # +SELECT @@session.open_files_limit; +ERROR HY000: Variable 'open_files_limit' is a GLOBAL variable +SELECT @@global.open_files_limit; +@@global.open_files_limit +# +SET @@session.open_files_limit= 7; +ERROR HY000: Variable 'open_files_limit' is a read only variable +SET @@global.open_files_limit= 7; +ERROR HY000: Variable 'open_files_limit' is a read only variable +# +SHOW VARIABLES like 'pid_file'; +Variable_name Value +pid_file # +SELECT @@session.pid_file; +ERROR HY000: Variable 'pid_file' is a GLOBAL variable +SELECT @@global.pid_file; +@@global.pid_file +# +SET @@session.pid_file= 'x'; +ERROR HY000: Variable 'pid_file' is a read only variable +SET @@global.pid_file= 'x'; +ERROR HY000: Variable 'pid_file' is a read only variable +# +SHOW VARIABLES like 'plugin_dir'; +Variable_name Value +plugin_dir # +SELECT @@session.plugin_dir; +ERROR HY000: Variable 'plugin_dir' is a GLOBAL variable +SELECT @@global.plugin_dir; +@@global.plugin_dir +# +SET @@session.plugin_dir= 'x'; +ERROR HY000: Variable 'plugin_dir' is a read only variable +SET @@global.plugin_dir= 'x'; +ERROR HY000: Variable 'plugin_dir' is a read only variable +# +SHOW VARIABLES like 'port'; +Variable_name Value +port # +SELECT @@session.port; +ERROR HY000: Variable 'port' is a GLOBAL variable +SELECT @@global.port; +@@global.port +# +SET @@session.port= 7; +ERROR HY000: Variable 'port' is a read only variable +SET @@global.port= 7; +ERROR HY000: Variable 'port' is a read only variable +# +SHOW VARIABLES like 'protocol_version'; +Variable_name Value +protocol_version 10 +SELECT @@session.protocol_version; +ERROR HY000: Variable 'protocol_version' is a GLOBAL variable +SELECT @@global.protocol_version; +@@global.protocol_version +10 +SET @@session.protocol_version= 7; +ERROR HY000: Variable 'protocol_version' is a read only variable +SET @@global.protocol_version= 7; +ERROR HY000: Variable 'protocol_version' is a read only variable +# +SHOW VARIABLES like 'skip_external_locking'; +Variable_name Value +skip_external_locking ON +SELECT @@session.skip_external_locking; +ERROR HY000: Variable 'skip_external_locking' is a GLOBAL variable +SELECT @@global.skip_external_locking; +@@global.skip_external_locking +1 +SET @@session.skip_external_locking= true; +ERROR HY000: Variable 'skip_external_locking' is a read only variable +SET @@global.skip_external_locking= true; +ERROR HY000: Variable 'skip_external_locking' is a read only variable +# +SHOW VARIABLES like 'skip_networking'; +Variable_name Value +skip_networking OFF +SELECT @@session.skip_networking; +ERROR HY000: Variable 'skip_networking' is a GLOBAL variable +SELECT @@global.skip_networking; +@@global.skip_networking +0 +SET @@session.skip_networking= true; +ERROR HY000: Variable 'skip_networking' is a read only variable +SET @@global.skip_networking= true; +ERROR HY000: Variable 'skip_networking' is a read only variable +# +SHOW VARIABLES like 'skip_show_database'; +Variable_name Value +skip_show_database OFF +SELECT @@session.skip_show_database; +ERROR HY000: Variable 'skip_show_database' is a GLOBAL variable +SELECT @@global.skip_show_database; +@@global.skip_show_database +0 +SET @@session.skip_show_database= true; +ERROR HY000: Variable 'skip_show_database' is a read only variable +SET @@global.skip_show_database= true; +ERROR HY000: Variable 'skip_show_database' is a read only variable +# +SHOW VARIABLES like 'socket'; +Variable_name Value +socket # +SELECT @@session.socket; +ERROR HY000: Variable 'socket' is a GLOBAL variable +SELECT @@global.socket; +@@global.socket +# +SET @@session.socket= 'x'; +ERROR HY000: Variable 'socket' is a read only variable +SET @@global.socket= 'x'; +ERROR HY000: Variable 'socket' is a read only variable +# +SHOW VARIABLES like 'thread_stack'; +Variable_name Value +thread_stack # +SELECT @@session.thread_stack; +ERROR HY000: Variable 'thread_stack' is a GLOBAL variable +SELECT @@global.thread_stack; +@@global.thread_stack +# +SET @@session.thread_stack= 7; +ERROR HY000: Variable 'thread_stack' is a read only variable +SET @@global.thread_stack= 7; +ERROR HY000: Variable 'thread_stack' is a read only variable diff --git a/mysql-test/t/variables-notembedded.test b/mysql-test/t/variables-notembedded.test index 79011a89b36..823fecb8791 100644 --- a/mysql-test/t/variables-notembedded.test +++ b/mysql-test/t/variables-notembedded.test @@ -28,3 +28,83 @@ set global slave_net_timeout=default; # sql_slave_skip_counter is write-only, so we can't save previous # value and restore it here. That's ok, because it's normally 0. set global sql_slave_skip_counter= 0; + +# +# Bug#28234 - global/session scope - documentation vs implementation +# +--echo +# +# Additional variables fixed from sql_repl.cc. +# +--echo # +SHOW VARIABLES like 'log_slave_updates'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.log_slave_updates; +SELECT @@global.log_slave_updates; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.log_slave_updates= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.log_slave_updates= true; +# +--echo # +SHOW VARIABLES like 'relay_log'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.relay_log; +SELECT @@global.relay_log; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.relay_log= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.relay_log= 'x'; +# +--echo # +SHOW VARIABLES like 'relay_log_index'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.relay_log_index; +SELECT @@global.relay_log_index; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.relay_log_index= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.relay_log_index= 'x'; +# +--echo # +SHOW VARIABLES like 'relay_log_info_file'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.relay_log_info_file; +SELECT @@global.relay_log_info_file; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.relay_log_info_file= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.relay_log_info_file= 'x'; +# +--echo # +SHOW VARIABLES like 'relay_log_space_limit'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.relay_log_space_limit; +SELECT @@global.relay_log_space_limit; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.relay_log_space_limit= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.relay_log_space_limit= 7; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'slave_load_tmpdir'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.slave_load_tmpdir; +--replace_column 1 # +SELECT @@global.slave_load_tmpdir; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.slave_load_tmpdir= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.slave_load_tmpdir= 'x'; +# +--echo # +SHOW VARIABLES like 'slave_skip_errors'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.slave_skip_errors; +SELECT @@global.slave_skip_errors; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.slave_skip_errors= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.slave_skip_errors= 7; +# diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index e98436fa62c..1ef114b1a16 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -793,3 +793,299 @@ SET GLOBAL log_output = 0; --echo --echo # -- End of Bug#34820. +# +# Bug#28234 - global/session scope - documentation vs implementation +# +--echo +--echo # +SHOW VARIABLES like 'ft_max_word_len'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.ft_max_word_len; +SELECT @@global.ft_max_word_len; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.ft_max_word_len= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.ft_max_word_len= 7; +# +--echo # +SHOW VARIABLES like 'ft_min_word_len'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.ft_min_word_len; +SELECT @@global.ft_min_word_len; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.ft_min_word_len= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.ft_min_word_len= 7; +# +--echo # +SHOW VARIABLES like 'ft_query_expansion_limit'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.ft_query_expansion_limit; +SELECT @@global.ft_query_expansion_limit; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.ft_query_expansion_limit= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.ft_query_expansion_limit= 7; +# +--echo # +SHOW VARIABLES like 'ft_stopword_file'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.ft_stopword_file; +SELECT @@global.ft_stopword_file; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.ft_stopword_file= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.ft_stopword_file= 'x'; +# +# Additional variables fixed. +# +--echo # +SHOW VARIABLES like 'back_log'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.back_log; +SELECT @@global.back_log; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.back_log= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.back_log= 7; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'large_files_support'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.large_files_support; +--replace_column 1 # +SELECT @@global.large_files_support; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.large_files_support= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.large_files_support= true; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'character_sets_dir'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.character_sets_dir; +--replace_column 1 # +SELECT @@global.character_sets_dir; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.character_sets_dir= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.character_sets_dir= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'init_file'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.init_file; +--replace_column 1 # +SELECT @@global.init_file; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.init_file= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.init_file= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'language'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.language; +--replace_column 1 # +SELECT @@global.language; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.language= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.language= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'large_page_size'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.large_page_size; +--replace_column 1 # +SELECT @@global.large_page_size; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.large_page_size= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.large_page_size= 7; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'large_pages'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.large_pages; +--replace_column 1 # +SELECT @@global.large_pages; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.large_pages= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.large_pages= true; +# +--echo # +SHOW VARIABLES like 'log_bin'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.log_bin; +SELECT @@global.log_bin; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.log_bin= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.log_bin= true; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'log_error'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.log_error; +--replace_column 1 # +SELECT @@global.log_error; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.log_error= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.log_error= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'lower_case_file_system'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.lower_case_file_system; +--replace_column 1 # +SELECT @@global.lower_case_file_system; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.lower_case_file_system= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.lower_case_file_system= true; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'lower_case_table_names'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.lower_case_table_names; +--replace_column 1 # +SELECT @@global.lower_case_table_names; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.lower_case_table_names= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.lower_case_table_names= 7; +# +--echo # +SHOW VARIABLES like 'myisam_recover_options'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.myisam_recover_options; +SELECT @@global.myisam_recover_options; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.myisam_recover_options= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.myisam_recover_options= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'open_files_limit'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.open_files_limit; +--replace_column 1 # +SELECT @@global.open_files_limit; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.open_files_limit= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.open_files_limit= 7; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'pid_file'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.pid_file; +--replace_column 1 # +SELECT @@global.pid_file; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.pid_file= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.pid_file= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'plugin_dir'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.plugin_dir; +--replace_column 1 # +SELECT @@global.plugin_dir; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.plugin_dir= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.plugin_dir= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'port'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.port; +--replace_column 1 # +SELECT @@global.port; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.port= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.port= 7; +# +--echo # +SHOW VARIABLES like 'protocol_version'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.protocol_version; +SELECT @@global.protocol_version; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.protocol_version= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.protocol_version= 7; +# +--echo # +SHOW VARIABLES like 'skip_external_locking'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.skip_external_locking; +SELECT @@global.skip_external_locking; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.skip_external_locking= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.skip_external_locking= true; +# +--echo # +SHOW VARIABLES like 'skip_networking'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.skip_networking; +SELECT @@global.skip_networking; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.skip_networking= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.skip_networking= true; +# +--echo # +SHOW VARIABLES like 'skip_show_database'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.skip_show_database; +SELECT @@global.skip_show_database; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.skip_show_database= true; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.skip_show_database= true; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'socket'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.socket; +--replace_column 1 # +SELECT @@global.socket; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.socket= 'x'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.socket= 'x'; +# +--echo # +--replace_column 2 # +SHOW VARIABLES like 'thread_stack'; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.thread_stack; +--replace_column 1 # +SELECT @@global.thread_stack; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@session.thread_stack= 7; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET @@global.thread_stack= 7; +# diff --git a/sql/item_func.cc b/sql/item_func.cc index e117adc3cd0..edcb9776a2b 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -4855,6 +4855,7 @@ void Item_func_get_system_var::fix_length_and_dec() max_length= MAX_BLOB_WIDTH; decimals=NOT_FIXED_DEC; break; + case SHOW_BOOL: case SHOW_MY_BOOL: unsigned_flag= FALSE; max_length= 1; @@ -4882,6 +4883,7 @@ enum Item_result Item_func_get_system_var::result_type() const { switch (var->show_type()) { + case SHOW_BOOL: case SHOW_MY_BOOL: case SHOW_INT: case SHOW_LONG: @@ -4904,6 +4906,7 @@ enum_field_types Item_func_get_system_var::field_type() const { switch (var->show_type()) { + case SHOW_BOOL: case SHOW_MY_BOOL: case SHOW_INT: case SHOW_LONG: @@ -4922,6 +4925,10 @@ enum_field_types Item_func_get_system_var::field_type() const } +/* + Uses var, var_type, component, cache_present, used_query_id, thd, + cached_llval, null_value, cached_null_value +*/ #define get_sys_var_safe(type) \ do { \ type value; \ @@ -4975,6 +4982,7 @@ longlong Item_func_get_system_var::val_int() case SHOW_LONG: get_sys_var_safe (ulong); case SHOW_LONGLONG: get_sys_var_safe (longlong); case SHOW_HA_ROWS: get_sys_var_safe (ha_rows); + case SHOW_BOOL: get_sys_var_safe (bool); case SHOW_MY_BOOL: get_sys_var_safe (my_bool); case SHOW_DOUBLE: { @@ -5072,6 +5080,7 @@ String* Item_func_get_system_var::val_str(String* str) case SHOW_LONG: case SHOW_LONGLONG: case SHOW_HA_ROWS: + case SHOW_BOOL: case SHOW_MY_BOOL: str->set (val_int(), collation.collation); break; @@ -5164,6 +5173,7 @@ double Item_func_get_system_var::val_real() case SHOW_LONG: case SHOW_LONGLONG: case SHOW_HA_ROWS: + case SHOW_BOOL: case SHOW_MY_BOOL: cached_dval= (double) val_int(); cache_present|= GET_SYS_VAR_CACHE_DOUBLE; diff --git a/sql/set_var.cc b/sql/set_var.cc index 7d1acc8e4fb..07ab82c77e0 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -77,7 +77,6 @@ extern ulong ndb_report_thresh_binlog_mem_usage; extern CHARSET_INFO *character_set_filesystem; -static DYNAMIC_ARRAY fixed_show_vars; static HASH system_variable_hash; const char *bool_type_names[]= { "OFF", "ON", NullS }; @@ -174,6 +173,9 @@ sys_auto_increment_offset(&vars, "auto_increment_offset", static sys_var_bool_ptr sys_automatic_sp_privileges(&vars, "automatic_sp_privileges", &sp_automatic_privileges); +static sys_var_const sys_back_log(&vars, "back_log", + OPT_GLOBAL, SHOW_LONG, + (uchar*) &back_log); static sys_var_const_str sys_basedir(&vars, "basedir", mysql_home); static sys_var_long_ptr sys_binlog_cache_size(&vars, "binlog_cache_size", &binlog_cache_size); @@ -181,6 +183,11 @@ static sys_var_thd_binlog_format sys_binlog_format(&vars, "binlog_format", &SV::binlog_format); static sys_var_thd_ulong sys_bulk_insert_buff_size(&vars, "bulk_insert_buffer_size", &SV::bulk_insert_buff_size); +static sys_var_const sys_character_sets_dir(&vars, + "character_sets_dir", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) + mysql_charsets_dir); static sys_var_character_set_sv sys_character_set_server(&vars, "character_set_server", &SV::collation_server, &default_charset_info, 0, @@ -249,14 +256,31 @@ static sys_var_long_ptr sys_expire_logs_days(&vars, "expire_logs_days", &expire_logs_days); static sys_var_bool_ptr sys_flush(&vars, "flush", &myisam_flush); static sys_var_long_ptr sys_flush_time(&vars, "flush_time", &flush_time); -static sys_var_str sys_ft_boolean_syntax(&vars, "ft_boolean_syntax", - sys_check_ftb_syntax, - sys_update_ftb_syntax, - sys_default_ftb_syntax, - ft_boolean_syntax); +static sys_var_str sys_ft_boolean_syntax(&vars, "ft_boolean_syntax", + sys_check_ftb_syntax, + sys_update_ftb_syntax, + sys_default_ftb_syntax, + ft_boolean_syntax); +static sys_var_const sys_ft_max_word_len(&vars, "ft_max_word_len", + OPT_GLOBAL, SHOW_LONG, + (uchar*) &ft_max_word_len); +static sys_var_const sys_ft_min_word_len(&vars, "ft_min_word_len", + OPT_GLOBAL, SHOW_LONG, + (uchar*) &ft_min_word_len); +static sys_var_const sys_ft_query_expansion_limit(&vars, + "ft_query_expansion_limit", + OPT_GLOBAL, SHOW_LONG, + (uchar*) + &ft_query_expansion_limit); +static sys_var_const sys_ft_stopword_file(&vars, "ft_stopword_file", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &ft_stopword_file); sys_var_str sys_init_connect(&vars, "init_connect", 0, sys_update_init_connect, sys_default_init_connect,0); +static sys_var_const sys_init_file(&vars, "init_file", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &opt_init_file); sys_var_str sys_init_slave(&vars, "init_slave", 0, sys_update_init_slave, sys_default_init_slave,0); @@ -274,14 +298,37 @@ static sys_var_key_cache_long sys_key_cache_division_limit(&vars, "key_cache_div static sys_var_key_cache_long sys_key_cache_age_threshold(&vars, "key_cache_age_threshold", offsetof(KEY_CACHE, param_age_threshold)); +static sys_var_const sys_language(&vars, "language", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) language); +static sys_var_const sys_large_files_support(&vars, "large_files_support", + OPT_GLOBAL, SHOW_BOOL, + (uchar*) &opt_large_files); +static sys_var_const sys_large_page_size(&vars, "large_page_size", + OPT_GLOBAL, SHOW_INT, + (uchar*) &opt_large_page_size); +static sys_var_const sys_large_pages(&vars, "large_pages", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) &opt_large_pages); static sys_var_bool_ptr sys_local_infile(&vars, "local_infile", &opt_local_infile); +#ifdef HAVE_MLOCKALL +static sys_var_const sys_locked_in_memory(&vars, "locked_in_memory", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) &locked_in_memory); +#endif +static sys_var_const sys_log_bin(&vars, "log_bin", + OPT_GLOBAL, SHOW_BOOL, + (uchar*) &opt_bin_log); static sys_var_trust_routine_creators sys_trust_routine_creators(&vars, "log_bin_trust_routine_creators", &trust_function_creators); static sys_var_bool_ptr sys_trust_function_creators(&vars, "log_bin_trust_function_creators", &trust_function_creators); +static sys_var_const sys_log_error(&vars, "log_error", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) log_error_file); static sys_var_bool_ptr sys_log_queries_not_using_indexes(&vars, "log_queries_not_using_indexes", &opt_log_queries_not_using_indexes); @@ -296,6 +343,16 @@ static sys_var_thd_bool sys_sql_low_priority_updates(&vars, "sql_low_priority_up &SV::low_priority_updates, fix_low_priority_updates); #endif +static sys_var_const sys_lower_case_file_system(&vars, + "lower_case_file_system", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) + &lower_case_file_system); +static sys_var_const sys_lower_case_table_names(&vars, + "lower_case_table_names", + OPT_GLOBAL, SHOW_INT, + (uchar*) + &lower_case_table_names); static sys_var_thd_ulong_session_readonly sys_max_allowed_packet(&vars, "max_allowed_packet", &SV::max_allowed_packet); static sys_var_long_ptr sys_max_binlog_cache_size(&vars, "max_binlog_cache_size", @@ -359,6 +416,10 @@ static sys_var_thd_ulong sys_multi_range_count(&vars, "multi_range_count", static sys_var_long_ptr sys_myisam_data_pointer_size(&vars, "myisam_data_pointer_size", &myisam_data_pointer_size); static sys_var_thd_ulonglong sys_myisam_max_sort_file_size(&vars, "myisam_max_sort_file_size", &SV::myisam_max_sort_file_size, fix_myisam_max_sort_file_size, 1); +static sys_var_const sys_myisam_recover_options(&vars, "myisam_recover_options", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) + &myisam_recover_options_str); static sys_var_thd_ulong sys_myisam_repair_threads(&vars, "myisam_repair_threads", &SV::myisam_repair_threads); static sys_var_thd_ulong sys_myisam_sort_buffer_size(&vars, "myisam_sort_buffer_size", &SV::myisam_sort_buff_size); static sys_var_bool_ptr sys_myisam_use_mmap(&vars, "myisam_use_mmap", @@ -369,6 +430,13 @@ static sys_var_thd_enum sys_myisam_stats_method(&vars, "myisam_stats_met &myisam_stats_method_typelib, NULL); +#ifdef __NT__ +/* purecov: begin inspected */ +static sys_var_const sys_named_pipe(&vars, "named_pipe", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) &opt_enable_named_pipe); +/* purecov: end */ +#endif static sys_var_thd_ulong_session_readonly sys_net_buffer_length(&vars, "net_buffer_length", &SV::net_buffer_length); static sys_var_thd_ulong sys_net_read_timeout(&vars, "net_read_timeout", @@ -387,12 +455,29 @@ static sys_var_bool_ptr_readonly sys_old_mode(&vars, "old", sys_var_thd_bool sys_old_alter_table(&vars, "old_alter_table", &SV::old_alter_table); sys_var_thd_bool sys_old_passwords(&vars, "old_passwords", &SV::old_passwords); +static sys_var_const sys_open_files_limit(&vars, "open_files_limit", + OPT_GLOBAL, SHOW_LONG, + (uchar*) + &open_files_limit); static sys_var_thd_ulong sys_optimizer_prune_level(&vars, "optimizer_prune_level", &SV::optimizer_prune_level); static sys_var_thd_ulong sys_optimizer_search_depth(&vars, "optimizer_search_depth", &SV::optimizer_search_depth); +static sys_var_const sys_pid_file(&vars, "pid_file", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) pidfile_name); +static sys_var_const sys_plugin_dir(&vars, "plugin_dir", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) opt_plugin_dir); +static sys_var_const sys_port(&vars, "port", + OPT_GLOBAL, SHOW_INT, + (uchar*) &mysqld_port); static sys_var_thd_ulong sys_preload_buff_size(&vars, "preload_buffer_size", &SV::preload_buff_size); +static sys_var_const sys_protocol_version(&vars, "protocol_version", + OPT_GLOBAL, SHOW_INT, + (uchar*) + &protocol_version); static sys_var_thd_ulong sys_read_buff_size(&vars, "read_buffer_size", &SV::read_buff_size); static sys_var_opt_readonly sys_readonly(&vars, "read_only", &opt_readonly); @@ -414,6 +499,45 @@ static sys_var_thd_ulong sys_query_alloc_block_size(&vars, "query_alloc_block_si static sys_var_thd_ulong sys_query_prealloc_size(&vars, "query_prealloc_size", &SV::query_prealloc_size, 0, fix_thd_mem_root); +#ifdef HAVE_SMEM +/* purecov: begin tested */ +static sys_var_const sys_shared_memory(&vars, "shared_memory", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) + &opt_enable_shared_memory); +static sys_var_const sys_shared_memory_base_name(&vars, + "shared_memory_base_name", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) + &shared_memory_base_name); +/* purecov: end */ +#endif +static sys_var_const sys_skip_external_locking(&vars, + "skip_external_locking", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) + &my_disable_locking); +static sys_var_const sys_skip_networking(&vars, "skip_networking", + OPT_GLOBAL, SHOW_BOOL, + (uchar*) &opt_disable_networking); +static sys_var_const sys_skip_show_database(&vars, "skip_show_database", + OPT_GLOBAL, SHOW_BOOL, + (uchar*) &opt_skip_show_db); +#ifdef HAVE_SYS_UN_H +static sys_var_const sys_socket(&vars, "socket", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &mysqld_unix_port); +#endif +#ifdef HAVE_THR_SETCONCURRENCY +/* purecov: begin tested */ +static sys_var_const sys_thread_concurrency(&vars, "thread_concurrency", + OPT_GLOBAL, SHOW_LONG, + (uchar*) &concurrency); +/* purecov: end */ +#endif +static sys_var_const sys_thread_stack(&vars, "thread_stack", + OPT_GLOBAL, SHOW_LONG, + (uchar*) &my_thread_stack_size); static sys_var_readonly sys_tmpdir(&vars, "tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir); static sys_var_thd_ulong sys_trans_alloc_block_size(&vars, "transaction_alloc_block_size", &SV::trans_alloc_block_size, @@ -764,59 +888,6 @@ static sys_var_log_output sys_var_log_output_state(&vars, "log_output", &log_out &log_output_typelib, 0); -/* - Additional variables (not derived from sys_var class, not accessible as - @@varname in SELECT or SET). Sorted in alphabetical order to facilitate - maintenance - SHOW VARIABLES will sort its output. - TODO: remove this list completely -*/ - -#define FIXED_VARS_SIZE (sizeof(fixed_vars) / sizeof(SHOW_VAR)) -static SHOW_VAR fixed_vars[]= { - {"back_log", (char*) &back_log, SHOW_LONG}, - {"character_sets_dir", mysql_charsets_dir, SHOW_CHAR}, - {"ft_max_word_len", (char*) &ft_max_word_len, SHOW_LONG}, - {"ft_min_word_len", (char*) &ft_min_word_len, SHOW_LONG}, - {"ft_query_expansion_limit",(char*) &ft_query_expansion_limit, SHOW_LONG}, - {"ft_stopword_file", (char*) &ft_stopword_file, SHOW_CHAR_PTR}, - {"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR}, - {"language", language, SHOW_CHAR}, - {"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, - {"large_page_size", (char*) &opt_large_page_size, SHOW_INT}, - {"large_pages", (char*) &opt_large_pages, SHOW_MY_BOOL}, -#ifdef HAVE_MLOCKALL - {"locked_in_memory", (char*) &locked_in_memory, SHOW_MY_BOOL}, -#endif - {"log_bin", (char*) &opt_bin_log, SHOW_BOOL}, - {"log_error", (char*) log_error_file, SHOW_CHAR}, - {"lower_case_file_system", (char*) &lower_case_file_system, SHOW_MY_BOOL}, - {"lower_case_table_names", (char*) &lower_case_table_names, SHOW_INT}, - {"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR}, -#ifdef __NT__ - {"named_pipe", (char*) &opt_enable_named_pipe, SHOW_MY_BOOL}, -#endif - {"open_files_limit", (char*) &open_files_limit, SHOW_LONG}, - {"pid_file", (char*) pidfile_name, SHOW_CHAR}, - {"plugin_dir", (char*) opt_plugin_dir, SHOW_CHAR}, - {"port", (char*) &mysqld_port, SHOW_INT}, - {"protocol_version", (char*) &protocol_version, SHOW_INT}, -#ifdef HAVE_SMEM - {"shared_memory", (char*) &opt_enable_shared_memory, SHOW_MY_BOOL}, - {"shared_memory_base_name", (char*) &shared_memory_base_name, SHOW_CHAR_PTR}, -#endif - {"skip_external_locking", (char*) &my_disable_locking, SHOW_MY_BOOL}, - {"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL}, - {"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL}, -#ifdef HAVE_SYS_UN_H - {"socket", (char*) &mysqld_unix_port, SHOW_CHAR_PTR}, -#endif -#ifdef HAVE_THR_SETCONCURRENCY - {"thread_concurrency", (char*) &concurrency, SHOW_LONG}, -#endif - {"thread_stack", (char*) &my_thread_stack_size, SHOW_LONG}, -}; - - bool sys_var::check(THD *thd, set_var *var) { var->save_result.ulonglong_value= var->value->val_int(); @@ -3135,14 +3206,12 @@ static int show_cmp(SHOW_VAR *a, SHOW_VAR *b) SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted) { int count= system_variable_hash.records, i; - int fixed_count= fixed_show_vars.elements; - int size= sizeof(SHOW_VAR) * (count + fixed_count + 1); + int size= sizeof(SHOW_VAR) * (count + 1); SHOW_VAR *result= (SHOW_VAR*) thd->alloc(size); if (result) { - SHOW_VAR *show= result + fixed_count; - memcpy(result, fixed_show_vars.buffer, fixed_count * sizeof(SHOW_VAR)); + SHOW_VAR *show= result; for (i= 0; i < count; i++) { @@ -3155,7 +3224,7 @@ SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted) /* sort into order */ if (sorted) - my_qsort(result, count + fixed_count, sizeof(SHOW_VAR), + my_qsort(result, count, sizeof(SHOW_VAR), (qsort_cmp) show_cmp); /* make last element empty */ @@ -3183,13 +3252,6 @@ int set_var_init() for (sys_var *var=vars.first; var; var= var->next, count++); - if (my_init_dynamic_array(&fixed_show_vars, sizeof(SHOW_VAR), - FIXED_VARS_SIZE + 64, 64)) - goto error; - - fixed_show_vars.elements= FIXED_VARS_SIZE; - memcpy(fixed_show_vars.buffer, fixed_vars, sizeof(fixed_vars)); - if (hash_init(&system_variable_hash, system_charset_info, count, 0, 0, (hash_get_key) get_sys_var_length, 0, HASH_UNIQUE)) goto error; @@ -3217,28 +3279,6 @@ error: void set_var_free() { hash_free(&system_variable_hash); - delete_dynamic(&fixed_show_vars); -} - - -/* - Add elements to the dynamic list of read-only system variables. - - SYNOPSIS - mysql_append_static_vars() - show_vars Pointer to start of array - count Number of elements - - RETURN VALUES - 0 SUCCESS - otherwise FAILURE -*/ -int mysql_append_static_vars(const SHOW_VAR *show_vars, uint count) -{ - for (; count > 0; count--, show_vars++) - if (insert_dynamic(&fixed_show_vars, (uchar*) show_vars)) - return 1; - return 0; } diff --git a/sql/set_var.h b/sql/set_var.h index ab819694e09..6b62d62706e 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -929,6 +929,34 @@ public: }; +/** + Global-only, read-only variable. E.g. command line option. +*/ + +class sys_var_const: public sys_var +{ +public: + enum_var_type var_type; + SHOW_TYPE show_type_value; + uchar *ptr; + sys_var_const(sys_var_chain *chain, const char *name_arg, enum_var_type type, + SHOW_TYPE show_type_arg, uchar *ptr_arg) + :sys_var(name_arg), var_type(type), + show_type_value(show_type_arg), ptr(ptr_arg) + { chain_sys_var(chain); } + bool update(THD *thd, set_var *var) { return 1; } + bool check_default(enum_var_type type) { return 1; } + bool check_type(enum_var_type type) { return type != var_type; } + bool check_update_type(Item_result type) { return 1; } + uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base) + { + return ptr; + } + SHOW_TYPE show_type() { return show_type_value; } + bool is_readonly() const { return 1; } +}; + + class sys_var_have_option: public sys_var { protected: @@ -1317,7 +1345,6 @@ struct sys_var_with_base int set_var_init(); void set_var_free(); -int mysql_append_static_vars(const SHOW_VAR *show_vars, uint count); SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted); int mysql_add_sys_var_chain(sys_var *chain, struct my_option *long_options); int mysql_del_sys_var_chain(sys_var *chain); diff --git a/sql/slave.cc b/sql/slave.cc index 0040b69f8de..6708f2ddd60 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -49,6 +49,7 @@ #define MAX_SLAVE_RETRY_PAUSE 5 bool use_slave_mask = 0; MY_BITMAP slave_error_mask; +char slave_skip_error_names[SHOW_VAR_FUNC_BUFF_SIZE]; typedef bool (*CHECK_KILLED_FUNC)(THD*,void*); @@ -275,6 +276,64 @@ err: } +/** + Convert slave skip errors bitmap into a printable string. +*/ + +static void print_slave_skip_errors(void) +{ + /* + To be safe, we want 10 characters of room in the buffer for a number + plus terminators. Also, we need some space for constant strings. + 10 characters must be sufficient for a number plus {',' | '...'} + plus a NUL terminator. That is a max 6 digit number. + */ + const int MIN_ROOM= 10; + DBUG_ENTER("print_slave_skip_errors"); + DBUG_ASSERT(sizeof(slave_skip_error_names) > MIN_ROOM); + DBUG_ASSERT(MAX_SLAVE_ERROR <= 999999); // 6 digits + + if (!use_slave_mask || bitmap_is_clear_all(&slave_error_mask)) + { + /* purecov: begin tested */ + memcpy(slave_skip_error_names, STRING_WITH_LEN("OFF")); + /* purecov: end */ + } + else if (bitmap_is_set_all(&slave_error_mask)) + { + /* purecov: begin tested */ + memcpy(slave_skip_error_names, STRING_WITH_LEN("ALL")); + /* purecov: end */ + } + else + { + char *buff= slave_skip_error_names; + char *bend= buff + sizeof(slave_skip_error_names); + int errnum; + + for (errnum= 1; errnum < MAX_SLAVE_ERROR; errnum++) + { + if (bitmap_is_set(&slave_error_mask, errnum)) + { + if (buff + MIN_ROOM >= bend) + break; /* purecov: tested */ + buff= int10_to_str(errnum, buff, 10); + *buff++= ','; + } + } + if (buff != slave_skip_error_names) + buff--; // Remove last ',' + if (errnum < MAX_SLAVE_ERROR) + { + /* Couldn't show all errors */ + buff= strmov(buff, "..."); /* purecov: tested */ + } + *buff=0; + } + DBUG_PRINT("init", ("error_names: '%s'", slave_skip_error_names)); + DBUG_VOID_RETURN; +} + /* Init function to set up array for errors that should be skipped for slave @@ -314,6 +373,8 @@ void init_slave_skip_errors(const char* arg) while (!my_isdigit(system_charset_info,*p) && *p) p++; } + /* Convert slave skip errors bitmap into a printable string. */ + print_slave_skip_errors(); DBUG_VOID_RETURN; } diff --git a/sql/slave.h b/sql/slave.h index dc2d668c97b..abd63315e62 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -98,6 +98,7 @@ class Master_info; extern ulong master_retry_count; extern MY_BITMAP slave_error_mask; +extern char slave_skip_error_names[]; extern bool use_slave_mask; extern char *slave_load_tmpdir; extern char *master_info_file, *relay_log_info_file; diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 932b7a67b4d..eac7a50417a 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1660,64 +1660,38 @@ public: static sys_var_chain vars = { NULL, NULL }; +static sys_var_const sys_log_slave_updates(&vars, "log_slave_updates", + OPT_GLOBAL, SHOW_MY_BOOL, + (uchar*) &opt_log_slave_updates); +static sys_var_const sys_relay_log(&vars, "relay_log", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &opt_relay_logname); +static sys_var_const sys_relay_log_index(&vars, "relay_log_index", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &opt_relaylog_index_name); +static sys_var_const sys_relay_log_info_file(&vars, "relay_log_info_file", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &relay_log_info_file); static sys_var_bool_ptr sys_relay_log_purge(&vars, "relay_log_purge", &relay_log_purge); +static sys_var_const sys_relay_log_space_limit(&vars, + "relay_log_space_limit", + OPT_GLOBAL, SHOW_LONGLONG, + (uchar*) + &relay_log_space_limit); +static sys_var_const sys_slave_load_tmpdir(&vars, "slave_load_tmpdir", + OPT_GLOBAL, SHOW_CHAR_PTR, + (uchar*) &slave_load_tmpdir); static sys_var_long_ptr sys_slave_net_timeout(&vars, "slave_net_timeout", &slave_net_timeout); +static sys_var_const sys_slave_skip_errors(&vars, "slave_skip_errors", + OPT_GLOBAL, SHOW_CHAR, + (uchar*) slave_skip_error_names); static sys_var_long_ptr sys_slave_trans_retries(&vars, "slave_transaction_retries", &slave_trans_retries); static sys_var_sync_binlog_period sys_sync_binlog_period(&vars, "sync_binlog", &sync_binlog_period); static sys_var_slave_skip_counter sys_slave_skip_counter(&vars, "sql_slave_skip_counter"); -static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff); - - -static SHOW_VAR fixed_vars[]= { - {"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_MY_BOOL}, - {"relay_log" , (char*) &opt_relay_logname, SHOW_CHAR_PTR}, - {"relay_log_index", (char*) &opt_relaylog_index_name, SHOW_CHAR_PTR}, - {"relay_log_info_file", (char*) &relay_log_info_file, SHOW_CHAR_PTR}, - {"relay_log_space_limit", (char*) &relay_log_space_limit, SHOW_LONGLONG}, - {"slave_load_tmpdir", (char*) &slave_load_tmpdir, SHOW_CHAR_PTR}, - {"slave_skip_errors", (char*) &show_slave_skip_errors, SHOW_FUNC}, -}; - -static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff) -{ - var->type=SHOW_CHAR; - var->value= buff; - if (!use_slave_mask || bitmap_is_clear_all(&slave_error_mask)) - { - var->value= const_cast("OFF"); - } - else if (bitmap_is_set_all(&slave_error_mask)) - { - var->value= const_cast("ALL"); - } - else - { - /* 10 is enough assuming errors are max 4 digits */ - int i; - var->value= buff; - for (i= 1; - i < MAX_SLAVE_ERROR && - (buff - var->value) < SHOW_VAR_FUNC_BUFF_SIZE; - i++) - { - if (bitmap_is_set(&slave_error_mask, i)) - { - buff= int10_to_str(i, buff, 10); - *buff++= ','; - } - } - if (var->value != buff) - buff--; // Remove last ',' - if (i < MAX_SLAVE_ERROR) - buff= strmov(buff, "..."); // Couldn't show all errors - *buff=0; - } - return 0; -} bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) { @@ -1765,8 +1739,6 @@ bool sys_var_sync_binlog_period::update(THD *thd, set_var *var) int init_replication_sys_vars() { - mysql_append_static_vars(fixed_vars, sizeof(fixed_vars) / sizeof(SHOW_VAR)); - if (mysql_add_sys_var_chain(vars.first, my_long_options)) { /* should not happen */ -- cgit v1.2.1 From d795963cba42fefd57a788eb1112bfc4cc13f6d3 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Mon, 24 Nov 2008 17:30:47 +0200 Subject: Bug #39656: Behaviour different for agg functions with & without where - ONLY_FULL_GROUP_BY The check for non-aggregated columns in queries with aggregate function, but without GROUP BY was treating all the parts of the query as if they are in the SELECT list. Fixed by ignoring the non-aggregated fields in the WHERE clause. mysql-test/r/func_group.result: Bug #39656: test case mysql-test/t/func_group.test: Bug #39656: test case sql/sql_select.cc: Bug #39656: ignore the new non-aggregated column refs in a WHERE by saving the state so far and then adding only the new values of the other parts of the bitmask. --- mysql-test/r/func_group.result | 23 +++++++++++++++++++++++ mysql-test/t/func_group.test | 29 +++++++++++++++++++++++++++++ sql/sql_select.cc | 10 ++++++++++ 3 files changed, 62 insertions(+) diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index 772e432355b..a7f4c58f4af 100644 --- a/mysql-test/r/func_group.result +++ b/mysql-test/r/func_group.result @@ -1425,4 +1425,27 @@ SELECT AVG(a), CAST(AVG(a) AS DECIMAL) FROM t1; AVG(a) CAST(AVG(a) AS DECIMAL) 15 15 DROP TABLE t1; +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1,1), (1,2), (1,3); +SET SQL_MODE='ONLY_FULL_GROUP_BY'; +SELECT COUNT(*) FROM t1; +COUNT(*) +3 +SELECT COUNT(*) FROM t1 where a=1; +COUNT(*) +3 +SELECT COUNT(*),a FROM t1; +ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause +SELECT COUNT(*) FROM t1 a JOIN t1 b ON a.a= b.a; +COUNT(*) +9 +SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a) +FROM t1 outr; +ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause +SELECT COUNT(*) FROM t1 a JOIN t1 outr +ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a); +COUNT(*) +0 +SET SQL_MODE=default; +DROP TABLE t1; End of 5.0 tests diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test index dbe6d3113d5..38779ac1a2f 100644 --- a/mysql-test/t/func_group.test +++ b/mysql-test/t/func_group.test @@ -926,5 +926,34 @@ SELECT AVG(a), CAST(AVG(a) AS DECIMAL) FROM t1; DROP TABLE t1; +# +# Bug #39656: Behaviour different for agg functions with & without where - +# ONLY_FULL_GROUP_BY +# + +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1,1), (1,2), (1,3); + +SET SQL_MODE='ONLY_FULL_GROUP_BY'; + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t1 where a=1; + +--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS +SELECT COUNT(*),a FROM t1; + +SELECT COUNT(*) FROM t1 a JOIN t1 b ON a.a= b.a; + +--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS +SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a) + FROM t1 outr; + +SELECT COUNT(*) FROM t1 a JOIN t1 outr + ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a); + +SET SQL_MODE=default; +DROP TABLE t1; + + ### --echo End of 5.0 tests diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 428d1709f94..2ac33c4e07f 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -390,11 +390,21 @@ inline int setup_without_group(THD *thd, Item **ref_pointer_array, { int res; nesting_map save_allow_sum_func=thd->lex->allow_sum_func ; + /* + Need to save the value, so we can turn off only the new NON_AGG_FIELD + additions coming from the WHERE + */ + uint8 saved_flag= thd->lex->current_select->full_group_by_flag; DBUG_ENTER("setup_without_group"); thd->lex->allow_sum_func&= ~(1 << thd->lex->current_select->nest_level); res= setup_conds(thd, tables, leaves, conds); + /* it's not wrong to have non-aggregated columns in a WHERE */ + if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY) + thd->lex->current_select->full_group_by_flag= saved_flag | + (thd->lex->current_select->full_group_by_flag & ~NON_AGG_FIELD_USED); + thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level; res= res || setup_order(thd, ref_pointer_array, tables, fields, all_fields, order); -- cgit v1.2.1 From d5057740a02cb4d6fbd63ea8e37d40d328c046d4 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Mon, 24 Nov 2008 17:24:03 +0100 Subject: Bug#40954: Crash in MyISAM index code with concurrency test using partitioned tables Problem was usage of read_range_first with an empty key. Solution was to not to give a key if it was empty. mysql-test/r/partition.result: Bug#40954: Crash in MyISAM index code with concurrency test using partitioned tables Updated test result. mysql-test/t/partition.test: Bug#40954: Crash in MyISAM index code with concurrency test using partitioned tables Added test case --- mysql-test/r/partition.result | 12 ++++++++++++ mysql-test/t/partition.test | 15 +++++++++++++++ sql/ha_partition.cc | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index adb055dd5e5..93684ba05e5 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -1,4 +1,16 @@ drop table if exists t1, t2; +CREATE TABLE t1 ( +pk INT NOT NULL AUTO_INCREMENT, +PRIMARY KEY (pk) +) +/*!50100 PARTITION BY HASH (pk) +PARTITIONS 2 */; +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1 WHERE pk < 0 ORDER BY pk; +pk +DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL, KEY(a)) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (200), PARTITION pmax VALUES LESS THAN MAXVALUE); diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index e8df2b01a94..6a12e4a4d12 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -14,6 +14,21 @@ drop table if exists t1, t2; --enable_warnings +# +# Bug#40954: Crash if range search and order by. +# +CREATE TABLE t1 ( + pk INT NOT NULL AUTO_INCREMENT, + PRIMARY KEY (pk) +) +/*!50100 PARTITION BY HASH (pk) +PARTITIONS 2 */; +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1 WHERE pk < 0 ORDER BY pk; +DROP TABLE t1; + # # Bug#40494: Crash MYSQL server crashes on range access with partitioning # and order by diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index a1131a99fa4..0c96b06381c 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -4490,7 +4490,8 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order) This can only read record to table->record[0], as it was set when the table was being opened. We have to memcpy data ourselves. */ - error= file->read_range_first(&m_start_key, end_range, eq_range, TRUE); + error= file->read_range_first(m_start_key.key? &m_start_key: NULL, + end_range, eq_range, TRUE); memcpy(rec_buf_ptr, table->record[0], m_rec_length); reverse_order= FALSE; break; -- cgit v1.2.1 From 2578609322e891f78c9d2807a9533e68c36cef52 Mon Sep 17 00:00:00 2001 From: Patrick Crews Date: Mon, 24 Nov 2008 16:53:32 -0500 Subject: Bug#40866: mysql-test-run's check of tests provides false failures due to timestamp Altering how MTR checks global variable status to exclude timestamp Changed SQL statements to update style. --- mysql-test/include/check-testcase.test | 38 +++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/mysql-test/include/check-testcase.test b/mysql-test/include/check-testcase.test index 30cb7391f30..a9885f7b0ec 100644 --- a/mysql-test/include/check-testcase.test +++ b/mysql-test/include/check-testcase.test @@ -11,12 +11,12 @@ # # Dump all global variables # -show global variables; +SHOW GLOBAL VARIABLES WHERE variable_name != 'timestamp'; # # Dump all databases # -show databases; +SHOW DATABASES; # # Dump the "test" database, all it's tables and their data @@ -29,23 +29,23 @@ show databases; # --exec $MYSQL_DUMP --skip-comments --no-data mysql use mysql; -select * from columns_priv; -select * from db order by host, db, user; -select * from func; -select * from help_category; -select * from help_keyword; -select * from help_relation; -select * from help_relation; -select * from host; -select * from proc; -select * from procs_priv; -select * from tables_priv; -select * from time_zone; -select * from time_zone_leap_second; -select * from time_zone_name; -select * from time_zone_transition; -select * from time_zone_transition_type; -select * from user; +SELECT * FROM columns_priv; +SELECT * FROM db ORDER BY host, db, user; +SELECT * FROM func; +SELECT * FROM help_category; +SELECT * FROM help_keyword; +SELECT * FROM help_relation; +SELECT * FROM help_relation; +SELECT * FROM host; +SELECT * FROM proc; +SELECT * FROM procs_priv; +SELECT * FROM tables_priv; +SELECT * FROM time_zone; +SELECT * FROM time_zone_leap_second; +SELECT * FROM time_zone_name; +SELECT * FROM time_zone_transition; +SELECT * FROM time_zone_transition_type; +SELECT * FROM user; -- cgit v1.2.1 From df8a5474f8a904b4e254e446fd6ea61a94c98e2a Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Tue, 25 Nov 2008 10:22:02 +0400 Subject: Fix for bug#40984: backport fix from 39585 into 5.0 Problem: in 5.0 'check table for upgrade' doesn't detect incompatible collation changes made in 5.0.48. Fix: backport #39585 fix to 5.0 sql/handler.cc: Fix for bug#40984: backport fix from 39585 into 5.0 - backport of #39585 fix sql/handler.h: Fix for bug#40984: backport fix from 39585 into 5.0 - backport of #39585 fix --- sql/handler.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ sql/handler.h | 1 + 2 files changed, 50 insertions(+) diff --git a/sql/handler.cc b/sql/handler.cc index 67ec5f3e759..71d184ad84b 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1957,8 +1957,53 @@ bool handler::get_error_message(int error, String* buf) } +/** + Check for incompatible collation changes. + + @retval + HA_ADMIN_NEEDS_UPGRADE Table may have data requiring upgrade. + @retval + 0 No upgrade required. +*/ + +int handler::check_collation_compatibility() +{ + ulong mysql_version= table->s->mysql_version; + + if (mysql_version < 50048) + { + KEY *key= table->key_info; + KEY *key_end= key + table->s->keys; + for (; key < key_end; key++) + { + KEY_PART_INFO *key_part= key->key_part; + KEY_PART_INFO *key_part_end= key_part + key->key_parts; + for (; key_part < key_part_end; key_part++) + { + if (!key_part->fieldnr) + continue; + Field *field= table->field[key_part->fieldnr - 1]; + uint cs_number= field->charset()->number; + if (mysql_version < 50048 && + (cs_number == 11 || /* ascii_general_ci - bug #29499, bug #27562 */ + cs_number == 41 || /* latin7_general_ci - bug #29461 */ + cs_number == 42 || /* latin7_general_cs - bug #29461 */ + cs_number == 20 || /* latin7_estonian_cs - bug #29461 */ + cs_number == 21 || /* latin2_hungarian_ci - bug #29461 */ + cs_number == 22 || /* koi8u_general_ci - bug #29461 */ + cs_number == 23 || /* cp1251_ukrainian_ci - bug #29461 */ + cs_number == 26)) /* cp1250_general_ci - bug #29461 */ + return HA_ADMIN_NEEDS_UPGRADE; + } + } + } + return 0; +} + + int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt) { + int error; KEY *keyinfo, *keyend; KEY_PART_INFO *keypart, *keypartend; @@ -1987,6 +2032,10 @@ int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt) } if (table->s->frm_version != FRM_VER_TRUE_VARCHAR) return HA_ADMIN_NEEDS_ALTER; + + if ((error= check_collation_compatibility())) + return error; + return check_for_upgrade(check_opt); } diff --git a/sql/handler.h b/sql/handler.h index aa3377c3868..8706aae5fce 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -787,6 +787,7 @@ protected: virtual int check_for_upgrade(HA_CHECK_OPT *check_opt) { return 0; } public: + int check_collation_compatibility(); int ha_check_for_upgrade(HA_CHECK_OPT *check_opt); int check_old_types(); /* to be actually called to get 'check()' functionality*/ -- cgit v1.2.1 From a8d3f0325b6c0ae3a4cb47e3991c1a14e804e470 Mon Sep 17 00:00:00 2001 From: Ingo Struewing Date: Tue, 25 Nov 2008 15:06:31 +0100 Subject: Bug#41002 - symlink.test fails on symlinked datadir symlink.test failed when run in an environment that has mysql-test/var symlinked to elsewhere, e.g. a memory file system. This is the case when running mysql-test-run --mem. In this case the server does not detect that the directory specified with a DATA/INDEX DIRECTORY clause is within its data home directory. This problem was reported as Bug#39277 (Creation of table with data and/or index files in data home directory succeeds). It was decided that it will not be fixed in 5.1. Hence, the current behavior is accepted for 5.1. It will be fixed in 6.0 though. Fixed the test case so that it works in both environments. 1. When no symbolic link is involved, the server notices that the data/index directory is in its data hone directory and rejects the CREATE/ALTER TABLE statement. 2. When the data home directory is symlinked, it does not notice the problem and executes the statement sucessfully. mysql-test/r/symlink.result: Bug#41002 - symlink.test fails on symlinked datadir Updated test result. mysql-test/t/symlink.test: Bug#41002 - symlink.test fails on symlinked datadir Adjusted the test case to the accepted behavior. It needs to accept success and failure of some statements. --- mysql-test/r/symlink.result | 8 ++++---- mysql-test/t/symlink.test | 31 +++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index 7711517fe5e..03bdeaceb58 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -148,16 +148,16 @@ DROP TABLE t1; End of 5.0 tests CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/master-data/mysql'; -ERROR HY000: Incorrect arguments to INDEX DIRECTORY +DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/master-data/test'; -ERROR HY000: Incorrect arguments to DATA DIRECTORY +DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/master-data/'; -ERROR HY000: Incorrect arguments to DATA DIRECTORY +DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/master-data'; -ERROR HY000: Incorrect arguments to INDEX DIRECTORY +DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/master-data_var'; ERROR HY000: Can't create/write to file 'TEST_DIR/master-data_var/t1.MYI' (Errcode: 2) diff --git a/mysql-test/t/symlink.test b/mysql-test/t/symlink.test index 3c7e9b658f3..b13640e7f3b 100644 --- a/mysql-test/t/symlink.test +++ b/mysql-test/t/symlink.test @@ -194,26 +194,49 @@ DROP TABLE t1; # # Bug#32167: another privilege bypass with DATA/INDEX DIRECTORY # +# With Bug#41002 (symlink.test fails on symlinked datadir) it was +# decided that the below statements may also succeed if the data +# home directory is symlinked, e.g. mysql-test-run --mem. +# This will be fixed in 6.0 only. +# --replace_result $MYSQLTEST_VARDIR TEST_DIR ---error ER_WRONG_ARGUMENTS +--error 0,ER_WRONG_ARGUMENTS eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data/mysql'; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +# --replace_result $MYSQLTEST_VARDIR TEST_DIR ---error ER_WRONG_ARGUMENTS +--error 0,ER_WRONG_ARGUMENTS eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/master-data/test'; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +# --replace_result $MYSQLTEST_VARDIR TEST_DIR ---error ER_WRONG_ARGUMENTS +--error 0,ER_WRONG_ARGUMENTS eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/master-data/'; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +# --replace_result $MYSQLTEST_VARDIR TEST_DIR ---error ER_WRONG_ARGUMENTS +--error 0,ER_WRONG_ARGUMENTS eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data'; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +# --replace_result $MYSQLTEST_VARDIR TEST_DIR --error 1 eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data_var'; + +# # BUG#25677 - With --skip-symbolic-links option on, DATA DIRECTORY clause is # silently ignored # -- cgit v1.2.1 From d096079d330f77eebd3c3abef04236a9a4a08d7b Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Wed, 26 Nov 2008 09:28:17 +0100 Subject: Bug#37553: MySql Error Compare TimeDiff & Time We pretended that TIMEDIFF() would always return positive results; this gave strange results in comparisons of the TIMEDIFF(low,hi) =) sql/item_func.cc: signed now sql/item_timefunc.h: Functions such as TIMEDIFF() return signed results! The file-comments pretended we were doing that all along, anyway... sql/my_decimal.cc: heed sign when converting time to my_decimal; times may actually be negative! Needed for SELECT CAST(time('-73:42:12') AS DECIMAL); sql/mysql_priv.h: using signed for dates and times now --- mysql-test/r/func_sapdb.result | 12 ++++++++++++ mysql-test/t/func_sapdb.test | 17 +++++++++++++++++ sql/item_cmpfunc.cc | 14 +++++++------- sql/item_cmpfunc.h | 6 +++--- sql/item_func.cc | 2 +- sql/item_timefunc.h | 1 + sql/my_decimal.cc | 2 +- sql/mysql_priv.h | 4 ++-- 8 files changed, 44 insertions(+), 14 deletions(-) diff --git a/mysql-test/r/func_sapdb.result b/mysql-test/r/func_sapdb.result index 4db0416bdce..a06d7004908 100644 --- a/mysql-test/r/func_sapdb.result +++ b/mysql-test/r/func_sapdb.result @@ -256,3 +256,15 @@ a select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f"); str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f") 2003-01-02 10:11:12.001200 +select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10'),time('00:00:00'); +timediff('2008-09-29 20:10:10','2008-09-30 20:10:10') time('00:00:00') +-24:00:00 00:00:00 +select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')>time('00:00:00'); +timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')>time('00:00:00') +0 +select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')time('00:00:00'); +select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')get_time(<ime); - value= !*is_null ? TIME_to_ulonglong_datetime(<ime) : 0; + value= !*is_null ? (longlong) TIME_to_ulonglong_datetime(<ime) : 0; } /* Do not cache GET_USER_VAR() function as its const_item() may return TRUE @@ -886,11 +886,11 @@ void Arg_comparator::set_datetime_cmp_func(Item **a1, Item **b1) obtained value */ -ulonglong +longlong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, Item *warn_item, bool *is_null) { - ulonglong value= 0; + longlong value= 0; String buf, *str= 0; Item *item= **item_arg; @@ -925,7 +925,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, enum_field_types f_type= warn_item->field_type(); timestamp_type t_type= f_type == MYSQL_TYPE_DATE ? MYSQL_TIMESTAMP_DATE : MYSQL_TIMESTAMP_DATETIME; - value= get_date_from_str(thd, str, t_type, warn_item->name, &error); + value= (longlong) get_date_from_str(thd, str, t_type, warn_item->name, &error); /* If str did not contain a valid date according to the current SQL_MODE, get_date_from_str() has already thrown a warning, @@ -979,7 +979,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, int Arg_comparator::compare_datetime() { bool a_is_null, b_is_null; - ulonglong a_value, b_value; + longlong a_value, b_value; /* Get DATE/DATETIME/TIME value of the 'a' item. */ a_value= (*get_value_func)(thd, &a, &a_cache, *b, &a_is_null); diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 1bd60ff37d9..db831c7030c 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -42,8 +42,8 @@ class Arg_comparator: public Sql_alloc bool is_nulls_eq; // TRUE <=> compare for the EQUAL_FUNC enum enum_date_cmp_type { CMP_DATE_DFLT= 0, CMP_DATE_WITH_DATE, CMP_DATE_WITH_STR, CMP_STR_WITH_DATE }; - ulonglong (*get_value_func)(THD *thd, Item ***item_arg, Item **cache_arg, - Item *warn_item, bool *is_null); + longlong (*get_value_func)(THD *thd, Item ***item_arg, Item **cache_arg, + Item *warn_item, bool *is_null); public: DTCollation cmp_collation; @@ -1028,7 +1028,7 @@ public: */ class cmp_item_datetime :public cmp_item { - ulonglong value; + longlong value; public: THD *thd; /* Item used for issuing warnings. */ diff --git a/sql/item_func.cc b/sql/item_func.cc index 45aa8e9bea0..8295bd41334 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2283,7 +2283,7 @@ uint Item_func_min_max::cmp_datetimes(ulonglong *value) { Item **arg= args + i; bool is_null; - ulonglong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null); + longlong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null); if ((null_value= args[i]->null_value)) return 0; if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0) diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 7960c03d2e5..81a6c3e98bd 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -408,6 +408,7 @@ public: { return save_time_in_field(field); } + bool result_as_longlong() { return TRUE; } }; diff --git a/sql/my_decimal.cc b/sql/my_decimal.cc index 31a5b09370a..a235edbd73c 100644 --- a/sql/my_decimal.cc +++ b/sql/my_decimal.cc @@ -216,7 +216,7 @@ my_decimal *date2my_decimal(MYSQL_TIME *ltime, my_decimal *dec) date = (ltime->year*100L + ltime->month)*100L + ltime->day; if (ltime->time_type > MYSQL_TIMESTAMP_DATE) date= ((date*100L + ltime->hour)*100L+ ltime->minute)*100L + ltime->second; - if (int2my_decimal(E_DEC_FATAL_ERROR, date, FALSE, dec)) + if (int2my_decimal(E_DEC_FATAL_ERROR, ltime->neg ? -date : date, FALSE, dec)) return dec; if (ltime->second_part) { diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1568f042b7e..d112c2b2f39 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1556,8 +1556,8 @@ void make_date(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time, String *str); void make_time(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time, String *str); -ulonglong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, - Item *warn_item, bool *is_null); +longlong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, + Item *warn_item, bool *is_null); int test_if_number(char *str,int *res,bool allow_wildcards); void change_byte(byte *,uint,char,char); -- cgit v1.2.1 From cff0a6b65cf5f848e9a64d564fde785a6772dbae Mon Sep 17 00:00:00 2001 From: Horst Hunger Date: Wed, 26 Nov 2008 09:33:41 +0100 Subject: Fix for bug#37702: Inserted the review results into the patch. --- mysql-test/r/timestamp_func.result | 44 ++++++-------- mysql-test/r/timestamp_sysdate_is_now_func.result | 25 ++++++++ mysql-test/t/timestamp_func.test | 69 +++++++--------------- .../t/timestamp_sysdate_is_now_func-master.opt | 1 + mysql-test/t/timestamp_sysdate_is_now_func.test | 47 +++++++++++++++ 5 files changed, 111 insertions(+), 75 deletions(-) create mode 100644 mysql-test/r/timestamp_sysdate_is_now_func.result create mode 100644 mysql-test/t/timestamp_sysdate_is_now_func-master.opt create mode 100644 mysql-test/t/timestamp_sysdate_is_now_func.test diff --git a/mysql-test/r/timestamp_func.result b/mysql-test/r/timestamp_func.result index ed51cec4227..1b49331c069 100644 --- a/mysql-test/r/timestamp_func.result +++ b/mysql-test/r/timestamp_func.result @@ -1,33 +1,25 @@ -** Setup ** - -** Connecting con0 using root ** ** Connecting con1 using root ** -'#-----------------------------FN_DYNVARS_179_01------------------#' -** Connection con0 ** -SET @ts_old = @@SESSION.timestamp; -waiting 1 sec -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 1 AS 'Timestamp Difference'; -Timestamp Difference +SELECT date(now()) = date(sysdate()); +date(now()) = date(sysdate()) +1 +SET @@session.timestamp = 1100000000; +SELECT date(now()) != date(sysdate()); +date(now()) != date(sysdate()) +1 +** Connecting con0 using root ** +SELECT @@session.timestamp != 1100000000; +@@session.timestamp != 1100000000 +1 +SET @@session.timestamp = 1000000000; +SELECT date(now()) != date(sysdate()); +date(now()) != date(sysdate()) 1 -1 means >=1 expected is true ** Connection con1 ** -SET @ts_old = @@SESSION.timestamp; -waiting 4 sec -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 4 AS 'Timestamp Difference'; -Timestamp Difference +SELECT @@session.timestamp != 1000000000; +@@session.timestamp != 1000000000 1 -1 means >=4 expected is true -'#-----------------------------FN_DYNVARS_179_02---------------------#' -SET @ts_old = @@SESSION.timestamp; -Changing time zone -SET time_zone = 'MET'; -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 1 AS 'Timestamp Difference'; -Timestamp Difference +SELECT @@session.timestamp = 1100000000; +@@session.timestamp = 1100000000 1 -1 means >=1 expected is true -** Cleanup ** ** Connection default ** Disconnecting Connections con0, con1 diff --git a/mysql-test/r/timestamp_sysdate_is_now_func.result b/mysql-test/r/timestamp_sysdate_is_now_func.result new file mode 100644 index 00000000000..e24ff2e962a --- /dev/null +++ b/mysql-test/r/timestamp_sysdate_is_now_func.result @@ -0,0 +1,25 @@ +** Connecting con1 using root ** +SELECT date(now()) = date(sysdate()); +date(now()) = date(sysdate()) +1 +SET @@session.timestamp = 1100000000; +SELECT date(now()) != date(sysdate()); +date(now()) != date(sysdate()) +0 +** Connecting con0 using root ** +SELECT @@session.timestamp != 1100000000; +@@session.timestamp != 1100000000 +1 +SET @@session.timestamp = 1000000000; +SELECT date(now()) != date(sysdate()); +date(now()) != date(sysdate()) +0 +** Connection con1 ** +SELECT @@session.timestamp != 1000000000; +@@session.timestamp != 1000000000 +1 +SELECT @@session.timestamp = 1100000000; +@@session.timestamp = 1100000000 +1 +** Connection default ** +Disconnecting Connections con0, con1 diff --git a/mysql-test/t/timestamp_func.test b/mysql-test/t/timestamp_func.test index ecca3c7daeb..e119f1b6253 100644 --- a/mysql-test/t/timestamp_func.test +++ b/mysql-test/t/timestamp_func.test @@ -9,6 +9,8 @@ # Creation Date: 2008-02-25 # # Author: Sharique Abdullah # # # +# Modified: HHunger 2008-08-28 Reimplemented the test completely. # +# # # Description: Test Cases of Dynamic System Variable "timestamp" # # that checks behavior of this variable in the following ways # # * Functionality based on different values # @@ -17,63 +19,32 @@ # # ############################################################################ ---echo ** Setup ** ---echo -# -# Setup -# ---echo ** Connecting con0 using root ** -connect (con0,localhost,root,,); ---echo ** Connecting con1 using root ** -connect (con1, localhost, root,,); - ---echo '#-----------------------------FN_DYNVARS_179_01------------------#' -# -# Checking for connection 1 -# +# Change timestamp which must have an effect on now(), but not on sysdate(). +# Use Unix epoch timestamp +# All comparisons must deliver true(1) +# Exception: --sysdate-is-now switches off this behaviour and must not be set. ---echo ** Connection con0 ** -connection con0; -SET @ts_old = @@SESSION.timestamp; ---echo waiting 1 sec ---sleep 1 -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 1 AS 'Timestamp Difference'; ---echo 1 means >=1 expected is true +--echo ** Connecting con1 using root ** +connect (con1,localhost,root,,); +SELECT date(now()) = date(sysdate()); +SET @@session.timestamp = 1100000000; +SELECT date(now()) != date(sysdate()); +# Assure that setting of the variable has no effect on other session. +--echo ** Connecting con0 using root ** +connect (con0,localhost,root,,); +SELECT @@session.timestamp != 1100000000; +SET @@session.timestamp = 1000000000; +SELECT date(now()) != date(sysdate()); -# -# Checking for connection 2 -# --echo ** Connection con1 ** connection con1; -SET @ts_old = @@SESSION.timestamp; ---echo waiting 4 sec ---sleep 4 -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 4 AS 'Timestamp Difference'; ---echo 1 means >=4 expected is true - ---echo '#-----------------------------FN_DYNVARS_179_02---------------------#' -# -# Testing timezone change effect -# - -SET @ts_old = @@SESSION.timestamp; ---sleep 1 ---echo Changing time zone -SET time_zone = 'MET'; -SET @ts_new = @@SESSION.timestamp; -SELECT @ts_new - @ts_old >= 1 AS 'Timestamp Difference'; ---echo 1 means >=1 expected is true - -# -# Cleanup -# ---echo ** Cleanup ** +SELECT @@session.timestamp != 1000000000; +SELECT @@session.timestamp = 1100000000; --echo ** Connection default ** connection default; --echo Disconnecting Connections con0, con1 disconnect con0; disconnect con1; + diff --git a/mysql-test/t/timestamp_sysdate_is_now_func-master.opt b/mysql-test/t/timestamp_sysdate_is_now_func-master.opt new file mode 100644 index 00000000000..97a58d28032 --- /dev/null +++ b/mysql-test/t/timestamp_sysdate_is_now_func-master.opt @@ -0,0 +1 @@ +--sysdate-is-now diff --git a/mysql-test/t/timestamp_sysdate_is_now_func.test b/mysql-test/t/timestamp_sysdate_is_now_func.test new file mode 100644 index 00000000000..7ca3b4cddac --- /dev/null +++ b/mysql-test/t/timestamp_sysdate_is_now_func.test @@ -0,0 +1,47 @@ +############################################################################ +# # +# Variable Name: timestamp with sysdate-is-now # +# Scope: GLOBAL # +# Access Type: Dynamic # +# Data Type: INTEGER # +# # +# # +# Creation Date: 2008-11-25 # +# Author: Horst Hunger # +# # +# Description: Test Cases of Dynamic System Variable "timestamp" # +# that checks behavior of this variable in the following ways # +# * Like timstamp_func, but with set "sysdate-is-now". # +# # +# Reference: http://dev.mysql.com/doc/refman/5.1/en/set-option.html # +# # +############################################################################ + +# Use Unix epoch timestamp +# Due to "--sysdate-is-now" timestamp must have an effect on both. +# See also timestamp_func.test. + +--echo ** Connecting con1 using root ** +connect (con1,localhost,root,,); +SELECT date(now()) = date(sysdate()); +SET @@session.timestamp = 1100000000; +SELECT date(now()) != date(sysdate()); + +# Assure that setting of the variable has no effect on other session. +--echo ** Connecting con0 using root ** +connect (con0,localhost,root,,); +SELECT @@session.timestamp != 1100000000; +SET @@session.timestamp = 1000000000; +SELECT date(now()) != date(sysdate()); + +--echo ** Connection con1 ** +connection con1; +SELECT @@session.timestamp != 1000000000; +SELECT @@session.timestamp = 1100000000; + +--echo ** Connection default ** +connection default; +--echo Disconnecting Connections con0, con1 +disconnect con0; +disconnect con1; + -- cgit v1.2.1 From 41494f86f446580aab3c15884fc27370d7133b16 Mon Sep 17 00:00:00 2001 From: Ingo Struewing Date: Thu, 27 Nov 2008 11:50:28 +0100 Subject: Bug#28234 - global/session scope - documentation vs implementation Post-pushbuild fix. - Windows does not have 'socket' system variable. - Compiler warning in sql/slave.cc mysql-test/r/variables.result: Bug#28234 - global/session scope - documentation vs implementation Updated test result. mysql-test/t/variables.test: Bug#28234 - global/session scope - documentation vs implementation Removed test for 'socket' variable. Windows doesn't have it. sql/slave.cc: Bug#28234 - global/session scope - documentation vs implementation Changed type of constant to avoid a compiler warning. --- mysql-test/r/variables.result | 13 ------------- mysql-test/t/variables.test | 12 ------------ sql/slave.cc | 2 +- 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 878416b4537..ac78d8e1871 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -1325,19 +1325,6 @@ ERROR HY000: Variable 'skip_show_database' is a read only variable SET @@global.skip_show_database= true; ERROR HY000: Variable 'skip_show_database' is a read only variable # -SHOW VARIABLES like 'socket'; -Variable_name Value -socket # -SELECT @@session.socket; -ERROR HY000: Variable 'socket' is a GLOBAL variable -SELECT @@global.socket; -@@global.socket -# -SET @@session.socket= 'x'; -ERROR HY000: Variable 'socket' is a read only variable -SET @@global.socket= 'x'; -ERROR HY000: Variable 'socket' is a read only variable -# SHOW VARIABLES like 'thread_stack'; Variable_name Value thread_stack # diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 1ef114b1a16..828cb3a2916 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -1067,18 +1067,6 @@ SET @@global.skip_show_database= true; # --echo # --replace_column 2 # -SHOW VARIABLES like 'socket'; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -SELECT @@session.socket; ---replace_column 1 # -SELECT @@global.socket; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -SET @@session.socket= 'x'; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -SET @@global.socket= 'x'; -# ---echo # ---replace_column 2 # SHOW VARIABLES like 'thread_stack'; --error ER_INCORRECT_GLOBAL_LOCAL_VAR SELECT @@session.thread_stack; diff --git a/sql/slave.cc b/sql/slave.cc index 6708f2ddd60..43b70f29a68 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -288,7 +288,7 @@ static void print_slave_skip_errors(void) 10 characters must be sufficient for a number plus {',' | '...'} plus a NUL terminator. That is a max 6 digit number. */ - const int MIN_ROOM= 10; + const size_t MIN_ROOM= 10; DBUG_ENTER("print_slave_skip_errors"); DBUG_ASSERT(sizeof(slave_skip_error_names) > MIN_ROOM); DBUG_ASSERT(MAX_SLAVE_ERROR <= 999999); // 6 digits -- cgit v1.2.1 From fbbdb613d77a673b225d23c46a84bb90520a5df0 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 27 Nov 2008 16:33:40 +0400 Subject: Bug#34825 perror on windows doesn't know about win32 error codes extended perror to enable printing of Win32 system errors extra/perror.c: extended perror to enable printing of Win32 system errors mysql-test/r/perror-win.result: test result mysql-test/t/perror-win.test: test case --- extra/perror.c | 40 ++++++++++++++++++++++++++++++++++++++-- mysql-test/r/perror-win.result | 5 +++++ mysql-test/t/perror-win.test | 11 +++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/perror-win.result create mode 100644 mysql-test/t/perror-win.test diff --git a/extra/perror.c b/extra/perror.c index 4d19f4dd7eb..37d6b45c8dd 100644 --- a/extra/perror.c +++ b/extra/perror.c @@ -185,11 +185,36 @@ static const char *get_ha_error_msg(int code) } +#if defined(__WIN__) +static my_bool print_win_error_msg(DWORD error, my_bool verbose) +{ + LPTSTR s; + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, (LPTSTR)&s, 0, + NULL)) + { + if (verbose) + printf("Win32 error code %d: %s", error, s); + else + puts(s); + LocalFree(s); + return 0; + } + return 1; +} +#endif + + + int main(int argc,char *argv[]) { int error,code,found; const char *msg; char *unknown_error = 0; +#if defined(__WIN__) + my_bool skip_win_message= 0; +#endif MY_INIT(argv[0]); if (get_options(&argc,&argv)) @@ -286,8 +311,15 @@ int main(int argc,char *argv[]) /* Error message still not found, look in handler error codes */ if (!(msg=get_ha_error_msg(code))) { - fprintf(stderr,"Illegal error code: %d\n",code); - error=1; +#if defined(__WIN__) + if (!(skip_win_message= !print_win_error_msg((DWORD)code, verbose))) + { +#endif + fprintf(stderr,"Illegal error code: %d\n",code); + error=1; +#if defined(__WIN__) + } +#endif } else { @@ -298,6 +330,10 @@ int main(int argc,char *argv[]) puts(msg); } } +#if defined(__WIN__) + if (!skip_win_message) + print_win_error_msg((DWORD)code, verbose); +#endif } } diff --git a/mysql-test/r/perror-win.result b/mysql-test/r/perror-win.result new file mode 100644 index 00000000000..61e6fcaab4e --- /dev/null +++ b/mysql-test/r/perror-win.result @@ -0,0 +1,5 @@ +MySQL error code 150: Foreign key constraint is incorrectly formed +Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed. +OS error code 23: Too many open files in system +Win32 error code 23: Data error (cyclic redundancy check). +Win32 error code 15000: The specified channel path is invalid. diff --git a/mysql-test/t/perror-win.test b/mysql-test/t/perror-win.test new file mode 100644 index 00000000000..56615e72a5a --- /dev/null +++ b/mysql-test/t/perror-win.test @@ -0,0 +1,11 @@ +# Windows-specific tests +--source include/windows.inc +--require r/have_perror.require +disable_query_log; +eval select LENGTH("$MY_PERROR") > 0 as "have_perror"; +enable_query_log; + + +--exec $MY_PERROR 150 +--exec $MY_PERROR 23 +--exec $MY_PERROR 15000 -- cgit v1.2.1 From 73960af037a68dd96ae636ff84b39007f825ab0e Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 27 Nov 2008 16:41:25 +0400 Subject: Bug#40365 Prepared statements may insert invalid dates. set DATE|DATETIME value to 0 if ALLOW_INVALID_DATES sql_mode is not enabled. sql/field.cc: set DATE|DATETIME value to 0 if ALLOW_INVALID_DATES sql_mode is not enabled. tests/mysql_client_test.c: test case --- sql/field.cc | 2 ++ tests/mysql_client_test.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/sql/field.cc b/sql/field.cc index 3d3f698f912..8188b51d4d1 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5372,6 +5372,7 @@ int Field_newdate::store_time(MYSQL_TIME *ltime, timestamp_type time_type) { char buff[MAX_DATE_STRING_REP_LENGTH]; String str(buff, sizeof(buff), &my_charset_latin1); + tmp= 0; make_date((DATE_TIME_FORMAT *) 0, ltime, &str); set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, str.ptr(), str.length(), MYSQL_TIMESTAMP_DATE, 1); @@ -5608,6 +5609,7 @@ int Field_datetime::store_time(MYSQL_TIME *ltime,timestamp_type time_type) { char buff[MAX_DATE_STRING_REP_LENGTH]; String str(buff, sizeof(buff), &my_charset_latin1); + tmp= 0; make_datetime((DATE_TIME_FORMAT *) 0, ltime, &str); set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, str.ptr(), str.length(), MYSQL_TIMESTAMP_DATETIME,1); diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 9270a2a9d60..a9ec7eb358a 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -16218,7 +16218,87 @@ static void test_bug38486(void) DBUG_VOID_RETURN; } +static void test_bug40365(void) +{ + uint rc, i, count= 1; + MYSQL_STMT *stmt= 0; + MYSQL_BIND my_bind[2]; + my_bool is_null[2]= {0}; + MYSQL_TIME tm[2]; + + DBUG_ENTER("test_bug40365"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); + myquery(rc); + rc= mysql_query(mysql, "CREATE TABLE t1(c1 DATETIME, \ + c2 DATE)"); + myquery(rc); + + stmt= mysql_simple_prepare(mysql, "INSERT INTO t1 VALUES(?, ?)"); + check_stmt(stmt); + verify_param_count(stmt, 2); + + bzero((char*) my_bind, sizeof(my_bind)); + my_bind[0].buffer_type= MYSQL_TYPE_DATETIME; + my_bind[1].buffer_type= MYSQL_TYPE_DATE; + for (i= 0; i < (int) array_elements(my_bind); i++) + { + my_bind[i].buffer= (void *) &tm[i]; + my_bind[i].is_null= &is_null[i]; + } + + rc= mysql_stmt_bind_param(stmt, my_bind); + check_execute(stmt, rc); + + for (i= 0; i < (int) array_elements(my_bind); i++) + { + tm[i].neg= 0; + tm[i].second_part= 0; + tm[i].year= 2009; + tm[i].month= 2; + tm[i].day= 29; + tm[i].hour= 0; + tm[i].minute= 0; + tm[i].second= 0; + } + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + rc= mysql_commit(mysql); + myquery(rc); + mysql_stmt_close(stmt); + + stmt= mysql_simple_prepare(mysql, "SELECT * FROM t1"); + check_stmt(stmt); + + rc= mysql_stmt_bind_result(stmt, my_bind); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + rc= mysql_stmt_store_result(stmt); + check_execute(stmt, rc); + rc= mysql_stmt_fetch(stmt); + check_execute(stmt, rc); + + if (!opt_silent) + fprintf(stdout, "\n"); + + for (i= 0; i < array_elements(my_bind); i++) + { + if (!opt_silent) + fprintf(stdout, "\ntime[%d]: %02d-%02d-%02d ", + i, tm[i].year, tm[i].month, tm[i].day); + DIE_UNLESS(tm[i].year == 0); + DIE_UNLESS(tm[i].month == 0); + DIE_UNLESS(tm[i].day == 0); + } + mysql_stmt_close(stmt); + + DBUG_VOID_RETURN; +} /* Read and parse arguments and MySQL options from my.cnf */ @@ -16514,6 +16594,7 @@ static struct my_tests_st my_tests[]= { { "test_bug31669", test_bug31669 }, { "test_bug32265", test_bug32265 }, { "test_bug38486", test_bug38486 }, + { "test_bug40365", test_bug40365 }, { 0, 0 } }; -- cgit v1.2.1 From 89d044062c1daa3f12358b003478cbaa5df91e3b Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 27 Nov 2008 17:57:34 +0400 Subject: Bug#37460 Assertion failed: !table->file || table->file->inited == handler::NONE enable uncacheable flag if we update a view with check option and check option has a subselect, otherwise, the check option can be evaluated after the subselect was freed as independent (See full_local in JOIN::join_free()) mysql-test/r/subselect.result: test result mysql-test/t/subselect.test: test case sql/mysql_priv.h: added UNCACHEABLE_CHECKOPTION flag sql/sql_update.cc: enable uncacheable flag if we update a view with check option and check option has a subselect, otherwise, the check option can be evaluated after the subselect was freed as independent (See full_local in JOIN::join_free()) --- mysql-test/r/subselect.result | 30 ++++++++++++++++++++++++++++++ mysql-test/t/subselect.test | 35 +++++++++++++++++++++++++++++++++++ sql/mysql_priv.h | 1 + sql/sql_update.cc | 26 ++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 6eeb652e3c1..8830ea11f97 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -4422,4 +4422,34 @@ id 2 3 DROP TABLE t1, t2; +CREATE TABLE t1 (id int); +CREATE TABLE t2 (id int, c int); +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id) VALUES (1); +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id) VALUES (1); +CREATE VIEW v1 AS +SELECT t2.c AS c FROM t1, t2 +WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; +UPDATE v1 SET c=1; +CREATE VIEW v2 (a,b) AS +SELECT t2.id, t2.c AS c FROM t1, t2 +WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; +INSERT INTO v2(a,b) VALUES (2,2); +ERROR HY000: CHECK OPTION failed 'test.v2' +INSERT INTO v2(a,b) VALUES (1,2); +SELECT * FROM v1; +c +1 +1 +1 +1 +2 +2 +CREATE VIEW v3 AS +SELECT t2.c AS c FROM t2 +WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; +DELETE FROM v3; +DROP VIEW v1,v2,v3; +DROP TABLE t1,t2; End of 5.0 tests. diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index d28e31fb545..ea911e4912d 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -3325,4 +3325,39 @@ INSERT INTO t2 VALUES (2,1),(3,1); SELECT * FROM t1 i WHERE 1 IN (SELECT l.id2 FROM t2 l WHERE i.id=l.id1); DROP TABLE t1, t2; +# +# Bug#37460 Assertion failed: +# !table->file || table->file->inited == handler::NONE +# +CREATE TABLE t1 (id int); +CREATE TABLE t2 (id int, c int); + +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id) VALUES (1); +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id) VALUES (1); + +CREATE VIEW v1 AS + SELECT t2.c AS c FROM t1, t2 + WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; +UPDATE v1 SET c=1; + +CREATE VIEW v2 (a,b) AS + SELECT t2.id, t2.c AS c FROM t1, t2 + WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION; + +--error 1369 +INSERT INTO v2(a,b) VALUES (2,2); +INSERT INTO v2(a,b) VALUES (1,2); +SELECT * FROM v1; + +CREATE VIEW v3 AS + SELECT t2.c AS c FROM t2 + WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION; + +DELETE FROM v3; + +DROP VIEW v1,v2,v3; +DROP TABLE t1,t2; + --echo End of 5.0 tests. diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1568f042b7e..75c95834ac9 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -435,6 +435,7 @@ MY_LOCALE *my_locale_by_number(uint number); #define UNCACHEABLE_PREPARE 16 /* For uncorrelated SELECT in an UNION with some correlated SELECTs */ #define UNCACHEABLE_UNITED 32 +#define UNCACHEABLE_CHECKOPTION 64 /* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */ #define UNDEF_POS (-1) diff --git a/sql/sql_update.cc b/sql/sql_update.cc index eb4e9b7ed73..f15db220a3b 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -1249,6 +1249,32 @@ multi_update::initialize_tables(JOIN *join) } } + /* + enable uncacheable flag if we update a view with check option + and check option has a subselect, otherwise, the check option + can be evaluated after the subselect was freed as independent + (See full_local in JOIN::join_free()). + */ + if (table_ref->check_option && !join->select_lex->uncacheable) + { + SELECT_LEX_UNIT *tmp_unit; + SELECT_LEX *sl; + for (tmp_unit= join->select_lex->first_inner_unit(); + tmp_unit; + tmp_unit= tmp_unit->next_unit()) + { + for (sl= tmp_unit->first_select(); sl; sl= sl->next_select()) + { + if (sl->master_unit()->item) + { + join->select_lex->uncacheable|= UNCACHEABLE_CHECKOPTION; + goto loop_end; + } + } + } + } +loop_end: + if (table == first_table_for_update && table_ref->check_option) { table_map unupdated_tables= table_ref->check_option->used_tables() & -- cgit v1.2.1 From 3a3d3527a333f83eb454efa8fd1e7f34e06b578c Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 27 Nov 2008 18:26:22 +0400 Subject: removed unused variable --- tests/mysql_client_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index a9ec7eb358a..ee3a053f8bd 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -16220,7 +16220,7 @@ static void test_bug38486(void) static void test_bug40365(void) { - uint rc, i, count= 1; + uint rc, i; MYSQL_STMT *stmt= 0; MYSQL_BIND my_bind[2]; my_bool is_null[2]= {0}; -- cgit v1.2.1 From 5cd6c9428931348c7b4f473a0b55a89ff8df4153 Mon Sep 17 00:00:00 2001 From: Horst Hunger Date: Thu, 27 Nov 2008 15:51:48 +0100 Subject: Fix for Bug#37766: Inserted review results. Reason for the failing test was that "SELECT count(*) from mysql.general_log;" was not always the same number. That was fixed by "...count(*)>4..." as the minimal fulfilled condition. As Bug 35371 was fixed the testcase with "log_output = 'FILE'" was enabled and changed to have always the same result. --- mysql-test/r/log_output_func.result | 38 +++++++++++-------- mysql-test/t/log_output_func.test | 75 ++++++++++++++++++++++--------------- 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/mysql-test/r/log_output_func.result b/mysql-test/r/log_output_func.result index 8af7f471195..060f930a161 100644 --- a/mysql-test/r/log_output_func.result +++ b/mysql-test/r/log_output_func.result @@ -1,13 +1,11 @@ +SET @start_value= @@global.log_output; +SET @start_general_log= @@global.general_log; +SET @start_general_log_file= @@global.general_log_file; '#--------------------FN_DYNVARS_065_01-------------------------#' SET @@global.log_output = 'NONE'; 'connect (con1,localhost,root,,,,)' -'connection con1' -SELECT @@global.log_output; -@@global.log_output -NONE SET @@global.log_output = 'TABLE,FILE'; 'connect (con2,localhost,root,,,,)' -'connection con2' SELECT @@global.log_output; @@global.log_output FILE,TABLE @@ -18,7 +16,7 @@ SET @@global.log_output = 'NONE'; TRUNCATE TABLE mysql.general_log; DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT); -INSERT INTO t1 value(1); +INSERT INTO t1 VALUE(1); SELECT 'abc'; abc abc @@ -29,25 +27,33 @@ count(*) SET @@global.log_output = 'TABLE'; TRUNCATE TABLE mysql.general_log; DROP TABLE IF EXISTS t1; -create table t1(a int); -INSERT INTO t1 value(1); +CREATE TABLE t1(a int); +INSERT INTO t1 VALUE(1); SELECT 'abc'; abc abc -SELECT count(*) from mysql.general_log; -count(*) -5 -'Bug#35371: Changing general_log file is crashing server' -'SET @@global.general_log_file = @log_file;' +SELECT count(*)>4 FROM mysql.general_log; +count(*)>4 +1 +SET @@global.general_log = 'OFF'; +FLUSH LOGS; +SET @@global.general_log_file = 'MYSQLTEST_VARDIR/run/mytest.log'; +SET @@global.general_log = 'ON'; SET @@global.log_output = 'FILE'; TRUNCATE TABLE mysql.general_log; DROP TABLE IF EXISTS t1; -create table t1(a int); -INSERT INTO t1 value(1); +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUE(1); SELECT 'abc'; abc abc -SELECT count(*) from mysql.general_log; +SELECT count(*) FROM mysql.general_log; count(*) 0 DROP TABLE t1; +connection default; +SET @@global.general_log= 'OFF'; +SET @@global.general_log_file= @start_general_log_file; +SET @@global.log_output= @start_value; +SET @@global.general_log= @start_general_log; +SET @@global.general_log= 'ON'; diff --git a/mysql-test/t/log_output_func.test b/mysql-test/t/log_output_func.test index 32026d8de59..007c4f38659 100644 --- a/mysql-test/t/log_output_func.test +++ b/mysql-test/t/log_output_func.test @@ -10,12 +10,13 @@ # # # Creation Date: 2008-03-08 # # Author: Rizwan # +# Modified: HHunger 2008-08-29 # # # Description: Test Cases of Dynamic System Variable log_output # # that checks the behavior of this variable # # # -# Reference: http://dev.mysql.com/doc/refman/5.1/en/ # -# server-system-variables.html # +# Reference: # +# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html # # # ############################################################################### @@ -23,6 +24,10 @@ # ps-protocol. So, it is switched off. --disable_ps_protocol +SET @start_value= @@global.log_output; +SET @start_general_log= @@global.general_log; +SET @start_general_log_file= @@global.general_log_file; + --echo '#--------------------FN_DYNVARS_065_01-------------------------#' ################################################################## # Check if setting log_output is changed in every new connection # @@ -32,17 +37,12 @@ SET @@global.log_output = 'NONE'; # con1 will be default connection from now on --echo 'connect (con1,localhost,root,,,,)' connect (con1,localhost,root,,,,); ---echo 'connection con1' -connection con1; -SELECT @@global.log_output; SET @@global.log_output = 'TABLE,FILE'; + +# Test that the effect is global --echo 'connect (con2,localhost,root,,,,)' connect (con2,localhost,root,,,,); ---echo 'connection con2' -connection con2; SELECT @@global.log_output; -disconnect con2; - --echo '#--------------------FN_DYNVARS_065_02-------------------------#' #################################################### @@ -52,10 +52,9 @@ disconnect con2; --echo 'connection con1' connection con1; - -#======================================================================= +#=============================================================== --echo '---Checking general_log when log_output is NONE---' -#======================================================================= +#=============================================================== SET @@global.log_output = 'NONE'; TRUNCATE TABLE mysql.general_log; @@ -64,13 +63,13 @@ TRUNCATE TABLE mysql.general_log; DROP TABLE IF EXISTS t1; --enable_warnings CREATE TABLE t1(a INT); -INSERT INTO t1 value(1); +INSERT INTO t1 VALUE(1); SELECT 'abc'; SELECT count(*) FROM mysql.general_log; -#============================================================================== +#=============================================================== --echo '---Checking general_log when log_output is TABLE---' -#============================================================================== +#=============================================================== SET @@global.log_output = 'TABLE'; TRUNCATE TABLE mysql.general_log; @@ -78,35 +77,49 @@ TRUNCATE TABLE mysql.general_log; --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings -create table t1(a int); -INSERT INTO t1 value(1); +CREATE TABLE t1(a int); +INSERT INTO t1 VALUE(1); SELECT 'abc'; -SELECT count(*) from mysql.general_log; +# At least the last 4 statement should be logged. +SELECT count(*)>4 FROM mysql.general_log; -#=========================================================== +#=============================================================== # Checking general_log when log_output is FILE -#=========================================================== - -#SET @log_file = "mytest.log"; -#SET @@global.general_log = 0; -#FLUSH LOGS; -#SET @@global.general_log_file = @log_file; ---echo 'Bug#35371: Changing general_log file is crashing server' ---echo 'SET @@global.general_log_file = @log_file;' +#=============================================================== +SET @@global.general_log = 'OFF'; +FLUSH LOGS; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval SET @@global.general_log_file = '$MYSQLTEST_VARDIR/run/mytest.log'; +SET @@global.general_log = 'ON'; SET @@global.log_output = 'FILE'; TRUNCATE TABLE mysql.general_log; --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings -create table t1(a int); -INSERT INTO t1 value(1); +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUE(1); SELECT 'abc'; -SELECT count(*) from mysql.general_log; +SELECT count(*) FROM mysql.general_log; DROP TABLE t1; +file_exists $MYSQLTEST_VARDIR/run/mytest.log ; + +#============================================================== +# Clean up +#============================================================== + +--echo connection default; +connection default; +SET @@global.general_log= 'OFF'; +SET @@global.general_log_file= @start_general_log_file; +SET @@global.log_output= @start_value; +SET @@global.general_log= @start_general_log; +SET @@global.general_log= 'ON'; + --enable_ps_protocol #################################################### -# Endo of functionality Testing for log_output # +# End of functionality Testing for log_output # #################################################### + -- cgit v1.2.1 From 1182c0979a5d9acc345c2cba83cac0aa32d42bca Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Thu, 27 Nov 2008 18:54:23 +0400 Subject: Bug#37284 Crash in Field_string::type() The bug is repeatable with latest(1.0.1) InnoDB plugin on Linux, Win, If MySQL is compiled with valgrind there are errors about using of uninitialized variable(orig_table). The fix is to set field->orig_table correct value. mysql-test/r/innodb_mysql.result: test result mysql-test/t/innodb_mysql.test: test case sql/sql_base.cc: set field->orig_table to 'table' value because it may be bogus and it leads to crash on Field_string::type() function. --- mysql-test/r/innodb_mysql.result | 6 ++++++ mysql-test/t/innodb_mysql.test | 11 +++++++++++ sql/sql_base.cc | 3 +++ 3 files changed, 20 insertions(+) diff --git a/mysql-test/r/innodb_mysql.result b/mysql-test/r/innodb_mysql.result index 47fa331c9ab..682cc2e82e2 100644 --- a/mysql-test/r/innodb_mysql.result +++ b/mysql-test/r/innodb_mysql.result @@ -1261,4 +1261,10 @@ a b c 5 1 1 4 1 1 DROP TABLE t1; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a char(50)) ENGINE=InnoDB; +CREATE INDEX i1 on t1 (a(3)); +SELECT * FROM t1 WHERE a = 'abcde'; +a +DROP TABLE t1; End of 5.0 tests diff --git a/mysql-test/t/innodb_mysql.test b/mysql-test/t/innodb_mysql.test index e15d1aee08a..b4fc425cb7c 100644 --- a/mysql-test/t/innodb_mysql.test +++ b/mysql-test/t/innodb_mysql.test @@ -1014,4 +1014,15 @@ SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5; DROP TABLE t1; +# +# Bug#37284 Crash in Field_string::type() +# +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (a char(50)) ENGINE=InnoDB; +CREATE INDEX i1 on t1 (a(3)); +SELECT * FROM t1 WHERE a = 'abcde'; +DROP TABLE t1; + --echo End of 5.0 tests diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 873a3eac24e..881c6a421e8 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2102,7 +2102,10 @@ bool reopen_table(TABLE *table,bool locked) for (key=0 ; key < table->s->keys ; key++) { for (part=0 ; part < table->key_info[key].usable_key_parts ; part++) + { table->key_info[key].key_part[part].field->table= table; + table->key_info[key].key_part[part].field->orig_table= table; + } } if (table->triggers) table->triggers->set_table(table); -- cgit v1.2.1 From 78119b2d04457abe94f2a0a9f3d887c0eb9210a5 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Fri, 28 Nov 2008 14:50:13 +0400 Subject: pushbuild failure fixes mysql-test/r/perror-win.result: pushbuild failure fix mysql-test/t/perror-win.test: pushbuild failure fix sql/item_func.cc: pushbuild failure fix --- mysql-test/r/perror-win.result | 7 ++++--- mysql-test/t/perror-win.test | 9 ++++++--- sql/item_func.cc | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/perror-win.result b/mysql-test/r/perror-win.result index 61e6fcaab4e..8d3026bc331 100644 --- a/mysql-test/r/perror-win.result +++ b/mysql-test/r/perror-win.result @@ -1,5 +1,6 @@ MySQL error code 150: Foreign key constraint is incorrectly formed -Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed. +Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed. OS error code 23: Too many open files in system -Win32 error code 23: Data error (cyclic redundancy check). -Win32 error code 15000: The specified channel path is invalid. +Win32 error code 23: Data error (cyclic redundancy check). +Win32 error code 500: User profile cannot be loaded. +Illegal error code: 30000 diff --git a/mysql-test/t/perror-win.test b/mysql-test/t/perror-win.test index 56615e72a5a..2b38c5fad54 100644 --- a/mysql-test/t/perror-win.test +++ b/mysql-test/t/perror-win.test @@ -6,6 +6,9 @@ eval select LENGTH("$MY_PERROR") > 0 as "have_perror"; enable_query_log; ---exec $MY_PERROR 150 ---exec $MY_PERROR 23 ---exec $MY_PERROR 15000 +--exec $MY_PERROR 150 2>&1 +--exec $MY_PERROR 23 2>&1 +--exec $MY_PERROR 500 2>&1 +--error 1 +--exec $MY_PERROR 30000 2>&1 + diff --git a/sql/item_func.cc b/sql/item_func.cc index 8295bd41334..c0d08d9b213 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2275,7 +2275,7 @@ void Item_func_min_max::fix_length_and_dec() uint Item_func_min_max::cmp_datetimes(ulonglong *value) { - ulonglong min_max; + longlong min_max; uint min_max_idx= 0; LINT_INIT(min_max); -- cgit v1.2.1 From fef07511e3c950438931e23eb286bf5638345700 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Fri, 28 Nov 2008 17:12:43 +0400 Subject: error code is changed to satisfy Win NT --- mysql-test/r/perror-win.result | 2 +- mysql-test/t/perror-win.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/perror-win.result b/mysql-test/r/perror-win.result index 8d3026bc331..1d42235cc14 100644 --- a/mysql-test/r/perror-win.result +++ b/mysql-test/r/perror-win.result @@ -2,5 +2,5 @@ MySQL error code 150: Foreign key constraint is incorrectly formed Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed. OS error code 23: Too many open files in system Win32 error code 23: Data error (cyclic redundancy check). -Win32 error code 500: User profile cannot be loaded. +Win32 error code 1062: The service has not been started. Illegal error code: 30000 diff --git a/mysql-test/t/perror-win.test b/mysql-test/t/perror-win.test index 2b38c5fad54..cc09b8527be 100644 --- a/mysql-test/t/perror-win.test +++ b/mysql-test/t/perror-win.test @@ -8,7 +8,7 @@ enable_query_log; --exec $MY_PERROR 150 2>&1 --exec $MY_PERROR 23 2>&1 ---exec $MY_PERROR 500 2>&1 +--exec $MY_PERROR 1062 2>&1 --error 1 --exec $MY_PERROR 30000 2>&1 -- cgit v1.2.1 From 8e688a7a0246d16a8c636262872a6e7b06376b99 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Fri, 28 Nov 2008 16:25:16 +0200 Subject: Bug #37339: SHOW VARIABLES not working properly with multi-byte datadir The SHOW VARIABLES LIKE .../SELECT @@/SELECT ... FROM INFORMATION_SCHEMA.VARIABLES were assuming that all the system variables are in system charset (UTF-8). However the variables that are settable through command line will have a different character set (character_set_filesystem). Fixed the server to remember the correct character set of basedir, datadir, tmpdir, ssl, plugin_dir, slave_load_tmpdir, innodb variables; init_connect and init_slave variables and use it when processing data. mysql-test/r/ctype_filesystem.result: Bug #37339: test case (should be in utf-8) mysql-test/t/ctype_filesystem-master.opt: Bug #37339: test case (should be in ISO-8859-1) mysql-test/t/ctype_filesystem.test: Bug #37339: test case sql/mysqld.cc: Bug #37339: remember the correct character set for init_slave and init_connect sql/set_var.cc: Bug #37339: - remember the character set of the relevant variables - implement storing and using the correct character set sql/set_var.h: Bug #37339: implement storing and using the correct character set sql/sql_show.cc: Bug #37339: implement storing and using the correct character set --- mysql-test/r/ctype_filesystem.result | 11 ++++++ mysql-test/t/ctype_filesystem-master.opt | 2 + mysql-test/t/ctype_filesystem.test | 5 +++ sql/mysqld.cc | 2 + sql/set_var.cc | 67 +++++++++++++++++++++----------- sql/set_var.h | 47 +++++++++++++++++++++- sql/sql_show.cc | 10 +++-- 7 files changed, 116 insertions(+), 28 deletions(-) create mode 100644 mysql-test/r/ctype_filesystem.result create mode 100644 mysql-test/t/ctype_filesystem-master.opt create mode 100644 mysql-test/t/ctype_filesystem.test diff --git a/mysql-test/r/ctype_filesystem.result b/mysql-test/r/ctype_filesystem.result new file mode 100644 index 00000000000..8a8f0f7f8cc --- /dev/null +++ b/mysql-test/r/ctype_filesystem.result @@ -0,0 +1,11 @@ +SET CHARACTER SET utf8; +SHOW VARIABLES like 'character_sets_dir'; +Variable_name Value +character_sets_dir /ß/ +SHOW VARIABLES like 'character_set_filesystem'; +Variable_name Value +character_set_filesystem latin1 +SHOW VARIABLES like 'character_set_client'; +Variable_name Value +character_set_client utf8 +SET CHARACTER SET default; diff --git a/mysql-test/t/ctype_filesystem-master.opt b/mysql-test/t/ctype_filesystem-master.opt new file mode 100644 index 00000000000..cb3427571b5 --- /dev/null +++ b/mysql-test/t/ctype_filesystem-master.opt @@ -0,0 +1,2 @@ +--character-sets-dir=/ß +--character-set-filesystem=latin1 diff --git a/mysql-test/t/ctype_filesystem.test b/mysql-test/t/ctype_filesystem.test new file mode 100644 index 00000000000..30b1607008b --- /dev/null +++ b/mysql-test/t/ctype_filesystem.test @@ -0,0 +1,5 @@ +SET CHARACTER SET utf8; +SHOW VARIABLES like 'character_sets_dir'; +SHOW VARIABLES like 'character_set_filesystem'; +SHOW VARIABLES like 'character_set_client'; +SET CHARACTER SET default; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index c3e5449b22b..dd2bebfdd2d 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3035,12 +3035,14 @@ static int init_common_variables(const char *conf_file_name, int argc, sys_init_connect.value_length= strlen(opt_init_connect); else sys_init_connect.value=my_strdup("",MYF(0)); + sys_init_connect.is_os_charset= TRUE; sys_init_slave.value_length= 0; if ((sys_init_slave.value= opt_init_slave)) sys_init_slave.value_length= strlen(opt_init_slave); else sys_init_slave.value=my_strdup("",MYF(0)); + sys_init_slave.is_os_charset= TRUE; if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1)) return 1; diff --git a/sql/set_var.cc b/sql/set_var.cc index 6bc19f2e6eb..59741e5683d 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -138,7 +138,7 @@ sys_var_thd_ulong sys_auto_increment_offset("auto_increment_offset", sys_var_bool_ptr sys_automatic_sp_privileges("automatic_sp_privileges", &sp_automatic_privileges); -sys_var_const_str sys_basedir("basedir", mysql_home); +sys_var_const_os_str sys_basedir("basedir", mysql_home); sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size", &binlog_cache_size); sys_var_thd_ulong sys_bulk_insert_buff_size("bulk_insert_buffer_size", @@ -151,6 +151,8 @@ sys_var_character_set_client sys_character_set_client("character_set_client"); sys_var_character_set_connection sys_character_set_connection("character_set_connection"); sys_var_character_set_results sys_character_set_results("character_set_results"); sys_var_character_set_filesystem sys_character_set_filesystem("character_set_filesystem"); +sys_var_const_os_str sys_character_sets_dir("character_sets_dir", + mysql_charsets_dir); sys_var_thd_ulong sys_completion_type("completion_type", &SV::completion_type, check_completion_type, @@ -162,7 +164,7 @@ sys_var_long_ptr sys_concurrent_insert("concurrent_insert", &myisam_concurrent_insert); sys_var_long_ptr sys_connect_timeout("connect_timeout", &connect_timeout); -sys_var_const_str sys_datadir("datadir", mysql_real_data_home); +sys_var_const_os_str sys_datadir("datadir", mysql_real_data_home); sys_var_enum sys_delay_key_write("delay_key_write", &delay_key_write_options, &delay_key_write_typelib, @@ -311,6 +313,7 @@ sys_var_thd_ulong sys_optimizer_prune_level("optimizer_prune_level", &SV::optimizer_prune_level); sys_var_thd_ulong sys_optimizer_search_depth("optimizer_search_depth", &SV::optimizer_search_depth); +sys_var_const_os_str sys_plugin_dir("plugin_dir", opt_plugin_dir); sys_var_thd_ulong sys_preload_buff_size("preload_buffer_size", &SV::preload_buff_size); sys_var_thd_ulong sys_read_buff_size("read_buffer_size", @@ -338,7 +341,7 @@ sys_var_thd_ulong sys_query_alloc_block_size("query_alloc_block_size", sys_var_thd_ulong sys_query_prealloc_size("query_prealloc_size", &SV::query_prealloc_size, 0, fix_thd_mem_root); -sys_var_readonly sys_tmpdir("tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir); +sys_var_readonly_os sys_tmpdir("tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir); sys_var_thd_ulong sys_trans_alloc_block_size("transaction_alloc_block_size", &SV::trans_alloc_block_size, 0, fix_trans_mem_root); @@ -363,9 +366,11 @@ sys_var_bool_ptr sys_secure_auth("secure_auth", &opt_secure_auth); sys_var_const_str_ptr sys_secure_file_priv("secure_file_priv", &opt_secure_file_priv); sys_var_long_ptr sys_server_id("server_id", &server_id, fix_server_id); +#ifdef HAVE_REPLICATION sys_var_bool_ptr sys_slave_compressed_protocol("slave_compressed_protocol", &opt_slave_compressed_protocol); -#ifdef HAVE_REPLICATION +sys_var_const_os_str_ptr sys_slave_load_tmpdir("slave_load_tmpdir", + &slave_load_tmpdir); sys_var_long_ptr sys_slave_net_timeout("slave_net_timeout", &slave_net_timeout); sys_var_long_ptr sys_slave_trans_retries("slave_transaction_retries", @@ -380,17 +385,17 @@ sys_var_thd_sql_mode sys_sql_mode("sql_mode", #ifdef HAVE_OPENSSL extern char *opt_ssl_ca, *opt_ssl_capath, *opt_ssl_cert, *opt_ssl_cipher, *opt_ssl_key; -sys_var_const_str_ptr sys_ssl_ca("ssl_ca", &opt_ssl_ca); -sys_var_const_str_ptr sys_ssl_capath("ssl_capath", &opt_ssl_capath); -sys_var_const_str_ptr sys_ssl_cert("ssl_cert", &opt_ssl_cert); -sys_var_const_str_ptr sys_ssl_cipher("ssl_cipher", &opt_ssl_cipher); -sys_var_const_str_ptr sys_ssl_key("ssl_key", &opt_ssl_key); +sys_var_const_os_str_ptr sys_ssl_ca("ssl_ca", &opt_ssl_ca); +sys_var_const_os_str_ptr sys_ssl_capath("ssl_capath", &opt_ssl_capath); +sys_var_const_os_str_ptr sys_ssl_cert("ssl_cert", &opt_ssl_cert); +sys_var_const_os_str_ptr sys_ssl_cipher("ssl_cipher", &opt_ssl_cipher); +sys_var_const_os_str_ptr sys_ssl_key("ssl_key", &opt_ssl_key); #else -sys_var_const_str sys_ssl_ca("ssl_ca", NULL); -sys_var_const_str sys_ssl_capath("ssl_capath", NULL); -sys_var_const_str sys_ssl_cert("ssl_cert", NULL); -sys_var_const_str sys_ssl_cipher("ssl_cipher", NULL); -sys_var_const_str sys_ssl_key("ssl_key", NULL); +sys_var_const_os_str sys_ssl_ca("ssl_ca", NULL); +sys_var_const_os_str sys_ssl_capath("ssl_capath", NULL); +sys_var_const_os_str sys_ssl_cert("ssl_cert", NULL); +sys_var_const_os_str sys_ssl_cipher("ssl_cipher", NULL); +sys_var_const_os_str sys_ssl_key("ssl_key", NULL); #endif sys_var_thd_enum sys_updatable_views_with_limit("updatable_views_with_limit", @@ -460,6 +465,14 @@ sys_var_long_ptr sys_innodb_commit_concurrency("innodb_commit_concurrency", sys_var_long_ptr sys_innodb_flush_log_at_trx_commit( "innodb_flush_log_at_trx_commit", &srv_flush_log_at_trx_commit); +sys_var_const_os_str_ptr sys_innodb_data_file_path("innodb_data_file_path", + &innobase_data_file_path); +sys_var_const_os_str_ptr sys_innodb_data_home_dir("innodb_data_home_dir", + &innobase_data_home_dir); +sys_var_const_os_str_ptr sys_innodb_log_arch_dir("innodb_log_arch_dir", + &innobase_log_arch_dir); +sys_var_const_os_str_ptr sys_innodb_log_group_home_dir("innodb_log_group_home_dir", + &innobase_log_group_home_dir); #endif /* Condition pushdown to storage engine */ @@ -844,7 +857,7 @@ struct show_var_st init_vars[]= { {sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS}, {sys_character_set_server.name, (char*) &sys_character_set_server,SHOW_SYS}, {sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS}, - {"character_sets_dir", mysql_charsets_dir, SHOW_CHAR}, + {sys_character_sets_dir.name, (char *) &sys_character_sets_dir, SHOW_SYS}, {sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS}, {sys_collation_database.name,(char*) &sys_collation_database, SHOW_SYS}, {sys_collation_server.name,(char*) &sys_collation_server, SHOW_SYS}, @@ -905,8 +918,8 @@ struct show_var_st init_vars[]= { {"innodb_checksums", (char*) &innobase_use_checksums, SHOW_MY_BOOL}, {sys_innodb_commit_concurrency.name, (char*) &sys_innodb_commit_concurrency, SHOW_SYS}, {sys_innodb_concurrency_tickets.name, (char*) &sys_innodb_concurrency_tickets, SHOW_SYS}, - {"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR}, - {"innodb_data_home_dir", (char*) &innobase_data_home_dir, SHOW_CHAR_PTR}, + {sys_innodb_data_file_path.name, (char*) &sys_innodb_data_file_path, SHOW_SYS}, + {sys_innodb_data_home_dir.name, (char*) &sys_innodb_data_home_dir, SHOW_SYS}, {"innodb_adaptive_hash_index", (char*) &innobase_adaptive_hash_index, SHOW_MY_BOOL}, {"innodb_doublewrite", (char*) &innobase_use_doublewrite, SHOW_MY_BOOL}, {sys_innodb_fast_shutdown.name,(char*) &sys_innodb_fast_shutdown, SHOW_SYS}, @@ -917,12 +930,12 @@ struct show_var_st init_vars[]= { {"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG }, {"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG }, {"innodb_locks_unsafe_for_binlog", (char*) &innobase_locks_unsafe_for_binlog, SHOW_MY_BOOL}, - {"innodb_log_arch_dir", (char*) &innobase_log_arch_dir, SHOW_CHAR_PTR}, + {sys_innodb_log_arch_dir.name, (char*) &sys_innodb_log_arch_dir, SHOW_SYS}, {"innodb_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL}, {"innodb_log_buffer_size", (char*) &innobase_log_buffer_size, SHOW_LONG }, {"innodb_log_file_size", (char*) &innobase_log_file_size, SHOW_LONGLONG}, {"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG}, - {"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR}, + {sys_innodb_log_group_home_dir.name, (char*) &sys_innodb_log_group_home_dir, SHOW_SYS}, {sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS}, {sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS}, {"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG}, @@ -1026,7 +1039,7 @@ struct show_var_st init_vars[]= { {sys_optimizer_search_depth.name,(char*) &sys_optimizer_search_depth, SHOW_SYS}, {"pid_file", (char*) pidfile_name, SHOW_CHAR}, - {"plugin_dir", (char*) opt_plugin_dir, SHOW_CHAR}, + {sys_plugin_dir.name, (char*) &sys_plugin_dir, SHOW_SYS}, {"port", (char*) &mysqld_port, SHOW_INT}, {sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS}, {"protocol_version", (char*) &protocol_version, SHOW_INT}, @@ -1068,7 +1081,7 @@ struct show_var_st init_vars[]= { #ifdef HAVE_REPLICATION {sys_slave_compressed_protocol.name, (char*) &sys_slave_compressed_protocol, SHOW_SYS}, - {"slave_load_tmpdir", (char*) &slave_load_tmpdir, SHOW_CHAR_PTR}, + {sys_slave_load_tmpdir.name,(char*) &sys_slave_load_tmpdir, SHOW_SYS}, {sys_slave_net_timeout.name,(char*) &sys_slave_net_timeout, SHOW_SYS}, {"slave_skip_errors", (char*) &slave_error_mask, SHOW_SLAVE_SKIP_ERRORS}, {sys_slave_trans_retries.name,(char*) &sys_slave_trans_retries, SHOW_SYS}, @@ -1175,6 +1188,7 @@ bool update_sys_var_str(sys_var_str *var_str, rw_lock_t *var_mutex, old_value= var_str->value; var_str->value= res; var_str->value_length= new_length; + var_str->is_os_charset= FALSE; rw_unlock(var_mutex); my_free(old_value, MYF(MY_ALLOW_ZERO_PTR)); return 0; @@ -1914,11 +1928,11 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base) char *str= (char*) value_ptr(thd, var_type, base); if (str) tmp= new Item_string(str, strlen(str), - system_charset_info, DERIVATION_SYSCONST); + charset(thd), DERIVATION_SYSCONST); else { tmp= new Item_null(); - tmp->collation.set(system_charset_info, DERIVATION_SYSCONST); + tmp->collation.set(charset(thd), DERIVATION_SYSCONST); } pthread_mutex_unlock(&LOCK_global_system_variables); return tmp; @@ -1930,6 +1944,13 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base) } +CHARSET_INFO *sys_var::charset(THD *thd) +{ + return is_os_charset ? thd->variables.character_set_filesystem : + system_charset_info; +} + + bool sys_var_thd_enum::update(THD *thd, set_var *var) { if (var->type == OPT_GLOBAL) diff --git a/sql/set_var.h b/sql/set_var.h index c37cc400e43..f43d3b75cee 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -46,9 +46,17 @@ public: sys_after_update_func after_update; bool no_support_one_shot; + /* + true if the value is in character_set_filesystem, + false otherwise. + Note that we can't use a pointer to the charset as the system var is + instantiated in global scope and the charset pointers are initialized + later. + */ + bool is_os_charset; sys_var(const char *name_arg, sys_after_update_func func= NULL) :name(name_arg), after_update(func) - , no_support_one_shot(1) + , no_support_one_shot(1), is_os_charset(FALSE) {} virtual ~sys_var() {} virtual bool check(THD *thd, set_var *var); @@ -68,6 +76,7 @@ public: Item *item(THD *thd, enum_var_type type, LEX_STRING *base); virtual bool is_struct() { return 0; } virtual bool is_readonly() const { return 0; } + CHARSET_INFO *charset(THD *thd); }; @@ -247,6 +256,17 @@ public: }; +class sys_var_const_os_str: public sys_var_const_str +{ +public: + sys_var_const_os_str(const char *name_arg, const char *value_arg) + :sys_var_const_str(name_arg, value_arg) + { + is_os_charset= TRUE; + } +}; + + class sys_var_const_str_ptr :public sys_var { public: @@ -276,6 +296,17 @@ public: }; +class sys_var_const_os_str_ptr :public sys_var_const_str_ptr +{ +public: + sys_var_const_os_str_ptr(const char *name_arg, char **value_arg) + :sys_var_const_str_ptr(name_arg, value_arg) + { + is_os_charset= TRUE; + } +}; + + class sys_var_enum :public sys_var { uint *value; @@ -791,6 +822,20 @@ public: bool is_readonly() const { return 1; } }; + +class sys_var_readonly_os: public sys_var_readonly +{ +public: + sys_var_readonly_os(const char *name_arg, enum_var_type type, + SHOW_TYPE show_type_arg, + sys_value_ptr_func value_ptr_func_arg) + :sys_var_readonly(name_arg, type, show_type_arg, value_ptr_func_arg) + { + is_os_charset= TRUE; + } +}; + + class sys_var_thd_time_zone :public sys_var_thd { public: diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5a4772e9847..4e3d209f674 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1441,6 +1441,7 @@ static bool show_status_array(THD *thd, const char *wild, char name_buffer[80]; int len; LEX_STRING null_lex_str; + CHARSET_INFO *charset= system_charset_info; DBUG_ENTER("show_status_array"); null_lex_str.str= 0; // For sys_var->value_ptr() @@ -1469,9 +1470,10 @@ static bool show_status_array(THD *thd, const char *wild, long nr; if (show_type == SHOW_SYS) { - show_type= ((sys_var*) value)->show_type(); - value= (char*) ((sys_var*) value)->value_ptr(thd, value_type, - &null_lex_str); + sys_var *var= ((sys_var *) value); + show_type= var->show_type(); + value= (char*) var->value_ptr(thd, value_type, &null_lex_str); + charset= var->charset(thd); } pos= end= buff; @@ -1794,7 +1796,7 @@ static bool show_status_array(THD *thd, const char *wild, restore_record(table, s->default_values); table->field[0]->store(name_buffer, strlen(name_buffer), system_charset_info); - table->field[1]->store(pos, (uint32) (end - pos), system_charset_info); + table->field[1]->store(pos, (uint32) (end - pos), charset); if (schema_table_store_record(thd, table)) DBUG_RETURN(TRUE); } -- cgit v1.2.1 From 41ccbefcc4cbf75c18e37746bd52617f6c9794b9 Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Fri, 28 Nov 2008 20:13:12 +0400 Subject: Bug #33461: SELECT ... FROM USE INDEX (...) throws an error Even after the fix for bug 28701 visible behaviors of SELECT FROM a view and SELECT FROM a regular table are little bit different: 1. "SELECT FROM regular table USE/FORCE/IGNORE(non existent index)" fails with a "ERROR 1176 (HY000): Key '...' doesn't exist in table '...'" 2. "SELECT FROM view USING/FORCE/IGNORE(any index)" fails with a "ERROR 1221 (HY000): Incorrect usage of USE/IGNORE INDEX and VIEW". OTOH "SHOW INDEX FROM view" always returns empty result set, so from the point of same behaviour view we trying to use/ignore non existent index. To harmonize the behaviour of USE/FORCE/IGNORE(index) clauses in SELECT from a view and from a regular table the "ERROR 1221 (HY000): Incorrect usage of USE/IGNORE INDEX and VIEW" message has been replaced with the "ERROR 1176 (HY000): Key '...' doesn't exist in table '...'" message like for tables and non existent keys. mysql-test/r/view.result: Added test case for bug #33461. Updated test case for bug 28701. mysql-test/t/view.test: Added test case for bug #33461. Updated test case for bug 28701. sql/sql_view.cc: Bug #33461: SELECT ... FROM USE INDEX (...) throws an error To harmonize the behaviour of USE/FORCE/IGNORE(index) clauses in SELECT from a view and from a regular table the "ERROR 1221 (HY000): Incorrect usage of USE/IGNORE INDEX and VIEW" message has been replaced with the "ERROR 1176 (HY000): Key '...' doesn't exist in table '...'" message like for tables and non existent keys. --- mysql-test/r/view.result | 33 +++++++++++++++++++++++++++++---- mysql-test/t/view.test | 34 ++++++++++++++++++++++++++++++---- sql/sql_view.cc | 13 +++++++------ 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 8cbe3fc36cf..311b77e7a99 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -625,7 +625,7 @@ drop table t1; create table t1 (a int, b int); create view v1 as select a, sum(b) from t1 group by a; select b from v1 use index (some_index) where b=1; -ERROR HY000: Incorrect usage of USE INDEX and VIEW +ERROR HY000: Key 'some_index' doesn't exist in table 'v1' drop view v1; drop table t1; create table t1 (col1 char(5),col2 char(5)); @@ -3567,11 +3567,11 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); CREATE VIEW v1 AS SELECT * FROM t1; SELECT * FROM v1 USE KEY(non_existant); -ERROR HY000: Incorrect usage of USE INDEX and VIEW +ERROR HY000: Key 'non_existant' doesn't exist in table 'v1' SELECT * FROM v1 FORCE KEY(non_existant); -ERROR HY000: Incorrect usage of FORCE INDEX and VIEW +ERROR HY000: Key 'non_existant' doesn't exist in table 'v1' SELECT * FROM v1 IGNORE KEY(non_existant); -ERROR HY000: Incorrect usage of IGNORE INDEX and VIEW +ERROR HY000: Key 'non_existant' doesn't exist in table 'v1' DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b INT NOT NULL DEFAULT 0, @@ -3679,6 +3679,31 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT 1; DROP VIEW v1; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, INDEX (c2)); +INSERT INTO t1 VALUES (1,1), (2,2), (3,3); +SELECT * FROM t1 USE INDEX (PRIMARY) WHERE c1=2; +c1 c2 +2 2 +SELECT * FROM t1 USE INDEX (c2) WHERE c2=2; +c1 c2 +2 2 +CREATE VIEW v1 AS SELECT c1, c2 FROM t1; +SHOW INDEX FROM v1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +SELECT * FROM v1 USE INDEX (PRIMARY) WHERE c1=2; +ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1' +SELECT * FROM v1 FORCE INDEX (PRIMARY) WHERE c1=2; +ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1' +SELECT * FROM v1 IGNORE INDEX (PRIMARY) WHERE c1=2; +ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1' +SELECT * FROM v1 USE INDEX (c2) WHERE c2=2; +ERROR HY000: Key 'c2' doesn't exist in table 'v1' +SELECT * FROM v1 FORCE INDEX (c2) WHERE c2=2; +ERROR HY000: Key 'c2' doesn't exist in table 'v1' +SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2; +ERROR HY000: Key 'c2' doesn't exist in table 'v1' +DROP VIEW v1; +DROP TABLE t1; # ----------------------------------------------------------------- # -- End of 5.0 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index bcf31a4501d..2892ee7dd69 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -510,7 +510,7 @@ drop table t1; # create table t1 (a int, b int); create view v1 as select a, sum(b) from t1 group by a; ---error ER_WRONG_USAGE +--error ER_KEY_DOES_NOT_EXITS select b from v1 use index (some_index) where b=1; drop view v1; drop table t1; @@ -3424,11 +3424,11 @@ drop table t1; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); CREATE VIEW v1 AS SELECT * FROM t1; ---error ER_WRONG_USAGE +--error ER_KEY_DOES_NOT_EXITS SELECT * FROM v1 USE KEY(non_existant); ---error ER_WRONG_USAGE +--error ER_KEY_DOES_NOT_EXITS SELECT * FROM v1 FORCE KEY(non_existant); ---error ER_WRONG_USAGE +--error ER_KEY_DOES_NOT_EXITS SELECT * FROM v1 IGNORE KEY(non_existant); DROP VIEW v1; @@ -3568,6 +3568,32 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT 1; DROP VIEW v1; +# +# Bug #33461: SELECT ... FROM USE INDEX (...) throws an error +# + +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, INDEX (c2)); +INSERT INTO t1 VALUES (1,1), (2,2), (3,3); +SELECT * FROM t1 USE INDEX (PRIMARY) WHERE c1=2; +SELECT * FROM t1 USE INDEX (c2) WHERE c2=2; + +CREATE VIEW v1 AS SELECT c1, c2 FROM t1; +SHOW INDEX FROM v1; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 USE INDEX (PRIMARY) WHERE c1=2; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 FORCE INDEX (PRIMARY) WHERE c1=2; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 IGNORE INDEX (PRIMARY) WHERE c1=2; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 USE INDEX (c2) WHERE c2=2; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 FORCE INDEX (c2) WHERE c2=2; +--error ER_KEY_DOES_NOT_EXITS +SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2; + +DROP VIEW v1; +DROP TABLE t1; --echo # ----------------------------------------------------------------- --echo # -- End of 5.0 tests. diff --git a/sql/sql_view.cc b/sql/sql_view.cc index f65a62bed75..5bd3c09a289 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -980,13 +980,14 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table, DBUG_RETURN(0); } - if (table->use_index || table->ignore_index) + List *index_list= table->use_index ? table->use_index + : table->ignore_index; + if (index_list) { - my_error(ER_WRONG_USAGE, MYF(0), - table->ignore_index ? "IGNORE INDEX" : - (table->force_index ? "FORCE INDEX" : "USE INDEX"), - "VIEW"); - DBUG_RETURN(TRUE); + DBUG_ASSERT(index_list->head()); // should never fail + my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), index_list->head()->c_ptr_safe(), + table->table_name); + DBUG_RETURN(TRUE); } /* check loop via view definition */ -- cgit v1.2.1 From d15cbc1a1abf8c61398c096b0a0271d361da552c Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Fri, 28 Nov 2008 20:36:07 +0400 Subject: Bug #40745: Error during WHERE clause calculation in UPDATE leads to an assertion failure Any run-time error in stored function (like recursive function call or update of table that is already updating by statement which invoked this stored function etc.) that was used in some expression of the single-table UPDATE statement caused an assertion failure. Multiple-table UPDATE (as well as INSERT and both single- and multiple-table DELETE) are not affected. mysql-test/r/update.result: Added test case for bug #40745. mysql-test/t/update.test: Added test case for bug #40745. sql/sql_update.cc: Bug #40745: Error during WHERE clause calculation in UPDATE leads to an assertion failure The mysql_update function has been updated to take into account the status of invoked stored functions before setting the status of whole UPDATE query to OK. --- mysql-test/r/update.result | 11 +++++++++++ mysql-test/t/update.test | 21 +++++++++++++++++++++ sql/sql_update.cc | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/mysql-test/r/update.result b/mysql-test/r/update.result index b861ec96882..7a51649fac5 100644 --- a/mysql-test/r/update.result +++ b/mysql-test/r/update.result @@ -491,4 +491,15 @@ update t1 join t2 on (t1.a=t2.a) set t1.id=t2.id; affected rows: 127 info: Rows matched: 128 Changed: 127 Warnings: 0 drop table t1,t2; +DROP TABLE IF EXISTS t1; +DROP FUNCTION IF EXISTS f1; +CREATE FUNCTION f1() RETURNS INT RETURN f1(); +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1); +UPDATE t1 SET i = 3 WHERE f1(); +ERROR HY000: Recursive stored functions and triggers are not allowed. +UPDATE t1 SET i = f1(); +ERROR HY000: Recursive stored functions and triggers are not allowed. +DROP TABLE t1; +DROP FUNCTION f1; End of 5.0 tests diff --git a/mysql-test/t/update.test b/mysql-test/t/update.test index f79c9e773aa..7d56df259ba 100644 --- a/mysql-test/t/update.test +++ b/mysql-test/t/update.test @@ -430,4 +430,25 @@ drop table t1,t2; connection default; disconnect con1; +# +# Bug #40745: Error during WHERE clause calculation in UPDATE +# leads to an assertion failure +# +--disable_warnings +DROP TABLE IF EXISTS t1; +DROP FUNCTION IF EXISTS f1; +--enable_warnings + +CREATE FUNCTION f1() RETURNS INT RETURN f1(); +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1); + +--error ER_SP_NO_RECURSION +UPDATE t1 SET i = 3 WHERE f1(); +--error ER_SP_NO_RECURSION +UPDATE t1 SET i = f1(); + +DROP TABLE t1; +DROP FUNCTION f1; + --echo End of 5.0 tests diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 4fbf08c44d3..dbdd30552ec 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -715,6 +715,11 @@ int mysql_update(THD *thd, else table->file->unlock_row(); thd->row_count++; + if (thd->is_error()) + { + error= 1; + break; + } } dup_key_found= 0; /* -- cgit v1.2.1 From 4f75f58b7aa36184f853e7682c1f1acfbbe72b85 Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Mon, 1 Dec 2008 12:14:02 +0400 Subject: After-push commit for bug #33461 to make valgrind happy: TABLE_LIST doesn't free Strings in its string lists (TABLE_LIST::use_index and TABLE_liST::ignore_index), so calling c_ptr_safe() on that Strings leads to memleaks. OTOH "safe" c_ptr_safe() is not necessary there and we can replace it with c_ptr(). --- sql/sql_view.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 5bd3c09a289..41a638b2618 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -985,7 +985,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table, if (index_list) { DBUG_ASSERT(index_list->head()); // should never fail - my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), index_list->head()->c_ptr_safe(), + my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), index_list->head()->c_ptr(), table->table_name); DBUG_RETURN(TRUE); } -- cgit v1.2.1 From a1e9b6ba1e7d02c527bd2bd8b0a811919553f09c Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Mon, 1 Dec 2008 13:34:53 +0200 Subject: Addendum to bug #37339 : make the test case portable to windows by using and taking out a full path. mysql-test/r/ctype_filesystem.result: Bug #37399: use MYSQL_TEST_DIR rooted test mysql-test/t/ctype_filesystem-master.opt: Bug #37399: use MYSQL_TEST_DIR rooted test mysql-test/t/ctype_filesystem.test: Bug #37399: use MYSQL_TEST_DIR rooted test --- mysql-test/r/ctype_filesystem.result | 2 +- mysql-test/t/ctype_filesystem-master.opt | 2 +- mysql-test/t/ctype_filesystem.test | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/ctype_filesystem.result b/mysql-test/r/ctype_filesystem.result index 8a8f0f7f8cc..b461cf2a1a4 100644 --- a/mysql-test/r/ctype_filesystem.result +++ b/mysql-test/r/ctype_filesystem.result @@ -1,7 +1,7 @@ SET CHARACTER SET utf8; SHOW VARIABLES like 'character_sets_dir'; Variable_name Value -character_sets_dir /ß/ +character_sets_dir MYSQL_TEST_DIR/ß/ SHOW VARIABLES like 'character_set_filesystem'; Variable_name Value character_set_filesystem latin1 diff --git a/mysql-test/t/ctype_filesystem-master.opt b/mysql-test/t/ctype_filesystem-master.opt index cb3427571b5..44127f68664 100644 --- a/mysql-test/t/ctype_filesystem-master.opt +++ b/mysql-test/t/ctype_filesystem-master.opt @@ -1,2 +1,2 @@ ---character-sets-dir=/ß +--character-sets-dir=$MYSQL_TEST_DIR/ß --character-set-filesystem=latin1 diff --git a/mysql-test/t/ctype_filesystem.test b/mysql-test/t/ctype_filesystem.test index 30b1607008b..2b993c2b924 100644 --- a/mysql-test/t/ctype_filesystem.test +++ b/mysql-test/t/ctype_filesystem.test @@ -1,4 +1,5 @@ SET CHARACTER SET utf8; +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR SHOW VARIABLES like 'character_sets_dir'; SHOW VARIABLES like 'character_set_filesystem'; SHOW VARIABLES like 'character_set_client'; -- cgit v1.2.1 From f56e43ce521e4265f09682dd52ffa07ae1433afa Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Mon, 1 Dec 2008 16:18:35 +0200 Subject: Bug #39920: MySQL cannot deal with Leap Second expression in string literal. Updated MySQL time handling code to react correctly on UTC leap second additions. MySQL functions that return the OS current time, like e.g. CURDATE(), NOW() etc will return :59:59 instead of :59:60 or 59:61. As a result the reader will receive :59:59 for 2 or 3 consecutive seconds during the leap second. This fix will not affect the values returned by UNIX_TIMESTAMP() for leap seconds. But note that when converting the value returned by UNIX_TIMESTAMP() to broken down time the correction of leap seconds will still be applied. Note that this fix will make a difference *only* if the OS is specially configured to return leap seconds from the OS time calls or when using a MySQL time zone defintion that has leap seconds. Even after this change date/time literals (or other broken down time representations) with leap seconds (ending on :59:60 or 59:61) will still be considered illegal and discarded by the server with an error or a warning depending on the sql mode. Added a test case to demonstrate the effect of the fix. mysql-test/r/timezone3.result: Bug #39920: test case mysql-test/std_data/Moscow_leap: Bug #39920: updated the Moscow time zone to Dr. Olson's tzdata 2008i to accomodate for the 2008 leap second mysql-test/t/timezone3.test: Bug #39920: test case sql/tztime.cc: Bug #39920: adjust leap seconds (:60 or :61) to :59 sql/tztime.h: Bug #39920: adjust leap seconds (:60 or :61) to :59 --- mysql-test/r/timezone3.result | 8 ++++++++ mysql-test/std_data/Moscow_leap | Bin 991 -> 2674 bytes mysql-test/t/timezone3.test | 12 ++++++++++++ sql/tztime.cc | 22 ++++++++++++++++++++++ sql/tztime.h | 3 +++ 5 files changed, 45 insertions(+) diff --git a/mysql-test/r/timezone3.result b/mysql-test/r/timezone3.result index ec0b6045f93..ceac4a5aefb 100644 --- a/mysql-test/r/timezone3.result +++ b/mysql-test/r/timezone3.result @@ -17,6 +17,9 @@ insert into t1 values insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); +insert into t1 values +(unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), +(unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); select i, from_unixtime(i), c from t1; i from_unixtime(i) c 1072904422 2004-01-01 00:00:00 2004-01-01 00:00:00 @@ -31,6 +34,8 @@ i from_unixtime(i) c 1099180821 2004-10-31 02:59:59 2004-10-31 02:59:59 362793608 1981-07-01 03:59:59 1981-07-01 03:59:59 362793610 1981-07-01 04:00:00 1981-07-01 04:00:00 +1230768022 2009-01-01 02:59:59 2009-01-01 02:59:59 +1230768024 2009-01-01 03:00:00 2009-01-01 03:00:00 drop table t1; create table t1 (ts timestamp); insert into t1 values (19730101235900), (20040101235900); @@ -39,3 +44,6 @@ ts 1973-01-01 23:59:00 2004-01-01 23:59:00 drop table t1; +SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); +FROM_UNIXTIME(1230768022) FROM_UNIXTIME(1230768023) FROM_UNIXTIME(1230768024) +2009-01-01 02:59:59 2009-01-01 02:59:59 2009-01-01 03:00:00 diff --git a/mysql-test/std_data/Moscow_leap b/mysql-test/std_data/Moscow_leap index 4994c005595..3e73923cfb3 100644 Binary files a/mysql-test/std_data/Moscow_leap and b/mysql-test/std_data/Moscow_leap differ diff --git a/mysql-test/t/timezone3.test b/mysql-test/t/timezone3.test index 0aedbafcec4..8a9941f6383 100644 --- a/mysql-test/t/timezone3.test +++ b/mysql-test/t/timezone3.test @@ -45,6 +45,10 @@ insert into t1 values (unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'), (unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00'); +insert into t1 values + (unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'), + (unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00'); + select i, from_unixtime(i), c from t1; drop table t1; @@ -58,4 +62,12 @@ insert into t1 values (19730101235900), (20040101235900); select * from t1; drop table t1; +# +# Test Bug #39920: MySQL cannot deal with Leap Second expression in string +# literal +# + +# 2009-01-01 02:59:59, 2009-01-01 02:59:60 and 2009-01-01 03:00:00 +SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024); + # End of 4.1 tests diff --git a/sql/tztime.cc b/sql/tztime.cc index 709e3b64752..d3d952e3c1e 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -1073,6 +1073,7 @@ Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const localtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; + adjust_leap_second(tmp); } @@ -1157,6 +1158,7 @@ Time_zone_utc::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const gmtime_r(&tmp_t, &tmp_tm); localtime_to_TIME(tmp, &tmp_tm); tmp->time_type= MYSQL_TIMESTAMP_DATETIME; + adjust_leap_second(tmp); } @@ -1260,6 +1262,7 @@ void Time_zone_db::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const { ::gmt_sec_to_TIME(tmp, t, tz_info); + adjust_leap_second(tmp); } @@ -2373,6 +2376,25 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name) DBUG_RETURN(tz); } + +/** + Convert leap seconds into non-leap + + This function will convert the leap seconds added by the OS to + non-leap seconds, e.g. 23:59:59, 23:59:60 -> 23:59:59, 00:00:01 ... + This check is not checking for years on purpose : although it's not a + complete check this way it doesn't require looking (and having installed) + the leap seconds table. + + @param[in,out] broken down time structure as filled in by the OS +*/ + +void Time_zone::adjust_leap_second(MYSQL_TIME *t) +{ + if (t->second == 60 || t->second == 61) + t->second= 59; +} + #endif /* !defined(TESTTIME) && !defined(TZINFO2SQL) */ diff --git a/sql/tztime.h b/sql/tztime.h index 32a942a26e1..750b8dacbe1 100644 --- a/sql/tztime.h +++ b/sql/tztime.h @@ -55,6 +55,9 @@ public: allocated on MEM_ROOT and should not require destruction. */ virtual ~Time_zone() {}; + +protected: + static inline void adjust_leap_second(MYSQL_TIME *t); }; extern Time_zone * my_tz_UTC; -- cgit v1.2.1 From 7f9e0b9bfb71bd3e47c48bb77f11df76feb1b7ad Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Mon, 1 Dec 2008 17:41:06 +0200 Subject: addendum to the fix for bug #39920 : post-merge test suite fixes --- mysql-test/r/timezone2.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/timezone2.result b/mysql-test/r/timezone2.result index bb1d764ac8c..e115ce16fa4 100644 --- a/mysql-test/r/timezone2.result +++ b/mysql-test/r/timezone2.result @@ -110,7 +110,7 @@ i ts 362793610 1981-07-01 04:00:00 select from_unixtime(362793609); from_unixtime(362793609) -1981-07-01 03:59:60 +1981-07-01 03:59:59 drop table t1; create table t1 (ts timestamp); set time_zone='UTC'; -- cgit v1.2.1 From bd53e304d7a75854dea2b732468fe4b18ef3aaf8 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Tue, 2 Dec 2008 13:15:28 +0200 Subject: Addendum to the fix for bug #39178: Server crash in YaSSL with non-RSA-requesting client if server uses RSA key matchSuite() may not find a match. It will return error in this case. Added a error checking code that will prevent using uninitialized memory in the code based on the assumption that matchSuite() has found a match. extra/yassl/src/yassl_imp.cpp: Bug #39178: Correct error checking added --- extra/yassl/src/yassl_imp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/extra/yassl/src/yassl_imp.cpp b/extra/yassl/src/yassl_imp.cpp index 4430ef0213c..20dfe50f132 100644 --- a/extra/yassl/src/yassl_imp.cpp +++ b/extra/yassl/src/yassl_imp.cpp @@ -1560,6 +1560,7 @@ void ClientHello::Process(input_buffer&, SSL& ssl) return; } ssl.matchSuite(cipher_suites_, suite_len_); + if (ssl.GetError()) return; ssl.set_pending(ssl.getSecurity().get_parms().suite_[1]); if (compression_methods_ == zlib) -- cgit v1.2.1 From 014143e8588c4313ccf10e269aa34a997f5772b6 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Tue, 2 Dec 2008 13:21:05 +0200 Subject: Fixed a bad merge (5.0->5.1) of the fix for bug 37339. There was a missing initialization. sql/set_var.h: Added an initialization missing during the merge of 37339. --- sql/set_var.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/set_var.h b/sql/set_var.h index 2e58b2faa7d..b6c67d1ab4a 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -82,6 +82,7 @@ public: sys_var(const char *name_arg, sys_after_update_func func= NULL, Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG) :name(name_arg), after_update(func), no_support_one_shot(1), + is_os_charset (FALSE), binlog_status(binlog_status_arg), m_allow_empty_value(TRUE) {} -- cgit v1.2.1 From 71dbb4987f719e04ee49b30522fab2d8aa646dc6 Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Tue, 2 Dec 2008 14:50:40 +0200 Subject: moved the version to 5.0-main --- .bzr-mysql/default.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bzr-mysql/default.conf b/.bzr-mysql/default.conf index 557df1b1ffe..f79c1cd6319 100644 --- a/.bzr-mysql/default.conf +++ b/.bzr-mysql/default.conf @@ -1,4 +1,4 @@ [MYSQL] post_commit_to = "commits@lists.mysql.com" post_push_to = "commits@lists.mysql.com" -tree_name = "mysql-5.0-bugteam" +tree_name = "mysql-5.0" -- cgit v1.2.1 From 7391280c15fda6337c24be789cc0b1a1d5b25d69 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Dec 2008 01:09:05 +0100 Subject: Raise version number after cloning 5.0.74 --- configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 83220a879f0..2d942bc7e85 100644 --- a/configure.in +++ b/configure.in @@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! # remember to also change ndb version below and update version.c in ndb -AM_INIT_AUTOMAKE(mysql, 5.0.74) +AM_INIT_AUTOMAKE(mysql, 5.0.76) AM_CONFIG_HEADER([include/config.h:config.h.in]) PROTOCOL_VERSION=10 @@ -23,7 +23,7 @@ NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0 # ndb version NDB_VERSION_MAJOR=5 NDB_VERSION_MINOR=0 -NDB_VERSION_BUILD=74 +NDB_VERSION_BUILD=76 NDB_VERSION_STATUS="" # Set all version vars based on $VERSION. How do we do this more elegant ? -- cgit v1.2.1 From 8f500c522b5b38b55204031a90977c2c087ffd5c Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 4 Dec 2008 19:41:53 +0100 Subject: Bug#38522: 5 seconds delay when closing application using embedded server The problem here is that embedded server starts handle_thread manager thread on mysql_library_init() does not stop it on mysql_library_end(). At shutdown, my_thread_global_end() waits for thread count to become 0, but since we did not stop the thread it will give up after 5 seconds. Solution is to move shutdown for handle_manager thread from kill_server() (mysqld specific) to clean_up() that is used by both embedded and mysqld. This patch also contains some refactorings - to avoid duplicate code, start_handle_manager() and stop_handle_manager() functions are introduced. Unused variables are eliminated. handle_manager does not rely on global variable abort_loop anymore to stop (abort_loop is not set for embedded). Note: Specifically on Windows and when using DBUG version of libmysqld, the complete solution requires removing obsolete code my_thread_init() from my_thread_var(). This has a side effect that a DBUG statement after my_thread_end() can cause thread counter to be incremented, and embedded will hang for some seconds. Or worse, my_thread_init() will crash if critical sections have been deleted by the global cleanup routine that runs in a different thread. This patch also fixes and revert prior changes for Bug#38293 "Libmysqld crash in mysql_library_init if language file missing". Root cause of the crash observed in Bug#38293 was bug in my_thread_init() described above client/mysql.cc: sql_protocol_typelib is not exported from libmysqld (does not make sense either) thus excluded from embedded client dbug/dbug.c: revert changes for Bug#38293 include/my_dbug.h: revert changes for Bug#38293 libmysql/libmysql.c: Removed DBUG_POP call, because when called after my_end(), will access THR_key_mysys that is already deleted. The result of pthread_get_specific is not predictable in this case and hence DBUG_POP can crash. libmysqld/examples/CMakeLists.txt: Revert changes for Bug#38293. libmysqld/lib_sql.cc: code to start handle manager is factored out into start_handle_manager() function libmysqld/libmysqld.def: Revert changes for Bug #38293 Remove excessive exports from libmysqld, export what API documents. mysys/my_thr_init.c: Remove windows-DLL-specific workaround for something (old code, no documentation for what specifically). The problem is that even after my_thread_end() is finished, DBUG statement can initiate my_thread_init(). This does not happen anywhere else and should not happen on Windows either. sql/mysql_priv.h: - new functions start_handle_manager() and stop_handle_manager() - move manager_thread_in_use variable to sql_manager.cc and made it static - remove manager_status, as it is unused sql/mysqld.cc: Code to start/stop handle_manager thread is factored out into start_handle_manager() --- client/mysql.cc | 2 + dbug/dbug.c | 17 +---- include/my_dbug.h | 16 ----- libmysql/libmysql.c | 4 +- libmysqld/examples/CMakeLists.txt | 6 +- libmysqld/lib_sql.cc | 8 +-- libmysqld/libmysqld.def | 126 -------------------------------------- mysys/my_thr_init.c | 12 +--- sql/mysql_priv.h | 7 +-- sql/mysqld.cc | 24 +------- sql/sql_manager.cc | 54 ++++++++++++---- 11 files changed, 56 insertions(+), 220 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 024194d81f6..ff53d623d07 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1627,8 +1627,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), opt_nopager= 1; break; case OPT_MYSQL_PROTOCOL: +#ifndef EMBEDDED_LIBRARY opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, opt->name); +#endif break; case OPT_SERVER_ARG: #ifdef EMBEDDED_LIBRARY diff --git a/dbug/dbug.c b/dbug/dbug.c index bbd1abb9598..baf080f5e27 100644 --- a/dbug/dbug.c +++ b/dbug/dbug.c @@ -1851,13 +1851,7 @@ static void DBUGOpenFile(CODE_STATE *cs, else { newfile= !EXISTS(name); - if (!(fp= fopen(name, -#if defined(MSDOS) || defined(__WIN__) - append ? "a+c" : "wc" -#else - append ? "a+" : "w" -#endif - ))) + if (!(fp= fopen(name, append ? "a+" : "w"))) { (void) fprintf(stderr, ERR_OPEN, cs->process, name); perror(""); @@ -2407,13 +2401,4 @@ int i_am_a_dummy_function() { return 0; } -#ifdef __WIN__ -char _db_doprnt_; -char _db_enter_; -char _db_pargs_; -char _db_process_; -char _db_push_; -char _db_return_; -#endif /*__WIN__*/ - #endif diff --git a/include/my_dbug.h b/include/my_dbug.h index fa7941faf1c..a77e439b5db 100644 --- a/include/my_dbug.h +++ b/include/my_dbug.h @@ -108,22 +108,6 @@ extern FILE *_db_fp_(void); #define DBUG_EXPLAIN(buf,len) #define DBUG_EXPLAIN_INITIAL(buf,len) #define IF_DBUG(A) - -#ifdef __WIN__ -/* - On windows all the dll export has to be declared in the *.def file - so as we export these symbols in DEBUG mode we have to export - these in the RELEASE mode also. So below are the dummy symbols - for the RELEASE export -*/ -extern char _db_doprnt_; -extern char _db_enter_; -extern char _db_pargs_; -extern char _db_process_; -extern char _db_push_; -extern char _db_return_; -#endif /*__WIN__*/ - #endif #ifdef __cplusplus } diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 1eab4199deb..ca329eadf0f 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -207,9 +207,7 @@ void STDCALL mysql_server_end() /* If library called my_init(), free memory allocated by it */ if (!org_my_init_done) { - my_end(MY_DONT_FREE_DBUG); - /* Remove TRACING, if enabled by mysql_debug() */ - DBUG_POP(); + my_end(0); } else { diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt index 137dd11d28e..346278425a7 100644 --- a/libmysqld/examples/CMakeLists.txt +++ b/libmysqld/examples/CMakeLists.txt @@ -29,13 +29,13 @@ ADD_DEFINITIONS(-DEMBEDDED_LIBRARY) ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc ../../client/mysql.cc ../../client/readline.cc ../../client/sql_string.cc) -TARGET_LINK_LIBRARIES(mysql_embedded wsock32) +TARGET_LINK_LIBRARIES(mysql_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32) ADD_DEPENDENCIES(mysql_embedded libmysqld) ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c) -TARGET_LINK_LIBRARIES(mysqltest_embedded wsock32) +TARGET_LINK_LIBRARIES(mysqltest_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32) ADD_DEPENDENCIES(mysqltest_embedded libmysqld) ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c) -TARGET_LINK_LIBRARIES(mysql_client_test_embedded wsock32) +TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32) ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld) diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index e78c656d565..23572ad4929 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -386,6 +386,7 @@ static void emb_free_embedded_thd(MYSQL *mysql) thd->store_globals(); thd->unlink(); delete thd; + my_pthread_setspecific_ptr(THR_THD, 0); mysql->thd=0; } @@ -539,12 +540,7 @@ int init_embedded_server(int argc, char **argv, char **groups) (void) thr_setconcurrency(concurrency); // 10 by default - if (flush_time && flush_time != ~(ulong) 0L) - { - pthread_t hThread; - if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) - sql_print_error("Warning: Can't create thread to manage maintenance"); - } + start_handle_manager(); // FIXME initialize binlog_filter and rpl_filter if not already done // corresponding delete is in clean_up() diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def index 865475cb56c..047cfe0fe57 100644 --- a/libmysqld/libmysqld.def +++ b/libmysqld/libmysqld.def @@ -2,94 +2,6 @@ LIBRARY LIBMYSQLD DESCRIPTION 'MySQL 5.1 Embedded Server Library' VERSION 5.1 EXPORTS - _db_process_ - _db_enter_ - _db_return_ - _db_push_ - _db_doprnt_ - _db_pargs_ - strnmov - get_charset - my_memmem - my_snprintf - pthread_exit - pthread_cond_signal - dynstr_append_mem - init_dynamic_string - dynstr_free - my_hash_free - my_vsnprintf - dynstr_append - my_close - my_open - dynstr_set - dynstr_append_os_quoted - my_delete - my_seek - my_write - create_temp_file - fn_format - dirname_part - my_hash_insert - my_hash_search - test_if_hard_path - my_copy - my_mkdir - my_sleep - my_strtod - pthread_cond_wait - my_strnncoll_simple - get_dynamic - my_regerror - init_dynamic_array2 - pthread_create - pthread_cond_init - my_regcomp - my_regexec - my_regex_end - my_regfree - longlong2str - my_set_exception_pointers - my_print_stacktrace - my_thread_stack_size - my_safe_print_str - my_stat - _my_hash_init - pthread_attr_setstacksize - pthread_attr_init - my_dirend - wild_compare - my_dir - my_micro_time - find_type_or_exit - _dig_vec_upper - _dig_vec_lower - bmove_upp - delete_dynamic - free_defaults - getopt_compare_strings - getopt_ull_limit_value - handle_options - init_dynamic_array - insert_dynamic - int2str - is_prefix - list_add - list_delete - load_defaults - max_allowed_packet - my_cgets - my_end - my_getopt_print_errors - my_init - my_malloc - my_memdup - my_no_flags_free - my_path - my_print_help - my_print_variables - my_realloc - my_strdup mysql_thread_end mysql_thread_init myodbc_remove_escape @@ -162,47 +74,13 @@ EXPORTS mysql_thread_safe mysql_use_result mysql_warning_count - set_dynamic - strcend - strcont - strdup_root - strfill - strinstr - strmake - strmov - strxmov mysql_server_end mysql_server_init get_tty_password - sql_protocol_typelib mysql_get_server_version mysql_set_character_set mysql_sqlstate - charsets_dir - disabled_my_option - my_charset_latin1 - init_alloc_root - my_progname - get_charset_name - get_charset_by_csname - print_defaults - find_type - strxnmov - strend - my_fopen - my_fclose - unpack_filename - str2int - int10_to_str - longlong10_to_str - my_snprintf_8bit - alloc_root - free_root - my_read - llstr mysql_get_parameters - mysql_thread_init - mysql_thread_end mysql_stmt_bind_param mysql_stmt_bind_result mysql_stmt_execute @@ -230,7 +108,3 @@ EXPORTS mysql_stmt_attr_get mysql_stmt_attr_set mysql_stmt_field_count - get_defaults_options - my_charset_bin - my_charset_same - modify_defaults_file diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c index 933674fa007..2278c467f32 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -368,17 +368,7 @@ void my_thread_end(void) struct st_my_thread_var *_my_thread_var(void) { - struct st_my_thread_var *tmp= - my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); -#if defined(USE_TLS) - /* This can only happen in a .DLL */ - if (!tmp) - { - my_thread_init(); - tmp=my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); - } -#endif - return tmp; + return my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1d5c08c7c56..0d276cce177 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1768,10 +1768,9 @@ int mysql_load(THD *thd, sql_exchange *ex, TABLE_LIST *table_list, int write_record(THD *thd, TABLE *table, COPY_INFO *info); /* sql_manager.cc */ -extern ulong volatile manager_status; -extern bool volatile manager_thread_in_use, mqh_used; -extern pthread_t manager_thread; -pthread_handler_t handle_manager(void *arg); +extern bool volatile mqh_used; +void start_handle_manager(); +void stop_handle_manager(); bool mysql_manager_submit(void (*action)()); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index e6980318a66..7ff2b9e7dff 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -784,16 +784,6 @@ static void close_connections(void) kill_cached_threads++; flush_thread_cache(); - /* kill flush thread */ - (void) pthread_mutex_lock(&LOCK_manager); - if (manager_thread_in_use) - { - DBUG_PRINT("quit", ("killing manager thread: 0x%lx", - (ulong)manager_thread)); - (void) pthread_cond_signal(&COND_manager); - } - (void) pthread_mutex_unlock(&LOCK_manager); - /* kill connection thread */ #if !defined(__WIN__) && !defined(__NETWARE__) DBUG_PRINT("quit", ("waiting for select thread: 0x%lx", @@ -1196,6 +1186,7 @@ void clean_up(bool print_message) if (cleanup_done++) return; /* purecov: inspected */ + stop_handle_manager(); release_ddl_log(); /* @@ -4038,17 +4029,6 @@ server."); #ifndef EMBEDDED_LIBRARY -static void create_maintenance_thread() -{ - if (flush_time && flush_time != ~(ulong) 0L) - { - pthread_t hThread; - if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) - sql_print_warning("Can't create thread to manage maintenance"); - } -} - - static void create_shutdown_thread() { #ifdef __WIN__ @@ -4363,7 +4343,7 @@ we force server id to 2, but this MySQL server will not act as a slave."); execute_ddl_log_recovery(); create_shutdown_thread(); - create_maintenance_thread(); + start_handle_manager(); if (Events::init(opt_noacl)) unireg_abort(1); diff --git a/sql/sql_manager.cc b/sql/sql_manager.cc index 171ab55145a..b082f65bfb9 100644 --- a/sql/sql_manager.cc +++ b/sql/sql_manager.cc @@ -23,8 +23,9 @@ #include "mysql_priv.h" -ulong volatile manager_status; -bool volatile manager_thread_in_use; + +static bool volatile manager_thread_in_use; +static bool abort_manager; pthread_t manager_thread; pthread_mutex_t LOCK_manager; @@ -63,7 +64,6 @@ bool mysql_manager_submit(void (*action)()) pthread_handler_t handle_manager(void *arg __attribute__((unused))) { int error = 0; - ulong status; struct timespec abstime; bool reset_flush_time = TRUE; struct handler_cb *cb= NULL; @@ -72,7 +72,6 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) pthread_detach_this_thread(); manager_thread = pthread_self(); - manager_status = 0; manager_thread_in_use = 1; for (;;) @@ -87,16 +86,14 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) set_timespec(abstime, flush_time); reset_flush_time = FALSE; } - while (!manager_status && (!error || error == EINTR) && !abort_loop) + while ((!error || error == EINTR) && !abort_manager) error= pthread_cond_timedwait(&COND_manager, &LOCK_manager, &abstime); } else { - while (!manager_status && (!error || error == EINTR) && !abort_loop) + while ((!error || error == EINTR) && !abort_manager) error= pthread_cond_wait(&COND_manager, &LOCK_manager); } - status = manager_status; - manager_status = 0; if (cb == NULL) { cb= cb_list; @@ -104,7 +101,7 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) } pthread_mutex_unlock(&LOCK_manager); - if (abort_loop) + if (abort_manager) break; if (error == ETIMEDOUT || error == ETIME) @@ -121,11 +118,42 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) my_free((uchar*)cb, MYF(0)); cb= next; } - - if (status) - DBUG_PRINT("error", ("manager did not handle something: %lx", status)); } manager_thread_in_use = 0; + DBUG_LEAVE; // Can't use DBUG_RETURN after my_thread_end my_thread_end(); - DBUG_RETURN(NULL); + return (NULL); } + + +/* Start handle manager thread */ +void start_handle_manager() +{ + DBUG_ENTER("start_handle_manager"); + abort_manager = false; + if (flush_time && flush_time != ~(ulong) 0L) + { + pthread_t hThread; + if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) + sql_print_warning("Can't create handle_manager thread"); + } + DBUG_VOID_RETURN; +} + + +/* Initiate shutdown of handle manager thread */ +void stop_handle_manager() +{ + DBUG_ENTER("stop_handle_manager"); + abort_manager = true; + pthread_mutex_lock(&LOCK_manager); + if (manager_thread_in_use) + { + DBUG_PRINT("quit", ("initiate shutdown of handle manager thread: 0x%lx", + (ulong)manager_thread)); + pthread_cond_signal(&COND_manager); + } + pthread_mutex_unlock(&LOCK_manager); + DBUG_VOID_RETURN; +} + -- cgit v1.2.1 From 1bb6a0ba9f64ec5869d6d75a6e747379cd0842fe Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Fri, 5 Dec 2008 13:24:19 +0200 Subject: Disable wait_timeout_func and report bug #41255. --- mysql-test/t/disabled.def | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index c01bb4b9e44..5de0a435ba5 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -12,3 +12,4 @@ federated_transactions : Bug#29523 Transactions do not work log_tables.test : Bug #37798: main.log_tables fails randomly on powermacg5 and windows slow_query_log_func.test : Bug #37962: *_func tests containing sleeps/race conditions +wait_timeout_func : Bug #41225 joro wait_timeout_func fails -- cgit v1.2.1