From 9dfc28290bdf0c0f143f318658d406dafe82fc8f Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 10:10:56 -0400 Subject: [PATCH 1/9] feat(bigquery-jdbc): infer undeclared fields in PreparedStatement --- .../bigquery/jdbc/BigQueryConnection.java | 2 +- .../jdbc/BigQueryParameterHandler.java | 64 +++++++++++-------- .../jdbc/BigQueryPreparedStatement.java | 30 +++++++++ .../bigquery/jdbc/BigQueryStatement.java | 13 ++++ .../jdbc/BigQueryParameterHandlerTest.java | 1 + .../BigQueryPreparedStatementSettersTest.java | 19 ++++++ .../bigquery/jdbc/it/ITBigQueryJDBCTest.java | 55 ++++++++++++++++ 7 files changed, 158 insertions(+), 26 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 3d2ae4e9e02e..256fe906ae4c 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -876,7 +876,7 @@ public Properties getClientInfo() { @Override public void setClientInfo(Properties properties) { - this.clientInfo.clear(); + this.clientInfo.git (); if (properties != null) { this.clientInfo.putAll(properties); } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java index e40e3fcf28ef..28111e979759 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java @@ -24,6 +24,7 @@ import java.math.BigInteger; import java.sql.SQLException; import java.util.ArrayList; +import java.util.BitSet; class BigQueryParameterHandler { private final BigQueryJdbcCustomLogger LOG = new BigQueryJdbcCustomLogger(this.toString()); @@ -48,6 +49,7 @@ enum BigQueryStatementParameterType { }; private int parametersArraySize; + private final BitSet userSetParameters = new BitSet(); ArrayList parametersList = new ArrayList<>(parametersArraySize); private long highestIndex = 0; @@ -55,9 +57,12 @@ enum BigQueryStatementParameterType { QueryJobConfiguration.Builder configureParameters( QueryJobConfiguration.Builder jobConfigurationBuilder) throws SQLException { LOG.finest("++enter++"); - try { for (int i = 1; i <= this.parametersArraySize; i++) { + if (!this.userSetParameters.get(i)) { + throw new BigQueryJdbcException("One or more parameters missing in Prepared statement."); + } + Object parameterValue = getParameter(i); StandardSQLTypeName sqlType = getSqlType(i); parameterValue = formatValueForQueryParameter(parameterValue, sqlType); @@ -67,12 +72,6 @@ QueryJobConfiguration.Builder configureParameters( jobConfigurationBuilder.addPositionalParameter( QueryParameterValue.of(parameterValue, sqlType)); } - } catch (NullPointerException e) { - LOG.severe("Null parameter mapping encountered.", e); - if (e.getMessage().contains("Null type")) { - throw new BigQueryJdbcException("One or more parameters missing in Prepared statement.", e); - } - } return jobConfigurationBuilder; } @@ -108,13 +107,11 @@ static Object formatValueForQueryParameter(Object parameterValue, StandardSQLTyp return parameterValue; } - void setParameter(int parameterIndex, Object value, Class type) - throws BigQueryJdbcSqlFeatureNotSupportedException { - LOG.finest("++enter++"); - LOG.finest("setParameter called by : %s", type.getName()); - checkValidIndex(parameterIndex); - + private BigQueryJdbcParameter getOrCreateParameter(int parameterIndex){ int arrayIndex = parameterIndex - 1; + while (parametersList.size() < parameterIndex) { + parametersList.add(null); + } if (parameterIndex >= this.highestIndex || this.parametersList.get(arrayIndex) == null) { parametersList.ensureCapacity(parameterIndex); while (parametersList.size() < parameterIndex) { @@ -123,8 +120,15 @@ void setParameter(int parameterIndex, Object value, Class type) parametersList.set(arrayIndex, new BigQueryJdbcParameter()); } this.highestIndex = Math.max(parameterIndex, highestIndex); - BigQueryJdbcParameter parameter = parametersList.get(arrayIndex); + return parametersList.get(arrayIndex); + } + + void setParameter(int parameterIndex, Object value, Class type){ + LOG.finest("++enter++"); + LOG.finest("setParameter called by : %s", type.getName()); + checkValidIndex(parameterIndex); + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); parameter.setIndex(parameterIndex); parameter.setValue(value); parameter.setType(type); @@ -133,9 +137,22 @@ void setParameter(int parameterIndex, Object value, Class type) parameter.setParamType(BigQueryStatementParameterType.UNSPECIFIED); parameter.setScale(-1); + this.userSetParameters.set(parameterIndex); + LOG.finest("Parameter set { %s }", parameter.toString()); } + void setInferredParameterType(int parameterIndex, StandardSQLTypeName sqlTypeName) + throws SQLException{ + checkValidIndex(parameterIndex); + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); + + Class javaType = BigQueryTypeRegistry.toJavaClass(sqlTypeName); + parameter.setIndex(parameterIndex); + parameter.setType(javaType); + parameter.setSqlType(sqlTypeName); + } + private void checkValidIndex(int parameterIndex) { if (parameterIndex > this.parametersArraySize) { IndexOutOfBoundsException ex = @@ -174,7 +191,12 @@ StandardSQLTypeName getSqlType(int index) { void clearParameters() { LOG.finest("++enter++"); - parametersList.clear(); + this.userSetParameters.clear(); + for (BigQueryJdbcParameter param : this.parametersList) { + if (param != null) { + param.setValue(null); + } + } highestIndex = 0; } @@ -229,16 +251,8 @@ void setParameter( LOG.finest("++enter++"); LOG.finest("setParameter called by : %s", type.getName()); checkValidIndex(parameterIndex); - int arrayIndex = parameterIndex - 1; - if (parameterIndex >= this.highestIndex || this.parametersList.get(arrayIndex) == null) { - parametersList.ensureCapacity(parameterIndex); - while (parametersList.size() < parameterIndex) { - parametersList.add(null); - } - parametersList.set(arrayIndex, new BigQueryJdbcParameter()); - } - this.highestIndex = Math.max(parameterIndex, highestIndex); - BigQueryJdbcParameter parameter = parametersList.get(arrayIndex); + + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); parameter.setIndex(parameterIndex); parameter.setValue(value); diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java index 014717fd0646..9099d0cd551e 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java @@ -17,6 +17,7 @@ package com.google.cloud.bigquery.jdbc; import com.google.api.gax.retrying.RetrySettings; +import com.google.api.services.bigquery.model.QueryParameter; import com.google.cloud.bigquery.FieldList; import com.google.cloud.bigquery.JobStatistics.QueryStatistics; import com.google.cloud.bigquery.JobStatistics.QueryStatistics.StatementType; @@ -85,6 +86,35 @@ class BigQueryPreparedStatement extends BigQueryStatement implements PreparedSta super(connection); setCurrentQuery(query); this.parameterHandler = new BigQueryParameterHandler(this.parameterCount); + if(this.parameterCount > 0){ + populateInferredParameterTypes(); + } + } + + private void populateInferredParameterTypes(){ + if(this.currentQuery == null){ + return; + } + + try{ + List undeclaredQueryParameters = getUndeclaredQueryParameters(this.currentQuery); + if(undeclaredQueryParameters != null){ + int index = 1; + for(QueryParameter parameter : undeclaredQueryParameters){ + if(parameter.getParameterType() != null){ + String typeName = parameter.getParameterType().getType(); + StandardSQLTypeName sqlTypeName = StandardSQLTypeName.valueOf(typeName); + this.parameterHandler.setInferredParameterType(index, sqlTypeName); + } + index++; + } + } + } catch(Exception ex){ + + System.out.println("Throwing an exception here "); + ex.printStackTrace(); + LOG.warning("Could not infer parameter types via dryRun: " + ex.getMessage()); + } } void setCurrentQuery(String currentQuery) { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java index d1348f6d8091..3e7a83d33dd3 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java @@ -20,6 +20,7 @@ import com.google.api.gax.paging.Page; import com.google.api.gax.rpc.ApiException; import com.google.api.gax.rpc.StatusCode; +import com.google.api.services.bigquery.model.QueryParameter; import com.google.cloud.Tuple; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQuery.JobListOption; @@ -1899,4 +1900,16 @@ private void enqueueBufferError(BlockingQueue que private void enqueueBufferEndOfStream(BlockingQueue queue) { Uninterruptibles.putUninterruptibly(queue, BigQueryFieldValueListWrapper.ofEndOfStream(null)); } + + List getUndeclaredQueryParameters(String query){ + QueryJobConfiguration dryRunConfig = getJobConfig(query) + .setDryRun(true) + .setParameterMode("POSITIONAL").build(); + Job dryRunJob = this.bigQuery.create((JobInfo.of(dryRunConfig))); + QueryStatistics jobStatistics = dryRunJob.getStatistics(); + System.out.println(jobStatistics.getQueryParameters()); + List queryParameters = jobStatistics.getQueryParameters(); + return queryParameters; + + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandlerTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandlerTest.java index ab7fa7fb1c7a..f97e5bf3b5af 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandlerTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandlerTest.java @@ -156,4 +156,5 @@ public void testConfigureParametersWidenNumericTypes() throws Exception { assertEquals("5", config.getPositionalParameters().get(0).getValue()); assertEquals("10", config.getPositionalParameters().get(1).getValue()); } + } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 466d21b870d4..b4b21e4cb5c9 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -30,6 +30,7 @@ import com.google.cloud.bigquery.QueryJobConfiguration; import com.google.cloud.bigquery.Schema; import com.google.cloud.bigquery.StandardSQLTypeName; +import com.google.cloud.bigquery.exception.BigQueryJdbcException; import com.google.gson.Gson; import com.google.gson.JsonNull; import com.google.gson.JsonObject; @@ -325,4 +326,22 @@ public void testCreateJsonRowWithSetObjectNull() throws Exception { assertTrue(jsonRow.get("col1").isJsonNull()); assertEquals("42", jsonRow.get("col2").getAsString()); } + + @Test + public void testInferredParameterTypeKnownBeforeSetters() throws Exception { + // 1. Inferred type is known immediately without calling setInt/setString + preparedStatement.parameterHandler.setInferredParameterType(1, StandardSQLTypeName.INT64); + + ParameterMetaData pmd = preparedStatement.getParameterMetaData(); + assertEquals(Types.BIGINT, pmd.getParameterType(1)); + assertEquals("INT64", pmd.getParameterTypeName(1)); + + // 2. But execute() still fails if caller forgot to set value! + assertThrows(BigQueryJdbcException.class, () -> preparedStatement.execute()); + + // 3. Once setter is called, execute() succeeds + preparedStatement.setLong(1, 42L); + // All parameters provided -> proceeds to configureParameters without throwing + } + } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 999f2a7ad5f8..7d0eca9b1def 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -1048,6 +1048,61 @@ public void testPreparedExecuteMethod() throws SQLException { assertFalse(dropStatus); } + + + @Test + public void testPreparedInferredParameterTypes() throws SQLException { + + String TABLE_NAME = "JDBC_PREPARED_EXECUTE_TABLE_" + randomNumber; + String createQuery = + String.format( + "CREATE OR REPLACE TABLE %s.%s (`StringField` STRING, `IntegerField` INTEGER, `ShortField` INT64, `BytesField` BYTES, `DoubleField` FLOAT64, `BooleanField` BOOL, `NullField` STRING);", + DATASET, TABLE_NAME); + /*String insertQuery = + String.format( + "INSERT INTO %s.%s (StringField, IntegerField, ShortField, BytesField, DoubleField, BooleanField, NullField) VALUES (?,?,?,?,?,?,?);", + DATASET, TABLE_NAME);*/ + + String insertQuery = + String.format( + "INSERT INTO "+DATASET +"."+TABLE_NAME+" (StringField, IntegerField, ShortField, BytesField, DoubleField, BooleanField, NullField) VALUES (?,?,?,?,?,?,?);", + DATASET, TABLE_NAME); + String updateQuery = + String.format("UPDATE %s.%s SET StringField=? WHERE IntegerField=?", DATASET, TABLE_NAME); + String dropQuery = String.format("DROP TABLE %s.%s", DATASET, TABLE_NAME); + String selectQuery = String.format("SELECT ? FROM %s.%s", DATASET, TABLE_NAME); + + boolean createStatus = bigQueryStatement.execute(createQuery); + assertFalse(createStatus); + + PreparedStatement insertStmt = bigQueryConnection.prepareStatement(insertQuery); + + int value = insertStmt.getParameterMetaData().getParameterType(1); + assertTrue(value == insertStmt.getParameterMetaData().getParameterType(1) ); + System.out.println(insertStmt.getParameterMetaData().getParameterType(1)); + + value = insertStmt.getParameterMetaData().getParameterType(3); + assertTrue(value == insertStmt.getParameterMetaData().getParameterType(3)); + System.out.println(insertStmt.getParameterMetaData().getParameterType(3)); + + value = insertStmt.getParameterMetaData().getParameterType(6); + assertTrue(value == insertStmt.getParameterMetaData().getParameterType(6)); + System.out.println(insertStmt.getParameterMetaData().getParameterType(6)); + + // Row 1: Testing setString, setInt, setShort, setBytes, setObject, setNull + insertStmt.setString(1, "String1"); + insertStmt.setInt(2, 111); + insertStmt.setShort(3, (short) 12); + insertStmt.setObject(6, true, Types.BOOLEAN); + insertStmt.setNull(7, Types.VARCHAR); + + assertThrows(BigQueryJdbcException.class, insertStmt::execute); + + + boolean dropStatus = bigQueryStatement.execute(dropQuery); + assertFalse(dropStatus); + } + @Test public void testPreparedStatementThrowsSyntaxError() throws SQLException { String TABLE_NAME = "JDBC_PREPARED_SYNTAX_ERR_TABLE_" + randomNumber; From d084f3ed47447c83b6d111c1c111e14e852800d7 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 10:22:54 -0400 Subject: [PATCH 2/9] fix(biqguery): fix undeclared QueryParameter wiring in QueryStatistics --- .../src/main/java/com/google/cloud/bigquery/JobStatistics.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java index c78378ab53f7..154d1af008df 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java @@ -674,6 +674,9 @@ private Builder(com.google.api.services.bigquery.model.JobStatistics statisticsP this.exportDataStats = ExportDataStats.fromPb(statisticsPb.getQuery().getExportDataStatistics()); } + if(statisticsPb.getQuery().getUndeclaredQueryParameters() != null){ + this.queryParameters = statisticsPb.getQuery().getUndeclaredQueryParameters(); + } } } From d1f7030f895a8eb5720f48eeb2401fc17dfb32cf Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 11:30:08 -0400 Subject: [PATCH 3/9] add test --- .../jdbc/BigQueryParameterHandler.java | 82 +++++++++++-------- .../jdbc/BigQueryPreparedStatement.java | 31 +++++++ .../bigquery/jdbc/BigQueryStatement.java | 11 +++ .../BigQueryPreparedStatementSettersTest.java | 18 ++++ .../bigquery/jdbc/it/ITBigQueryJDBCTest.java | 42 ++++++++++ 5 files changed, 150 insertions(+), 34 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java index e40e3fcf28ef..25f44f555b05 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java @@ -24,6 +24,7 @@ import java.math.BigInteger; import java.sql.SQLException; import java.util.ArrayList; +import java.util.BitSet; class BigQueryParameterHandler { private final BigQueryJdbcCustomLogger LOG = new BigQueryJdbcCustomLogger(this.toString()); @@ -48,6 +49,7 @@ enum BigQueryStatementParameterType { }; private int parametersArraySize; + private final BitSet userSetParameters = new BitSet(); ArrayList parametersList = new ArrayList<>(parametersArraySize); private long highestIndex = 0; @@ -55,23 +57,20 @@ enum BigQueryStatementParameterType { QueryJobConfiguration.Builder configureParameters( QueryJobConfiguration.Builder jobConfigurationBuilder) throws SQLException { LOG.finest("++enter++"); - try { - for (int i = 1; i <= this.parametersArraySize; i++) { - - Object parameterValue = getParameter(i); - StandardSQLTypeName sqlType = getSqlType(i); - parameterValue = formatValueForQueryParameter(parameterValue, sqlType); - LOG.finest( - "Parameter %s of type %s at index %s added to QueryJobConfiguration", - parameterValue, sqlType, i); - jobConfigurationBuilder.addPositionalParameter( - QueryParameterValue.of(parameterValue, sqlType)); - } - } catch (NullPointerException e) { - LOG.severe("Null parameter mapping encountered.", e); - if (e.getMessage().contains("Null type")) { - throw new BigQueryJdbcException("One or more parameters missing in Prepared statement.", e); + for (int i = 1; i <= this.parametersArraySize; i++) { + + if (!this.userSetParameters.get(i)) { + throw new BigQueryJdbcException("One or more parameters missing in Prepared statement."); } + + Object parameterValue = getParameter(i); + StandardSQLTypeName sqlType = getSqlType(i); + parameterValue = formatValueForQueryParameter(parameterValue, sqlType); + LOG.finest( + "Parameter %s of type %s at index %s added to QueryJobConfiguration", + parameterValue, sqlType, i); + jobConfigurationBuilder.addPositionalParameter( + QueryParameterValue.of(parameterValue, sqlType)); } return jobConfigurationBuilder; } @@ -108,13 +107,11 @@ static Object formatValueForQueryParameter(Object parameterValue, StandardSQLTyp return parameterValue; } - void setParameter(int parameterIndex, Object value, Class type) - throws BigQueryJdbcSqlFeatureNotSupportedException { - LOG.finest("++enter++"); - LOG.finest("setParameter called by : %s", type.getName()); - checkValidIndex(parameterIndex); - + private BigQueryJdbcParameter getOrCreateParameter(int parameterIndex) { int arrayIndex = parameterIndex - 1; + while (parametersList.size() < parameterIndex) { + parametersList.add(null); + } if (parameterIndex >= this.highestIndex || this.parametersList.get(arrayIndex) == null) { parametersList.ensureCapacity(parameterIndex); while (parametersList.size() < parameterIndex) { @@ -123,8 +120,15 @@ void setParameter(int parameterIndex, Object value, Class type) parametersList.set(arrayIndex, new BigQueryJdbcParameter()); } this.highestIndex = Math.max(parameterIndex, highestIndex); - BigQueryJdbcParameter parameter = parametersList.get(arrayIndex); + return parametersList.get(arrayIndex); + } + + void setParameter(int parameterIndex, Object value, Class type) { + LOG.finest("++enter++"); + LOG.finest("setParameter called by : %s", type.getName()); + checkValidIndex(parameterIndex); + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); parameter.setIndex(parameterIndex); parameter.setValue(value); parameter.setType(type); @@ -133,9 +137,22 @@ void setParameter(int parameterIndex, Object value, Class type) parameter.setParamType(BigQueryStatementParameterType.UNSPECIFIED); parameter.setScale(-1); + this.userSetParameters.set(parameterIndex); + LOG.finest("Parameter set { %s }", parameter.toString()); } + void setInferredParameterType(int parameterIndex, StandardSQLTypeName sqlTypeName) + throws SQLException { + checkValidIndex(parameterIndex); + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); + + Class javaType = BigQueryTypeRegistry.toJavaClass(sqlTypeName); + parameter.setIndex(parameterIndex); + parameter.setType(javaType); + parameter.setSqlType(sqlTypeName); + } + private void checkValidIndex(int parameterIndex) { if (parameterIndex > this.parametersArraySize) { IndexOutOfBoundsException ex = @@ -174,7 +191,12 @@ StandardSQLTypeName getSqlType(int index) { void clearParameters() { LOG.finest("++enter++"); - parametersList.clear(); + this.userSetParameters.clear(); + for (BigQueryJdbcParameter param : this.parametersList) { + if (param != null) { + param.setValue(null); + } + } highestIndex = 0; } @@ -229,16 +251,8 @@ void setParameter( LOG.finest("++enter++"); LOG.finest("setParameter called by : %s", type.getName()); checkValidIndex(parameterIndex); - int arrayIndex = parameterIndex - 1; - if (parameterIndex >= this.highestIndex || this.parametersList.get(arrayIndex) == null) { - parametersList.ensureCapacity(parameterIndex); - while (parametersList.size() < parameterIndex) { - parametersList.add(null); - } - parametersList.set(arrayIndex, new BigQueryJdbcParameter()); - } - this.highestIndex = Math.max(parameterIndex, highestIndex); - BigQueryJdbcParameter parameter = parametersList.get(arrayIndex); + + BigQueryJdbcParameter parameter = getOrCreateParameter(parameterIndex); parameter.setIndex(parameterIndex); parameter.setValue(value); diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java index 014717fd0646..b714f552f4a7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java @@ -17,6 +17,7 @@ package com.google.cloud.bigquery.jdbc; import com.google.api.gax.retrying.RetrySettings; +import com.google.api.services.bigquery.model.QueryParameter; import com.google.cloud.bigquery.FieldList; import com.google.cloud.bigquery.JobStatistics.QueryStatistics; import com.google.cloud.bigquery.JobStatistics.QueryStatistics.StatementType; @@ -85,6 +86,36 @@ class BigQueryPreparedStatement extends BigQueryStatement implements PreparedSta super(connection); setCurrentQuery(query); this.parameterHandler = new BigQueryParameterHandler(this.parameterCount); + if (this.parameterCount > 0) { + populateInferredParameterTypes(); + } + } + + private void populateInferredParameterTypes() { + if (this.currentQuery == null) { + return; + } + + try { + List undeclaredQueryParameters = + getUndeclaredQueryParameters(this.currentQuery); + if (undeclaredQueryParameters != null) { + int index = 1; + for (QueryParameter parameter : undeclaredQueryParameters) { + if (parameter.getParameterType() != null) { + String typeName = parameter.getParameterType().getType(); + StandardSQLTypeName sqlTypeName = StandardSQLTypeName.valueOf(typeName); + this.parameterHandler.setInferredParameterType(index, sqlTypeName); + } + index++; + } + } + } catch (Exception ex) { + + System.out.println("Throwing an exception here "); + ex.printStackTrace(); + LOG.warning("Could not infer parameter types via dryRun: " + ex.getMessage()); + } } void setCurrentQuery(String currentQuery) { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java index d1348f6d8091..00803befe203 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java @@ -20,6 +20,7 @@ import com.google.api.gax.paging.Page; import com.google.api.gax.rpc.ApiException; import com.google.api.gax.rpc.StatusCode; +import com.google.api.services.bigquery.model.QueryParameter; import com.google.cloud.Tuple; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQuery.JobListOption; @@ -1899,4 +1900,14 @@ private void enqueueBufferError(BlockingQueue que private void enqueueBufferEndOfStream(BlockingQueue queue) { Uninterruptibles.putUninterruptibly(queue, BigQueryFieldValueListWrapper.ofEndOfStream(null)); } + + List getUndeclaredQueryParameters(String query) { + QueryJobConfiguration dryRunConfig = + getJobConfig(query).setDryRun(true).setParameterMode("POSITIONAL").build(); + Job dryRunJob = this.bigQuery.create((JobInfo.of(dryRunConfig))); + QueryStatistics jobStatistics = dryRunJob.getStatistics(); + System.out.println(jobStatistics.getQueryParameters()); + List queryParameters = jobStatistics.getQueryParameters(); + return queryParameters; + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 466d21b870d4..37a6d00219da 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -30,6 +30,7 @@ import com.google.cloud.bigquery.QueryJobConfiguration; import com.google.cloud.bigquery.Schema; import com.google.cloud.bigquery.StandardSQLTypeName; +import com.google.cloud.bigquery.exception.BigQueryJdbcException; import com.google.gson.Gson; import com.google.gson.JsonNull; import com.google.gson.JsonObject; @@ -325,4 +326,21 @@ public void testCreateJsonRowWithSetObjectNull() throws Exception { assertTrue(jsonRow.get("col1").isJsonNull()); assertEquals("42", jsonRow.get("col2").getAsString()); } + + @Test + public void testInferredParameterTypeKnownBeforeSetters() throws Exception { + // 1. Inferred type is known immediately without calling setInt/setString + preparedStatement.parameterHandler.setInferredParameterType(1, StandardSQLTypeName.INT64); + + ParameterMetaData pmd = preparedStatement.getParameterMetaData(); + assertEquals(Types.BIGINT, pmd.getParameterType(1)); + assertEquals("INT64", pmd.getParameterTypeName(1)); + + // 2. But execute() still fails if caller forgot to set value! + assertThrows(BigQueryJdbcException.class, () -> preparedStatement.execute()); + + // 3. Once setter is called, execute() succeeds + preparedStatement.setLong(1, 42L); + // All parameters provided -> proceeds to configureParameters without throwing + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 999f2a7ad5f8..59209b82bcbc 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -1048,6 +1048,48 @@ public void testPreparedExecuteMethod() throws SQLException { assertFalse(dropStatus); } + @Test + public void testPreparedInferredParameterTypes() throws SQLException { + + String TABLE_NAME = "JDBC_PREPARED_PARAMETER_INFER_TABLE_" + randomNumber; + String createQuery = + String.format( + "CREATE OR REPLACE TABLE %s.%s (`StringField` STRING, `IntegerField` INTEGER, `BytesField` BYTES, `DoubleField` FLOAT64, `BooleanField` BOOL, `NumericField` NUMERIC, " + + "`BigNumericField` BIGNUMERIC, `DateField` DATE, `TimeField` TIME, `DateTimeField` DATETIME, `TimestampField` TIMESTAMP, `ArrayField` ARRAY, `StructField` STRUCT, " + + "`JsonField` JSON, `GeographyField` GEOGRAPHY, `IntervalField` INTERVAL, `RangeField` RANGE);", + DATASET, TABLE_NAME); + String insertQuery = + String.format( + "INSERT INTO %s.%s (StringField, IntegerField, BytesField, DoubleField, BooleanField, NumericField, BigNumericField, DateField, TimeField, DateTimeField, TimestampField, ArrayField, StructField, JsonField, GeographyField, IntervalField, RangeField) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);", + DATASET, TABLE_NAME); + + String dropQuery = String.format("DROP TABLE %s.%s", DATASET, TABLE_NAME); + int[] expectedValues = { + -9, -5, -3, 8, 16, 2, 2, 91, 92, 93, 93, 2003, 2002, 1111, 1111, 1111, 1111 + }; + + boolean createStatus = bigQueryStatement.execute(createQuery); + assertFalse(createStatus); + + PreparedStatement insertStmt = bigQueryConnection.prepareStatement(insertQuery); + ParameterMetaData parameterMetaData = insertStmt.getParameterMetaData(); + for (int i = 0; i < parameterMetaData.getParameterCount(); i++) { + assertEquals(expectedValues[i], parameterMetaData.getParameterType(i + 1)); + } + + // Row 1: Testing setString, setInt, setShort, setBytes, setObject, setNull + insertStmt.setString(1, "String1"); + insertStmt.setInt(2, 111); + insertStmt.setShort(3, (short) 12); + insertStmt.setObject(6, true, Types.BOOLEAN); + insertStmt.setNull(7, Types.VARCHAR); + + assertThrows(BigQueryJdbcException.class, insertStmt::execute); + + boolean dropStatus = bigQueryStatement.execute(dropQuery); + assertFalse(dropStatus); + } + @Test public void testPreparedStatementThrowsSyntaxError() throws SQLException { String TABLE_NAME = "JDBC_PREPARED_SYNTAX_ERR_TABLE_" + randomNumber; From aaf6d7c04257ee48b03f4f8d877dccac50cf90ae Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 11:48:41 -0400 Subject: [PATCH 4/9] fix build --- .../google/cloud/bigquery/jdbc/BigQueryConnection.java | 2 +- .../google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index cb351342cdb8..3d2ae4e9e02e 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -876,7 +876,7 @@ public Properties getClientInfo() { @Override public void setClientInfo(Properties properties) { - this.clientInfo.git(); + this.clientInfo.clear(); if (properties != null) { this.clientInfo.putAll(properties); } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 59209b82bcbc..34e398e533d3 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -1060,7 +1060,9 @@ public void testPreparedInferredParameterTypes() throws SQLException { DATASET, TABLE_NAME); String insertQuery = String.format( - "INSERT INTO %s.%s (StringField, IntegerField, BytesField, DoubleField, BooleanField, NumericField, BigNumericField, DateField, TimeField, DateTimeField, TimestampField, ArrayField, StructField, JsonField, GeographyField, IntervalField, RangeField) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);", + "INSERT INTO %s.%s (StringField, IntegerField, BytesField, DoubleField, BooleanField, NumericField, BigNumericField, " + + "DateField, TimeField, DateTimeField, TimestampField, ArrayField, StructField, JsonField, GeographyField, IntervalField, RangeField) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);", DATASET, TABLE_NAME); String dropQuery = String.format("DROP TABLE %s.%s", DATASET, TABLE_NAME); @@ -1077,10 +1079,10 @@ public void testPreparedInferredParameterTypes() throws SQLException { assertEquals(expectedValues[i], parameterMetaData.getParameterType(i + 1)); } - // Row 1: Testing setString, setInt, setShort, setBytes, setObject, setNull + // Testing an Exception is thrown if not all values are set. insertStmt.setString(1, "String1"); insertStmt.setInt(2, 111); - insertStmt.setShort(3, (short) 12); + insertStmt.setObject(4, 1.5); insertStmt.setObject(6, true, Types.BOOLEAN); insertStmt.setNull(7, Types.VARCHAR); From dbca72e98ebb0a7bd35d5e7668b07b827c9825ae Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 11:53:33 -0400 Subject: [PATCH 5/9] add test --- .../test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java index 9744eebc2d81..87a9ffcfd238 100644 --- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java +++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java @@ -5301,6 +5301,8 @@ void testQueryParameterModeWithDryRun() { Job job = bigquery.create(JobInfo.of(queryConfig)); JobStatistics.QueryStatistics statistics = job.getStatistics(); + assertNotNull(statistics.getQueryParameters()); + assertEquals(7, statistics.getQueryParameters().size()); assertNotNull(statistics.getTotalBytesProcessed()); } From 338e6b3e802a000fb21496679b808fc2f99746b6 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 16 Sep 2026 12:26:50 -0400 Subject: [PATCH 6/9] lint --- .../src/main/java/com/google/cloud/bigquery/JobStatistics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java index 154d1af008df..8983c08e2e6a 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java @@ -674,7 +674,7 @@ private Builder(com.google.api.services.bigquery.model.JobStatistics statisticsP this.exportDataStats = ExportDataStats.fromPb(statisticsPb.getQuery().getExportDataStatistics()); } - if(statisticsPb.getQuery().getUndeclaredQueryParameters() != null){ + if (statisticsPb.getQuery().getUndeclaredQueryParameters() != null) { this.queryParameters = statisticsPb.getQuery().getUndeclaredQueryParameters(); } } From bba34b7b1f31956521c768fd7fec7d6d547e2a56 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 17 Sep 2026 10:34:05 -0400 Subject: [PATCH 7/9] fix test --- .../bigquery/jdbc/BigQueryJdbcParameter.java | 14 ++++++++++++- .../jdbc/BigQueryParameterHandler.java | 16 ++++++++------ .../BigQueryPreparedStatementSettersTest.java | 21 ++++++++++++++++--- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java index cb11d14e46ab..91b4decad8e1 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java @@ -28,6 +28,7 @@ class BigQueryJdbcParameter { private String paramName; private BigQueryStatementParameterType paramType; private int scale; + private boolean isUserSet = false; BigQueryJdbcParameter() {} @@ -36,6 +37,7 @@ class BigQueryJdbcParameter { this.value = parameter.value; this.type = parameter.type; this.sqlType = parameter.sqlType; + this.isUserSet = parameter.isUserSet; } int getIndex() { @@ -94,6 +96,14 @@ void setScale(int scale) { this.scale = scale; } + boolean isUserSet() { + return isUserSet; + } + + void setUserSet(boolean userSet) { + isUserSet = userSet; + } + @Override public String toString() { return "BigQueryJdbcParameter{" @@ -109,9 +119,11 @@ public String toString() { + paramName + '\'' + ", paramType=" - + paramType.name() + + paramType + ", scale=" + scale + + ", isUserSet=" + + isUserSet + '}'; } } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java index d56def289c70..f157859dc41b 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java @@ -24,7 +24,6 @@ import java.math.BigInteger; import java.sql.SQLException; import java.util.ArrayList; -import java.util.BitSet; class BigQueryParameterHandler { private final BigQueryJdbcCustomLogger LOG = new BigQueryJdbcCustomLogger(this.toString()); @@ -49,7 +48,6 @@ enum BigQueryStatementParameterType { }; private int parametersArraySize; - private final BitSet userSetParameters = new BitSet(); ArrayList parametersList = new ArrayList<>(parametersArraySize); private long highestIndex = 0; @@ -58,7 +56,11 @@ QueryJobConfiguration.Builder configureParameters( QueryJobConfiguration.Builder jobConfigurationBuilder) throws SQLException { LOG.finest("++enter++"); for (int i = 1; i <= this.parametersArraySize; i++) { - if (!this.userSetParameters.get(i)) { + + int arrayIndex = i - 1; + if (this.parametersList.size() <= arrayIndex + || this.parametersList.get(arrayIndex) == null + || !this.parametersList.get(arrayIndex).isUserSet()) { throw new BigQueryJdbcException("One or more parameters missing in Prepared statement."); } @@ -135,8 +137,7 @@ void setParameter(int parameterIndex, Object value, Class type) { parameter.setParamName(""); parameter.setParamType(BigQueryStatementParameterType.UNSPECIFIED); parameter.setScale(-1); - - this.userSetParameters.set(parameterIndex); + parameter.setUserSet(true); LOG.finest("Parameter set { %s }", parameter.toString()); } @@ -189,10 +190,10 @@ StandardSQLTypeName getSqlType(int index) { void clearParameters() { LOG.finest("++enter++"); - this.userSetParameters.clear(); for (BigQueryJdbcParameter param : this.parametersList) { if (param != null) { param.setValue(null); + param.setUserSet(false); } } highestIndex = 0; @@ -232,6 +233,8 @@ void setParameter( parameter.setParamName(paramName); parameter.setParamType(paramType); parameter.setScale(scale); + parameter.setUserSet(true); + if (parameter.getIndex() == -1) { parametersList.add(parameter); } @@ -259,6 +262,7 @@ void setParameter( parameter.setParamName(""); parameter.setParamType(paramType); parameter.setScale(scale); + parameter.setUserSet(true); LOG.finest("Parameter set { %s }", parameter.toString()); } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 37a6d00219da..4efe06427dbe 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -17,6 +17,7 @@ package com.google.cloud.bigquery.jdbc; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -61,6 +62,7 @@ public class BigQueryPreparedStatementSettersTest { public void setUp() throws Exception { connection = mock(BigQueryConnection.class); when(connection.getQueryDialect()).thenReturn("SQL"); + when(connection.getConnectionId()).thenReturn("test-connection-id"); preparedStatement = new BigQueryPreparedStatement(connection, "SELECT ?, ?, ?, ?, ?"); } @@ -329,6 +331,8 @@ public void testCreateJsonRowWithSetObjectNull() throws Exception { @Test public void testInferredParameterTypeKnownBeforeSetters() throws Exception { + preparedStatement = new BigQueryPreparedStatement(connection, "SELECT ?"); + // 1. Inferred type is known immediately without calling setInt/setString preparedStatement.parameterHandler.setInferredParameterType(1, StandardSQLTypeName.INT64); @@ -337,10 +341,21 @@ public void testInferredParameterTypeKnownBeforeSetters() throws Exception { assertEquals("INT64", pmd.getParameterTypeName(1)); // 2. But execute() still fails if caller forgot to set value! - assertThrows(BigQueryJdbcException.class, () -> preparedStatement.execute()); + // 2. configureParameters fails before value is supplied + QueryJobConfiguration.Builder configBuilder = QueryJobConfiguration.newBuilder("SELECT ?"); + BigQueryJdbcException ex = + assertThrows( + BigQueryJdbcException.class, + () -> preparedStatement.parameterHandler.configureParameters(configBuilder)); + assertTrue(ex.getMessage().contains("One or more parameters missing")); + // 3. Once setter is called, configureParameters succeeds and populates QueryJobConfiguration - // 3. Once setter is called, execute() succeeds preparedStatement.setLong(1, 42L); - // All parameters provided -> proceeds to configureParameters without throwing + assertDoesNotThrow(() -> preparedStatement.parameterHandler.configureParameters(configBuilder)); + + QueryJobConfiguration config = configBuilder.build(); + assertEquals(1, config.getPositionalParameters().size()); + assertEquals("42", config.getPositionalParameters().get(0).getValue()); + assertEquals(StandardSQLTypeName.INT64, config.getPositionalParameters().get(0).getType()); } } From 353afe02c60d925d73b6db1c6c8e0170cc91a4d2 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 17 Sep 2026 10:35:22 -0400 Subject: [PATCH 8/9] nit --- .../com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java index 91b4decad8e1..8b98a2e43e3f 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcParameter.java @@ -119,7 +119,7 @@ public String toString() { + paramName + '\'' + ", paramType=" - + paramType + + paramType.name() + ", scale=" + scale + ", isUserSet=" From 15295c9a04f351b5ae42d3924d94fdac0364c2d9 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 17 Sep 2026 10:37:32 -0400 Subject: [PATCH 9/9] remove comment --- .../bigquery/jdbc/BigQueryPreparedStatementSettersTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 4efe06427dbe..c83594f44d80 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -340,7 +340,6 @@ public void testInferredParameterTypeKnownBeforeSetters() throws Exception { assertEquals(Types.BIGINT, pmd.getParameterType(1)); assertEquals("INT64", pmd.getParameterTypeName(1)); - // 2. But execute() still fails if caller forgot to set value! // 2. configureParameters fails before value is supplied QueryJobConfiguration.Builder configBuilder = QueryJobConfiguration.newBuilder("SELECT ?"); BigQueryJdbcException ex =