From: Marc Alff Date: August 26 2010 12:59am Subject: bzr commit into mysql-5.5-bugfixing branch (marc.alff:3194) Bug#55873 List-Archive: http://lists.mysql.com/commits/116808 X-Bug: 55873 Message-Id: <20100826005933.4BDDA45E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7663044040417044721==" --===============7663044040417044721== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/malff/BZR_TREE/mysql-5.5-bugfixing-55873/ based on revid:jon.hauglid@stripped 3194 Marc Alff 2010-08-25 Bug#55873 short startup options do not work in 5.5 Before this fix, the server did not recognize 'short' (as in -a) options but only 'long' (as in --ansi) options in the startup command line, due to earlier changes in 5.5 introduced for the performance schema. The root cause is that handle_options() did not honor the my_getopt_skip_unknown flag when parsing 'short' options. The fix changes handle_options(), so that my_getopt_skip_unknown is honored in all cases. Note that there are limitations to this, see the added doxygen documentation in handle_options(). The current usage of handle_options() by the server to parse early performance schema options fits within the limitations. This has been enforced by an assert for PARSE_EARLY options, for safety. 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 === 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-05 12:34:19 +0000 +++ b/mysys/my_getopt.c 2010-08-26 00:59:28 +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,57 @@ 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", and parsing is done in multiple phases. + One or the argument found is not an option. + */ + if (optend == cur_arg) + { + /* + The first argument, "-X", is not an option + In this case, the entire argument "-XYZ" is rejected + from this phase, and preserved as is for later parsing. + */ + (*argv)[argvpos++]= *pos; + } + else + { + /* + We are in the middle of an "-XYZ" string already, + "-X" has already been parsed, and "Y" (pointed by optend) + is not an option. + Hack the string "-XYZ" to make a "-YZ" substring in it, + and push that to the next parsing phase. + */ + DBUG_ASSERT(optend > *pos); + DBUG_ASSERT(optend > cur_arg); + DBUG_ASSERT(optend <= *pos + strlen(*pos)); + DBUG_ASSERT(*optend); + optend--; + optend[0]= '-'; /* replace 'X' 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 +565,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 10:25:53 +0000 +++ b/sql/set_var.cc 2010-08-26 00:59:28 +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); --===============7663044040417044721== 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-5.5-bugfixing-\ # 55873/ # testament_sha1: 95fb9a467ab426b040da5e8c283bed4268c63d9d # timestamp: 2010-08-25 18:59:33 -0600 # base_revision_id: jon.hauglid@stripped\ # yqsa2ybxkg8f5vwc # # Begin bundle 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 elw= --===============7663044040417044721==--