ResultSet.getBytes() fails for BIT VARYING columns
HSQLDB reports the following metadata for a column defined as:
BIT_VARYING_COL BIT VARYING(16)
ResultSetMetaData reports:
COLUMN_NAME = BIT_VARYING_COL
COLUMN_TYPE_NAME = BIT VARYING
COLUMN_TYPE = -7 (java.sql.Types.BIT)
COLUMN_CLASS_NAME = [B (byte[])
However, calling:
resultSet.getBytes(columnIndex);
fails with:
org.hsqldb.HsqlException: incompatible data type in conversion:
from SQL type BIT VARYING to [B,
value: instance of org.hsqldb.types.BinaryData
The failure is particularly unexpected because:
ResultSetMetaData.getColumnClassName(columnIndex)
reports:
[B
indicating byte[] as the Java representation.
There may also be a separate metadata issue. BIT VARYING(n) and BIT(n) columns are reported as java.sql.Types.BIT (-7). It may be more appropriate to expose a binary/variable-binary JDBC type (java.sql.Type.BINARY = -2 and java.sql.Type.VARBINARY = -3), although the primary issue is that getBytes() fails despite the reported Java class being byte[].
Reproduction:
CREATE TABLE t (
bit_varying_col BIT VARYING(16)
);
INSERT INTO t VALUES (B'11001100');
Then:
ResultSet rs = statement.executeQuery(
"SELECT bit_varying_col FROM t"
);
ResultSetMetaData md = rs.getMetaData();
System.out.println(md.getColumnName(1));
System.out.println(md.getColumnTypeName(1));
System.out.println(md.getColumnType(1));
System.out.println(md.getColumnClassName(1));
rs.next();
byte[] value = rs.getBytes(1);
Observed:
BIT_VARYING_COL
BIT VARYING
-7
[B
followed by:
org.hsqldb.HsqlException:
incompatible data type in conversion:
from SQL type BIT VARYING to [B,
value: instance of org.hsqldb.types.BinaryData
HSQLDB version: 2.7.4
Java version: JDK 17
Thanks for reporting. Fixed and committed for the next release.