From: Alexander Nozdrin Date: October 20 2010 5:33pm Subject: bzr commit into mysql-5.5-bugteam branch (alexander.nozdrin:3256) Bug#56934 List-Archive: http://lists.mysql.com/commits/121383 X-Bug: 56934 Message-Id: <201010201733.o9KCUK4E024065@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7015039385886668340==" --===============7015039385886668340== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug56934/mysql-5.5-bugteam-bug56934/ based on revid:davi.arnaut@stripped 3256 Alexander Nozdrin 2010-10-20 Fix for Bug#56934 (mysql_stmt_fetch() incorrectly fills MYSQL_TIME structure buffer). This is a follow-up for WL#4435. The bug actually existed not only MYSQL_TYPE_DATETIME type. The problem was that Item_param::set_value() was written in an assumption that it's working with expressions, i.e. with basic data types. There are two different quick fixes here: a) Change Item_param::make_field() -- remove setting of Send_field::length, Send_field::charsetnr, Send_field::flags and Send_field::type. That would lead to marshalling all data using basic types to the client (MYSQL_TYPE_LONGLONG, MYSQL_TYPE_DOUBLE, MYSQL_TYPE_STRING and MYSQL_TYPE_NEWDECIMAL). In particular, that means, DATETIME would be sent as MYSQL_TYPE_STRING, TINYINT -- as MYSQL_TYPE_LONGLONG, etc. That could be Ok for the client, because the client library does reverse conversion automatically (the client program would see DATETIME as MYSQL_TIME object). However, there is a problem with metadata -- the metadata would be wrong (misleading): it would say that DATETIME is marshaled as MYSQL_TYPE_DATETIME, not as MYSQL_TYPE_STRING. b) Set Item_param::param_type properly to actual underlying field type. That would lead to double conversion inside the server: for example, MYSQL_TIME-object would be converted into STRING-object (in Item_param::set_value()), and then converted back to MYSQL_TIME-object (in Item_param::send()). The data however would be marshalled more properly, and also metadata would be correct. This patch implements b). There is also a possibility to avoid double conversion either by clonning the data field, or by storing a reference to it and using it on Item::send() time. That requires more work and might be done later. modified: mysql-test/r/ps.result mysql-test/t/ps.test sql/item.cc sql/sp_rcontext.h sql/sql_prepare.cc tests/mysql_client_test.c === modified file 'mysql-test/r/ps.result' --- a/mysql-test/r/ps.result 2010-08-16 15:16:07 +0000 +++ b/mysql-test/r/ps.result 2010-10-20 17:33:10 +0000 @@ -3164,6 +3164,510 @@ test1 DROP PROCEDURE p1; DROP PROCEDURE p2; +TINYINT + +CREATE PROCEDURE p1(OUT v TINYINT) +SET v = 127; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 127; +@a @a = 127 +127 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +SMALLINT + +CREATE PROCEDURE p1(OUT v SMALLINT) +SET v = 32767; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 32767; +@a @a = 32767 +32767 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +MEDIUMINT + +CREATE PROCEDURE p1(OUT v MEDIUMINT) +SET v = 8388607; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 8388607; +@a @a = 8388607 +8388607 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +INT + +CREATE PROCEDURE p1(OUT v INT) +SET v = 2147483647; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 2147483647; +@a @a = 2147483647 +2147483647 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +BIGINT + +CREATE PROCEDURE p1(OUT v BIGINT) +SET v = 9223372036854775807; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 9223372036854775807; +@a @a = 9223372036854775807 +9223372036854775807 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +BIT(11) + +CREATE PROCEDURE p1(OUT v BIT(11)) +SET v = b'10100100101'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = b'10100100101'; +@a @a = b'10100100101' +1317 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +TIMESTAMP + +CREATE PROCEDURE p1(OUT v TIMESTAMP) +SET v = '2007-11-18 15:01:02'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = '2007-11-18 15:01:02'; +@a @a = '2007-11-18 15:01:02' +2007-11-18 15:01:02 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +DATETIME + +CREATE PROCEDURE p1(OUT v DATETIME) +SET v = '1234-11-12 12:34:59'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = '1234-11-12 12:34:59'; +@a @a = '1234-11-12 12:34:59' +1234-11-12 12:34:59 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +TIME + +CREATE PROCEDURE p1(OUT v TIME) +SET v = '123:45:01'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = '123:45:01'; +@a @a = '123:45:01' +123:45:01 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +DATE + +CREATE PROCEDURE p1(OUT v DATE) +SET v = '1234-11-12'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = '1234-11-12'; +@a @a = '1234-11-12' +1234-11-12 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +YEAR + +CREATE PROCEDURE p1(OUT v YEAR) +SET v = 2010; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 2010; +@a @a = 2010 +2010 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +FLOAT(7, 4) + +CREATE PROCEDURE p1(OUT v FLOAT(7, 4)) +SET v = 123.4567; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` double DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a - 123.4567 < 0.00001; +@a @a - 123.4567 < 0.00001 +123.45670318603516 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +DOUBLE(8, 5) + +CREATE PROCEDURE p1(OUT v DOUBLE(8, 5)) +SET v = 123.45678; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` double DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a - 123.45678 < 0.000001; +@a @a - 123.45678 < 0.000001 +123.45678 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +DECIMAL(9, 6) + +CREATE PROCEDURE p1(OUT v DECIMAL(9, 6)) +SET v = 123.456789; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` decimal(65,30) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 123.456789; +@a @a = 123.456789 +123.456789 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +CHAR(32) + +CREATE PROCEDURE p1(OUT v CHAR(32)) +SET v = REPEAT('a', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('a', 16); +@a @a = REPEAT('a', 16) +aaaaaaaaaaaaaaaa 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +VARCHAR(32) + +CREATE PROCEDURE p1(OUT v VARCHAR(32)) +SET v = REPEAT('b', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('b', 16); +@a @a = REPEAT('b', 16) +bbbbbbbbbbbbbbbb 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +TINYTEXT + +CREATE PROCEDURE p1(OUT v TINYTEXT) +SET v = REPEAT('c', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('c', 16); +@a @a = REPEAT('c', 16) +cccccccccccccccc 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +TEXT + +CREATE PROCEDURE p1(OUT v TEXT) +SET v = REPEAT('d', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('d', 16); +@a @a = REPEAT('d', 16) +dddddddddddddddd 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +MEDIUMTEXT + +CREATE PROCEDURE p1(OUT v MEDIUMTEXT) +SET v = REPEAT('e', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('e', 16); +@a @a = REPEAT('e', 16) +eeeeeeeeeeeeeeee 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +LONGTEXT + +CREATE PROCEDURE p1(OUT v LONGTEXT) +SET v = REPEAT('f', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('f', 16); +@a @a = REPEAT('f', 16) +ffffffffffffffff 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +BINARY(32) + +CREATE PROCEDURE p1(OUT v BINARY(32)) +SET v = REPEAT('g', 32); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('g', 32); +@a @a = REPEAT('g', 32) +gggggggggggggggggggggggggggggggg 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +VARBINARY(32) + +CREATE PROCEDURE p1(OUT v VARBINARY(32)) +SET v = REPEAT('h', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('h', 16); +@a @a = REPEAT('h', 16) +hhhhhhhhhhhhhhhh 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +TINYBLOB + +CREATE PROCEDURE p1(OUT v TINYBLOB) +SET v = REPEAT('i', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('i', 16); +@a @a = REPEAT('i', 16) +iiiiiiiiiiiiiiii 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +BLOB + +CREATE PROCEDURE p1(OUT v BLOB) +SET v = REPEAT('j', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('j', 16); +@a @a = REPEAT('j', 16) +jjjjjjjjjjjjjjjj 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +MEDIUMBLOB + +CREATE PROCEDURE p1(OUT v MEDIUMBLOB) +SET v = REPEAT('k', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('k', 16); +@a @a = REPEAT('k', 16) +kkkkkkkkkkkkkkkk 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +LONGBLOB + +CREATE PROCEDURE p1(OUT v LONGBLOB) +SET v = REPEAT('l', 16); +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = REPEAT('l', 16); +@a @a = REPEAT('l', 16) +llllllllllllllll 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +SET('aaa', 'bbb') + +CREATE PROCEDURE p1(OUT v SET('aaa', 'bbb')) +SET v = 'aaa'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 'aaa'; +@a @a = 'aaa' +aaa 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + +ENUM('aaa', 'bbb') + +CREATE PROCEDURE p1(OUT v ENUM('aaa', 'bbb')) +SET v = 'aaa'; +PREPARE stmt1 FROM 'CALL p1(?)'; +EXECUTE stmt1 USING @a; +CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1; +SHOW CREATE TABLE tmp1; +Table Create Table +tmp1 CREATE TEMPORARY TABLE `tmp1` ( + `c1` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT @a, @a = 'aaa'; +@a @a = 'aaa' +aaa 1 +DROP TEMPORARY TABLE tmp1; +DROP PROCEDURE p1; + # End of WL#4435. # # WL#4284: Transactional DDL locking === modified file 'mysql-test/t/ps.test' --- a/mysql-test/t/ps.test 2010-04-29 20:33:06 +0000 +++ b/mysql-test/t/ps.test 2010-10-20 17:33:10 +0000 @@ -3276,6 +3276,12 @@ SELECT @a; DROP PROCEDURE p1; DROP PROCEDURE p2; +########################################################################### + +--source t/wl4435_generated.inc + +########################################################################### + --echo --echo # End of WL#4435. === modified file 'sql/item.cc' --- a/sql/item.cc 2010-10-08 14:06:31 +0000 +++ b/sql/item.cc 2010-10-20 17:33:10 +0000 @@ -226,8 +226,6 @@ bool Item::val_bool() */ String *Item::val_str_ascii(String *str) { - DBUG_ASSERT(fixed == 1); - if (!(collation.collation->state & MY_CS_NONASCII)) return val_str(str); @@ -3458,19 +3456,16 @@ Item_param::set_value(THD *thd, sp_rcont str_value.charset()); collation.set(str_value.charset(), DERIVATION_COERCIBLE); decimals= 0; - param_type= MYSQL_TYPE_STRING; break; } case REAL_RESULT: set_double(arg->val_real()); - param_type= MYSQL_TYPE_DOUBLE; break; case INT_RESULT: set_int(arg->val_int(), arg->max_length); - param_type= MYSQL_TYPE_LONG; break; case DECIMAL_RESULT: @@ -3482,8 +3477,6 @@ Item_param::set_value(THD *thd, sp_rcont return TRUE; set_decimal(dv); - param_type= MYSQL_TYPE_NEWDECIMAL; - break; } @@ -3515,6 +3508,7 @@ void Item_param::set_out_param_info(Send_field *info) { m_out_param_info= info; + param_type= m_out_param_info->type; } @@ -3560,6 +3554,7 @@ void Item_param::make_field(Send_field * field->org_table_name= m_out_param_info->org_table_name; field->col_name= m_out_param_info->col_name; field->org_col_name= m_out_param_info->org_col_name; + field->length= m_out_param_info->length; field->charsetnr= m_out_param_info->charsetnr; field->flags= m_out_param_info->flags; === modified file 'sql/sp_rcontext.h' --- a/sql/sp_rcontext.h 2010-07-30 15:28:36 +0000 +++ b/sql/sp_rcontext.h 2010-10-20 17:33:10 +0000 @@ -220,6 +220,7 @@ private: during execution. */ bool m_return_value_set; + /** TRUE if the context is created for a sub-statement. */ === modified file 'sql/sql_prepare.cc' --- a/sql/sql_prepare.cc 2010-08-18 09:35:41 +0000 +++ b/sql/sql_prepare.cc 2010-10-20 17:33:10 +0000 @@ -1185,7 +1185,7 @@ static bool insert_params_from_vars_with uint32 length= 0; THD *thd= stmt->thd; - DBUG_ENTER("insert_params_from_vars"); + DBUG_ENTER("insert_params_from_vars_with_log"); if (query->copy(stmt->query(), stmt->query_length(), default_charset_info)) DBUG_RETURN(1); === modified file 'tests/mysql_client_test.c' --- a/tests/mysql_client_test.c 2010-10-04 12:42:16 +0000 +++ b/tests/mysql_client_test.c 2010-10-20 17:33:10 +0000 @@ -2103,6 +2103,255 @@ static void test_wl4435_2() } +#define WL4435_TEST(sql_type, sql_value, \ + c_api_in_type, c_api_out_type, \ + c_type, c_type_ext, \ + printf_args, assert_condition) \ +\ + do { \ + int rc; \ + MYSQL_STMT *ps; \ + MYSQL_BIND psp; \ + MYSQL_RES *rs_metadata; \ + MYSQL_FIELD *fields; \ + c_type pspv c_type_ext; \ + my_bool psp_null; \ + \ + bzero(&pspv, sizeof (pspv)); \ + \ + rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1"); \ + myquery(rc); \ + \ + rc= mysql_query(mysql, \ + "CREATE PROCEDURE p1(OUT v " sql_type ") SET v = " sql_value ";"); \ + myquery(rc); \ + \ + ps = mysql_simple_prepare(mysql, "CALL p1(?)"); \ + check_stmt(ps); \ + \ + bzero(&psp, sizeof (psp)); \ + psp.buffer_type= c_api_in_type; \ + psp.is_null= &psp_null; \ + psp.buffer= (char *) &pspv; \ + psp.buffer_length= sizeof (psp); \ + \ + rc= mysql_stmt_bind_param(ps, &psp); \ + check_execute(ps, rc); \ + \ + rc= mysql_stmt_execute(ps); \ + check_execute(ps, rc); \ + \ + DIE_UNLESS(mysql->server_status & SERVER_PS_OUT_PARAMS); \ + DIE_UNLESS(mysql_stmt_field_count(ps) == 1); \ + \ + rs_metadata= mysql_stmt_result_metadata(ps); \ + fields= mysql_fetch_fields(rs_metadata); \ + \ + rc= mysql_stmt_bind_result(ps, &psp); \ + check_execute(ps, rc); \ + \ + rc= mysql_stmt_fetch(ps); \ + DIE_UNLESS(rc == 0); \ + \ + DIE_UNLESS(fields[0].type == c_api_out_type); \ + printf printf_args; \ + printf("; in type: %d; out type: %d\n", \ + (int) c_api_in_type, (int) c_api_out_type); \ + \ + rc= mysql_stmt_fetch(ps); \ + DIE_UNLESS(rc == MYSQL_NO_DATA); \ + \ + rc= mysql_stmt_next_result(ps); \ + DIE_UNLESS(rc == 0); \ + \ + mysql_stmt_free_result(ps); \ + mysql_stmt_close(ps); \ + \ + DIE_UNLESS(assert_condition); \ + \ + } while (0) + +static void test_wl4435_3() +{ + char tmp[255]; + + puts(""); + + // The following types are not supported: + // - ENUM + // - SET + // + // The following types are supported but can not be used for + // OUT-parameters: + // - MEDIUMINT; + // - BIT(..); + // + // The problem is that those types are not supported for IN-parameters, + // and OUT-parameters should be bound as IN-parameters before execution. + // + // The following types should not be used: + // - MYSQL_TYPE_YEAR (use MYSQL_TYPE_SHORT instead); + // - MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB + // (use MYSQL_TYPE_BLOB instead); + + WL4435_TEST("TINYINT", "127", + MYSQL_TYPE_TINY, MYSQL_TYPE_TINY, + char, , + (" - TINYINT / char / MYSQL_TYPE_TINY:\t\t\t %d", (int) pspv), + pspv == 127); + + WL4435_TEST("SMALLINT", "32767", + MYSQL_TYPE_SHORT, MYSQL_TYPE_SHORT, + short, , + (" - SMALLINT / short / MYSQL_TYPE_SHORT:\t\t %d", (int) pspv), + pspv == 32767); + + WL4435_TEST("INT", "2147483647", + MYSQL_TYPE_LONG, MYSQL_TYPE_LONG, + int, , + (" - INT / int / MYSQL_TYPE_LONG:\t\t\t %d", pspv), + pspv == 2147483647l); + + WL4435_TEST("BIGINT", "9223372036854775807", + MYSQL_TYPE_LONGLONG, MYSQL_TYPE_LONGLONG, + long long, , + (" - BIGINT / long long / MYSQL_TYPE_LONGLONG:\t\t %lld", pspv), + pspv == 9223372036854775807ll); + + WL4435_TEST("TIMESTAMP", "'2007-11-18 15:01:02'", + MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_TIMESTAMP, + MYSQL_TIME, , + (" - TIMESTAMP / MYSQL_TIME / MYSQL_TYPE_TIMESTAMP:\t " + "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", + (int) pspv.year, (int) pspv.month, (int) pspv.day, + (int) pspv.hour, (int) pspv.minute, (int) pspv.second), + pspv.year == 2007 && pspv.month == 11 && pspv.day == 18 && + pspv.hour == 15 && pspv.minute == 1 && pspv.second == 2); + + WL4435_TEST("DATETIME", "'1234-11-12 12:34:59'", + MYSQL_TYPE_DATETIME, MYSQL_TYPE_DATETIME, + MYSQL_TIME, , + (" - DATETIME / MYSQL_TIME / MYSQL_TYPE_DATETIME:\t " + "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", + (int) pspv.year, (int) pspv.month, (int) pspv.day, + (int) pspv.hour, (int) pspv.minute, (int) pspv.second), + pspv.year == 1234 && pspv.month == 11 && pspv.day == 12 && + pspv.hour == 12 && pspv.minute == 34 && pspv.second == 59); + + WL4435_TEST("TIME", "'123:45:01'", + MYSQL_TYPE_TIME, MYSQL_TYPE_TIME, + MYSQL_TIME, , + (" - TIME / MYSQL_TIME / MYSQL_TYPE_TIME:\t\t " + "%.3d:%.2d:%.2d", + (int) pspv.hour, (int) pspv.minute, (int) pspv.second), + pspv.hour == 123 && pspv.minute == 45 && pspv.second == 1); + + WL4435_TEST("DATE", "'1234-11-12'", + MYSQL_TYPE_DATE, MYSQL_TYPE_DATE, + MYSQL_TIME, , + (" - DATE / MYSQL_TIME / MYSQL_TYPE_DATE:\t\t " + "%.4d-%.2d-%.2d", + (int) pspv.year, (int) pspv.month, (int) pspv.day), + pspv.year == 1234 && pspv.month == 11 && pspv.day == 12); + + WL4435_TEST("YEAR", "'2010'", + MYSQL_TYPE_SHORT, MYSQL_TYPE_YEAR, + short, , + (" - YEAR / short / MYSQL_TYPE_SHORT:\t\t\t %.4d", (int) pspv), + pspv == 2010); + + WL4435_TEST("FLOAT(7, 4)", "123.4567", + MYSQL_TYPE_FLOAT, MYSQL_TYPE_FLOAT, + float, , + (" - FLOAT / float / MYSQL_TYPE_FLOAT:\t\t\t %g", (double) pspv), + pspv - 123.4567 < 0.0001); + + WL4435_TEST("DOUBLE(8, 5)", "123.45678", + MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE, + double, , + (" - DOUBLE / double / MYSQL_TYPE_DOUBLE:\t\t %g", (double) pspv), + pspv - 123.45678 < 0.00001); + + WL4435_TEST("DECIMAL(9, 6)", "123.456789", + MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL, + char, [255], + (" - DECIMAL / char[] / MYSQL_TYPE_NEWDECIMAL:\t\t '%s'", (char *) pspv), + !strcmp(pspv, "123.456789")); + + WL4435_TEST("CHAR(32)", "REPEAT('C', 16)", + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + char, [255], + (" - CHAR(32) / char[] / MYSQL_TYPE_STRING:\t\t '%s'", (char *) pspv), + !strcmp(pspv, "CCCCCCCCCCCCCCCC")); + + WL4435_TEST("VARCHAR(32)", "REPEAT('V', 16)", + MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_VAR_STRING, + char, [255], + (" - VARCHAR(32) / char[] / MYSQL_TYPE_VAR_STRING:\t '%s'", (char *) pspv), + !strcmp(pspv, "VVVVVVVVVVVVVVVV")); + + WL4435_TEST("TINYTEXT", "REPEAT('t', 16)", + MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - TINYTEXT / char[] / MYSQL_TYPE_TINY_BLOB:\t\t '%s'", (char *) pspv), + !strcmp(pspv, "tttttttttttttttt")); + + WL4435_TEST("TEXT", "REPEAT('t', 16)", + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - TEXT / char[] / MYSQL_TYPE_BLOB:\t\t\t '%s'", (char *) pspv), + !strcmp(pspv, "tttttttttttttttt")); + + WL4435_TEST("MEDIUMTEXT", "REPEAT('t', 16)", + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - MEDIUMTEXT / char[] / MYSQL_TYPE_MEDIUM_BLOB:\t '%s'", (char *) pspv), + !strcmp(pspv, "tttttttttttttttt")); + + WL4435_TEST("LONGTEXT", "REPEAT('t', 16)", + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - LONGTEXT / char[] / MYSQL_TYPE_LONG_BLOB:\t\t '%s'", (char *) pspv), + !strcmp(pspv, "tttttttttttttttt")); + + WL4435_TEST("BINARY(32)", "REPEAT('\1', 16)", + MYSQL_TYPE_STRING, MYSQL_TYPE_STRING, + char, [255], + (" - BINARY(32) / char[] / MYSQL_TYPE_STRING:\t\t '%s'", (char *) pspv), + memset(tmp, 1, 16) && !memcmp(tmp, pspv, 16)); + + WL4435_TEST("VARBINARY(32)", "REPEAT('\1', 16)", + MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_VAR_STRING, + char, [255], + (" - VARBINARY(32) / char[] / MYSQL_TYPE_VAR_STRING:\t '%s'", (char *) pspv), + memset(tmp, 1, 16) && !memcmp(tmp, pspv, 16)); + + WL4435_TEST("TINYBLOB", "REPEAT('\2', 16)", + MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - TINYBLOB / char[] / MYSQL_TYPE_TINY_BLOB:\t\t '%s'", (char *) pspv), + memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16)); + + WL4435_TEST("BLOB", "REPEAT('\2', 16)", + MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - BLOB / char[] / MYSQL_TYPE_BLOB:\t\t\t '%s'", (char *) pspv), + memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16)); + + WL4435_TEST("MEDIUMBLOB", "REPEAT('\2', 16)", + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - MEDIUMBLOB / char[] / MYSQL_TYPE_MEDIUM_BLOB:\t '%s'", (char *) pspv), + memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16)); + + WL4435_TEST("LONGBLOB", "REPEAT('\2', 16)", + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, + char, [255], + (" - LONGBLOB / char[] / MYSQL_TYPE_LONG_BLOB:\t\t '%s'", (char *) pspv), + memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16)); +} + + /* Test simple prepare field results */ static void test_prepare_field_result() @@ -19468,6 +19717,7 @@ static struct my_tests_st my_tests[]= { { "test_wl4284_1", test_wl4284_1 }, { "test_wl4435", test_wl4435 }, { "test_wl4435_2", test_wl4435_2 }, + { "test_wl4435_3", test_wl4435_3 }, { "test_bug38486", test_bug38486 }, { "test_bug33831", test_bug33831 }, { "test_bug40365", test_bug40365 }, --===============7015039385886668340== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # 0yh2lm24wtp25ddp # target_branch: file:///home/alik/MySQL/bzr/00/bug56934/mysql-5.5-\ # bugteam-bug56934/ # testament_sha1: 04af6e0bfeff1a305d193692c5cb61868fd5f67f # timestamp: 2010-10-20 21:33:18 +0400 # base_revision_id: davi.arnaut@stripped\ # b2coipse00x1occ0 # # Begin bundle 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 --===============7015039385886668340==--