List:Commits« Previous MessageNext Message »
From:ramil Date:November 7 2007 8:47am
Subject:bk commit into 4.1 tree (ramil:1.2688) BUG#32137
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of ram. When ram does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-11-07 12:47:19+04:00, ramil@stripped +3 -0
  Fix for bug #32137: prepared statement crash with str_to_date in update clause
  
  Problem: calling non-constant argument's val_xxx() methods 
  in the ::fix_length_and_dec() is inadmissible.
  
  Fix: call the method only for constant arguments.

  mysql-test/r/ps.result@stripped, 2007-11-07 12:47:18+04:00, ramil@stripped +5 -0
    Fix for bug #32137: prepared statement crash with str_to_date in update clause
      - test result.

  mysql-test/t/ps.test@stripped, 2007-11-07 12:47:18+04:00, ramil@stripped +9 -0
    Fix for bug #32137: prepared statement crash with str_to_date in update clause
      - test case.

  sql/item_timefunc.cc@stripped, 2007-11-07 12:47:18+04:00, ramil@stripped +26 -23
    Fix for bug #32137: prepared statement crash with str_to_date in update clause
      - call argument's val_str() only for constant items in the 
        Item_func_str_to_date::fix_length_and_dec().

diff -Nrup a/mysql-test/r/ps.result b/mysql-test/r/ps.result
--- a/mysql-test/r/ps.result	2007-05-15 04:41:08 +05:00
+++ b/mysql-test/r/ps.result	2007-11-07 12:47:18 +04:00
@@ -1109,4 +1109,9 @@ a
 13
 DEALLOCATE PREPARE st1;
 DROP TABLE t1;
+create table t1 (a int, b tinyint);
+prepare st1 from 'update t1 set b= (str_to_date(a, a))';
+execute st1;
+deallocate prepare st1;
+drop table t1;
 End of 4.1 tests.
diff -Nrup a/mysql-test/t/ps.test b/mysql-test/t/ps.test
--- a/mysql-test/t/ps.test	2007-05-15 04:41:08 +05:00
+++ b/mysql-test/t/ps.test	2007-11-07 12:47:18 +04:00
@@ -1146,4 +1146,13 @@ EXECUTE st1;
 DEALLOCATE PREPARE st1;
 DROP TABLE t1;
 
+#
+# Bug #32137: prepared statement crash with str_to_date in update clause
+#
+create table t1 (a int, b tinyint);
+prepare st1 from 'update t1 set b= (str_to_date(a, a))';
+execute st1;
+deallocate prepare st1;
+drop table t1;
+
 --echo End of 4.1 tests.
diff -Nrup a/sql/item_timefunc.cc b/sql/item_timefunc.cc
--- a/sql/item_timefunc.cc	2007-02-06 14:58:04 +04:00
+++ b/sql/item_timefunc.cc	2007-11-07 12:47:18 +04:00
@@ -2958,38 +2958,41 @@ Field *Item_func_str_to_date::tmp_table_
 
 void Item_func_str_to_date::fix_length_and_dec()
 {
-  char format_buff[64];
-  String format_str(format_buff, sizeof(format_buff), &my_charset_bin);
-  String *format;
   maybe_null= 1;
   decimals=0;
   cached_field_type= MYSQL_TYPE_STRING;
   max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
   cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
-  format= args[1]->val_str(&format_str);
-  if (!args[1]->null_value && (const_item= args[1]->const_item()))
+  if ((const_item= args[1]->const_item()))
   {
-    cached_format_type= get_date_time_result_type(format->ptr(),
-                                                  format->length());
-    switch (cached_format_type) {
-    case DATE_ONLY:
-      cached_timestamp_type= MYSQL_TIMESTAMP_DATE;
-      cached_field_type= MYSQL_TYPE_DATE; 
-      max_length= MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
-      break;
-    case TIME_ONLY:
-    case TIME_MICROSECOND:
-      cached_timestamp_type= MYSQL_TIMESTAMP_TIME;
-      cached_field_type= MYSQL_TYPE_TIME; 
-      max_length= MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
-      break;
-    default:
-      cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME;
-      cached_field_type= MYSQL_TYPE_DATETIME; 
-      break;
+    char format_buff[64];
+    String format_str(format_buff, sizeof(format_buff), &my_charset_bin);
+    String *format= args[1]->val_str(&format_str);
+    if (!args[1]->null_value)
+    {
+      cached_format_type= get_date_time_result_type(format->ptr(),
+                                                    format->length());
+      switch (cached_format_type) {
+      case DATE_ONLY:
+        cached_timestamp_type= MYSQL_TIMESTAMP_DATE;
+        cached_field_type= MYSQL_TYPE_DATE; 
+        max_length= MAX_DATE_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
+        break;
+      case TIME_ONLY:
+      case TIME_MICROSECOND:
+        cached_timestamp_type= MYSQL_TIMESTAMP_TIME;
+        cached_field_type= MYSQL_TYPE_TIME; 
+        max_length= MAX_TIME_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
+        break;
+      default:
+        cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME;
+        cached_field_type= MYSQL_TYPE_DATETIME; 
+        break;
+      }
     }
   }
 }
+
 
 bool Item_func_str_to_date::get_date(TIME *ltime, uint fuzzy_date)
 {
Thread
bk commit into 4.1 tree (ramil:1.2688) BUG#32137ramil7 Nov
  • Re: bk commit into 4.1 tree (ramil:1.2688) BUG#32137Sergei Golubchik9 Nov