Обсуждение: Report BUG: The column size for BIT VARYING(5) type is incorrect
l ODBC driver version
12.02.00.00
l PostgreSQL database version
PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
l Error message ( Log)
Successfully connected to DSN 'sbosmk'.
SQLExecDirect:
In: Statementhandle = 0x000000000060BD20, StatementText = "create table j_varbit2 (vbt1 bit varying (5))", Statementlength = 45
Return: SQL_SUCCESS=0
SQLPrepare:
In: StatementHandle = 0x000000000060BD20, StatementText = "select vbt1 from j_varbit2", TextLength = 26
Return: SQL_SUCCESS=0
SQLDescribeCol:
In:StatementHandle = 0x000000000060BD20, ColumnNumber = 1, ColumnName = 0x00000000001640D0, BufferLength = 600, NameLengthPtr = 0x0000000000104AA0, DataTypePtr = 0x000000000010DD30, ColumnSizePtr = 0x000000000010DD60, DecimalDigits = 0x000000000010DD90, NullablePtr = 0x000000000010DDC0
Return: SQL_SUCCESS=0
Out:*ColumnName = "vbt1", *NameLengthPtr = 4, *DataTypePtr = SQL_WVARCHAR=-9, *ColumnSizePtr = 1, *DecimalDigits = 0, *NullablePtr = SQL_NULLABLE=1
TST1011: Buffer ColumnName is not properly NULL terminated.
Note: Why is the *ColumnSizePtr = 1 instead of *ColumnSizePtr = 5 since the column is created with bit varying (5) in the test case?
Вложения
James (Ke) Wang wrote: > create table j_varbit2 (vbt1 bit varying (5)) > > *ColumnName = "vbt1", *NameLengthPtr = 4, *DataTypePtr = SQL_WVARCHAR=-9, *ColumnSizePtr = 1, *DecimalDigits = 0, *NullablePtr= SQL_NULLABLE=1 > > Why is the *ColumnSizePtr = 1 instead of *ColumnSizePtr = 5 since the column is created with bit varying (5) in the testcase? The ODBC specification does not define the data type BIT VARYING, so the ODBC driver tries to represent it as a blob or text. And five bits fit into one byte. Regards, Clemens
> > Why is the *ColumnSizePtr = 1 instead of *ColumnSizePtr = 5 since
> the column is created with bit varying (5) in the test case?
>
> The ODBC specification does not define the data type BIT VARYING, so the
> ODBC driver tries to represent it as a blob or text.
>
> And five bits fit into one byte.
I'm not sure this is the correct interpretation. According to PostgreSQL, bit varying(n) is a bit "string" (https://www.postgresql.org/docs/12/datatype-bit.html). The ODBC spec says that the column size for all string types is defined as the "... maximum column size in characters of the column or parameter" (https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/column-size). Also, according to the bug report, SQLDescribeCol answered that the data type in this case was returned as SQL_WVARRCHAR.
I don't use this type myself but based on the documentation and the (fact?) SQLDescribeCol answers the type as SQL_WVARCHAR, it does make sense to me for the column size to match the number of characters needed to represent the bits.
Jon