Bug #4079 error checking in prepared statements
Submitted: 9 Jun 2004 17:56 Modified: 16 Jun 2004 13:29
Reporter: Georg Richter
Status: Closed
Category:Server Severity:S3 (Non-critical)
Version:4.1 OS:Any (all)
Assigned to: Konstantin Osipov Target Version:

[9 Jun 2004 17: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);
}
[10 Jun 2004 0:37] Konstantin Osipov
bk commit - 4.1 tree (konstantin:1.1912) BUG#4079
[11 Jun 2004 13:14] Konstantin Osipov
Fixed in 4.1.3