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 <[email protected]>
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);