Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit 068f686

Browse files
fix: Fix Column Type Name for PostgreSQL ARRAY types
1 parent 14837f8 commit 068f686

3 files changed

Lines changed: 36 additions & 1 deletion

File tree

src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcWrapper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ static int extractColumnType(Type type) {
7777
}
7878

7979
static String getSpannerTypeName(Type type, Dialect dialect) {
80+
if (dialect == Dialect.POSTGRESQL && type.getCode() == Code.ARRAY) {
81+
return "_" + getSpannerTypeName(type.getArrayElementType(), dialect);
82+
}
8083
return Preconditions.checkNotNull(type).getSpannerTypeName(dialect);
8184
}
8285

src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaData.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package com.google.cloud.spanner.jdbc;
1818

19+
import com.google.cloud.spanner.Dialect;
1920
import com.google.cloud.spanner.ResultSet;
21+
import com.google.cloud.spanner.Type;
2022
import com.google.cloud.spanner.connection.ConnectionProperties;
2123
import com.google.common.base.Preconditions;
2224
import java.sql.Connection;
@@ -192,7 +194,12 @@ public int getColumnType(int column) {
192194

193195
@Override
194196
public String getColumnTypeName(int column) {
195-
return spannerResultSet.getColumnType(column - 1).getCode().name();
197+
Type columnType = spannerResultSet.getColumnType(column - 1);
198+
if (statement instanceof JdbcStatement) {
199+
Dialect dialect = ((JdbcStatement) statement).getConnection().getDialect();
200+
return getSpannerTypeName(columnType, dialect);
201+
}
202+
return columnType.getCode().name();
196203
}
197204

198205
@Override

src/test/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaDataTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.mockito.Mockito.when;
2424

2525
import com.google.cloud.ByteArray;
26+
import com.google.cloud.spanner.Dialect;
2627
import com.google.cloud.spanner.ResultSet;
2728
import com.google.cloud.spanner.ResultSets;
2829
import com.google.cloud.spanner.Struct;
@@ -540,6 +541,30 @@ public void getColumnTypeName() {
540541
}
541542
}
542543

544+
@Test
545+
public void getColumnTypeNameForPostgreSQL() throws SQLException {
546+
JdbcConnection connection = mock(JdbcConnection.class);
547+
JdbcStatement statement = mock(JdbcStatement.class);
548+
JdbcResultSet resultSet = getFooTestResultSet(statement);
549+
when(connection.getSchema()).thenReturn("");
550+
when(connection.getCatalog()).thenReturn("test-database");
551+
when(statement.getConnection()).then(new Returns(connection));
552+
when(connection.getDialect()).thenReturn(Dialect.POSTGRESQL);
553+
554+
JdbcResultSetMetaData sub = resultSet.getMetaData();
555+
556+
int index = 1;
557+
for (TestColumn col : TEST_COLUMNS) {
558+
if (col.type.getCode() == Type.Code.ARRAY
559+
&& col.type.getSpannerTypeName(Dialect.POSTGRESQL).contains("bool")) {
560+
assertEquals("_boolean", sub.getColumnTypeName(index));
561+
} else if (col.type.getCode() == Type.Code.BOOL) {
562+
assertEquals("boolean", sub.getColumnTypeName(index));
563+
}
564+
index++;
565+
}
566+
}
567+
543568
@Test
544569
public void testIsReadOnly() {
545570
for (int i = 0; i < TEST_COLUMNS.size(); i++) {

0 commit comments

Comments
 (0)