| Bug #8880 | Commands out of sync error with cursors | ||
|---|---|---|---|
| Submitted: | 2 Mar 2005 10:56 | Modified: | 12 Apr 2005 2:49 |
| Reporter: | Georg Richter | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S1 (Critical) |
| Version: | 5.0.3 | OS: | Linux (Linux) |
| Assigned to: | Konstantin Osipov | CPU Architecture: | Any |
[23 Mar 2005 15:26]
Konstantin Osipov
Subject: bk commit - 5.0 tree (konstantin:1.1829) BUG#9159 ChangeSet 1.1829 05/03/23 18:01:03 konstantin@mysql.com +5 -0 Fixes and test cases for Bug#8880 "Commands out of sync error with cursors" and Bug#9159 "Server crash during mysql_stmt_close". The patch adds support for single-row result sets in cursors.
[24 Mar 2005 14:12]
Konstantin Osipov
Pushed into 5.0 tree, which is tagged 5.0.3 (but will go to 5.0.4 most probably).
[12 Apr 2005 2:49]
Paul DuBois
Noted in 5.0.4 changelog.

Description: When opening two cursors mysql_stmt_execute reports an "Commands out of sync". See how to repeat. Note: the sample works as expected if you add more than one row in tables t1. How to repeat: #include <stdio.h> #include <stdlib.h> #include <mysql.h> MYSQL_STMT *stmt1, *stmt2; MYSQL *mysql; void die_if(int rc, int line, const char *msg) { if (rc) { printf("Error in line %d: %s\n", line, msg); exit (-1); } } MYSQL_STMT *open_cursor(char *query) { const unsigned long type = CURSOR_TYPE_READ_ONLY; MYSQL *stmt = mysql_stmt_init(mysql); die_if(mysql_stmt_prepare(stmt, query, strlen(query)), __LINE__, mysql_stmt_error(stmt)); die_if(mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *)&type), __LINE__, mysql_stmt_error(stmt)); return stmt; } int main (int argc, char **argv) { int rc; mysql = mysql_init(NULL); mysql_real_connect(mysql, "localhost", "root", "", "test", 0, NULL, 0); mysql_query(mysql, "DROP TABLE IF EXISTS t1"); mysql_query(mysql, "CREATE TABLE t1 (a int not null primary key, b int)"); mysql_query(mysql, "INSERT INTO t1 VALUES (1,1)"); /* when inserting 2 rows everything works well mysql_query(mysql, "INSERT INTO t1 VALUES (1,1),(2,2)"); */ mysql_query(mysql, "DROP TABLE IF EXISTS t2"); mysql_query(mysql, "CREATE TABLE t2 (a int not null primary key, b int)"); mysql_query(mysql, "INSERT INTO t2 VALUES (2,2)"); stmt1 = open_cursor("SELECT a FROM t1"); stmt2 = open_cursor("SELECT a FROM t2"); die_if(mysql_stmt_execute(stmt1), __LINE__, mysql_stmt_error(stmt1)); die_if(mysql_stmt_execute(stmt2), __LINE__, mysql_stmt_error(stmt2)); mysql_stmt_close(stmt1); mysql_stmt_close(stmt2); mysql_close(mysql); }