List:Commits« Previous MessageNext Message »
From:Sergey Vojtovich Date:October 12 2010 2:07pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch
(nirbhay.choubey:3523) Bug#54899
View as plain text  
Hi Nirbhay,

the patch is pretty nice and it solves the problem. Though looking at
retrospective I think current_db is not supposed to change at all. In
other words get_current_db() should be no-op when mysql was invoked with
--one-database option.

If you disagree, then there is still inconsistency - you change current_db
to NULL after DROP DATABASE, but you don't change it after USE command.

Regards,
Sergey

On Mon, Oct 11, 2010 at 06:31:34AM +0000, Nirbhay Choubey wrote:
> #At file:///home/nirbhay/Project/mysql/repo/wl/mysql-5.1-bugteam-54899/ based on
> revid:georgi.kodinov@stripped
> 
>  3523 Nirbhay Choubey	2010-10-11
>       Bug#54899 : --one-database option cannot handle DROP/CREATE DATABASE commands
>       
>       After dropping and recreating the database specified along with --one-database
>       option at command line, mysql client keeps filtering the statements even after
>       the execution of a 'USE' command on the same database.
>       
>       --one-database option enables the filtering of statements when the current
>       database is not the one specified at the command line. However, when the same
>       database is dropped and recreated the variable (current_db) that holds the
>       inital database name gets altered. This bug exploits the fact that current_db
>       initially gets set to null value (0) when a 'use db_name' follows the
> recreation
>       of same database db_name (speficied at the command line) and hence
> skip_updates
>       gets set to 1, which inturn triggers the further filtering of statements.
>       
>       Fixed by introducing a new variable 'opt_db', which persistently stores the
>       database name specified at mysql client's command line and fixing the if
>       statement that governed the filtering flag by adding a check on whether the
>       database name in the USE command is similar to one specified at command line.
>      @ client/mysql.cc
>         Bug#54899 : --one-database option cannot handle DROP/CREATE DATABASE
> commands
>         
>         During mysql client start-up, 'opt_db' gets initialized in get_options
> function
>         with the database name specified at the command line.
>         
>         Now, when a 'USE' command is run after the recreation of database ( i.e.
> drop
>         followed by create database), the function com_use is called which in-turn
> calls
>         get_current_db(), which sets current_db. Now as the current database was
> dropped
>         and recreated, get_current_db() sets current_db to a null value (0), and
> hence
>         skip_updates gets set to 1 for --one_database.
>         
>         The bug was resolved by checking if the database name used in the 'USE'
>         command is same database that was entered at the command line.
>      @ mysql-test/r/mysql.result
>         Added test case for bug#54899.
>      @ mysql-test/t/mysql.test
>         Added test case for bug#54899.
> 
>     modified:
>       client/mysql.cc
>       mysql-test/r/mysql.result
>       mysql-test/t/mysql.test
> === modified file 'client/mysql.cc'
> --- a/client/mysql.cc	2010-07-20 18:07:36 +0000
> +++ b/client/mysql.cc	2010-10-11 06:31:31 +0000
> @@ -160,7 +160,7 @@ static uint verbose=0,opt_silent=0,opt_m
>  static uint my_end_arg;
>  static char * opt_mysql_unix_port=0;
>  static int connect_flag=CLIENT_INTERACTIVE;
> -static char *current_host,*current_db,*current_user=0,*opt_password=0,
> +static char *current_host,*current_db,*opt_db,*current_user=0,*opt_password=0,
>              *current_prompt=0, *delimiter_str= 0,
>              *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
>  static char *histfile;
> @@ -1258,6 +1258,7 @@ sig_handler mysql_end(int sig)
>    my_free(histfile,MYF(MY_ALLOW_ZERO_PTR));
>    my_free(histfile_tmp,MYF(MY_ALLOW_ZERO_PTR));
>    my_free(current_db,MYF(MY_ALLOW_ZERO_PTR));
> +  my_free(opt_db, MYF(MY_ALLOW_ZERO_PTR));
>    my_free(current_host,MYF(MY_ALLOW_ZERO_PTR));
>    my_free(current_user,MYF(MY_ALLOW_ZERO_PTR));
>    my_free(full_username,MYF(MY_ALLOW_ZERO_PTR));
> @@ -1841,7 +1842,13 @@ static int get_options(int argc, char **
>    {
>      skip_updates= 0;
>      my_free(current_db, MYF(MY_ALLOW_ZERO_PTR));
> -    current_db= my_strdup(*argv, MYF(MY_WME));
> +    my_free(opt_db, MYF(MY_ALLOW_ZERO_PTR));
> +    /*
> +      Store initial database name specified at
> +      command line in opt_db.
> +    */
> +    opt_db= my_strdup(*argv, MYF(MY_WME));
> +    current_db= my_strdup(opt_db, MYF(MY_WME));
>    }
>    if (tty_password)
>      opt_password= get_tty_password(NullS);
> @@ -4108,7 +4115,12 @@ com_use(String *buffer __attribute__((un
>  
>    if (!current_db || cmp_database(charset_info, current_db,tmp))
>    {
> -    if (one_database)
> +    /*
> +      Skip the following if statement in case opt_db (i.e. database
> +      specified at command line) is similar to the database name
> +      provided in the 'USE' command.
> +    */
> +    if (one_database && cmp_database(charset_info, opt_db, tmp))
>      {
>        skip_updates= 1;
>        select_db= 0;    // don't do mysql_select_db()
> 
> === modified file 'mysql-test/r/mysql.result'
> --- a/mysql-test/r/mysql.result	2009-12-17 20:06:36 +0000
> +++ b/mysql-test/r/mysql.result	2010-10-11 06:31:31 +0000
> @@ -235,4 +235,13 @@ Bug #47147: mysql client option --skip-c
>  *************************** 1. row ***************************
>  1
>  
> +Bug #54899: --one-database option cannot handle DROP/CREATE DATABASE commands
> +
> +CREATE DATABASE connected_db;
> +USE connected_db;
> +SHOW TABLES;
> +Tables_in_connected_db
> +t1
> +DROP DATABASE connected_db;
> +
>  End of tests
> 
> === modified file 'mysql-test/t/mysql.test'
> --- a/mysql-test/t/mysql.test	2009-12-17 20:06:36 +0000
> +++ b/mysql-test/t/mysql.test	2010-10-11 06:31:31 +0000
> @@ -413,4 +413,21 @@ drop table t1;
>  --exec $MYSQL --skip-column-names --vertical test -e "select 1 as a"
>  
>  --echo
> +--echo Bug #54899: --one-database option cannot handle DROP/CREATE DATABASE
> commands
> +--echo
> +--write_file $MYSQLTEST_VARDIR/tmp/bug54899.sql
> +DROP DATABASE connected_db;
> +CREATE DATABASE connected_db;
> +USE connected_db;
> +CREATE TABLE t1(a INT);
> +EOF
> +
> +CREATE DATABASE connected_db;
> +--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/bug54899.sql
> +USE connected_db;
> +SHOW TABLES;
> +DROP DATABASE connected_db;
> +--remove_file $MYSQLTEST_VARDIR/tmp/bug54899.sql
> +
> +--echo
>  --echo End of tests
> 


> 
> -- 
> MySQL Code Commits Mailing List
> For list archives: http://lists.mysql.com/commits
> To unsubscribe:    http://lists.mysql.com/commits?unsub=1


-- 
Sergey Vojtovich <svoj@stripped>
MySQL AB, Software Engineer
Izhevsk, Russia, www.mysql.com
Thread
bzr commit into mysql-5.1-bugteam branch (nirbhay.choubey:3523)Bug#54899Nirbhay Choubey11 Oct
  • Re: bzr commit into mysql-5.1-bugteam branch(nirbhay.choubey:3523) Bug#54899Sergey Vojtovich12 Oct