Skip to content

fix(bqjdbc): resolve JDBC metadata compliance gaps for wrappers, searchability, and type mappings#13242

Open
Neenu1995 wants to merge 2 commits into
mainfrom
metadata-fix
Open

fix(bqjdbc): resolve JDBC metadata compliance gaps for wrappers, searchability, and type mappings#13242
Neenu1995 wants to merge 2 commits into
mainfrom
metadata-fix

Conversation

@Neenu1995
Copy link
Copy Markdown
Contributor

@Neenu1995 Neenu1995 commented May 20, 2026

b/514445832

Key Changes

  1. Align DatabaseMetaData Column Data Types and DB-Specific Type Names:
  • Updated DatabaseMetaData.getColumns() type resolution (via mapBigQueryTypeToJdbc) to map BigQuery types and database-specific type names compliantly (e.g., STRING, RANGE, GEOGRAPHY, JSON, INTERVAL).
  • Aligned type codes with JDBC conventions (e.g., StandardSQLTypeName.STRING maps to Types.NVARCHAR to support Unicode/UTF-8 string reporting).
  • Ensured that unknown/fallback types default to Types.NVARCHAR / STRING instead of Types.VARCHAR to keep mapping behavior consistent across the driver.
  • Documented design rationale for mapping StandardSQLTypeName.STRING to Types.NVARCHAR (UTF-8 character encoding reporting).
  1. Wrapper Pattern Implementation (JDBC 4.0 Compliance):
  • Implemented standard JDBC wrapper methods (unwrap and isWrapperFor) in BigQueryDatabaseMetaData and BigQueryResultSetMetadata.
  • Integrated proxy resolution via BigQueryJdbcContextProxy to correctly handle unwrapping in connection proxy environments.
  1. ResultSetMetaData Searchability:
  • Refactored BigQueryResultSetMetadata.isSearchable to return true for all column types. This fixes compliance issues where advanced types (GEOGRAPHY, JSON, INTERVAL, RANGE under Types.OTHER) were incorrectly reported as not searchable, even though they are fully queryable.

@Neenu1995 Neenu1995 requested review from a team as code owners May 20, 2026 18:34
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the type mapping logic in BigQueryDatabaseMetaData by introducing a static STANDARD_TYPE_INFO map and updates several BigQuery-to-JDBC type mappings, such as changing the default string representation to NVARCHAR and mapping complex types like GEOGRAPHY and JSON to Types.OTHER. Additionally, it implements the unwrap and isWrapperFor methods in BigQueryDatabaseMetaData, BigQueryResultSetMetadata, and the JDBC context proxy to support standard JDBC wrapper operations. Corresponding unit tests have been updated and expanded to verify these changes. I have no feedback to provide as there were no review comments to assess.


@Test
public void testIsSearchableForOtherTypes() throws SQLException {
FieldList schemaFields =
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: it's better to parameterize it to test 1 type at a time instead of the list

assertThat(unwrappedImpl).isNotSameInstanceAs(resultSetMetaData);
assertThat(unwrappedImpl).isInstanceOf(BigQueryResultSetMetadata.class);

try {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit:

assertThatThrownBy(() -> { 
    // code that should throw 
}).isInstanceOf(SomeException.class)
  .hasMessageContaining("error message");


// BigQuery STRING represents Unicode character strings (UTF-8).
// Standard JDBC maps UTF-8/Unicode data to Types.NVARCHAR rather than Types.VARCHAR.
private static final Map<StandardSQLTypeName, ColumnTypeInfo> STANDARD_TYPE_INFO =
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also add a test to ensure that metadata & resultsetmetadata column types match each other?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants