Bug #11497 mysql_stmt_attr_set CURSOR_TYPE_READ_ONLY incorrect query result multi execute
Submitted: 22 Jun 2005 11:00 Modified: 2 Jul 2005 8:40
Reporter: Berto van de Kraats Email Updates:
Status: Can't repeat Impact on me:
None 
Category:MySQL Server Severity:S2 (Serious)
Version:5.0.8-beta-nightly-20050613-debug OS:Linux (Linux)
Assigned to: Konstantin Osipov CPU Architecture:Any

[22 Jun 2005 11:00] Berto van de Kraats
Description:
If cursors are enabled, a re-execute of a query gives an incorrect result.

How to repeat:
Compile and run the attached program (which is an automatically generated trace
of our mysql database driver). The problem reproduces if the program silently
runs and has exit status 0.
The trace contains a call to mysql_stmt_fetch that returns incorrect data (search for pattern "ERROR:" in attached program).
[22 Jun 2005 11:03] Berto van de Kraats
Cpp trace of problem

Attachment: bug11497.cpp (text/plain), 24.84 KiB.

[25 Jun 2005 18:52] Jorge del Conde
Thanks for your bug report.

I was able to reproduce this bug using 5.0.9 from bk.

Your test-case worked/compiled perfectly.
[2 Jul 2005 8:40] Konstantin Osipov
kostja@dragonfly:~> g++ -I /home/kostja/work/mysql-5.0-root/include -L/home/kostja/work/mysql-5.0-root/libmysql/.libs -lmysqlclient -lz -lnsl -lcrypto bug11497.cpp -lstdc++
kostja@dragonfly:~> ./a.out 
kostja@dragonfly:~> ./a.out
kostja@dragonfly:~> ./a.out             
kostja@dragonfly:~> diff -u  bug11497.cpp.vanilla bug11497.cpp
--- bug11497.cpp.vanilla        2005-07-02 12:37:51.794815736 +0400
+++ bug11497.cpp        2005-07-02 12:36:52.682802128 +0400
@@ -97,14 +97,15 @@
        MYSQL *sess_1;
        sess_1 = mysql_init( NULL ); assert(sess_1);
        // actuals: HOST_NAME="nlbaldev1", _NAME="bsp", _PWD="bsp", DB_NAME="baan"
-       mysql_real_connect(sess_1, HOST_NAME, USER_NAME, USER_PWD, DB_NAME, 0, NULL, 0);
+       mysql_real_connect(sess_1, 0, "kostja", 0, "test", 0,
+                           "/opt/local/var/mysql/mysql.sock", 0);
        mysql_autocommit(sess_1, 0);
        mysql_query(sess_1, "SET SESSION sql_mode=ERROR_FOR_DIVISION_BY_ZERO");
        mysql_query(sess_1, "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED");
        MYSQL_STMT *stmt_1;
        stmt_1 = mysql_stmt_init(sess_1);
        mysql_ret = mysql_stmt_attr_set(stmt_1,STMT_ATTR_CURSOR_TYPE,(const void *) &select_cursor); assert(mysql_ret==0);
-       stmt_text = "SELECT a0.t_edlevel FROM baan.tdbtst120000 a0  WHERE (a0.t_edlevel > ?) ORDER BY 1";
+       stmt_text = "SELECT a0.t_edlevel FROM tdbtst120000 a0  WHERE (a0.t_edlevel > ?) ORDER BY 1";
        mysql_ret = mysql_stmt_prepare(stmt_1,stmt_text,strlen(stmt_text)); assert(mysql_ret==0);
        count = mysql_stmt_param_count(stmt_1); assert( count==1 );
        MYSQL_BIND *param_1 = (MYSQL_BIND *)calloc(1, sizeof(MYSQL_BIND));
@@ -143,7 +144,7 @@
        mysql_ret = mysql_stmt_fetch(stmt_1); assert(mysql_ret==0);
        count = mysql_warning_count(sess_1); assert(count==0);
 // ERROR: would expect 14, as was returned by the previous exec/fetch
-       ASSERT_EQ(data_2,16);
+       ASSERT_EQ(data_2,14);
        mysql_ret = mysql_stmt_free_result(stmt_1); assert(mysql_ret==0);
        mysql_ret = mysql_stmt_reset(stmt_1); assert(mysql_ret==0);
        mysql_ret = mysql_stmt_close(stmt_1); assert(mysql_ret==0);
@@ -221,7 +222,7 @@
        fprintf(fp,"%s\n","/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;");
        fprintf(fp,"%s\n","");
        fclose(fp);
-       const char *cmd = "mysql --user="OWNER_NAME" --password="OWNER_PWD" --host="HOST_NAME" "DB_NAME" < /tmp/baan_table_dump";
+       const char *cmd = "mysql test < /tmp/baan_table_dump";
        int ret = system(cmd);
        if ( ret != 0 ) fprintf(stderr,"Command \"mysql --user="OWNER_NAME" --password="OWNER_PWD" --host="HOST_NAME" "DB_NAME" < /tmp/baan_table_dump\" failed\n",cmd);
 }