Description:
ODBC driver hangup at reading value from TEXT field, if length greather then 4096B
Configuration:
==============
ODBC driver 5.00.12( ODBC driver 3.51.17 too)
MySQL 5.0.45
Default charset CP1250 (server, database, table)
VFP 9.0 SP 1
Result - trace.log:
===================
Full log:
http://disk.jabbim.cz/gorila@dione.zcu.cz/ODBC%203.51-5.00,%20TEXT,%20length%20more%204096...
config 2dc-180 EXIT SQLDescribeCol with return code 0 (SQL_SUCCESS)
HSTMT 020D1BB0
UWORD 1
UCHAR * 0x0012F648 [ 5] "XX001"
SWORD 255
SWORD * 0x0012F3BE (5)
SWORD * 0x01C7BFEC (-1)
SQLULEN * 0x01C7BFF4 (196605)
SWORD * 0x01C7BFF8 (0)
SWORD * 0x0012F3B6 (0)
config 2dc-180 ENTER SQLFetch
HSTMT 020D1BB0
config 2dc-180 EXIT SQLFetch with return code 0 (SQL_SUCCESS)
HSTMT 020D1BB0
config 2dc-180 ENTER SQLGetData
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60
SQLLEN 4097
SQLLEN * 0x0012F5E4
config 2dc-180 EXIT SQLGetData with return code 1 (SQL_SUCCESS_WITH_INFO)
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60 [ 4097] "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..." SQLLEN 4097
SQLLEN * 0x0012F5E4 (4097)
DIAG [01004] [MySQL][MyODBC 5.00.11] Data truncated (0)
config 2dc-180 ENTER SQLGetData
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60
SQLLEN 4097
SQLLEN * 0x0012F5E4
config 2dc-180 EXIT SQLGetData with return code 100 (SQL_NO_DATA_FOUND)
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60
SQLLEN 4097
SQLLEN * 0x0012F5E4
...
...
...
...
config 2dc-180 ENTER SQLGetData
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60
SQLLEN 4097
SQLLEN * 0x0012F5E4
config 2dc-180 EXIT SQLGetData with return code 100 (SQL_NO_DATA_FOUND)
HSTMT 020D1BB0
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x01150F60
SQLLEN 4097
SQLLEN * 0x0012F5E4
How to repeat:
script test.sql:
================
drop table XXT001I;
create table XXT001I (XX000 Integer, XX001 TEXT ) ENGINE=INNODB DEFAULT CHARSET=cp1250;
INSERT INTO XXT001I (XX000,XX001) VALUES (1,CONCAT(REPEAT('X',4096),'0'));
drop table XXT001M;
create table XXT001M (XX000 Integer, XX001 TEXT ) ENGINE=MYISAM DEFAULT CHARSET=cp1250;
INSERT INTO XXT001M (XX000,XX001) VALUES (1,CONCAT(REPEAT('X',4096),'0'));
VFP source code:
================
#define SQL_OPT_TRACE 104
#define SQL_OPT_TRACEFILE 105
#define SQL_IS_INTEGER (-6)
DECLARE integer SQLSetConnectAttr in odbc32.dll integer, integer, string @, integer
DECLARE integer SQLSetConnectAttr in odbc32.dll AS SQLSetConnectAttrI integer, integer, integer, integer
LOCAL lihdbc,liHODBC,liLen,liPom
liLen=0
lihdbc=SQLSTRINGCONNECT("uid=XXX;pwd=XXX;driver={MySQL Connector/ODBC v5};Database=anydb;SERVER=localhost;PORT=3506;OPTION=0;STMT=SET NAMES cp1250")
*lihdbc=SQLSTRINGCONNECT("uid=XXX;pwd=XXX;driver={MySQL ODBC 3.51 Driver};Database=anydb;SERVER=localhost;PORT=3506;OPTION=0;STMT=SET NAMES cp1250")
liHODBC=SQLGETPROP(lihdbc,"ODBChdbc")
lcPom="e:\mysql-bug\ODBC 3.51-5.00, TEXT, length more 4096 = hungup.log"
=SQLSetConnectAttr(liHODBC, SQL_OPT_TRACEFILE, @lcPom, LEN(lcPom))
liPom=1
=SQLSetConnectAttrI(liHODBC, SQL_OPT_TRACE, liPom, SQL_IS_INTEGER)
=SQLEXEC(lihdbc,"SELECT XX001 FROM XXT001I") && hangup
=SQLEXEC(lihdbc,"SELECT XX001 FROM XXT001M")
liPom=0
=SQLSetConnectAttrI(liHODBC, SQL_OPT_TRACE, liPom, SQL_IS_INTEGER)
?SQLDISCONNECT(lihdbc)