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);
}
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); }