From: Marc Alff Date: August 26 2010 2:55pm Subject: bzr push into mysql-trunk-bugfixing branch (marc.alff:3240 to 3241) List-Archive: http://lists.mysql.com/commits/116898 Message-Id: <20100826145524.852FA45E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7425472724353129517==" --===============7425472724353129517== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3241 Marc Alff 2010-08-26 [merge] Merge mysql-5.5-bugfixing --> mysql-trunk-bugfixing added: mysql-test/suite/perfschema/r/bad_option_3.result mysql-test/suite/perfschema/r/bad_option_4.result mysql-test/suite/perfschema/r/bad_option_5.result mysql-test/suite/perfschema/r/short_option_1.result mysql-test/suite/perfschema/r/short_option_2.result mysql-test/suite/perfschema/t/bad_option_3.test mysql-test/suite/perfschema/t/bad_option_4.test mysql-test/suite/perfschema/t/bad_option_5.test mysql-test/suite/perfschema/t/short_option_1-master.opt mysql-test/suite/perfschema/t/short_option_1.test mysql-test/suite/perfschema/t/short_option_2-master.opt mysql-test/suite/perfschema/t/short_option_2.test modified: mysys/my_getopt.c sql/set_var.cc 3240 Alexander Barkov 2010-08-26 [merge] Merging from mysql-5.5-bugfixing modified: mysql-test/r/ctype_utf32.result mysql-test/t/ctype_utf32.test storage/myisam/mi_key.c === added file 'mysql-test/suite/perfschema/r/bad_option_3.result' --- a/mysql-test/suite/perfschema/r/bad_option_3.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/bad_option_3.result 2010-08-26 00:59:28 +0000 @@ -0,0 +1,2 @@ +Found: unknown option '-x' +Found: Aborting === added file 'mysql-test/suite/perfschema/r/bad_option_4.result' --- a/mysql-test/suite/perfschema/r/bad_option_4.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/bad_option_4.result 2010-08-26 00:59:28 +0000 @@ -0,0 +1,2 @@ +Found: Can't change dir to.*bad_option_h_param +Found: Aborting === added file 'mysql-test/suite/perfschema/r/bad_option_5.result' --- a/mysql-test/suite/perfschema/r/bad_option_5.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/bad_option_5.result 2010-08-26 00:59:28 +0000 @@ -0,0 +1,2 @@ +Found: unknown option '-X' +Found: Aborting === added file 'mysql-test/suite/perfschema/r/short_option_1.result' --- a/mysql-test/suite/perfschema/r/short_option_1.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/short_option_1.result 2010-08-26 00:59:28 +0000 @@ -0,0 +1,27 @@ +select 'Ok, the server started' as result; +result +Ok, the server started +select @@SQL_MODE; +@@SQL_MODE +REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI +show variables like 'sql_mode'; +Variable_name Value +sql_mode REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI +select @@character_set_server; +@@character_set_server +utf8 +show variables like 'character_set_system'; +Variable_name Value +character_set_system utf8 +show variables like 'log'; +Variable_name Value +log ON +show variables like 'general_log'; +Variable_name Value +general_log ON +show variables like 'new'; +Variable_name Value +new ON +show variables like 'log_warnings'; +Variable_name Value +log_warnings 3 === added file 'mysql-test/suite/perfschema/r/short_option_2.result' --- a/mysql-test/suite/perfschema/r/short_option_2.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/short_option_2.result 2010-08-26 00:59:28 +0000 @@ -0,0 +1,9 @@ +select 'Ok, the server started' as result; +result +Ok, the server started +select @@SQL_MODE; +@@SQL_MODE +REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI +select @@log_warnings; +@@log_warnings +5 === added file 'mysql-test/suite/perfschema/t/bad_option_3.test' --- a/mysql-test/suite/perfschema/t/bad_option_3.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/bad_option_3.test 2010-08-26 00:59:28 +0000 @@ -0,0 +1,49 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA +# Check error handling for invalid server start options + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_3.txt; +--error 0,1 +--remove_file $outfile +--error 2 +--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -a -x > $outfile 2>&1 + +perl; + use strict; + use warnings; + my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_3.txt"; + open(FILE, "<", $fname) or die; + my @lines= ; + # those must be in the file for the test to pass + my @patterns= + ("unknown option '-x'", + "Aborting"); + foreach my $one_line (@lines) + { + foreach my $one_pattern (@patterns) + { + # print pattern, not line, to get a stable output + print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/); + } + } + close FILE; +EOF +--remove_file $outfile + === added file 'mysql-test/suite/perfschema/t/bad_option_4.test' --- a/mysql-test/suite/perfschema/t/bad_option_4.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/bad_option_4.test 2010-08-26 00:59:28 +0000 @@ -0,0 +1,49 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA +# Check error handling for invalid server start options + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_4.txt; +--error 0,1 +--remove_file $outfile +--error 1 +--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -a -h bad_option_h_param > $outfile 2>&1 + +perl; + use strict; + use warnings; + my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_4.txt"; + open(FILE, "<", $fname) or die; + my @lines= ; + # those must be in the file for the test to pass + my @patterns= + ("Can't change dir to.*bad_option_h_param", + "Aborting"); + foreach my $one_line (@lines) + { + foreach my $one_pattern (@patterns) + { + # print pattern, not line, to get a stable output + print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/); + } + } + close FILE; +EOF +--remove_file $outfile + === added file 'mysql-test/suite/perfschema/t/bad_option_5.test' --- a/mysql-test/suite/perfschema/t/bad_option_5.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/bad_option_5.test 2010-08-26 00:59:28 +0000 @@ -0,0 +1,52 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA +# Check error handling for invalid server start options + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_5.txt; +--error 0,1 +--remove_file $outfile +--error 2 +--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -aXbroken > $outfile 2>&1 + +# -aXbroken should be parsed as -a -Xbroken, or --ansi -Xbroken, +# therefore the -X option is what the server should complain about + +perl; + use strict; + use warnings; + my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_5.txt"; + open(FILE, "<", $fname) or die; + my @lines= ; + # those must be in the file for the test to pass + my @patterns= + ("unknown option '-X'", + "Aborting"); + foreach my $one_line (@lines) + { + foreach my $one_pattern (@patterns) + { + # print pattern, not line, to get a stable output + print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/); + } + } + close FILE; +EOF +--remove_file $outfile + === added file 'mysql-test/suite/perfschema/t/short_option_1-master.opt' --- a/mysql-test/suite/perfschema/t/short_option_1-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/short_option_1-master.opt 2010-08-26 00:59:28 +0000 @@ -0,0 +1 @@ +-a -n -Cutf8 --collation=utf8_bin -l -T12 -W3 === added file 'mysql-test/suite/perfschema/t/short_option_1.test' --- a/mysql-test/suite/perfschema/t/short_option_1.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/short_option_1.test 2010-08-26 00:59:28 +0000 @@ -0,0 +1,35 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA +# Check server start for short server start options + +select 'Ok, the server started' as result; + +# See the associated -master.opt file. + +select @@SQL_MODE; +show variables like 'sql_mode'; + +select @@character_set_server; +show variables like 'character_set_system'; + +show variables like 'log'; +show variables like 'general_log'; + +show variables like 'new'; + +show variables like 'log_warnings'; + === added file 'mysql-test/suite/perfschema/t/short_option_2-master.opt' --- a/mysql-test/suite/perfschema/t/short_option_2-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/short_option_2-master.opt 2010-08-26 00:59:28 +0000 @@ -0,0 +1 @@ +-aW5 === added file 'mysql-test/suite/perfschema/t/short_option_2.test' --- a/mysql-test/suite/perfschema/t/short_option_2.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/short_option_2.test 2010-08-26 00:59:28 +0000 @@ -0,0 +1,29 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA +# Check server start for short server start options + +select 'Ok, the server started' as result; + +# See the associated -master.opt file. +# -aW5 should be parsed as -a -W5, which are two separate short options +# stuffed inside a single argv[i] argument. + +# Should contain ANSI, since we started the server with -a (stands for --ansi) +select @@SQL_MODE; + +# Should be 5, since we started the server with -W5 +select @@log_warnings; === modified file 'mysys/my_getopt.c' --- a/mysys/my_getopt.c 2010-08-12 14:08:21 +0000 +++ b/mysys/my_getopt.c 2010-08-26 14:54:39 +0000 @@ -98,6 +98,49 @@ void my_getopt_register_get_addr(my_geto matches with one of the options in struct 'my_option'. Check that option was given an argument if it requires one Call the optional 'get_one_option()' function once for each option. + + Note that handle_options() can be invoked multiple times to + parse a command line in several steps. + In this case, use the global flag @c my_getopt_skip_unknown to indicate + that options unknown in the current step should be preserved in the + command line for later parsing in subsequent steps. + + For 'long' options (--a_long_option), @c my_getopt_skip_unknown is + fully supported. Command line parameters such as: + - "--a_long_option" + - "--a_long_option=value" + - "--a_long_option value" + will be preserved as is when the option is not known. + + For 'short' options (-S), support for @c my_getopt_skip_unknown + comes with some limitation, because several short options + can also be specified together in the same command line argument, + as in "-XYZ". + + The first use case supported is: all short options are declared. + handle_options() will be able to interpret "-XYZ" as one of: + - an unknown X option + - "-X -Y -Z", three short options with no arguments + - "-X -YZ", where Y is a short option with argument Z + - "-XYZ", where X is a short option with argument YZ + based on the full short options specifications. + + The second use case supported is: no short option is declared. + handle_options() will reject "-XYZ" as unknown, to be parsed later. + + The use case that is explicitly not supported is to provide + only a partial list of short options to handle_options(). + This function can not be expected to extract some option Y + in the middle of the string "-XYZ" in these conditions, + without knowing if X will be declared an option later. + + Note that this limitation only impacts parsing of several + short options from the same command line argument, + as in "mysqld -anW5". + When each short option is properly separated out in the command line + argument, for example in "mysqld -a -n -w5", the code would actually + work even with partial options specs given at each stage. + @param [in, out] argc command line options (count) @param [in, out] argv command line options (values) @param [in] longopts descriptor of all valid options @@ -464,14 +507,40 @@ int handle_options(int *argc, char ***ar } if (!opt_found) { - if (my_getopt_print_errors) - my_getopt_error_reporter(ERROR_LEVEL, - "%s: unknown option '-%c'", - my_progname, *optend); - return EXIT_UNKNOWN_OPTION; + if (my_getopt_skip_unknown) + { + /* + We are currently parsing a single argv[] argument + of the form "-XYZ". + One or the argument found (say Y) is not an option. + Hack the string "-XYZ" to make a "-YZ" substring in it, + and push that to the output as an unrecognized parameter. + */ + DBUG_ASSERT(optend > *pos); + DBUG_ASSERT(optend >= cur_arg); + DBUG_ASSERT(optend <= *pos + strlen(*pos)); + DBUG_ASSERT(*optend); + optend--; + optend[0]= '-'; /* replace 'X' or '-' by '-' */ + (*argv)[argvpos++]= optend; + /* + Do not continue to parse at the current "-XYZ" argument, + skip to the next argv[] argument instead. + */ + optend= (char*) " "; + } + else + { + if (my_getopt_print_errors) + my_getopt_error_reporter(ERROR_LEVEL, + "%s: unknown option '-%c'", + my_progname, *optend); + return EXIT_UNKNOWN_OPTION; + } } } - (*argc)--; /* option handled (short), decrease argument count */ + if (opt_found) + (*argc)--; /* option handled (short), decrease argument count */ continue; } if ((error= setval(optp, value, argument, set_maximum_value))) @@ -479,7 +548,7 @@ int handle_options(int *argc, char ***ar if (get_one_option && get_one_option(optp->id, optp, argument)) return EXIT_UNSPECIFIED_ERROR; - (*argc)--; /* option handled (short or long), decrease argument count */ + (*argc)--; /* option handled (long), decrease argument count */ } else /* non-option found */ (*argv)[argvpos++]= cur_arg; === modified file 'sql/set_var.cc' --- a/sql/set_var.cc 2010-07-27 15:01:56 +0000 +++ b/sql/set_var.cc 2010-08-26 14:54:39 +0000 @@ -153,6 +153,17 @@ sys_var::sys_var(sys_var_chain *chain, c guard(lock), offset(off), on_check(on_check_func), on_update(on_update_func), is_os_charset(FALSE) { + /* + There is a limitation in handle_options() related to short options: + - either all short options should be declared when parsing in multiple stages, + - or none should be declared. + Because a lot of short options are used in the normal parsing phase + for mysqld, we enforce here that no short option is present + in the first (PARSE_EARLY) stage. + See handle_options() for details. + */ + DBUG_ASSERT(parse_flag == PARSE_NORMAL || getopt_id <= 0 || getopt_id >= 255); + name.str= name_arg; name.length= strlen(name_arg); DBUG_ASSERT(name.length <= NAME_CHAR_LEN); --===============7425472724353129517== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///home/malff/BZR_TREE/mysql-trunk-bugfixing-\ # merge/ # testament_sha1: 9307bf9c7412c5edd6304e37abeeb25ce7582bb7 # timestamp: 2010-08-26 08:55:24 -0600 # source_branch: file:///home/malff/BZR_TREE/mysql-5.5-bugfixing/ # base_revision_id: bar@stripped # # Begin bundle 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 h4Gtg9A= --===============7425472724353129517==--