Skip to content

Commit ac1f0f4

Browse files
authored
fix(bq jdbc): ensure getMoreResults() always moves the cursor (#12353)
1 parent 474efb1 commit ac1f0f4

File tree

2 files changed

+62
-8
lines changed

2 files changed

+62
-8
lines changed

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,10 @@ private QueryJobConfiguration setDestinationDatasetAndTableInJobConfig(
643643
}
644644

645645
Job getNextJob() {
646+
if (this.parentJobId == null) {
647+
return null;
648+
}
649+
646650
while (this.currentJobIdIndex + 1 < this.parentJobId.getJobs().size()) {
647651
this.currentJobIdIndex += 1;
648652
Job currentJob = this.parentJobId.getJobs().get(this.currentJobIdIndex);
@@ -1448,10 +1452,6 @@ public boolean getMoreResults(int current) throws SQLException {
14481452
"The JDBC driver only supports Statement.CLOSE_CURRENT_RESULT.");
14491453
}
14501454

1451-
if (this.parentJobId == null) {
1452-
return false;
1453-
}
1454-
14551455
try {
14561456
if (this.currentResultSet != null) {
14571457
this.currentResultSet.close();

java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,7 @@ public class ITBigQueryJDBCTest extends ITBase {
8787
"jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID="
8888
+ PROJECT_ID
8989
+ ";OAUTHTYPE=3";
90-
static final String session_enabled_connection_uri =
91-
"jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID="
92-
+ PROJECT_ID
93-
+ ";OAUTHTYPE=3;EnableSession=1";
90+
static final String session_enabled_connection_uri = connection_uri + ";EnableSession=1";
9491
private static final String BASE_QUERY =
9592
"SELECT * FROM bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2017 order by"
9693
+ " trip_distance asc LIMIT %s";
@@ -3717,6 +3714,63 @@ public void testExecuteScriptWithExpession() throws SQLException {
37173714
assertEquals(-1, bigQueryStatement.getUpdateCount());
37183715
}
37193716

3717+
@Test
3718+
public void testExecuteSingleSelectMoreResultsBehavior() throws SQLException {
3719+
String sql = "SELECT 1;";
3720+
assertTrue(bigQueryStatement.execute(sql));
3721+
ResultSet rs = bigQueryStatement.getResultSet();
3722+
assertNotNull(rs);
3723+
assertTrue(rs.next());
3724+
assertEquals(1, rs.getInt(1));
3725+
assertFalse(rs.next());
3726+
3727+
// Validate no more results reset update count to -1
3728+
assertFalse(bigQueryStatement.getMoreResults());
3729+
assertEquals(-1, bigQueryStatement.getUpdateCount());
3730+
}
3731+
3732+
@Test
3733+
public void testExecuteSingleInsertMoreResultsBehavior() throws SQLException {
3734+
String tableName = "test_insert_more_results_" + System.currentTimeMillis();
3735+
String createSql =
3736+
String.format("CREATE OR REPLACE TABLE %s.%s (id INT64);", DATASET, tableName);
3737+
String insertSql = String.format("INSERT INTO %s.%s (id) VALUES (1);", DATASET, tableName);
3738+
String dropSql = String.format("DROP TABLE IF EXISTS %s.%s;", DATASET, tableName);
3739+
3740+
try {
3741+
bigQueryStatement.execute(createSql);
3742+
3743+
assertFalse(bigQueryStatement.execute(insertSql));
3744+
assertNull(bigQueryStatement.getResultSet());
3745+
assertTrue(bigQueryStatement.getUpdateCount() > 0);
3746+
3747+
// Validate no more results reset update count to -1
3748+
assertFalse(bigQueryStatement.getMoreResults());
3749+
assertEquals(-1, bigQueryStatement.getUpdateCount());
3750+
} finally {
3751+
bigQueryStatement.execute(dropSql);
3752+
}
3753+
}
3754+
3755+
@Test
3756+
public void testExecuteSingleTclMoreResultsBehavior() throws SQLException {
3757+
Connection sessionConnection = DriverManager.getConnection(session_enabled_connection_uri);
3758+
Statement sessionStatement = sessionConnection.createStatement();
3759+
3760+
try {
3761+
assertFalse(sessionStatement.execute("START TRANSACTION;"));
3762+
assertNull(sessionStatement.getResultSet());
3763+
assertEquals(0, sessionStatement.getUpdateCount());
3764+
3765+
// Validate no more results reset update count to -1
3766+
assertFalse(sessionStatement.getMoreResults());
3767+
assertEquals(-1, sessionStatement.getUpdateCount());
3768+
} finally {
3769+
sessionStatement.close();
3770+
sessionConnection.close();
3771+
}
3772+
}
3773+
37203774
@Test
37213775
public void testInformationSchemaTables() throws SQLException {
37223776
String query = String.format("SELECT * FROM %s.INFORMATION_SCHEMA.TABLES", DATASET);

0 commit comments

Comments
 (0)