Commit ade3fbc3 authored by unknown's avatar unknown

Fix EXPLAIN bug with binary protocol

Added new client tests (EXPLAIN + DECIMAL conv)



sql/sql_prepare.cc:
  Fix EXPLAIN bug with binary protocol
tests/client_test.c:
  New tests for EXPLAIN + DECIMAL conv
parent 5931e8b1
......@@ -573,8 +573,19 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
if (open_and_lock_tables(thd, tables))
DBUG_RETURN(1);
if (lex->describe)
{
if (!(result= new select_send()))
{
send_error(thd, ER_OUT_OF_RESOURCES);
DBUG_RETURN(1);
}
if (send_prep_stmt(stmt, 0) || send_item_params(stmt))
DBUG_RETURN(1);
}
else
{
fix_tables_pointers(thd->lex.all_selects_list);
if (!result && !(result= new select_send()))
{
delete select_lex->having;
......@@ -591,15 +602,12 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
select_lex, unit, 0, 0))
DBUG_RETURN(1);
/*
Currently return only column list info only, and we are not
sending any info on where clause.
*/
if (send_prep_stmt(stmt, fields.elements) ||
thd->protocol_simple.send_fields(&fields, 0) ||
send_item_params(stmt))
DBUG_RETURN(1);
join->cleanup(thd);
}
DBUG_RETURN(0);
}
......
......@@ -5926,7 +5926,7 @@ static void test_field_misc()
/*
To test SET OPTION feature with prepare stmts
bug #85
bug #85 (reported by mark@mysql.com)
*/
static void test_set_option()
{
......@@ -5991,7 +5991,7 @@ static void test_set_option()
/*
To test a misc GRANT option
bug #89
bug #89 (reported by mark@mysql.com)
*/
static void test_prepare_grant()
{
......@@ -6084,8 +6084,8 @@ static void test_prepare_grant()
/*
To test a crash when invalid/corrupted .frm is used in the
SHOW TABLE STATUS (in debug mode)
bug #93
SHOW TABLE STATUS
bug #93 (reported by serg@mysql.com).
*/
static void test_frm_bug()
{
......@@ -6167,6 +6167,215 @@ static void test_frm_bug()
mysql_query(mysql,"drop table if exists test_frm_bug");
}
/*
To test DECIMAL conversion
*/
static void test_decimal_bug()
{
MYSQL_STMT *stmt;
MYSQL_BIND bind[1];
double data;
int rc;
my_bool is_null;
myheader("test_decimal_bug");
mysql_autocommit(mysql, TRUE);
rc= mysql_query(mysql,"drop table if exists test_decimal_bug");
myquery(rc);
rc = mysql_query(mysql, "create table test_decimal_bug(c1 decimal(10,2))");
myquery(rc);
rc = mysql_query(mysql, "insert into test_decimal_bug value(8),(10.22),(5.61)");
myquery(rc);
stmt = mysql_prepare(mysql,"select c1 from test_decimal_bug where c1= ?",50);
mystmt_init(stmt);
bind[0].buffer_type= MYSQL_TYPE_DOUBLE;
bind[0].buffer= (char *)&data;
bind[0].buffer_length= 0;
bind[0].is_null= &is_null;
bind[0].length= 0;
is_null= 0;
rc = mysql_bind_param(stmt, bind);
mystmt(stmt,rc);
data= 8.0;
rc = mysql_execute(stmt);
mystmt(stmt,rc);
data=0;
rc = mysql_bind_result(stmt, bind);
mystmt(stmt,rc);
rc = mysql_fetch(stmt);
mystmt(stmt,rc);
fprintf(stdout, "\n data: %g", data);
myassert(data == 8.0);
rc = mysql_fetch(stmt);
myassert(rc == MYSQL_NO_DATA);
data= 5.61;
rc = mysql_execute(stmt);
mystmt(stmt,rc);
data=0;
rc = mysql_bind_result(stmt, bind);
mystmt(stmt,rc);
rc = mysql_fetch(stmt);
mystmt(stmt,rc);
fprintf(stdout, "\n data: %g", data);
myassert(data == 5.61);
rc = mysql_fetch(stmt);
myassert(rc == MYSQL_NO_DATA);
is_null= 1;
rc = mysql_execute(stmt);
mystmt(stmt,rc);
rc = mysql_fetch(stmt);
myassert(rc == MYSQL_NO_DATA);
data= 10.22; is_null= 0;
rc = mysql_execute(stmt);
mystmt(stmt,rc);
data=0;
rc = mysql_bind_result(stmt, bind);
mystmt(stmt,rc);
rc = mysql_fetch(stmt);
mystmt(stmt,rc);
fprintf(stdout, "\n data: %g", data);
myassert(data == 10.22);
rc = mysql_fetch(stmt);
myassert(rc == MYSQL_NO_DATA);
mysql_stmt_close(stmt);
}
/*
To test EXPLAIN bug
bug #115 (reported by mark@mysql.com & georg@php.net).
*/
static void test_explain_bug()
{
MYSQL_STMT *stmt;
MYSQL_RES *result;
int rc;
myheader("test_explain_bug");
mysql_autocommit(mysql,TRUE);
rc = mysql_query(mysql, "DROP TABLE IF EXISTS test_explain");
myquery(rc);
rc = mysql_query(mysql, "CREATE TABLE test_explain(id int, name char(2))");
myquery(rc);
stmt = mysql_prepare(mysql, "explain test_explain", 30);
mystmt_init(stmt);
rc = mysql_execute(stmt);
mystmt(stmt, rc);
myassert( 2 == my_process_stmt_result(stmt));
result = mysql_prepare_result(stmt);
mytest(result);
fprintf(stdout, "\n total fields in the result: %d",
mysql_num_fields(result));
myassert(7 == mysql_num_fields(result));
verify_prepare_field(result,0,"Field","",MYSQL_TYPE_STRING,
"","","",NAME_LEN);
verify_prepare_field(result,1,"Type","",MYSQL_TYPE_STRING,
"","","",40);
verify_prepare_field(result,2,"Collation","",MYSQL_TYPE_STRING,
"","","",40);
verify_prepare_field(result,3,"Null","",MYSQL_TYPE_STRING,
"","","",1);
verify_prepare_field(result,4,"Key","",MYSQL_TYPE_STRING,
"","","",3);
verify_prepare_field(result,5,"Default","",MYSQL_TYPE_STRING,
"","","",NAME_LEN);
verify_prepare_field(result,6,"Extra","",MYSQL_TYPE_STRING,
"","","",20);
mysql_free_result(result);
mysql_stmt_close(stmt);
stmt = mysql_prepare(mysql, "explain select id, name FROM test_explain", 50);
mystmt_init(stmt);
rc = mysql_execute(stmt);
mystmt(stmt, rc);
myassert( 1 == my_process_stmt_result(stmt));
result = mysql_prepare_result(stmt);
mytest(result);
fprintf(stdout, "\n total fields in the result: %d",
mysql_num_fields(result));
myassert(10 == mysql_num_fields(result));
verify_prepare_field(result,0,"id","",MYSQL_TYPE_LONGLONG,
"","","",3);
verify_prepare_field(result,1,"select_type","",MYSQL_TYPE_STRING,
"","","",19);
verify_prepare_field(result,2,"table","",MYSQL_TYPE_STRING,
"","","",NAME_LEN);
verify_prepare_field(result,3,"type","",MYSQL_TYPE_STRING,
"","","",10);
verify_prepare_field(result,4,"possible_keys","",MYSQL_TYPE_STRING,
"","","",NAME_LEN*32);
verify_prepare_field(result,5,"key","",MYSQL_TYPE_STRING,
"","","",NAME_LEN);
verify_prepare_field(result,6,"key_len","",MYSQL_TYPE_LONGLONG,
"","","",3);
verify_prepare_field(result,7,"ref","",MYSQL_TYPE_STRING,
"","","",NAME_LEN*16);
verify_prepare_field(result,8,"rows","",MYSQL_TYPE_LONGLONG,
"","","",10);
verify_prepare_field(result,9,"Extra","",MYSQL_TYPE_STRING,
"","","",255);
mysql_free_result(result);
mysql_stmt_close(stmt);
}
/*
Read and parse arguments and MySQL options from my.cnf
......@@ -6389,6 +6598,8 @@ int main(int argc, char **argv)
test_set_option(); /* test the SET OPTION feature, bug #85 */
test_prepare_grant(); /* to test the GRANT command, bug #89 */
test_frm_bug(); /* test the crash when .frm is invalid, bug #93 */
test_explain_bug(); /* test for the EXPLAIN, bug #115 */
test_decimal_bug(); /* test for the decimal bug */
end_time= time((time_t *)0);
total_time+= difftime(end_time, start_time);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment