From: Marc Alff Date: August 26 2010 2:54pm Subject: bzr commit into mysql-trunk-bugfixing branch (marc.alff:3241) List-Archive: http://lists.mysql.com/commits/116895 Message-Id: <20100826145456.C1E3545E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4076165434407046780==" --===============4076165434407046780== 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-trunk-bugfixing-merge/ based on revid:bar@stripped 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 === 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); --===============4076165434407046780== 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:54:56 -0600 # source_branch: file:///home/malff/BZR_TREE/mysql-5.5-bugfixing/ # base_revision_id: bar@stripped # # Begin bundle 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 9KZb --===============4076165434407046780==--