This is an automated email from the ASF dual-hosted git repository.

rubenql pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite-avatica.git


The following commit(s) were added to refs/heads/main by this push:
     new 74a736472 [CALCITE-4900] NullPointerException when send 
ExectuteRequest via protobuf with no parameters
74a736472 is described below

commit 74a7364728b463ba347ad4f921d633a6141b66a7
Author: Aleksey Stavrov <logio...@ya.ru>
AuthorDate: Wed Nov 24 13:36:23 2021 +0500

    [CALCITE-4900] NullPointerException when send ExectuteRequest via protobuf 
with no parameters
---
 .../org/apache/calcite/avatica/jdbc/JdbcMeta.java  |  4 +--
 .../apache/calcite/avatica/jdbc/JdbcMetaTest.java  | 30 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java 
b/server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index 257eead43..363ea4bac 100644
--- a/server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -846,11 +846,11 @@ public class JdbcMeta implements ProtobufMeta {
   @Override public ExecuteResult execute(StatementHandle h,
       List<TypedValue> parameterValues, int maxRowsInFirstFrame) throws 
NoSuchStatementException {
     try {
-      if (MetaImpl.checkParameterValueHasNull(parameterValues)) {
+      if (parameterValues != null && 
MetaImpl.checkParameterValueHasNull(parameterValues)) {
         throw new SQLException("exception while executing query: unbound 
parameter");
       }
 
-      final StatementInfo statementInfo = statementCache.getIfPresent(h.id);
+      final StatementInfo statementInfo = 
getStatementCache().getIfPresent(h.id);
       if (null == statementInfo) {
         throw new NoSuchStatementException(h);
       }
diff --git 
a/server/src/test/java/org/apache/calcite/avatica/jdbc/JdbcMetaTest.java 
b/server/src/test/java/org/apache/calcite/avatica/jdbc/JdbcMetaTest.java
index 494b9ab69..7b6787ff7 100644
--- a/server/src/test/java/org/apache/calcite/avatica/jdbc/JdbcMetaTest.java
+++ b/server/src/test/java/org/apache/calcite/avatica/jdbc/JdbcMetaTest.java
@@ -123,6 +123,36 @@ public class JdbcMetaTest {
     Mockito.verify(statement).setMaxRows(maxRows);
   }
 
+  @Test public void testPrepareNoParams() throws Exception {
+    final String id = UUID.randomUUID().toString();
+    final int statementId = 12345;
+    final int maxRows = 500;
+
+    JdbcMeta meta = Mockito.mock(JdbcMeta.class);
+
+    @SuppressWarnings("unchecked")
+    Cache<Integer, StatementInfo> statementCache =
+        (Cache<Integer, StatementInfo>) Mockito.mock(Cache.class);
+
+    PreparedStatement statement = Mockito.mock(PreparedStatement.class);
+    Signature signature = Mockito.mock(Signature.class);
+
+    final StatementInfo statementInfo = new StatementInfo(statement);
+    final StatementHandle statementHandle = new StatementHandle(id, 
statementId, signature);
+
+    Mockito.when(meta.getStatementCache()).thenReturn(statementCache);
+    
Mockito.when(statementCache.getIfPresent(statementId)).thenReturn(statementInfo);
+    Mockito.when(statement.getResultSet()).thenReturn(null);
+    // The real methods
+    Mockito.when(meta.execute(statementHandle, null, 
maxRows)).thenCallRealMethod();
+
+    // Call our method
+    meta.execute(statementHandle, null, maxRows);
+
+    // Make sure we call execute and there is no exception
+    Mockito.verify(statement).execute();
+  }
+
   @Test public void testConcurrentConnectionOpening() throws Exception {
     final Map<String, String> properties = Collections.emptyMap();
     final Connection conn = Mockito.mock(Connection.class);

Reply via email to