Fix for Bug#4079 "error checking in prepared statements":
reset mysql->status if there was an error in row reading. libmysql/libmysql.c: Fix for bug#4079 tests/client_test.c: Test for bug #4079
This commit is contained in:
parent
267418de32
commit
4047b5ade3
@ -2501,6 +2501,13 @@ static int stmt_read_row_unbuffered(MYSQL_STMT *stmt, unsigned char **row)
|
|||||||
{
|
{
|
||||||
set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
|
set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
|
||||||
mysql->net.sqlstate);
|
mysql->net.sqlstate);
|
||||||
|
/*
|
||||||
|
If there was an error, there are no more pending rows:
|
||||||
|
reset statement status to not hang up in following
|
||||||
|
mysql_stmt_close (it will try to flush result set before
|
||||||
|
closing the statement).
|
||||||
|
*/
|
||||||
|
mysql->status= MYSQL_STATUS_READY;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (!*row)
|
if (!*row)
|
||||||
|
@ -9869,6 +9869,49 @@ static void test_bug4026()
|
|||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void test_bug4079()
|
||||||
|
{
|
||||||
|
MYSQL_STMT *stmt;
|
||||||
|
MYSQL_BIND bind[1];
|
||||||
|
const char *stmt_text;
|
||||||
|
unsigned long res;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
myheader("test_bug4079");
|
||||||
|
|
||||||
|
/* Create and fill table */
|
||||||
|
mysql_query(mysql, "DROP TABLE IF EXISTS t1");
|
||||||
|
mysql_query(mysql, "CREATE TABLE t1 (a int)");
|
||||||
|
mysql_query(mysql, "INSERT INTO t1 VALUES (1), (2)");
|
||||||
|
|
||||||
|
/* Prepare erroneous statement */
|
||||||
|
stmt= mysql_stmt_init(mysql);
|
||||||
|
stmt_text= "SELECT 1 < (SELECT a FROM t1)";
|
||||||
|
|
||||||
|
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
/* Execute the select statement */
|
||||||
|
rc= mysql_stmt_execute(stmt);
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
/* Bind input buffers */
|
||||||
|
bzero(bind, sizeof(bind));
|
||||||
|
|
||||||
|
bind[0].buffer_type= MYSQL_TYPE_LONG;
|
||||||
|
bind[0].buffer= (char*) &res;
|
||||||
|
|
||||||
|
mysql_stmt_bind_result(stmt, bind);
|
||||||
|
|
||||||
|
rc= mysql_stmt_fetch(stmt);
|
||||||
|
assert(rc != 0 && rc != MYSQL_NO_DATA);
|
||||||
|
printf("Got error from mysql_stmt_fetch (as expected):\n%s\n",
|
||||||
|
mysql_stmt_error(stmt));
|
||||||
|
/* buggy version of libmysql hanged up here */
|
||||||
|
mysql_stmt_close(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read and parse arguments and MySQL options from my.cnf
|
Read and parse arguments and MySQL options from my.cnf
|
||||||
*/
|
*/
|
||||||
@ -10162,6 +10205,7 @@ int main(int argc, char **argv)
|
|||||||
test_ps_i18n(); /* test for i18n support in binary protocol */
|
test_ps_i18n(); /* test for i18n support in binary protocol */
|
||||||
test_bug3796(); /* test for select concat(?, <string>) */
|
test_bug3796(); /* test for select concat(?, <string>) */
|
||||||
test_bug4026(); /* test microseconds precision of time types */
|
test_bug4026(); /* test microseconds precision of time types */
|
||||||
|
test_bug4079(); /* erroneous subquery in prepared statement */
|
||||||
/*
|
/*
|
||||||
XXX: PLEASE RUN THIS PROGRAM UNDER VALGRIND AND VERIFY THAT YOUR TEST
|
XXX: PLEASE RUN THIS PROGRAM UNDER VALGRIND AND VERIFY THAT YOUR TEST
|
||||||
DOESN'T CONTAIN WARNINGS/ERRORS BEFORE YOU PUSH.
|
DOESN'T CONTAIN WARNINGS/ERRORS BEFORE YOU PUSH.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user