From: Jon Olav Hauglid Date: September 10 2010 7:40am Subject: bzr push into mysql-5.5-runtime branch (jon.hauglid:3134 to 3135) List-Archive: http://lists.mysql.com/commits/117965 Message-Id: <201009100742.o89KAeF9015481@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8138830226299477958==" --===============8138830226299477958== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3135 Jon Olav Hauglid 2010-09-10 [merge] Merge from mysql-5.5-bugfixing to mysql-5.5-runtime. modified: client/mysqltest.cc cmake/dtrace.cmake libmysqld/lib_sql.cc mysql-test/include/default_mysqld.cnf mysql-test/r/func_time.result mysql-test/r/parser.result mysql-test/r/select.result mysql-test/r/strict.result mysql-test/r/type_datetime.result mysql-test/suite/perfschema/r/start_server_no_cond_class.result mysql-test/suite/perfschema/r/start_server_no_cond_inst.result mysql-test/suite/perfschema/r/start_server_no_file_class.result mysql-test/suite/perfschema/r/start_server_no_file_inst.result mysql-test/suite/perfschema/r/start_server_no_mutex_class.result mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result mysql-test/suite/perfschema/r/start_server_no_thread_class.result mysql-test/suite/perfschema/r/start_server_no_thread_inst.result mysql-test/suite/perfschema/r/start_server_off.result mysql-test/suite/perfschema/r/start_server_on.result mysql-test/suite/rpl/t/disabled.def mysql-test/t/disabled.def mysql-test/t/strict.test mysql-test/t/type_datetime.test mysys/my_gethwaddr.c mysys/my_sync.c sql/derror.cc sql/item_timefunc.cc sql/item_timefunc.h sql/mysqld.cc sql/set_var.cc sql/set_var.h sql/sys_vars.h 3134 Dmitry Lenev 2010-09-09 Fix for bug #55273 "FLUSH TABLE tm WITH READ LOCK for Merge table causes assert failure". Attempting to use FLUSH TABLE table_list WITH READ LOCK statement for a MERGE table led to an assertion failure if one of its children was not present in the list of tables to be flushed. The problem was not visible in non-debug builds. The assertion failure was caused by the fact that in such situations FLUSH TABLES table_list WITH READ LOCK implementation tried to use (e.g. lock) such child tables without acquiring metadata lock on them. This happened because when opening tables we assumed metadata locks on all tables were already acquired earlier during statement execution and a such assumption was false for MERGE children. This patch fixes the problem by ensuring at open_tables() time that we try to acquire metadata locks on all tables to be opened. For normal tables such requests are satisfied instantly since locks are already acquired for them. For MERGE children metadata locks are acquired in normal fashion. Note that FLUSH TABLES merge_table WITH READ LOCK will lock for read both the MERGE table and its children but will flush only the MERGE table. To flush children one has to mention them in table list explicitly. This is expected behavior and it is consistent with usage patterns for this statement (e.g. in mysqlhotcopy script). @ mysql-test/r/flush.result Added test case for bug #55273 "FLUSH TABLE tm WITH READ LOCK for Merge table causes assert failure". @ mysql-test/t/flush.test Added test case for bug #55273 "FLUSH TABLE tm WITH READ LOCK for Merge table causes assert failure". @ sql/sql_base.cc Changed lock_table_names() to support newly introduced MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK flag. @ sql/sql_base.h Introduced MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK flag for open_tables() and lock_table_names() which allows to skip acquiring of global and schema-scope locks when SNW, SNRW or X metadata locks are acquired. @ sql/sql_reload.cc Changed "FLUSH TABLES table_list WITH READ LOCK" code not to cause assert about missing metadata locks when MERGE table is flushed without one of its underlying tables. To achieve this we no longer call open_and_lock_tables() with MYSQL_OPEN_HAS_MDL_LOCK flag so this function automatically acquires metadata locks on MERGE children if such lock has not been already acquired at earlier stage. Instead we call this function with MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK flag to suppress acquiring of global IX lock in order to keep FLUSH TABLES table_list WITH READ LOCK compatible with FLUSH TABLE WITH READ LOCK. Also changed implementation to use lock_table_names() function for pre-acquiring of metadata locks instead of custom code. To implement this change moved setting of open_type member for table list elements to parser. @ sql/sql_yacc.yy Now we set acceptable type of table for FLUSH TABLES table_list WITH READ LOCK at parsing time instead of execution time. modified: mysql-test/r/flush.result mysql-test/t/flush.test sql/sql_base.cc sql/sql_base.h sql/sql_reload.cc sql/sql_yacc.yy === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-08-27 11:33:32 +0000 +++ b/client/mysqltest.cc 2010-09-08 08:53:03 +0000 @@ -248,10 +248,14 @@ struct st_connection my_bool pending; #ifdef EMBEDDED_LIBRARY + pthread_t tid; const char *cur_query; int cur_query_len; - pthread_mutex_t mutex; - pthread_cond_t cond; + int command, result; + pthread_mutex_t query_mutex; + pthread_cond_t query_cond; + pthread_mutex_t result_mutex; + pthread_cond_t result_cond; int query_done; #endif /*EMBEDDED_LIBRARY*/ }; @@ -703,67 +707,148 @@ void handle_no_error(struct st_command*) #ifdef EMBEDDED_LIBRARY +#define EMB_SEND_QUERY 1 +#define EMB_READ_QUERY_RESULT 2 +#define EMB_END_CONNECTION 3 + /* attributes of the query thread */ pthread_attr_t cn_thd_attrib; + /* - send_one_query executes query in separate thread, which is - necessary in embedded library to run 'send' in proper way. - This implementation doesn't handle errors returned - by mysql_send_query. It's technically possible, though - I don't see where it is needed. + This procedure represents the connection and actually + runs queries when in the EMBEDDED-SERVER mode. + The run_query_normal() just sends request for running + mysql_send_query and mysql_read_query_result() here. */ -pthread_handler_t send_one_query(void *arg) + +pthread_handler_t connection_thread(void *arg) { struct st_connection *cn= (struct st_connection*)arg; mysql_thread_init(); - (void) mysql_send_query(&cn->mysql, cn->cur_query, cn->cur_query_len); + while (cn->command != EMB_END_CONNECTION) + { + if (!cn->command) + { + pthread_mutex_lock(&cn->query_mutex); + while (!cn->command) + pthread_cond_wait(&cn->query_cond, &cn->query_mutex); + pthread_mutex_unlock(&cn->query_mutex); + } + switch (cn->command) + { + case EMB_END_CONNECTION: + goto end_thread; + case EMB_SEND_QUERY: + cn->result= mysql_send_query(&cn->mysql, cn->cur_query, cn->cur_query_len); + break; + case EMB_READ_QUERY_RESULT: + cn->result= mysql_read_query_result(&cn->mysql); + break; + default: + DBUG_ASSERT(0); + } + cn->command= 0; + pthread_mutex_lock(&cn->result_mutex); + cn->query_done= 1; + pthread_cond_signal(&cn->result_cond); + pthread_mutex_unlock(&cn->result_mutex); + } - mysql_thread_end(); - pthread_mutex_lock(&cn->mutex); +end_thread: cn->query_done= 1; - pthread_cond_signal(&cn->cond); - pthread_mutex_unlock(&cn->mutex); + mysql_thread_end(); pthread_exit(0); return 0; } -static int do_send_query(struct st_connection *cn, const char *q, int q_len, - int flags) + +static void wait_query_thread_done(struct st_connection *con) +{ + DBUG_ASSERT(con->tid); + if (!con->query_done) + { + pthread_mutex_lock(&con->result_mutex); + while (!con->query_done) + pthread_cond_wait(&con->result_cond, &con->result_mutex); + pthread_mutex_unlock(&con->result_mutex); + } +} + + +static void signal_connection_thd(struct st_connection *cn, int command) { - pthread_t tid; + DBUG_ASSERT(cn->tid); + cn->query_done= 0; + cn->command= command; + pthread_mutex_lock(&cn->query_mutex); + pthread_cond_signal(&cn->query_cond); + pthread_mutex_unlock(&cn->query_mutex); +} - if (flags & QUERY_REAP_FLAG) - return mysql_send_query(&cn->mysql, q, q_len); - if (pthread_mutex_init(&cn->mutex, NULL) || - pthread_cond_init(&cn->cond, NULL)) - die("Error in the thread library"); +/* + Sometimes we try to execute queries when the connection is closed. + It's done to make sure it was closed completely. + So that if our connection is closed (cn->tid == 0), we just return + the mysql_send_query() result which is an error in this case. +*/ +static int do_send_query(struct st_connection *cn, const char *q, int q_len) +{ + if (!cn->tid) + return mysql_send_query(&cn->mysql, q, q_len); cn->cur_query= q; cn->cur_query_len= q_len; - cn->query_done= 0; - if (pthread_create(&tid, &cn_thd_attrib, send_one_query, (void*)cn)) - die("Cannot start new thread for query"); - + signal_connection_thd(cn, EMB_SEND_QUERY); return 0; } -static void wait_query_thread_end(struct st_connection *con) + +static int do_read_query_result(struct st_connection *cn) { - if (!con->query_done) - { - pthread_mutex_lock(&con->mutex); - while (!con->query_done) - pthread_cond_wait(&con->cond, &con->mutex); - pthread_mutex_unlock(&con->mutex); - } + DBUG_ASSERT(cn->tid); + wait_query_thread_done(cn); + signal_connection_thd(cn, EMB_READ_QUERY_RESULT); + wait_query_thread_done(cn); + + return cn->result; +} + + +static void emb_close_connection(struct st_connection *cn) +{ + if (!cn->tid) + return; + wait_query_thread_done(cn); + signal_connection_thd(cn, EMB_END_CONNECTION); + pthread_join(cn->tid, NULL); + cn->tid= 0; + pthread_mutex_destroy(&cn->query_mutex); + pthread_cond_destroy(&cn->query_cond); + pthread_mutex_destroy(&cn->result_mutex); + pthread_cond_destroy(&cn->result_cond); } + +static void init_connection_thd(struct st_connection *cn) +{ + cn->query_done= 1; + cn->command= 0; + if (pthread_mutex_init(&cn->query_mutex, NULL) || + pthread_cond_init(&cn->query_cond, NULL) || + pthread_mutex_init(&cn->result_mutex, NULL) || + pthread_cond_init(&cn->result_cond, NULL) || + pthread_create(&cn->tid, &cn_thd_attrib, connection_thread, (void*)cn)) + die("Error in the thread library"); +} + + #else /*EMBEDDED_LIBRARY*/ -#define do_send_query(cn,q,q_len,flags) mysql_send_query(&cn->mysql, q, q_len) +#define do_send_query(cn,q,q_len) mysql_send_query(&cn->mysql, q, q_len) +#define do_read_query_result(cn) mysql_read_query_result(&cn->mysql) #endif /*EMBEDDED_LIBRARY*/ @@ -1106,6 +1191,9 @@ void close_connections() DBUG_ENTER("close_connections"); for (--next_con; next_con >= connections; --next_con) { +#ifdef EMBEDDED_LIBRARY + emb_close_connection(next_con); +#endif if (next_con->stmt) mysql_stmt_close(next_con->stmt); next_con->stmt= 0; @@ -4866,7 +4954,7 @@ void do_close_connection(struct st_comma we need to check if the query's thread was finished and probably wait (embedded-server specific) */ - wait_query_thread_end(con); + emb_close_connection(con); #endif /*EMBEDDED_LIBRARY*/ if (con->stmt) mysql_stmt_close(con->stmt); @@ -5216,8 +5304,9 @@ void do_connect(struct st_command *comma } #ifdef EMBEDDED_LIBRARY - con_slot->query_done= 1; -#endif + init_connection_thd(con_slot); +#endif /*EMBEDDED_LIBRARY*/ + if (!mysql_init(&con_slot->mysql)) die("Failed on mysql_init()"); @@ -6768,21 +6857,13 @@ void run_query_normal(struct st_connecti /* Send the query */ - if (do_send_query(cn, query, query_len, flags)) + if (do_send_query(cn, query, query_len)) { handle_error(command, mysql_errno(mysql), mysql_error(mysql), mysql_sqlstate(mysql), ds); goto end; } } -#ifdef EMBEDDED_LIBRARY - /* - Here we handle 'reap' command, so we need to check if the - query's thread was finished and probably wait - */ - else if (flags & QUERY_REAP_FLAG) - wait_query_thread_end(cn); -#endif /*EMBEDDED_LIBRARY*/ if (!(flags & QUERY_REAP_FLAG)) { cn->pending= TRUE; @@ -6795,7 +6876,7 @@ void run_query_normal(struct st_connecti When on first result set, call mysql_read_query_result to retrieve answer to the query sent earlier */ - if ((counter==0) && mysql_read_query_result(mysql)) + if ((counter==0) && do_read_query_result(cn)) { handle_error(command, mysql_errno(mysql), mysql_error(mysql), mysql_sqlstate(mysql), ds); @@ -7970,6 +8051,9 @@ int main(int argc, char **argv) ps_protocol_enabled= 1; st_connection *con= connections; +#ifdef EMBEDDED_LIBRARY + init_connection_thd(con); +#endif /*EMBEDDED_LIBRARY*/ if (!( mysql_init(&con->mysql))) die("Failed in mysql_init()"); if (opt_connect_timeout) === modified file 'cmake/dtrace.cmake' --- a/cmake/dtrace.cmake 2010-02-25 16:31:31 +0000 +++ b/cmake/dtrace.cmake 2010-09-06 12:45:12 +0000 @@ -13,13 +13,30 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_COMPILER_IS_GNUCXX + AND CMAKE_SIZEOF_VOID_P EQUAL 4) + IF(NOT DEFINED BUGGY_GCC_NO_DTRACE_MODULES) + EXECUTE_PROCESS( + COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} --version + OUTPUT_VARIABLE out) + IF(out MATCHES "3.4.6") + # This gcc causes crashes in dlopen() for dtraced shared libs, + # while standard shipped with Solaris10 3.4.3 is ok + SET(BUGGY_GCC_NO_DTRACE_MODULES 1 CACHE INTERNAL "") + ELSE() + SET(BUGGY_GCC_NO_DTRACE_MODULES 0 CACHE INTERNAL "") + ENDIF() + ENDIF() +ENDIF() + # Check if OS supports DTrace MACRO(CHECK_DTRACE) FIND_PROGRAM(DTRACE dtrace) MARK_AS_ADVANCED(DTRACE) # On FreeBSD, dtrace does not handle userland tracing yet - IF(DTRACE AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + IF(DTRACE AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD" + AND NOT BUGGY_GCC_NO_DTRACE_MODULES) SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace") ENDIF() SET(HAVE_DTRACE ${ENABLE_DTRACE}) @@ -72,22 +89,6 @@ IF(ENABLE_DTRACE) ) ENDIF() -IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_COMPILER_IS_GNUCXX - AND CMAKE_SIZEOF_VOID_P EQUAL 4) - IF(NOT DEFINED BUGGY_GCC_NO_DTRACE_MODULES) - EXECUTE_PROCESS( - COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} --version - OUTPUT_VARIABLE out) - IF(out MATCHES "3.4.6") - # This gcc causes crashes in dlopen() for dtraced shared libs, - # while standard shipped with Solaris10 3.4.3 is ok - SET(BUGGY_GCC_NO_DTRACE_MODULES 1 CACHE INTERNAL "") - ELSE() - SET(BUGGY_GCC_NO_DTRACE_MODULES 0 CACHE INTERNAL "") - ENDIF() - ENDIF() -ENDIF() - FUNCTION(DTRACE_INSTRUMENT target) IF(BUGGY_GCC_NO_DTRACE_MODULES) GET_TARGET_PROPERTY(target_type ${target} TYPE) === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2010-07-15 11:33:27 +0000 +++ b/libmysqld/lib_sql.cc 2010-09-02 18:37:04 +0000 @@ -481,6 +481,10 @@ int init_embedded_server(int argc, char char *fake_argv[] = { (char *)"", 0 }; const char *fake_groups[] = { "server", "embedded", 0 }; my_bool acl_error; + + if (my_thread_init()) + return 1; + if (argc) { argcp= &argc; === modified file 'mysql-test/include/default_mysqld.cnf' --- a/mysql-test/include/default_mysqld.cnf 2010-02-17 09:18:17 +0000 +++ b/mysql-test/include/default_mysqld.cnf 2010-09-08 18:01:12 +0000 @@ -43,5 +43,11 @@ log-bin=mysqld-bin # Run tests with the performance schema instrumentation loose-enable-performance-schema +# Run tests with a small number of instrumented objects +# to limit memory consumption with MTR +loose-performance-schema-max-mutex-instances=10000 +loose-performance-schema-max-rwlock-instances=10000 +loose-performance-schema-max-table-instances=500 +loose-performance-schema-max-table-handles=1000 binlog-direct-non-transactional-updates === modified file 'mysql-test/r/func_time.result' --- a/mysql-test/r/func_time.result 2010-08-16 07:11:57 +0000 +++ b/mysql-test/r/func_time.result 2010-09-09 12:02:02 +0000 @@ -1200,6 +1200,8 @@ set time_zone= @@global.time_zone; select str_to_date('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE; str_to_date('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE NULL +Warnings: +Warning 1411 Incorrect datetime value: '10:00 PM' for function str_to_date create table t1 (field DATE); insert into t1 values ('2006-11-06'); select * from t1 where field < '2006-11-06 04:08:36.0'; === modified file 'mysql-test/r/parser.result' --- a/mysql-test/r/parser.result 2010-06-09 08:46:24 +0000 +++ b/mysql-test/r/parser.result 2010-09-07 06:45:00 +0000 @@ -556,9 +556,13 @@ DROP TABLE IF EXISTS t1; SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE; STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE NULL +Warnings: +Warning 1411 Incorrect datetime value: '10:00 PM' for function str_to_date SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE; STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE NULL +Warnings: +Warning 1411 Incorrect datetime value: '10:00 PM' for function str_to_date SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; "1997-12-31 23:59:59" + INTERVAL 1 SECOND 1998-01-01 00:00:00 === modified file 'mysql-test/r/select.result' --- a/mysql-test/r/select.result 2010-08-25 19:00:38 +0000 +++ b/mysql-test/r/select.result 2010-09-07 06:45:00 +0000 @@ -4171,9 +4171,10 @@ str_to_date('2007-10-00','%Y-%m-%d') bet set SQL_MODE=TRADITIONAL; select str_to_date('2007-10-00 12:34','%Y-%m-%d %H:%i') = '2007-10-00 12:34'; str_to_date('2007-10-00 12:34','%Y-%m-%d %H:%i') = '2007-10-00 12:34' -0 +NULL Warnings: Warning 1292 Truncated incorrect datetime value: '2007-10-00 12:34' +Warning 1411 Incorrect datetime value: '2007-10-00 12:34' for function str_to_date select str_to_date('2007-10-01 12:34','%Y-%m-%d %H:%i') = '2007-10-00 12:34'; str_to_date('2007-10-01 12:34','%Y-%m-%d %H:%i') = '2007-10-00 12:34' 0 @@ -4181,17 +4182,16 @@ Warnings: Warning 1292 Truncated incorrect datetime value: '2007-10-00 12:34' select str_to_date('2007-10-00 12:34','%Y-%m-%d %H:%i') = '2007-10-01 12:34'; str_to_date('2007-10-00 12:34','%Y-%m-%d %H:%i') = '2007-10-01 12:34' -0 +NULL Warnings: -Warning 1292 Truncated incorrect datetime value: '2007-10-00 12:34:00' +Warning 1411 Incorrect datetime value: '2007-10-00 12:34' for function str_to_date select str_to_date('2007-10-00','%Y-%m-%d') between '2007/09/01' and '2007/10/20'; str_to_date('2007-10-00','%Y-%m-%d') between '2007/09/01' and '2007/10/20' -0 +NULL Warnings: -Warning 1292 Incorrect datetime value: '2007-10-00' for column '2007/09/01' at row 1 -Warning 1292 Incorrect datetime value: '2007-10-00' for column '2007/10/20' at row 1 +Warning 1411 Incorrect datetime value: '2007-10-00' for function str_to_date set SQL_MODE=DEFAULT; select str_to_date('2007-10-00','%Y-%m-%d') between '' and '2007/10/20'; str_to_date('2007-10-00','%Y-%m-%d') between '' and '2007/10/20' === modified file 'mysql-test/r/strict.result' --- a/mysql-test/r/strict.result 2010-07-30 15:28:36 +0000 +++ b/mysql-test/r/strict.result 2010-09-07 06:45:00 +0000 @@ -206,12 +206,11 @@ INSERT INTO t1 (col1) VALUES (STR_TO_DAT INSERT INTO t1 (col2) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i')); INSERT INTO t1 (col3) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i')); INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); -Warnings: -Note 1265 Data truncated for column 'col1' at row 1 +ERROR HY000: Incorrect datetime value: '31.10.0000 15.30' for function str_to_date INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect date value: '2004-00-31 15:30:00' for column 'col1' at row 1 +ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_date INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect date value: '2004-10-00 15:30:00' for column 'col1' at row 1 +ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); ERROR 22007: Incorrect date value: '2004-09-31 15:30:00' for column 'col1' at row 1 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i')); @@ -221,12 +220,13 @@ ERROR 22007: Incorrect date value: '2003 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); -ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1 +ERROR HY000: Incorrect datetime value: '00.00.0000' for function str_to_date INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); +ERROR HY000: Incorrect datetime value: '31.10.0000 15.30' for function str_to_date INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect datetime value: '2004-00-31 15:30:00' for column 'col2' at row 1 +ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_date INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1 +ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col2' at row 1 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i')); @@ -236,13 +236,13 @@ ERROR 22007: Incorrect datetime value: ' INSERT INTO t1 (col2) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date INSERT INTO t1 (col2) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); -ERROR 22007: Incorrect datetime value: '0000-00-00' for column 'col2' at row 1 +ERROR HY000: Incorrect datetime value: '00.00.0000' for function str_to_date INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1 +ERROR HY000: Incorrect datetime value: '31.10.0000 15.30' for function str_to_date INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect datetime value: '2004-00-31 15:30:00' for column 'col3' at row 1 +ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_date INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); -ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1 +ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col3' at row 1 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i')); @@ -252,7 +252,7 @@ ERROR 22007: Incorrect datetime value: ' INSERT INTO t1 (col3) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date INSERT INTO t1 (col3) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); -ERROR 22007: Incorrect datetime value: '0000-00-00' for column 'col3' at row 1 +ERROR HY000: Incorrect datetime value: '00.00.0000' for function str_to_date drop table t1; CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp); INSERT INTO t1 (col1) VALUES (CAST('2004-10-15' AS DATE)); @@ -1108,6 +1108,9 @@ Warnings: Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date +Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date +Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date +Warning 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_date drop table t1; create table t1 (col1 char(3), col2 integer); insert into t1 (col1) values (cast(1000 as char(3))); === modified file 'mysql-test/r/type_datetime.result' --- a/mysql-test/r/type_datetime.result 2010-05-05 09:28:37 +0000 +++ b/mysql-test/r/type_datetime.result 2010-09-07 06:45:00 +0000 @@ -655,5 +655,30 @@ Note 1003 select `test`.`t1`.`Id` AS `Id DROP TABLE t1; SET NAMES latin1; # +# Bug#56271: Wrong comparison result with STR_TO_DATE function +# +CREATE TABLE t1 ( +`year` int(4) NOT NULL, +`month` int(2) NOT NULL +); +INSERT INTO t1 VALUES (2010,3),(2010,4),(2009,8),(2008,9); +SELECT * +FROM t1 +WHERE STR_TO_DATE(CONCAT_WS('/01/',`month`,`year`), '%m/%d/%Y') >= +STR_TO_DATE('1/1/2010', '%m/%d/%Y'); +year month +2010 3 +2010 4 +create table t2(f1 datetime primary key); +insert into t2 select STR_TO_DATE(CONCAT_WS('/01/',`month`,`year`), '%m/%d/%Y') from t1; +select * from t2 where f1=STR_TO_DATE('4/1/2010', '%m/%d/%Y'); +f1 +2010-04-01 00:00:00 +t2 should be const +explain select * from t2 where f1=STR_TO_DATE('4/1/2010', '%m/%d/%Y'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 const PRIMARY PRIMARY 8 const 1 Using index +DROP TABLE t1,t2; +# # End of 5.5 tests # === modified file 'mysql-test/suite/perfschema/r/start_server_no_cond_class.result' --- a/mysql-test/suite/perfschema/r/start_server_no_cond_class.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_cond_class.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_cond_inst.result' --- a/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_file_class.result' --- a/mysql-test/suite/perfschema/r/start_server_no_file_class.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_file_class.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 0 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_file_inst.result' --- a/mysql-test/suite/perfschema/r/start_server_no_file_inst.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_file_inst.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 0 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_mutex_class.result' --- a/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 0 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result' --- a/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result 2010-09-08 18:01:12 +0000 @@ -47,9 +47,9 @@ performance_schema_max_file_instances 10 performance_schema_max_mutex_classes 200 performance_schema_max_mutex_instances 0 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result' --- a/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 0 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result' --- a/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_instances 0 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_thread_class.result' --- a/mysql-test/suite/perfschema/r/start_server_no_thread_class.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_thread_class.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 0 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_no_thread_inst.result' --- a/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 0 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_off.result' --- a/mysql-test/suite/perfschema/r/start_server_off.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_off.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/perfschema/r/start_server_on.result' --- a/mysql-test/suite/perfschema/r/start_server_on.result 2010-08-25 00:21:43 +0000 +++ b/mysql-test/suite/perfschema/r/start_server_on.result 2010-09-08 18:01:12 +0000 @@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 performance_schema_max_file_handles 32768 performance_schema_max_file_instances 10000 performance_schema_max_mutex_classes 200 -performance_schema_max_mutex_instances 1000000 +performance_schema_max_mutex_instances 10000 performance_schema_max_rwlock_classes 30 -performance_schema_max_rwlock_instances 1000000 -performance_schema_max_table_handles 100000 -performance_schema_max_table_instances 50000 +performance_schema_max_rwlock_instances 10000 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 performance_schema_max_thread_classes 50 performance_schema_max_thread_instances 1000 show engine PERFORMANCE_SCHEMA status; === modified file 'mysql-test/suite/rpl/t/disabled.def' --- a/mysql-test/suite/rpl/t/disabled.def 2010-08-13 10:07:27 +0000 +++ b/mysql-test/suite/rpl/t/disabled.def 2010-09-06 12:45:12 +0000 @@ -11,7 +11,6 @@ ############################################################################## rpl_failed_optimize : WL#4284: Can't optimize table used by a pending transaction (there is metadata lock on the table). -rpl_plugin_load : Bug#55966 2010-08-13 alik "plugin" tests fail in 5.5 rpl_read_only : WL#4284: Setting Read only won't succeed until all metadata locks are released. rpl_row_create_table : Bug#51574 2010-02-27 andrei failed different way than earlier with bug#45576 rpl_spec_variables : BUG#47661 2009-10-27 jasonh rpl_spec_variables fails on PB2 hpux === modified file 'mysql-test/t/disabled.def' --- a/mysql-test/t/disabled.def 2010-09-01 13:12:42 +0000 +++ b/mysql-test/t/disabled.def 2010-09-06 12:45:12 +0000 @@ -14,9 +14,6 @@ lowercase_table3 : Bug#54845 201 mysqlhotcopy_myisam : Bug#54129 2010-08-31 alik mysqlhotcopy* fails mysqlhotcopy_archive : Bug#54129 2010-08-31 alik mysqlhotcopy* fails partition_innodb_plugin : Bug#53307 2010-04-30 VasilDimov valgrind warnings -plugin : Bug#55966 2010-08-13 alik "plugin" tests fail in 5.5 -plugin_load : Bug#55966 2010-08-13 alik "plugin" tests fail in 5.5 -plugin_not_embedded : Bug#55966 2010-08-13 alik "plugin" tests fail in 5.5 query_cache_28249 : Bug#43861 2009-03-25 main.query_cache_28249 fails sporadically sp_sync : Bug#48157 2010-02-06 5.5-m3 demands a differnt solution ctype_utf8mb4_ndb : Bug#55799, Bug#51907, disabled by Konstantin 2010-08-06 === modified file 'mysql-test/t/strict.test' --- a/mysql-test/t/strict.test 2010-03-18 10:38:29 +0000 +++ b/mysql-test/t/strict.test 2010-09-07 06:45:00 +0000 @@ -192,11 +192,11 @@ INSERT INTO t1 (col3) VALUES (STR_TO_DAT # All test cases expected to fail should return # SQLSTATE 22007 +--error 1411 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); - ---error 1292 +--error 1411 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); --error 1292 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); @@ -206,18 +206,18 @@ INSERT INTO t1 (col1) VALUES(STR_TO_DATE INSERT INTO t1 (col1) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i')); --error 1411 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); ## Test INSERT with STR_TO_DATE into DATETIME # All test cases expected to fail should return # SQLSTATE 22007 +--error 1411 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); - ---error 1292 +--error 1411 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); --error 1292 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); @@ -227,18 +227,18 @@ INSERT INTO t1 (col2) VALUES(STR_TO_DATE INSERT INTO t1 (col2) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i')); --error 1411 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col2) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); ## Test INSERT with STR_TO_DATE into TIMESTAMP # All test cases expected to fail should return # SQLSTATE 22007 ---error 1292 +--error 1411 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i')); --error 1292 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i')); @@ -248,7 +248,7 @@ INSERT INTO t1 (col3) VALUES(STR_TO_DATE INSERT INTO t1 (col3) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i')); --error 1411 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i')); ---error 1292 +--error 1411 INSERT INTO t1 (col3) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y')); drop table t1; === modified file 'mysql-test/t/type_datetime.test' --- a/mysql-test/t/type_datetime.test 2010-05-05 09:28:37 +0000 +++ b/mysql-test/t/type_datetime.test 2010-09-07 06:45:00 +0000 @@ -462,5 +462,28 @@ DROP TABLE t1; SET NAMES latin1; --echo # +--echo # Bug#56271: Wrong comparison result with STR_TO_DATE function +--echo # +CREATE TABLE t1 ( + `year` int(4) NOT NULL, + `month` int(2) NOT NULL +); + +INSERT INTO t1 VALUES (2010,3),(2010,4),(2009,8),(2008,9); + +SELECT * +FROM t1 +WHERE STR_TO_DATE(CONCAT_WS('/01/',`month`,`year`), '%m/%d/%Y') >= +STR_TO_DATE('1/1/2010', '%m/%d/%Y'); + +create table t2(f1 datetime primary key); +insert into t2 select STR_TO_DATE(CONCAT_WS('/01/',`month`,`year`), '%m/%d/%Y') from t1; +select * from t2 where f1=STR_TO_DATE('4/1/2010', '%m/%d/%Y'); +--echo t2 should be const +explain select * from t2 where f1=STR_TO_DATE('4/1/2010', '%m/%d/%Y'); + +DROP TABLE t1,t2; + +--echo # --echo # End of 5.5 tests --echo # === modified file 'mysys/my_gethwaddr.c' --- a/mysys/my_gethwaddr.c 2010-07-15 13:47:50 +0000 +++ b/mysys/my_gethwaddr.c 2010-09-09 12:51:50 +0000 @@ -64,7 +64,7 @@ my_bool my_gethwaddr(uchar *to) if (ifm->ifm_type == RTM_IFINFO) { sdl = (struct sockaddr_dl *)(ifm + 1); - addr=LLADDR(sdl); + addr=(uchar *)LLADDR(sdl); res=memcpy_and_test(to, addr, ETHER_ADDR_LEN); } } === modified file 'mysys/my_sync.c' --- a/mysys/my_sync.c 2009-12-11 09:39:38 +0000 +++ b/mysys/my_sync.c 2010-09-09 13:55:37 +0000 @@ -100,9 +100,9 @@ static const char cur_dir_name[]= {FN_CU RETURN 0 if ok, !=0 if error */ +#ifdef NEED_EXPLICIT_SYNC_DIR int my_sync_dir(const char *dir_name, myf my_flags) { -#ifdef NEED_EXPLICIT_SYNC_DIR File dir_fd; int res= 0; const char *correct_dir_name; @@ -124,10 +124,14 @@ int my_sync_dir(const char *dir_name, my else res= 1; DBUG_RETURN(res); -#else +} +#else /* NEED_EXPLICIT_SYNC_DIR */ +int my_sync_dir(const char *dir_name __attribute__((unused)), + myf my_flags __attribute__((unused))) +{ return 0; -#endif } +#endif /* NEED_EXPLICIT_SYNC_DIR */ /* @@ -141,15 +145,18 @@ int my_sync_dir(const char *dir_name, my RETURN 0 if ok, !=0 if error */ +#ifdef NEED_EXPLICIT_SYNC_DIR int my_sync_dir_by_file(const char *file_name, myf my_flags) { -#ifdef NEED_EXPLICIT_SYNC_DIR char dir_name[FN_REFLEN]; size_t dir_name_length; dirname_part(dir_name, file_name, &dir_name_length); return my_sync_dir(dir_name, my_flags); -#else +} +#else /* NEED_EXPLICIT_SYNC_DIR */ +int my_sync_dir_by_file(const char *file_name __attribute__((unused)), + myf my_flags __attribute__((unused))) +{ return 0; -#endif } - +#endif /* NEED_EXPLICIT_SYNC_DIR */ === modified file 'sql/derror.cc' --- a/sql/derror.cc 2010-07-08 21:20:08 +0000 +++ b/sql/derror.cc 2010-09-02 18:37:04 +0000 @@ -35,6 +35,8 @@ static void init_myfunc_errs(void); C_MODE_START static const char **get_server_errmsgs() { + if (!current_thd) + return DEFAULT_ERRMSGS; return CURRENT_THD_ERRMSGS; } C_MODE_END === modified file 'sql/item_timefunc.cc' --- a/sql/item_timefunc.cc 2010-07-09 12:28:51 +0000 +++ b/sql/item_timefunc.cc 2010-09-07 06:45:00 +0000 @@ -3368,6 +3368,8 @@ void Item_func_str_to_date::fix_length_a cached_field_type= MYSQL_TYPE_DATETIME; max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; cached_timestamp_type= MYSQL_TIMESTAMP_NONE; + sql_mode= (current_thd->variables.sql_mode & + (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE)); if ((const_item= args[1]->const_item())) { char format_buff[64]; @@ -3433,6 +3435,14 @@ bool Item_func_str_to_date::get_date(MYS return 0; null_date: + if (fuzzy_date & TIME_NO_ZERO_DATE) + { + char buff[128]; + strmake(buff, val->ptr(), min(val->length(), sizeof(buff)-1)); + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE), + "datetime", buff, "str_to_date"); + } return (null_value=1); } @@ -3442,7 +3452,7 @@ String *Item_func_str_to_date::val_str(S DBUG_ASSERT(fixed == 1); MYSQL_TIME ltime; - if (Item_func_str_to_date::get_date(<ime, TIME_FUZZY_DATE)) + if (Item_func_str_to_date::get_date(<ime, TIME_FUZZY_DATE | sql_mode)) return 0; if (!make_datetime((const_item ? cached_format_type : @@ -3453,6 +3463,29 @@ String *Item_func_str_to_date::val_str(S } +longlong Item_func_str_to_date::val_int() +{ + DBUG_ASSERT(fixed == 1); + MYSQL_TIME ltime; + + if (Item_func_str_to_date::get_date(<ime, TIME_FUZZY_DATE | sql_mode)) + return 0; + + if (const_item) + { + switch (cached_field_type) { + case MYSQL_TYPE_DATE: + return TIME_to_ulonglong_date(<ime); + case MYSQL_TYPE_TIME: + return TIME_to_ulonglong_time(<ime); + default: + return TIME_to_ulonglong_datetime(<ime); + } + } + return TIME_to_ulonglong_datetime(<ime); +} + + bool Item_func_last_day::get_date(MYSQL_TIME *ltime, uint fuzzy_date) { if (get_arg0_date(ltime, fuzzy_date & ~TIME_FUZZY_DATE) || === modified file 'sql/item_timefunc.h' --- a/sql/item_timefunc.h 2010-08-16 07:11:57 +0000 +++ b/sql/item_timefunc.h 2010-09-09 12:02:02 +0000 @@ -1039,6 +1039,7 @@ class Item_func_str_to_date :public Item date_time_format_types cached_format_type; timestamp_type cached_timestamp_type; bool const_item; + ulonglong sql_mode; public: Item_func_str_to_date(Item *a, Item *b) :Item_str_func(a, b), const_item(false) @@ -1052,6 +1053,8 @@ public: { return tmp_table_field_from_field_type(table, 1); } + longlong val_int(); + bool result_as_longlong() { return TRUE; } }; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-08-30 14:07:40 +0000 +++ b/sql/mysqld.cc 2010-09-02 18:37:04 +0000 @@ -1486,6 +1486,7 @@ void clean_up(bool print_message) cleanup_errmsgs(); MYSQL_CALLBACK(thread_scheduler, end, ()); finish_client_errs(); + (void) my_error_unregister(ER_ERROR_FIRST, ER_ERROR_LAST); // finish server errs DBUG_PRINT("quit", ("Error messages freed")); /* Tell main we are ready */ logger.cleanup_end(); === modified file 'sql/set_var.cc' --- a/sql/set_var.cc 2010-08-26 00:59:28 +0000 +++ b/sql/set_var.cc 2010-09-02 18:37:04 +0000 @@ -108,7 +108,7 @@ void sys_var_end() my_hash_free(&system_variable_hash); for (sys_var *var=all_sys_vars.first; var; var= var->next) - var->~sys_var(); + var->cleanup(); DBUG_VOID_RETURN; } === modified file 'sql/set_var.h' --- a/sql/set_var.h 2010-07-23 20:13:36 +0000 +++ b/sql/set_var.h 2010-09-09 12:37:09 +0000 @@ -91,11 +91,13 @@ public: longlong def_val, PolyLock *lock, enum binlog_status_enum binlog_status_arg, on_check_function on_check_func, on_update_function on_update_func, uint deprecated_version, const char *substitute, int parse_flag); + + virtual ~sys_var() {} + /** - The instance should only be destroyed on shutdown, as it doesn't unlink - itself from the chain. + All the cleanup procedures should be performed here */ - virtual ~sys_var() {} + virtual void cleanup() {} /** downcast for sys_var_pluginvar. Returns this if it's an instance of sys_var_pluginvar, and 0 otherwise. === modified file 'sql/sys_vars.h' --- a/sql/sys_vars.h 2010-08-05 12:34:19 +0000 +++ b/sql/sys_vars.h 2010-09-02 18:37:04 +0000 @@ -385,7 +385,7 @@ public: DBUG_ASSERT(scope() == GLOBAL); DBUG_ASSERT(size == sizeof(char *)); } - ~Sys_var_charptr() + void cleanup() { if (flags & ALLOCATED) my_free(global_var(char*)); --===============8138830226299477958== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-runtime-test/ # testament_sha1: 6bd9ea232edaabc6f05e884386c9e39943a09208 # timestamp: 2010-09-10 09:40:20 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: dlenev@stripped # # Begin bundle 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 Eg+2bu7A --===============8138830226299477958==--