From: Marc Alff Date: August 26 2010 3:23pm Subject: bzr commit into mysql-next-mr-bugfixing branch (marc.alff:3251) List-Archive: http://lists.mysql.com/commits/116900 Message-Id: <20100826152404.4633445E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7137857713359128720==" --===============7137857713359128720== 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-next-mr-bugfixing-merge/ based on revid:jorgen.loland@stripped 3251 Marc Alff 2010-08-26 [merge] Merge mysql-trunk-bugfixing --> mysql-next-mr-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-16 06:58:42 +0000 +++ b/mysys/my_getopt.c 2010-08-26 15:23:47 +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-08-12 00:26:10 +0000 +++ b/sql/set_var.cc 2010-08-26 15:23:47 +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); --===============7137857713359128720== 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-next-mr-bugfixing-\ # merge/ # testament_sha1: a3a99151e9957087dd2d9e3dcc2acb4e0bcb1fee # timestamp: 2010-08-26 09:24:04 -0600 # source_branch: file:///home/malff/BZR_TREE/mysql-trunk-bugfixing/ # base_revision_id: jorgen.loland@stripped\ # xobppp06n1c1sg5i # # Begin bundle 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 hltwGVg= --===============7137857713359128720==--