Description:
If a subquery returns more than one row in a PS, mysql_stmt_execute doesn't report an error. Instead mysql_stmt_fetch fails and you can't send any command.
How to repeat:
#include <mysql.h>
#include <stdlib.h>
int main()
{
MYSQL *mysql;
MYSQL_STMT *stmt;
char query[1000];
MYSQL_BIND bind[1];
long lval;
mysql = mysql_init(NULL);
mysql_real_connect(mysql, "localhost" , "root", "", "test", 0, NULL, CLIENT_FOUND_ROWS);
mysql_autocommit(mysql, 0);
mysql_query(mysql, "DROP TABLE IF EXISTS t1");
mysql_query(mysql, "CREATE TABLE t1 (a int) TYPE=InnoDB");
mysql_query(mysql, "INSERT INTO t1 VALUES (1),(2)");
stmt = mysql_stmt_init(mysql);
strcpy(query, "SELECT 1 < (SELECT a FROM t1)");
if (mysql_stmt_prepare(stmt, query, strlen(query))) {
printf("error (prepare) %s\n", mysql_stmt_error(stmt));
exit;
}
if (mysql_stmt_execute(stmt)) {
printf("error (execute): %s\n", mysql_stmt_error(stmt));
exit;
}
bind[0].buffer_type = MYSQL_TYPE_LONG;
bind[0].buffer = (char *)lval;
if (mysql_stmt_bind_result(stmt, bind)) {
printf("error (bind_result): %s\n", mysql_stmt_error(stmt));
exit;
}
if (mysql_stmt_fetch(stmt)) {
printf("fetch error: %s\n", mysql_stmt_error(stmt));
if (mysql_rollback(mysql)) {
printf("Argggghhh! Error!!! Can't rollback -> %s\n", mysql_error(mysql));
}
exit;
}
mysql_stmt_close(stmt);
mysql_close(mysql);
}