From 346033a5dab56766dbe2a5bb060f4235844d6c16 Mon Sep 17 00:00:00 2001 From: "kaa@polly.local" <> Date: Mon, 20 Nov 2006 17:35:23 +0300 Subject: [PATCH 1/2] Fix for bug #22077 "DROP TEMPORARY TABLE fails with wrong error if read_only is set" Do not issue a 'read-only' error in case of DROP TEMPORARY TABLE on a non-existing temporary table. Instead produce the correct "Unknown table" error or warning (in cases when the IF EXISTS clause was specified). To a documentor: the part of the manual describing the 'read_only' system variable should be clarified to state the following: "When the read_only variable is set to ON, all operations which create/update/drop tables are rejected with the exceptions for: 1. Any operation performed by the replication thread on a slave server 2. Any operation performed by a user that have the SUPER privilege 3. Any operation that creates/updates/drops only temporary tables" --- mysql-test/r/read_only.result | 5 +++++ mysql-test/t/read_only.test | 12 ++++++++++++ sql/sql_parse.cc | 13 +++++++------ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/read_only.result b/mysql-test/r/read_only.result index 1a1991a6255..69d25fbef6f 100644 --- a/mysql-test/r/read_only.result +++ b/mysql-test/r/read_only.result @@ -39,6 +39,11 @@ delete t1 from t1,t3 where t1.a=t3.a; drop table t1; insert into t1 values(1); ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement +drop temporary table ttt; +ERROR 42S02: Unknown table 'ttt' +drop temporary table if exists ttt; +Warnings: +Note 1051 Unknown table 'ttt' drop table t1,t2; drop user test@localhost; set global read_only=0; diff --git a/mysql-test/t/read_only.test b/mysql-test/t/read_only.test index 175a5bba6fa..8e14b310f4c 100644 --- a/mysql-test/t/read_only.test +++ b/mysql-test/t/read_only.test @@ -101,6 +101,18 @@ drop table t1; --error 1290 insert into t1 values(1); +# +# BUG #22077 "DROP TEMPORARY TABLE fails with wrong error if read_only is set" +# +# check if DROP TEMPORARY on a non-existing temporary table returns the right +# error + +--error ER_BAD_TABLE_ERROR +drop temporary table ttt; + +# check if DROP TEMPORARY TABLE IF EXISTS produces a warning with read_only set +drop temporary table if exists ttt; + connection default; drop table t1,t2; drop user test@localhost; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4992d2514c9..eda58f6d798 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2515,12 +2515,13 @@ mysql_execute_command(THD *thd) tables. Except for the replication thread and the 'super' users. */ if (opt_readonly && - !(thd->security_ctx->master_access & SUPER_ACL) && - uc_update_queries[lex->sql_command] && - !((lex->sql_command == SQLCOM_CREATE_TABLE) && - (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) && - ((lex->sql_command != SQLCOM_UPDATE_MULTI) && - some_non_temp_table_to_be_updated(thd, all_tables))) + !(thd->security_ctx->master_access & SUPER_ACL) && + uc_update_queries[lex->sql_command] && + !((lex->sql_command == SQLCOM_CREATE_TABLE) && + (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) && + !((lex->sql_command == SQLCOM_DROP_TABLE) && lex->drop_temporary) && + ((lex->sql_command != SQLCOM_UPDATE_MULTI) && + some_non_temp_table_to_be_updated(thd, all_tables))) { my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); DBUG_RETURN(-1); From d4595f3c57ae97e9251ee3b1680ad9fd6ddb218f Mon Sep 17 00:00:00 2001 From: "knielsen@ymer.(none)" <> Date: Fri, 24 Nov 2006 12:38:39 +0100 Subject: [PATCH 2/2] Do not link /usr/lib/debug/* on Debian <=3.1, as it causes broken stack traces in Valgrind (broken libc6-dbg). Installing libc6-dbg on Debian will still provide proper bactraces, even without setting LD_LIBRARY_PATH explicitly. --- mysql-test/lib/mtr_io.pl | 14 ++++++++++++++ mysql-test/mysql-test-run.pl | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/mysql-test/lib/mtr_io.pl b/mysql-test/lib/mtr_io.pl index 984d834486c..09749bc74e3 100644 --- a/mysql-test/lib/mtr_io.pl +++ b/mysql-test/lib/mtr_io.pl @@ -13,6 +13,8 @@ sub mtr_tofile ($@); sub mtr_tonewfile($@); sub mtr_lastlinefromfile($); sub mtr_appendfile_to_file ($$); +sub mtr_grab_file($); + ############################################################################## # @@ -128,6 +130,7 @@ sub unspace { return "$quote$string$quote"; } +# Read a whole file, stripping leading and trailing whitespace. sub mtr_fromfile ($) { my $file= shift; @@ -181,5 +184,16 @@ sub mtr_appendfile_to_file ($$) { close TOFILE; } +# Read a whole file verbatim. +sub mtr_grab_file($) { + my $file= shift; + open(FILE, '<', $file) + or return undef; + local $/= undef; + my $data= scalar(); + close FILE; + return $data; +} + 1; diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index a028c94a2c5..22dc49c5ebd 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -1557,9 +1557,17 @@ sub environment_setup () { # impossible to add correct supressions, that means if "/usr/lib/debug" # is available, it should be added to # LD_LIBRARY_PATH + # + # But pthread is broken in libc6-dbg on Debian <= 3.1 (see Debian + # bug 399035, http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=399035), + # so don't change LD_LIBRARY_PATH on that platform. # -------------------------------------------------------------------------- my $debug_libraries_path= "/usr/lib/debug"; - if ( $opt_valgrind and -d $debug_libraries_path ) + my $deb_version; + if ( $opt_valgrind and -d $debug_libraries_path and + (! -e '/etc/debian_version' or + ($deb_version= mtr_grab_file('/etc/debian_version')) == 0 or + $deb_version > 3.1 ) ) { push(@ld_library_paths, $debug_libraries_path); }