1
0
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#10794 "mysql_stmt_attr_set no

open cursor after mysql_stmt_execute" + post-review fixes.
The bug was caused by wrong flags in stmt->server_status on the client
side: if there was no cursor, the server didn't send server_status
flags to the client, and the old flags were used to set up the
fetch function of a statement. Consequently, stmt_read_row_from_cursor was
used when there was no cursor. The fix fixes the server to always
send server flags to the client.
This commit is contained in:
konstantin@mysql.com
2005-06-30 16:17:10 +04:00
parent e4aedcc2c1
commit f60ebc4815
6 changed files with 132 additions and 35 deletions

View File

@ -13389,6 +13389,93 @@ static void test_bug10736()
myquery(rc);
}
/* Bug#10794: cursors, packets out of order */
static void test_bug10794()
{
MYSQL_STMT *stmt, *stmt1;
MYSQL_BIND bind[2];
char a[21];
int id_val;
ulong a_len;
int rc;
const char *stmt_text;
int i= 0;
ulong type;
myheader("test_bug10794");
mysql_query(mysql, "drop table if exists t1");
mysql_query(mysql, "create table t1 (id integer not null primary key,"
"name varchar(20) not null)");
stmt= mysql_stmt_init(mysql);
stmt_text= "insert into t1 (id, name) values (?, ?)";
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
check_execute(stmt, rc);
bzero(bind, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (void*) &id_val;
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (void*) a;
bind[1].length= &a_len;
rc= mysql_stmt_bind_param(stmt, bind);
check_execute(stmt, rc);
for (i= 0; i < 34; i++)
{
id_val= (i+1)*10;
sprintf(a, "a%d", i);
a_len= strlen(a); /* safety against broken sprintf */
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
}
stmt_text= "select name from t1";
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
type= (ulong) CURSOR_TYPE_READ_ONLY;
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void*) &type);
stmt1= mysql_stmt_init(mysql);
mysql_stmt_attr_set(stmt1, STMT_ATTR_CURSOR_TYPE, (const void*) &type);
bzero(bind, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].buffer= (void*) a;
bind[0].buffer_length= sizeof(a);
bind[0].length= &a_len;
rc= mysql_stmt_bind_result(stmt, bind);
check_execute(stmt, rc);
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rc= mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
if (!opt_silent)
printf("Fetched row from stmt: %s\n", a);
/* Don't optimize: an attribute of the original test case */
mysql_stmt_free_result(stmt);
mysql_stmt_reset(stmt);
stmt_text= "select name from t1 where id=10";
rc= mysql_stmt_prepare(stmt1, stmt_text, strlen(stmt_text));
check_execute(stmt1, rc);
rc= mysql_stmt_bind_result(stmt1, bind);
check_execute(stmt1, rc);
rc= mysql_stmt_execute(stmt1);
while (1)
{
rc= mysql_stmt_fetch(stmt1);
if (rc == MYSQL_NO_DATA)
{
if (!opt_silent)
printf("End of data in stmt1\n");
break;
}
check_execute(stmt1, rc);
if (!opt_silent)
printf("Fetched row from stmt1: %s\n", a);
}
mysql_stmt_close(stmt);
mysql_stmt_close(stmt1);
rc= mysql_query(mysql, "drop table t1");
myquery(rc);
}
/*
Read and parse arguments and MySQL options from my.cnf
@ -13626,6 +13713,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug11111", test_bug11111 },
{ "test_bug9992", test_bug9992 },
{ "test_bug10736", test_bug10736 },
{ "test_bug10794", test_bug10794 },
{ 0, 0 }
};