mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
A fix and a test case for Bug#11909 "mysql_stmt_attr_set
CURSOR_TYPE_READ_ONLY nested queries corrupt result"
This commit is contained in:
@ -13932,6 +13932,125 @@ static void test_bug12001()
|
||||
DIE_UNLESS(res==1);
|
||||
}
|
||||
|
||||
|
||||
/* Bug#11909: wrong metadata if fetching from two cursors */
|
||||
|
||||
static void test_bug11909()
|
||||
{
|
||||
MYSQL_STMT *stmt1, *stmt2;
|
||||
MYSQL_BIND bind[7];
|
||||
int rc;
|
||||
char firstname[20], midinit[20], lastname[20], workdept[20];
|
||||
ulong firstname_len, midinit_len, lastname_len, workdept_len;
|
||||
uint32 empno;
|
||||
double salary;
|
||||
float bonus;
|
||||
const char *stmt_text;
|
||||
|
||||
myheader("test_bug11909");
|
||||
|
||||
stmt_text= "drop table if exists t1";
|
||||
rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text));
|
||||
myquery(rc);
|
||||
|
||||
stmt_text= "create table t1 ("
|
||||
" empno int(11) not null, firstname varchar(20) not null,"
|
||||
" midinit varchar(20) not null, lastname varchar(20) not null,"
|
||||
" workdept varchar(6) not null, salary double not null,"
|
||||
" bonus float not null, primary key (empno)"
|
||||
") default charset=latin1 collate=latin1_bin";
|
||||
rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text));
|
||||
myquery(rc);
|
||||
|
||||
stmt_text= "insert into t1 values "
|
||||
"(10, 'CHRISTINE', 'I', 'HAAS', 'A00', 52750, 1000), "
|
||||
"(20, 'MICHAEL', 'L', 'THOMPSON', 'B01', 41250, 800),"
|
||||
"(30, 'SALLY', 'A', 'KWAN', 'C01', 38250, 800),"
|
||||
"(50, 'JOHN', 'B', 'GEYER', 'E01', 40175, 800), "
|
||||
"(60, 'IRVING', 'F', 'STERN', 'D11', 32250, 500)";
|
||||
rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text));
|
||||
myquery(rc);
|
||||
|
||||
/* ****** Begin of trace ****** */
|
||||
|
||||
stmt1= open_cursor("SELECT empno, firstname, midinit, lastname,"
|
||||
"workdept, salary, bonus FROM t1");
|
||||
|
||||
bzero(bind, sizeof(bind));
|
||||
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
||||
bind[0].buffer= (void*) &empno;
|
||||
|
||||
bind[1].buffer_type= MYSQL_TYPE_VAR_STRING;
|
||||
bind[1].buffer= (void*) firstname;
|
||||
bind[1].buffer_length= sizeof(firstname);
|
||||
bind[1].length= &firstname_len;
|
||||
|
||||
bind[2].buffer_type= MYSQL_TYPE_VAR_STRING;
|
||||
bind[2].buffer= (void*) midinit;
|
||||
bind[2].buffer_length= sizeof(midinit);
|
||||
bind[2].length= &midinit_len;
|
||||
|
||||
bind[3].buffer_type= MYSQL_TYPE_VAR_STRING;
|
||||
bind[3].buffer= (void*) lastname;
|
||||
bind[3].buffer_length= sizeof(lastname);
|
||||
bind[3].length= &lastname_len;
|
||||
|
||||
bind[4].buffer_type= MYSQL_TYPE_VAR_STRING;
|
||||
bind[4].buffer= (void*) workdept;
|
||||
bind[4].buffer_length= sizeof(workdept);
|
||||
bind[4].length= &workdept_len;
|
||||
|
||||
bind[5].buffer_type= MYSQL_TYPE_DOUBLE;
|
||||
bind[5].buffer= (void*) &salary;
|
||||
|
||||
bind[6].buffer_type= MYSQL_TYPE_FLOAT;
|
||||
bind[6].buffer= (void*) &bonus;
|
||||
rc= mysql_stmt_bind_result(stmt1, bind);
|
||||
check_execute(stmt1, rc);
|
||||
|
||||
rc= mysql_stmt_execute(stmt1);
|
||||
check_execute(stmt1, rc);
|
||||
|
||||
rc= mysql_stmt_fetch(stmt1);
|
||||
DIE_UNLESS(rc == 0);
|
||||
DIE_UNLESS(empno == 10);
|
||||
DIE_UNLESS(strcmp(firstname, "CHRISTINE") == 0);
|
||||
DIE_UNLESS(strcmp(midinit, "I") == 0);
|
||||
DIE_UNLESS(strcmp(lastname, "HAAS") == 0);
|
||||
DIE_UNLESS(strcmp(workdept, "A00") == 0);
|
||||
DIE_UNLESS(salary == (double) 52750.0);
|
||||
DIE_UNLESS(bonus == (float) 1000.0);
|
||||
|
||||
stmt2= open_cursor("SELECT empno, firstname FROM t1");
|
||||
rc= mysql_stmt_bind_result(stmt2, bind);
|
||||
check_execute(stmt2, rc);
|
||||
|
||||
rc= mysql_stmt_execute(stmt2);
|
||||
check_execute(stmt2, rc);
|
||||
|
||||
rc= mysql_stmt_fetch(stmt2);
|
||||
DIE_UNLESS(rc == 0);
|
||||
|
||||
DIE_UNLESS(empno == 10);
|
||||
DIE_UNLESS(strcmp(firstname, "CHRISTINE") == 0);
|
||||
|
||||
rc= mysql_stmt_reset(stmt2);
|
||||
check_execute(stmt2, rc);
|
||||
|
||||
/* ERROR: next statement should return 0 */
|
||||
|
||||
rc= mysql_stmt_fetch(stmt1);
|
||||
DIE_UNLESS(rc == 0);
|
||||
|
||||
mysql_stmt_close(stmt1);
|
||||
mysql_stmt_close(stmt2);
|
||||
rc= mysql_rollback(mysql);
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "drop table t1");
|
||||
myquery(rc);
|
||||
}
|
||||
|
||||
/*
|
||||
Read and parse arguments and MySQL options from my.cnf
|
||||
*/
|
||||
@ -14178,6 +14297,7 @@ static struct my_tests_st my_tests[]= {
|
||||
{ "test_bug11037", test_bug11037 },
|
||||
{ "test_bug10760", test_bug10760 },
|
||||
{ "test_bug12001", test_bug12001 },
|
||||
{ "test_bug11909", test_bug11909 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user