summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storage/connect/ha_connect.cc2
-rw-r--r--storage/connect/myutil.cpp5
-rw-r--r--storage/connect/odbconn.cpp30
-rw-r--r--storage/connect/value.cpp4
4 files changed, 30 insertions, 11 deletions
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 2fcc4f3a41b..28053f91054 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -162,8 +162,8 @@ PQRYRES MyODBCCols(PGLOBAL g, char *tab, char *dsn);
#if defined(MYSQL_SUPPORT)
PQRYRES MyColumns(PGLOBAL g, char *host, char *db, char *user, char *pwd,
char *table, char *colpat, int port, bool key);
-enum enum_field_types PLGtoMYSQL(int type, bool gdf);
#endif // MYSQL_SUPPORT
+enum enum_field_types PLGtoMYSQL(int type, bool gdf);
#if defined(WIN32)
PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *classname, PWMIUT wp= NULL);
#endif // WIN32
diff --git a/storage/connect/myutil.cpp b/storage/connect/myutil.cpp
index 5d6ef75292e..6c08aacc683 100644
--- a/storage/connect/myutil.cpp
+++ b/storage/connect/myutil.cpp
@@ -48,6 +48,8 @@ int MYSQLtoPLG(char *typname)
!stricmp(typname, "time") || !stricmp(typname, "timestamp") ||
!stricmp(typname, "year"))
type = TYPE_DATE;
+ else if (!stricmp(typname, "bigint") || !stricmp(typname, "longlong"))
+ type = TYPE_BIGINT;
else
type = TYPE_ERROR;
@@ -77,6 +79,9 @@ enum enum_field_types PLGtoMYSQL(int type, bool gdf)
case TYPE_STRING:
mytype = MYSQL_TYPE_VARCHAR;
break;
+ case TYPE_BIGINT:
+ mytype = MYSQL_TYPE_LONGLONG;
+ break;
default:
mytype = MYSQL_TYPE_NULL;
} // endswitch mytype
diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp
index 8fef995473a..f39e9289d7f 100644
--- a/storage/connect/odbconn.cpp
+++ b/storage/connect/odbconn.cpp
@@ -219,8 +219,8 @@ PQRYRES ODBCColumns(PGLOBAL g, ODBConn *op, char *dsn, char *table,
/**************************************************************************/
PQRYRES MyODBCCols(PGLOBAL g, char *tab, char *dsn)
{
- int n;
- PCOLRES crp;
+ int type, len, prec;
+ PCOLRES crpt, crpl, crpp;
PQRYRES qrp;
ODBConn *ocp = new(g) ODBConn(g, NULL);
@@ -247,14 +247,28 @@ PQRYRES MyODBCCols(PGLOBAL g, char *tab, char *dsn)
/* Keep only the info used by ha_connect::pre_create. */
/************************************************************************/
qrp->Colresp = qrp->Colresp->Next->Next; // Skip Owner and Table names
- crp = qrp->Colresp->Next; // DB type
- // Types must be PLG types, not SQL types
- for (int i = 0; i < qrp->Nblin; i++)
- crp->Kdata->SetValue(TranslateSQLType(crp->Kdata->GetIntValue(i),0,n),i);
+ crpt = qrp->Colresp->Next; // SQL type
+ crpl = crpt->Next->Next; // Length
+ crpp = crpl->Next->Next; // Decimals
+
+ for (int i = 0; i < qrp->Nblin; i++) {
+ // Types must be PLG types, not SQL types
+ type = crpt->Kdata->GetIntValue(i);
+ len = crpl->Kdata->GetIntValue(i);
+ prec = crpp->Kdata->GetIntValue(i);
+ type = TranslateSQLType(type, prec, len);
+ crpt->Kdata->SetValue(type, i);
+
+ // Some data sources do not count prec in length
+ if (type == TYPE_FLOAT)
+ len += (prec + 2); // To be safe
+
+ // Could have been changed for blobs or numeric
+ crpl->Kdata->SetValue(len, i);
+ } // endfor i
- crp = crp->Next->Next->Next->Next; // Should be Radix
- crp->Next = crp->Next->Next->Next; // Should be Remark
+ crpp->Next = crpp->Next->Next->Next; // Should be Remark
qrp->Nbcol = 7; // Was 11, skipped 4
return qrp;
} // end of MyODBCCols
diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp
index 999716d6f67..5f892d9fc9b 100644
--- a/storage/connect/value.cpp
+++ b/storage/connect/value.cpp
@@ -210,7 +210,7 @@ short GetSQLType(int type)
case TYPE_SHORT: tp = SQL_SMALLINT; break;
case TYPE_INT: tp = SQL_INTEGER; break;
case TYPE_DATE: tp = SQL_TIMESTAMP; break;
- case TYPE_BIGINT:
+ case TYPE_BIGINT: tp = SQL_BIGINT; break; // (-5)
case TYPE_FLOAT: tp = SQL_DOUBLE; break;
} // endswitch type
@@ -229,7 +229,7 @@ int GetSQLCType(int type)
case TYPE_SHORT: tp = SQL_C_SHORT; break;
case TYPE_INT: tp = SQL_C_LONG; break;
case TYPE_DATE: tp = SQL_C_TIMESTAMP; break;
- case TYPE_BIGINT:
+ case TYPE_BIGINT: tp = SQL_C_SBIGINT; break;
case TYPE_FLOAT: tp = SQL_C_DOUBLE; break;
} // endswitch type