Bug #34592 | Don't Cache Result does not work with forward cursors and Modify/AddNew | ||
---|---|---|---|
Submitted: | 15 Feb 2008 12:13 | Modified: | 10 Oct 2008 1:24 |
Reporter: | Bogdan Pytlik | Email Updates: | |
Status: | Won't fix | Impact on me: | |
Category: | Connector / ODBC | Severity: | S1 (Critical) |
Version: | 3.51.23,5.1 | OS: | Windows (w2k-SP4) |
Assigned to: | Jess Balint | CPU Architecture: | Any |
Tags: | odbc_postga51 |
[15 Feb 2008 12:13]
Bogdan Pytlik
[15 Feb 2008 12:14]
Bogdan Pytlik
sources to reproduce
Attachment: pr3.zip (application/x-zip-compressed, text), 3.59 KiB.
[18 Feb 2008 17:53]
Tonci Grgin
Hi Bogdan and thanks for your very interesting report. This has our full attention now.
[18 Feb 2008 18:51]
Tonci Grgin
Verified as described by Bogdan with test case attached.
[18 Feb 2008 18:53]
Tonci Grgin
DM traces
Attachment: both_case_traces.zip (application/x-zip-compressed, text), 3.43 KiB.
[4 Sep 2008 9:08]
Tonci Grgin
Bogdan, according to my research, this should be fixed in http://downloads.mysql.com/snapshots/mysql-connector-odbc-5.1/mysql-connector-odbc-noinsta.... Can you please test it and inform me of results?
[16 Sep 2008 14:50]
Bogdan Pytlik
I gave it a quick test with myodbc5.dll but it does NOT work I see same problems described in initial report myodbc5.dll file version 5.1.6.0 from Windows Explorer Properties md5sum sum 41f9e564703558f2cc55c270ea9b8267 *C:\\WINNT\\system32\\myodbc5.dll Bogdan
[29 Sep 2008 14:30]
Tonci Grgin
Bogdan, rechecking.
[9 Oct 2008 8:36]
Bogdan Degtyariov
The error occurs because "Dont cache result" option forces MyODBC driver to use mysql_use_result() function instead of mysql_store_result(). If not all rows are read from the current resultset the stmt->dbc->mysql.status == MYSQL_STATUS_USE_RESULT and MySQL server cannot continue with the next query unless all rows are read or the result set is closed using mysql_free_result(). The command out of sync error is returned, otherwise all unfetched rows will appear in the result set for the next query. Fix for this problems follows soon.
[9 Oct 2008 8:56]
Bogdan Degtyariov
=== modified file 'driver/cursor.c' --- driver/cursor.c 2008-08-22 22:12:25 +0000 +++ driver/cursor.c 2008-10-09 09:52:32 +0000 @@ -454,6 +454,11 @@ MYLOG_QUERY(stmt, query); pthread_mutex_lock(&dbc->lock); + /* Fetch all rows if used mysql_use_result */ + if(stmt->dbc->mysql.status == MYSQL_STATUS_USE_RESULT) + { + while(mysql_fetch_row(stmt->result)); + } if ( check_if_server_is_alive(dbc) || mysql_real_query(&dbc->mysql, query, len) ) {
[10 Oct 2008 1:24]
Jess Balint
This is not a viable fix as the cursor will be lost. Due to limitations in the MySQL server and network protocol (as explained by Bogdan D.), this will not be fixed.