From e591b575c7656d1175ab66181f77a56635ed4175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 10 Mar 2021 13:50:39 +0100 Subject: [PATCH] fix: call .next() before getting metadata --- .../cloud/spanner/jdbc/JdbcPreparedStatement.java | 6 ++++-- .../cloud/spanner/jdbc/JdbcPreparedStatementTest.java | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatement.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatement.java index 0d451bf88..d8eeb6232 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatement.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatement.java @@ -99,8 +99,10 @@ public ResultSetMetaData getMetaData() throws SQLException { if (StatementParser.INSTANCE.isUpdateStatement(sql)) { // Return metadata for an empty result set as DML statements do not return any results (as a // result set). - return new JdbcResultSetMetaData( - JdbcResultSet.of(ResultSets.forRows(Type.struct(), ImmutableList.of())), this); + com.google.cloud.spanner.ResultSet resultSet = + ResultSets.forRows(Type.struct(), ImmutableList.of()); + resultSet.next(); + return new JdbcResultSetMetaData(JdbcResultSet.of(resultSet), this); } try (ResultSet rs = analyzeQuery(createStatement(), QueryAnalyzeMode.PLAN)) { return rs.getMetaData(); diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatementTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatementTest.java index ddbab6d18..5a1235f5d 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatementTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcPreparedStatementTest.java @@ -307,4 +307,15 @@ public void testGetResultSetMetadata() throws SQLException { assertEquals(Types.DOUBLE, metadata.getColumnType(3)); } } + + @Test + public void testGetResultSetMetaDataForDml() throws SQLException { + Connection connection = mock(Connection.class); + try (JdbcPreparedStatement ps = + new JdbcPreparedStatement( + createMockConnection(connection), "UPDATE FOO SET BAR=1 WHERE TRUE")) { + ResultSetMetaData metadata = ps.getMetaData(); + assertEquals(0, metadata.getColumnCount()); + } + } }