Bug #4079 error checking in prepared statements
Submitted: 9 Jun 2004 15:56 Modified: 16 Jun 2004 11:29
Reporter: Georg Richter Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server Severity:S3 (Non-critical)
Version:4.1 OS:Any (all)
Assigned to: Konstantin Osipov CPU Architecture:Any

[9 Jun 2004 15:56] Georg Richter
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);
}
[9 Jun 2004 22:37] Konstantin Osipov
bk commit - 4.1 tree (konstantin:1.1912) BUG#4079
[11 Jun 2004 11:14] Konstantin Osipov
Fixed in 4.1.3