List:Commits« Previous MessageNext Message »
From:Kristofer Pettersson Date:March 5 2009 12:37pm
Subject:bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2712)
Bug#40363
View as plain text  
#At file:///home/thek/Development/cpp/mysqlbzr/mysql-5.0-bugteam/ based on revid:kristofer.pettersson@stripped

 2712 Kristofer Pettersson	2009-03-05
      Bug#40363 Bug 20023 is not fixed on 5.0
      
      This is a back port from 5.1 to 5.0.
      
      Fix for BUG 20023: mysql_change_user() resets the value
      of SQL_BIG_SELECTS.
        
      The bug was that SQL_BIG_SELECTS was not properly set
      in COM_CHANGE_USER.
        
      The fix is to update SQL_BIG_SELECTS properly.
     @ sql/sql_class.cc
        Update THD::options with the respect to SQL_BIG_SELECTS
        in COM_CHANGE_USER.
     @ tests/mysql_client_test.c
        Add a test case BUG#20023.

    modified:
      sql/sql_class.cc
      tests/mysql_client_test.c
=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc	2008-09-17 06:34:00 +0000
+++ b/sql/sql_class.cc	2009-03-05 12:37:46 +0000
@@ -341,6 +341,12 @@ void THD::init(void)
   if (variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES)
     server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES;
   options= thd_startup_options;
+
+  if (variables.max_join_size == HA_POS_ERROR)
+    options |= OPTION_BIG_SELECTS;
+  else
+    options &= ~OPTION_BIG_SELECTS;
+
   transaction.all.modified_non_trans_table= transaction.stmt.modified_non_trans_table= FALSE;
   open_options=ha_open_options;
   update_lock_default= (variables.low_priority_updates ?

=== modified file 'tests/mysql_client_test.c'
--- a/tests/mysql_client_test.c	2008-08-20 09:49:28 +0000
+++ b/tests/mysql_client_test.c	2009-03-05 12:37:46 +0000
@@ -115,6 +115,8 @@ static void client_disconnect(void);
 
 #define DIE_UNLESS(expr) \
         ((void) ((expr) ? 0 : (die(__FILE__, __LINE__, #expr), 0)))
+#define DIE_IF(expr) \
+        ((void) ((expr) ? (die(__FILE__, __LINE__, #expr), 0) : 0))
 #define DIE(expr) \
         die(__FILE__, __LINE__, #expr)
 
@@ -16218,6 +16220,176 @@ static void test_bug38486(void)
   DBUG_VOID_RETURN;
 }
 
+static void bug20023_change_user(MYSQL *con)
+{
+  DIE_IF(mysql_change_user(con,
+                           opt_user,
+                           opt_password,
+                           opt_db ? opt_db : "test"));
+}
+
+static void bug20023_query_int_variable(MYSQL *con,
+                                        const char *var_name,
+                                        int *var_value)
+{
+  MYSQL_RES *rs;
+  MYSQL_ROW row;
+
+  char query_buffer[MAX_TEST_QUERY_LENGTH];
+
+  my_snprintf(query_buffer,
+          sizeof (query_buffer),
+          "SELECT @@%s",
+          (const char *) var_name);
+
+  DIE_IF(mysql_query(con, query_buffer));
+  DIE_UNLESS(rs= mysql_store_result(con));
+  DIE_UNLESS(row= mysql_fetch_row(rs));
+  *var_value= atoi(row[0]);
+  mysql_free_result(rs);
+}
+
+static void test_bug20023()
+{
+  MYSQL con;
+
+  int sql_big_selects_orig;
+  int max_join_size_orig;
+
+  int sql_big_selects_2;
+  int sql_big_selects_3;
+  int sql_big_selects_4;
+  int sql_big_selects_5;
+
+  char query_buffer[MAX_TEST_QUERY_LENGTH];
+
+  /* Create a new connection. */
+
+  DIE_UNLESS(mysql_init(&con));
+
+  DIE_UNLESS(mysql_real_connect(&con,
+                                opt_host,
+                                opt_user,
+                                opt_password,
+                                opt_db ? opt_db : "test",
+                                opt_port,
+                                opt_unix_socket,
+                                CLIENT_FOUND_ROWS));
+
+  /***********************************************************************
+   Remember original SQL_BIG_SELECTS, MAX_JOIN_SIZE values.
+  ***********************************************************************/
+
+  bug20023_query_int_variable(&con,
+                              "session.sql_big_selects",
+                              &sql_big_selects_orig);
+
+  bug20023_query_int_variable(&con,
+                              "global.max_join_size",
+                              &max_join_size_orig);
+
+  /***********************************************************************
+   Test that COM_CHANGE_USER resets the SQL_BIG_SELECTS to the initial value.
+  ***********************************************************************/
+
+  /* Issue COM_CHANGE_USER. */
+
+  bug20023_change_user(&con);
+
+  /* Query SQL_BIG_SELECTS. */
+
+  bug20023_query_int_variable(&con,
+                              "session.sql_big_selects",
+                              &sql_big_selects_2);
+
+  /* Check that SQL_BIG_SELECTS is reset properly. */
+
+  DIE_UNLESS(sql_big_selects_orig == sql_big_selects_2);
+
+  /***********************************************************************
+   Test that if MAX_JOIN_SIZE set to non-default value,
+   SQL_BIG_SELECTS will be 0.
+  ***********************************************************************/
+
+  /* Set MAX_JOIN_SIZE to some non-default value. */
+
+  DIE_IF(mysql_query(&con, "SET @@global.max_join_size = 10000"));
+  DIE_IF(mysql_query(&con, "SET @@session.max_join_size = default"));
+
+  /* Issue COM_CHANGE_USER. */
+
+  bug20023_change_user(&con);
+
+  /* Query SQL_BIG_SELECTS. */
+
+  bug20023_query_int_variable(&con,
+                              "session.sql_big_selects",
+                              &sql_big_selects_3);
+
+  /* Check that SQL_BIG_SELECTS is 0. */
+
+  DIE_UNLESS(sql_big_selects_3 == 0);
+
+  /***********************************************************************
+   Test that if MAX_JOIN_SIZE set to default value,
+   SQL_BIG_SELECTS will be 1.
+  ***********************************************************************/
+
+  /* Set MAX_JOIN_SIZE to the default value (-1). */
+
+  DIE_IF(mysql_query(&con, "SET @@global.max_join_size = -1"));
+  DIE_IF(mysql_query(&con, "SET @@session.max_join_size = default"));
+
+  /* Issue COM_CHANGE_USER. */
+
+  bug20023_change_user(&con);
+
+  /* Query SQL_BIG_SELECTS. */
+
+  bug20023_query_int_variable(&con,
+                              "session.sql_big_selects",
+                              &sql_big_selects_4);
+
+  /* Check that SQL_BIG_SELECTS is 1. */
+
+  DIE_UNLESS(sql_big_selects_4 == 1);
+
+  /***********************************************************************
+   Restore MAX_JOIN_SIZE.
+   Check that SQL_BIG_SELECTS will be the original one.
+  ***********************************************************************/
+
+  /* Restore MAX_JOIN_SIZE. */
+
+  my_snprintf(query_buffer,
+           sizeof (query_buffer),
+           "SET @@global.max_join_size = %d",
+           (int) max_join_size_orig);
+
+  DIE_IF(mysql_query(&con, query_buffer));
+  DIE_IF(mysql_query(&con, "SET @@session.max_join_size = default"));
+
+  /* Issue COM_CHANGE_USER. */
+
+  bug20023_change_user(&con);
+
+  /* Query SQL_BIG_SELECTS. */
+
+  bug20023_query_int_variable(&con,
+                              "session.sql_big_selects",
+                              &sql_big_selects_5);
+
+  /* Check that SQL_BIG_SELECTS is 1. */
+
+  DIE_UNLESS(sql_big_selects_5 == sql_big_selects_orig);
+
+  /***********************************************************************
+   That's it. Cleanup.
+  ***********************************************************************/
+
+  mysql_close(&con);
+}
+
 
 /*
   Read and parse arguments and MySQL options from my.cnf
@@ -16514,6 +16686,7 @@ static struct my_tests_st my_tests[]= {
   { "test_bug31669", test_bug31669 },
   { "test_bug32265", test_bug32265 },
   { "test_bug38486", test_bug38486 },
+  { "test_bug20023", test_bug20023 },
   { 0, 0 }
 };
 


Attachment: [text/bzr-bundle] bzr/kristofer.pettersson@sun.com-20090305123746-g1199oqive7uld2b.bundle
Thread
bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2712)Bug#40363Kristofer Pettersson5 Mar