From: Marc Alff Date: September 9 2010 3:27pm Subject: bzr commit into mysql-5.5-bugfixing branch (marc.alff:3204) List-Archive: http://lists.mysql.com/commits/117901 Message-Id: <20100909152720.8E0BA45E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8531573100047736004==" --===============8531573100047736004== 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-5.5-bugfixing-56528/ based on revid:marc.alff@stripped 3204 Marc Alff 2010-09-09 [merge] local merge modified: client/mysqltest.cc cmake/dtrace.cmake libmysqld/lib_sql.cc 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/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 === 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/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/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*)); --===============8531573100047736004== 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-5.5-bugfixing-\ # 56528/ # testament_sha1: 1c011e5d2a3b067dbcacd8e6d90583d6248b0b59 # timestamp: 2010-09-09 09:27:20 -0600 # source_branch: file:///home/malff/BZR_TREE/mysql-5.5-bugfixing/ # base_revision_id: marc.alff@stripped\ # 0e6o8uiku59gtbhl # # Begin bundle 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 y/eQfuBpUv/2o2S5HU+v+c/wLuSKcKEgArY0rg== --===============8531573100047736004==--