Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
3.0.8
-
None
-
Windows 10, Microsoft Visual FoxPro 9, MariaDB ODBC 3.0 Driver 32-Bit
Description
Brief description
When I try to fetch records from tables that contain mediumint columns, I get empty values. The problem doesn’t occur when I use the odbc driver 5.3 from oracle/mysql.
Long description
I am using Microsoft Visual FoxPro 9.0 to access the data. It is a quite old development environment from Microsoft. I was not able to trigger this bug in other ways than using Microsoft Visual FoxPro. However, I figured some things out:
When I apply the following patch to the odbc driver, everything works fine:
diff --git a/ma_helper.c b/ma_helper.c
|
index a1ca7a580a9e9f64b9cda149367644f56d022409..259a6ea25d80c9cefd94717a30a2c961d4846792 100644
|
--- a/ma_helper.c
|
+++ b/ma_helper.c
|
@@ -544,7 +544,6 @@ size_t MADB_GetOctetLength(MYSQL_FIELD *Field, unsigned short MaxCharLen) |
case MYSQL_TYPE_SHORT: |
return 2; |
case MYSQL_TYPE_INT24: |
- return 3; |
case MYSQL_TYPE_LONG: |
return 4; |
case MYSQL_TYPE_LONGLONG: |
But I am not sure whether this is the right solution because in the module ma_statement.c I found another snipped of code that could be related to this issue:
/* We do this for catalog functions and MS Access in first turn. The thing is that for some columns in catalog functions result,
|
we fix column type manually, since we can't make field of desired type in the query to I_S. Mostly that is for SQLSMALLINT
|
fields, and we can cast only to int, not to short. MSAccess in its turn like to to get length for fixed length types, and
|
throws error if the length is not what it expected (ODBC-131)
|
Probably it makes sense to do this only for SQL_C_DEFAULT type, which MS Access uses. But atm it looks like this should
|
not hurt if done for other types, too */{color} |
if (*StrLen_or_IndPtr == 0 || (Bind.length_value > (unsigned long)IrdRec->OctetLength && *StrLen_or_IndPtr > IrdRec->OctetLength)) |
{
|
*StrLen_or_IndPtr= IrdRec->OctetLength;
|
}
|
The comment says at some point: „Probably it makes sense to do this only for SQL_C_DEFAULT type, which MS Access uses. But atm it looks like this should not hurt if done for other types, too“.
If I remove this line of code, everything works fine too:
*StrLen_or_IndPtr= IrdRec->OctetLength;
Maybe FoxPro doesn’t like this behavior and it should actually be done only for SQL_C_DEFAULT type.