Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class BigQueryJdbcTypeMappings {
ImmutableMap.ofEntries(
entry(Types.BIGINT, Long.class),
entry(Types.INTEGER, Integer.class),
entry(Types.SMALLINT, Long.class),
entry(Types.TINYINT, Long.class),
Comment thread
Neenu1995 marked this conversation as resolved.
Outdated
entry(Types.BOOLEAN, Boolean.class),
entry(Types.DOUBLE, Double.class),
entry(Types.FLOAT, Float.class),
Expand All @@ -94,38 +96,33 @@ class BigQueryJdbcTypeMappings {
entry(Types.VARBINARY, byte[].class),
entry(Types.STRUCT, Struct.class),
entry(Types.BIT, Boolean.class),
entry(Types.ARRAY, Array.class));
entry(Types.ARRAY, Array.class),
entry(Types.NULL, String.class));

static StandardSQLTypeName classToType(Class type)
throws BigQueryJdbcSqlFeatureNotSupportedException {
if (Boolean.class.isAssignableFrom(type)) {
return StandardSQLTypeName.BOOL;
} else if (String.class.isAssignableFrom(type)) {
return StandardSQLTypeName.STRING;
} else if (String.class.isAssignableFrom(type)) {
return StandardSQLTypeName.GEOGRAPHY;
} else if (String.class.isAssignableFrom(type)) {
return StandardSQLTypeName.DATETIME;
} else if (Integer.class.isAssignableFrom(type)) {
return StandardSQLTypeName.INT64;
} else if (Long.class.isAssignableFrom(type)) {
return StandardSQLTypeName.INT64;
} else if (Short.class.isAssignableFrom(type)) {
return StandardSQLTypeName.INT64;
} else if (Double.class.isAssignableFrom(type)) {
return StandardSQLTypeName.FLOAT64;
} else if (Float.class.isAssignableFrom(type)) {
return StandardSQLTypeName.FLOAT64;
} else if (BigDecimal.class.isAssignableFrom(type)) {
return StandardSQLTypeName.NUMERIC;
} else if (BigDecimal.class.isAssignableFrom(type)) {
return StandardSQLTypeName.BIGNUMERIC;
} else if (Date.class.isAssignableFrom(type)) {
return StandardSQLTypeName.DATE;
} else if (Timestamp.class.isAssignableFrom(type)) {
return StandardSQLTypeName.TIMESTAMP;
} else if (Time.class.isAssignableFrom(type)) {
return StandardSQLTypeName.TIME;
} else if (String.class.isAssignableFrom(type)) {
return StandardSQLTypeName.JSON;
} else if (JsonObject.class.isAssignableFrom(type)) {
return StandardSQLTypeName.JSON;
} else if (Byte.class.isAssignableFrom(type)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
Expand Down Expand Up @@ -114,8 +115,15 @@ public void clearParameters() {
}

@Override
public void setNull(int parameterIndex, int sqlType) {
// TODO(neenu): implement null case
public void setNull(int parameterIndex, int sqlType) throws SQLException {
checkClosed();
Class<?> javaType;
try {
javaType = BigQueryJdbcTypeMappings.getJavaType(sqlType);
} catch (SQLException e) {
javaType = String.class;
}
Comment thread
Neenu1995 marked this conversation as resolved.
Outdated
this.parameterHandler.setParameter(parameterIndex, null, javaType);
}

@Override
Expand All @@ -131,8 +139,9 @@ public void setByte(int parameterIndex, byte x) throws SQLException {
}

@Override
public void setShort(int parameterIndex, short x) {
// TODO(neenu): implement Bytes conversion.
public void setShort(int parameterIndex, short x) throws SQLException {
checkClosed();
this.parameterHandler.setParameter(parameterIndex, (long) x, Long.class);
Comment thread
Neenu1995 marked this conversation as resolved.
Outdated
}

@Override
Expand Down Expand Up @@ -172,8 +181,9 @@ public void setString(int parameterIndex, String x) throws SQLException {
}

@Override
public void setBytes(int parameterIndex, byte[] x) {
// TODO(neenu): implement Bytes conversion.
public void setBytes(int parameterIndex, byte[] x) throws SQLException {
checkClosed();
this.parameterHandler.setParameter(parameterIndex, x, byte[].class);
}

@Override
Expand Down Expand Up @@ -218,11 +228,24 @@ public void setBinaryStream(int parameterIndex, InputStream x, int length) {
}

@Override
public void setObject(int parameterIndex, Object x, int targetSqlType) {}
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {
checkClosed();
if (x == null) {
setNull(parameterIndex, targetSqlType);
return;
}
Class<?> javaType = BigQueryJdbcTypeMappings.getJavaType(targetSqlType);
this.parameterHandler.setParameter(parameterIndex, x, javaType);
}

@Override
public void setObject(int parameterIndex, Object x) {
// TODO :NOT IMPLEMENTED
public void setObject(int parameterIndex, Object x) throws SQLException {
checkClosed();
if (x == null) {
setNull(parameterIndex, Types.NULL);
return;
}
this.parameterHandler.setParameter(parameterIndex, x, x.getClass());
}

@Override
Expand Down Expand Up @@ -444,8 +467,9 @@ public void setClob(int parameterIndex, Clob x) {
}

@Override
public void setArray(int parameterIndex, Array x) {
// TODO(neenu) :IMPLEMENT ARRAY
public void setArray(int parameterIndex, Array x) throws SQLException {
checkClosed();
this.parameterHandler.setParameter(parameterIndex, x, Array.class);
}

@Override
Expand All @@ -470,8 +494,8 @@ public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) {
}

@Override
public void setNull(int parameterIndex, int sqlType, String typeName) {
// TODO :NOT IMPLEMENTED
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException {
setNull(parameterIndex, sqlType);
}

@Override
Expand Down Expand Up @@ -526,8 +550,10 @@ public void setSQLXML(int parameterIndex, SQLXML xmlObject) {
}

@Override
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) {
// TODO(neenu) : IMPLEMENT?
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)
throws SQLException {
checkClosed();
setObject(parameterIndex, x, targetSqlType);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/*
* Copyright 2026 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.google.cloud.bigquery.jdbc;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.Mockito.mock;

import com.google.cloud.bigquery.StandardSQLTypeName;
import java.sql.Array;
import java.sql.Types;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class BigQueryPreparedStatementSettersTest {

private BigQueryConnection connection;
private BigQueryPreparedStatement preparedStatement;

@BeforeEach
public void setUp() throws Exception {
connection = mock(BigQueryConnection.class);
preparedStatement = new BigQueryPreparedStatement(connection, "SELECT ?, ?, ?, ?, ?");
}

@Test
public void testSetNullWithSqlType() throws Exception {
preparedStatement.setNull(1, Types.VARCHAR);
assertNull(preparedStatement.parameterHandler.getParameter(1));
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.STRING, preparedStatement.parameterHandler.getSqlType(1));

preparedStatement.setNull(2, Types.INTEGER);
assertNull(preparedStatement.parameterHandler.getParameter(2));
assertEquals(Integer.class, preparedStatement.parameterHandler.getType(2));
assertEquals(StandardSQLTypeName.INT64, preparedStatement.parameterHandler.getSqlType(2));

preparedStatement.setNull(3, Types.NULL);
assertNull(preparedStatement.parameterHandler.getParameter(3));
assertEquals(String.class, preparedStatement.parameterHandler.getType(3));
assertEquals(StandardSQLTypeName.STRING, preparedStatement.parameterHandler.getSqlType(3));
}

@Test
public void testSetNullWithTypeName() throws Exception {
preparedStatement.setNull(1, Types.VARCHAR, "VARCHAR");
assertNull(preparedStatement.parameterHandler.getParameter(1));
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.STRING, preparedStatement.parameterHandler.getSqlType(1));
}

@Test
public void testSetShort() throws Exception {
preparedStatement.setShort(1, (short) 42);
assertEquals(42L, preparedStatement.parameterHandler.getParameter(1));
assertEquals(Long.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.INT64, preparedStatement.parameterHandler.getSqlType(1));
}

@Test
public void testSetBytes() throws Exception {
byte[] bytes = new byte[] {1, 2, 3, 4};
preparedStatement.setBytes(1, bytes);
assertArrayEquals(bytes, (byte[]) preparedStatement.parameterHandler.getParameter(1));
assertEquals(byte[].class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.BYTES, preparedStatement.parameterHandler.getSqlType(1));
}

@Test
public void testSetObjectSingleArg() throws Exception {
preparedStatement.setObject(1, "hello");
assertEquals("hello", preparedStatement.parameterHandler.getParameter(1));
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.STRING, preparedStatement.parameterHandler.getSqlType(1));

preparedStatement.setObject(2, 100L);
assertEquals(100L, preparedStatement.parameterHandler.getParameter(2));
assertEquals(Long.class, preparedStatement.parameterHandler.getType(2));
assertEquals(StandardSQLTypeName.INT64, preparedStatement.parameterHandler.getSqlType(2));

preparedStatement.setObject(3, null);
assertNull(preparedStatement.parameterHandler.getParameter(3));
assertEquals(String.class, preparedStatement.parameterHandler.getType(3));
}

@Test
public void testSetObjectWithTargetSqlType() throws Exception {
preparedStatement.setObject(1, 123, Types.INTEGER);
assertEquals(123, preparedStatement.parameterHandler.getParameter(1));
assertEquals(Integer.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.INT64, preparedStatement.parameterHandler.getSqlType(1));

preparedStatement.setObject(2, null, Types.INTEGER);
assertNull(preparedStatement.parameterHandler.getParameter(2));
assertEquals(Integer.class, preparedStatement.parameterHandler.getType(2));

preparedStatement.setObject(3, 456, Types.INTEGER, 0);
assertEquals(456, preparedStatement.parameterHandler.getParameter(3));
assertEquals(Integer.class, preparedStatement.parameterHandler.getType(3));
}

@Test
public void testSetArray() throws Exception {
Array mockArray = mock(Array.class);
preparedStatement.setArray(1, mockArray);
assertEquals(mockArray, preparedStatement.parameterHandler.getParameter(1));
assertEquals(Array.class, preparedStatement.parameterHandler.getType(1));
assertEquals(StandardSQLTypeName.ARRAY, preparedStatement.parameterHandler.getSqlType(1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.time.LocalTime;
import java.util.Properties;
import java.util.Random;
Expand Down Expand Up @@ -984,11 +985,11 @@ public void testPreparedExecuteMethod() throws SQLException {
String TABLE_NAME = "JDBC_PREPARED_EXECUTE_TABLE_" + randomNumber;
String createQuery =
String.format(
"CREATE OR REPLACE TABLE %s.%s (`StringField` STRING, `IntegerField` INTEGER);",
"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) VALUES (?,?), (?,?), (?,?), (?,?);",
"INSERT INTO %s.%s (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);
Expand All @@ -999,14 +1000,23 @@ public void testPreparedExecuteMethod() throws SQLException {
assertFalse(createStatus);

PreparedStatement insertStmt = bigQueryConnection.prepareStatement(insertQuery);
// Row 1: Testing setString, setInt, setShort, setBytes, setObject, setNull
insertStmt.setString(1, "String1");
insertStmt.setInt(2, 111);
insertStmt.setString(3, "String2");
insertStmt.setInt(4, 222);
insertStmt.setString(5, "String3");
insertStmt.setInt(6, 333);
insertStmt.setString(7, "String4");
insertStmt.setInt(8, 444);
insertStmt.setShort(3, (short) 12);
insertStmt.setBytes(4, new byte[] {0x1, 0x2});
insertStmt.setObject(5, 3.14d);
insertStmt.setObject(6, true, Types.BOOLEAN);
insertStmt.setNull(7, Types.VARCHAR);

// Row 2: Testing setString, setInt, setShort, setBytes, setObject, setNull with typeName
insertStmt.setString(8, "String2");
insertStmt.setInt(9, 222);
insertStmt.setShort(10, (short) 34);
insertStmt.setBytes(11, new byte[] {0x3, 0x4});
insertStmt.setObject(12, 6.28d);
insertStmt.setObject(13, false);
insertStmt.setNull(14, Types.VARCHAR, "STRING");

boolean insertStatus = insertStmt.execute();
assertFalse(insertStatus);
Expand Down
Loading