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

Commit c171388

Browse files
fix: Fix Column Type Name for PostgreSQL ARRAY types (#2409)
1 parent 14837f8 commit c171388

4 files changed

Lines changed: 59 additions & 1 deletion

File tree

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ static String getSpannerTypeName(Type type, Dialect dialect) {
8080
return Preconditions.checkNotNull(type).getSpannerTypeName(dialect);
8181
}
8282

83+
static String getSpannerColumnTypeName(Type type, Dialect dialect) {
84+
if (dialect == Dialect.POSTGRESQL && type.getCode() == Code.ARRAY) {
85+
return "_" + getSpannerTypeName(type.getArrayElementType(), dialect);
86+
}
87+
return getSpannerTypeName(type, dialect);
88+
}
89+
8390
/**
8491
* Extract Spanner type name from {@link java.sql.Types} code.
8592
*

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 getSpannerColumnTypeName(columnType, dialect);
201+
}
202+
return columnType.getCode().name();
196203
}
197204

198205
@Override

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

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

19+
import static com.google.cloud.spanner.jdbc.AbstractJdbcWrapper.getSpannerColumnTypeName;
1920
import static com.google.cloud.spanner.jdbc.AbstractJdbcWrapper.getSpannerTypeName;
2021
import static com.google.common.truth.Truth.assertThat;
2122
import static org.junit.Assert.assertEquals;
@@ -502,5 +503,23 @@ public void testPostgreSQLTypeNames() {
502503
getSpannerTypeName(Type.array(Type.timestamp()), Dialect.POSTGRESQL));
503504
assertEquals("jsonb[]", getSpannerTypeName(Type.array(Type.pgJsonb()), Dialect.POSTGRESQL));
504505
assertEquals("numeric[]", getSpannerTypeName(Type.array(Type.pgNumeric()), Dialect.POSTGRESQL));
506+
507+
assertEquals("_bigint", getSpannerColumnTypeName(Type.array(Type.int64()), Dialect.POSTGRESQL));
508+
assertEquals("_boolean", getSpannerColumnTypeName(Type.array(Type.bool()), Dialect.POSTGRESQL));
509+
assertEquals(
510+
"_double precision",
511+
getSpannerColumnTypeName(Type.array(Type.float64()), Dialect.POSTGRESQL));
512+
assertEquals(
513+
"_character varying",
514+
getSpannerColumnTypeName(Type.array(Type.string()), Dialect.POSTGRESQL));
515+
assertEquals("_bytea", getSpannerColumnTypeName(Type.array(Type.bytes()), Dialect.POSTGRESQL));
516+
assertEquals("_date", getSpannerColumnTypeName(Type.array(Type.date()), Dialect.POSTGRESQL));
517+
assertEquals(
518+
"_timestamp with time zone",
519+
getSpannerColumnTypeName(Type.array(Type.timestamp()), Dialect.POSTGRESQL));
520+
assertEquals(
521+
"_jsonb", getSpannerColumnTypeName(Type.array(Type.pgJsonb()), Dialect.POSTGRESQL));
522+
assertEquals(
523+
"_numeric", getSpannerColumnTypeName(Type.array(Type.pgNumeric()), Dialect.POSTGRESQL));
505524
}
506525
}

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)