Skip to content

Commit

Permalink
Fix for ODBC-111. SQLGetTypeInfo for VARCHAR returns a maximum size o…
Browse files Browse the repository at this point in the history
…f 32765 regardless of charset encoding
  • Loading branch information
alexpotapchenko committed Mar 10, 2011
1 parent 57174a7 commit 2ab9fa6
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 14 deletions.
20 changes: 19 additions & 1 deletion IscDbc/IscDatabaseMetaData.cpp
Expand Up @@ -1126,9 +1126,27 @@ ResultSet* IscDatabaseMetaData::getCrossReference(
}

ResultSet* IscDatabaseMetaData::getTypeInfo(int dataType)
{
IscMetaDataResultSet resultSet(this);
int bytesPerCharacter = 1;

try
{
char sql[2048] = "select charset.rdb$bytes_per_character from rdb$database db \n"
"join RDB$CHARACTER_SETS charset on charset.RDB$CHARACTER_SET_NAME = db.rdb$character_set_name";
resultSet.prepareStatement(sql);

if ( resultSet.getCountRowsStaticCursor() )
{
bytesPerCharacter = resultSet.sqlda->getShort(1);
}
return new TypesResultSet( dataType, connection->getUseAppOdbcVersion(), bytesPerCharacter );
}
catch (...)
{
return new TypesResultSet( dataType, connection->getUseAppOdbcVersion() );
throw;
}
}

StatementMetaData* IscDatabaseMetaData::getMetaDataTypeInfo(ResultSet* setTypeInfo)
{
Expand Down
6 changes: 3 additions & 3 deletions IscDbc/IscDbc.h
Expand Up @@ -126,11 +126,11 @@ typedef unsigned __int64 UQUAD;

#define MAX_ARRAY_LENGTH 100000000
#define MAX_BLOB_LENGTH 2147483647
#define MAX_WLONGVARCHAR_LENGTH 1073741823
#define MAX_WLONGVARCHAR_LENGTH 715827882
#define MAX_CHAR_LENGTH 32767
#define MAX_VARCHAR_LENGTH 32765
#define MAX_WCHAR_LENGTH 16383
#define MAX_WVARCHAR_LENGTH 16381
#define MAX_WCHAR_LENGTH 10922
#define MAX_WVARCHAR_LENGTH 10921
#define MAX_NUMERIC_SHORT_LENGTH 4
#define MAX_NUMERIC_LONG_LENGTH 9
#define MAX_NUMERIC_DOUBLE_LENGTH 15
Expand Down
22 changes: 13 additions & 9 deletions IscDbc/TypesResultSet.cpp
Expand Up @@ -108,13 +108,15 @@ struct Types {

static Types types [] =
{
BLOB ("BLOB", JDBC_LONGVARBINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
BLOB ("BLOB SUB_TYPE 0", JDBC_VARBINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
BLOB ("BLOB SUB_TYPE BLR", JDBC_BINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
ALPHA ("CHAR", JDBC_CHAR, MAX_CHAR_LENGTH),
ALPHA ("VARCHAR", JDBC_VARCHAR, MAX_VARCHAR_LENGTH),
BLOB ("BLOB SUB_TYPE TEXT", JDBC_LONGVARCHAR, MAX_BLOB_LENGTH, "'","'",CASE_SENSITIVE),
BLOB ("BLOB SUB_TYPE TEXT", JDBC_WLONGVARCHAR, MAX_WLONGVARCHAR_LENGTH, "'","'",CASE_SENSITIVE),
ALPHA ("CHAR", JDBC_CHAR,MAX_CHAR_LENGTH),
ALPHA ("CHAR(x) CHARACTER SET UNICODE_FSS", JDBC_WCHAR,MAX_WCHAR_LENGTH),
ALPHA ("CHAR(x) CHARACTER SET UNICODE_FSS", JDBC_WCHAR, MAX_WCHAR_LENGTH),
ALPHA ("VARCHAR(x) CHARACTER SET UNICODE_FSS", JDBC_WVARCHAR, MAX_WVARCHAR_LENGTH),
BLOB ("BLOB SUB_TYPE TEXT CHARACTER SET UNICODE_FSS", JDBC_WLONGVARCHAR, MAX_WLONGVARCHAR_LENGTH, "'","'",CASE_SENSITIVE),
BLOB ("BLOB SUB_TYPE 0", JDBC_LONGVARBINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
BLOB ("BLOB SUB_TYPE 0", JDBC_VARBINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
BLOB ("BLOB SUB_TYPE 0", JDBC_BINARY, MAX_BLOB_LENGTH, "","",CASE_INSENSITIVE),
NUMERIC ("NUMERIC", JDBC_NUMERIC, MAX_NUMERIC_LENGTH, "precision,scale", 0, MAX_NUMERIC_LENGTH, 10),
NUMERIC ("DECIMAL", JDBC_DECIMAL, MAX_DECIMAL_LENGTH, "precision,scale", 0, MAX_DECIMAL_LENGTH, 10),
NUMERIC ("INTEGER", JDBC_INTEGER, MAX_INT_LENGTH, "", 0, 0, 10),
Expand All @@ -124,8 +126,6 @@ static Types types [] =
NUMERIC ("FLOAT", JDBC_REAL, MAX_FLOAT_DIGIT_LENGTH, "", UNSCALED, UNSCALED, 2),
NUMERIC ("DOUBLE PRECISION", JDBC_DOUBLE, MAX_DOUBLE_DIGIT_LENGTH, "", UNSCALED, UNSCALED, 2),
NUMERIC ("BIGINT", JDBC_BIGINT, MAX_QUAD_LENGTH,"", 0, MAX_QUAD_LENGTH, 10),
ALPHA ("VARCHAR", JDBC_VARCHAR,MAX_VARCHAR_LENGTH),
ALPHA ("VARCHAR(x) CHARACTER SET UNICODE_FSS", JDBC_WVARCHAR,MAX_WVARCHAR_LENGTH),
DATE("DATE",JDBC_DATE,MAX_DATE_LENGTH,"{d'","'}",1),
DATETIME("TIME",JDBC_TIME,MAX_TIME_LENGTH,"{t'","'}",2),
DATETIME("TIMESTAMP",JDBC_TIMESTAMP,MAX_TIMESTAMP_LENGTH,"{ts'","'}",3)
Expand All @@ -135,7 +135,7 @@ static Types types [] =
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

TypesResultSet::TypesResultSet(int dataType, int appOdbcVersion) : IscResultSet (NULL)
TypesResultSet::TypesResultSet(int dataType, int appOdbcVersion, int bytesPerCharacter) : IscResultSet (NULL)
{
dataTypes = dataType;

Expand Down Expand Up @@ -184,6 +184,10 @@ TypesResultSet::TypesResultSet(int dataType, int appOdbcVersion) : IscResultSet
types[--endRow].typeType = JDBC_SQL_DATE;
}

types[0].typePrecision /= bytesPerCharacter;
types[1].typePrecision /= bytesPerCharacter;
types[2].typePrecision /= bytesPerCharacter;

recordNumber = 0;
numberColumns = 19;
values.alloc (numberColumns);
Expand Down
2 changes: 1 addition & 1 deletion IscDbc/TypesResultSet.h
Expand Up @@ -37,7 +37,7 @@ class TypesResultSet : public IscResultSet
virtual int objectVersion(){ return STATEMENTMETADATA_VERSION; }

public:
TypesResultSet( int dataType, int appOdbcVersion );
TypesResultSet( int dataType, int appOdbcVersion, int bytesPerCharacter );
~TypesResultSet();

virtual bool nextFetch();
Expand Down

0 comments on commit 2ab9fa6

Please sign in to comment.