From 9affb4075aa2a24c764ad56ff19c695c9d89a668 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Fri, 27 Feb 2026 16:00:55 +0530 Subject: [PATCH] fix: Fix Column Type Name for PostgreSQL ARRAY types --- .../spanner/jdbc/JdbcResultSetMetaData.java | 11 +++++++- .../jdbc/JdbcResultSetMetaDataTest.java | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaData.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaData.java index f582ce45e..c549ee27d 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaData.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaData.java @@ -16,7 +16,9 @@ package com.google.cloud.spanner.jdbc; +import com.google.cloud.spanner.Dialect; import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.Type; import com.google.cloud.spanner.connection.ConnectionProperties; import com.google.common.base.Preconditions; import java.sql.Connection; @@ -192,7 +194,14 @@ public int getColumnType(int column) { @Override public String getColumnTypeName(int column) { - return spannerResultSet.getColumnType(column - 1).getCode().name(); + Type columnType = spannerResultSet.getColumnType(column - 1); + if (columnType.getCode() == Type.Code.ARRAY && statement instanceof JdbcStatement) { + Dialect dialect = ((JdbcStatement) statement).getConnection().getDialect(); + if (dialect == Dialect.POSTGRESQL) { + return "_" + columnType.getArrayElementType().getSpannerTypeName(dialect); + } + } + return columnType.getCode().name(); } @Override diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaDataTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaDataTest.java index 36996c801..3fdbf374c 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaDataTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcResultSetMetaDataTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.when; import com.google.cloud.ByteArray; +import com.google.cloud.spanner.Dialect; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.ResultSets; import com.google.cloud.spanner.Struct; @@ -540,6 +541,30 @@ public void getColumnTypeName() { } } + @Test + public void getColumnTypeNameForPostgreSQL() throws SQLException { + JdbcConnection connection = mock(JdbcConnection.class); + JdbcStatement statement = mock(JdbcStatement.class); + JdbcResultSet resultSet = getFooTestResultSet(statement); + when(connection.getSchema()).thenReturn(""); + when(connection.getCatalog()).thenReturn("test-database"); + when(statement.getConnection()).then(new Returns(connection)); + when(connection.getDialect()).thenReturn(Dialect.POSTGRESQL); + + JdbcResultSetMetaData sub = resultSet.getMetaData(); + + int index = 1; + for (TestColumn col : TEST_COLUMNS) { + if (col.type.getCode() == Type.Code.ARRAY + && col.type.getSpannerTypeName(Dialect.POSTGRESQL).contains("bool")) { + assertEquals("_boolean", sub.getColumnTypeName(index)); + } else if (col.type.getCode() != Type.Code.ARRAY) { + assertEquals(col.type.getCode().name(), sub.getColumnTypeName(index)); + } + index++; + } + } + @Test public void testIsReadOnly() { for (int i = 0; i < TEST_COLUMNS.size(); i++) {