Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,18 @@ public int isNullable(int column) throws SQLException {

@Override
public boolean isSigned(int column) throws SQLException {
String typeName = getColumnTypeName(column);
return "NUMERIC".equals(typeName) || "INTEGER".equals(typeName) || "REAL".equals(typeName);
if (declType(column) != null) {
return switch (getColumnTypeName(column)) {
case "NUMERIC", "INTEGER", "REAL" -> true;
default -> false;
};
}
// An expression column has no declared type, so signedness follows the
// storage class of the current value, as xerial does.
return switch (storageType(runtimeValue(column))) {
case INTEGER, FLOAT, NULL -> true;
case TEXT, BLOB -> false;
};
}

@Override
Expand Down Expand Up @@ -286,13 +296,7 @@ public String getColumnTypeName(int column) throws SQLException {
matcher.find();
return matcher.group(1).toUpperCase(Locale.ENGLISH);
}
return switch (sampleType(column)) {
case INTEGER -> "INTEGER";
case FLOAT -> "FLOAT";
case BLOB -> "BLOB";
case TEXT -> "TEXT";
default -> "NUMERIC";
};
return "NUMERIC";
}

@Override
Expand Down Expand Up @@ -374,10 +378,6 @@ private Value sampleValue(int column) {
return null;
}

private SampleType sampleType(int column) {
return storageType(sampleValue(column));
}

private static SampleType storageType(Value value) {
if (value instanceof Value.Integer) {
return SampleType.INTEGER;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ void matchesCastOnlyInLowerCase() throws SQLException {
"SELECT CAST(1 AS BOOLEAN), cast(1 as BOOLEAN)",
null);

assertThat(metadata.getColumnTypeName(1)).as("uppercase CAST").isEqualTo("INTEGER");
assertThat(metadata.getColumnTypeName(1)).as("uppercase CAST").isEqualTo("NUMERIC");
assertThat(metadata.getColumnType(1)).as("uppercase CAST").isEqualTo(Types.INTEGER);
assertThat(metadata.isSigned(1)).as("uppercase CAST").isTrue();

Expand Down Expand Up @@ -378,6 +378,55 @@ void reportsCurrentRowClassNameForMixedTypeColumn() throws SQLException {
.isEqualTo(Object.class.getName());
}

@Test
void reportsUnknownTypeNameForExpressionColumnAtEveryCursorPosition() throws SQLException {
StmtResult result = new StmtResult(
List.of(new Col("x", null)), List.of(new Row(List.of(Value.of(1L)))), 0, null);
LibsqlResultSet resultSet = new LibsqlResultSet(null, result);
ResultSetMetaData metadata = resultSet.getMetaData();

assertThat(metadata.getColumnTypeName(1))
.as("before the first row")
.isEqualTo("NUMERIC");

assertThat(resultSet.next()).isTrue();
assertThat(metadata.getColumnTypeName(1)).as("on a row").isEqualTo("NUMERIC");

assertThat(resultSet.next()).isFalse();
assertThat(metadata.getColumnTypeName(1))
.as("after the last row")
.isEqualTo("NUMERIC");
}

@Test
void reportsUnknownTypeNameForMixedTypeColumn() throws SQLException {
StmtResult result = new StmtResult(
List.of(new Col("x", null)),
List.of(new Row(List.of(Value.of(1L))), new Row(List.of(Value.of("a")))),
0,
null);
LibsqlResultSet resultSet = new LibsqlResultSet(null, result);
ResultSetMetaData metadata = resultSet.getMetaData();

assertThat(resultSet.next()).isTrue();
assertThat(metadata.getColumnTypeName(1))
.as("on the integer row")
.isEqualTo("NUMERIC");
assertThat(metadata.isSigned(1)).as("on the integer row").isTrue();

assertThat(resultSet.next()).isTrue();
assertThat(metadata.getColumnTypeName(1))
.as("on the text row")
.isEqualTo("NUMERIC");
assertThat(metadata.isSigned(1)).as("on the text row").isFalse();

assertThat(resultSet.next()).isFalse();
assertThat(metadata.getColumnTypeName(1))
.as("after the last row")
.isEqualTo("NUMERIC");
assertThat(metadata.isSigned(1)).as("after the last row").isTrue();
}

@Test
void reportsClassNameForCurrentRowOutsideIntRange() throws SQLException {
StmtResult result = new StmtResult(
Expand Down
Loading