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

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 9a07ae890a [fix](point query) Fix ArrayIndexOutOfBoundsException if 
close a prepare stmt (#22237)
9a07ae890a is described below

commit 9a07ae890aa7c70d3b1d9a9a9b9ac2f6c858f913
Author: meiyi <[email protected]>
AuthorDate: Wed Jul 26 18:22:07 2023 +0800

    [fix](point query) Fix ArrayIndexOutOfBoundsException if close a prepare 
stmt (#22237)
---
 .../src/main/java/org/apache/doris/qe/ConnectContext.java   |  4 ++++
 .../src/main/java/org/apache/doris/qe/ConnectProcessor.java | 13 +++++++++++--
 .../src/main/java/org/apache/doris/qe/QueryState.java       |  4 ++++
 .../suites/point_query_p0/test_point_query.groovy           |  1 +
 4 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
index 02aec996bc..bc7b5273c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
@@ -289,6 +289,10 @@ public class ConnectContext {
         this.preparedStmtCtxs.put(stmtName, ctx);
     }
 
+    public void removePrepareStmt(String stmtName) {
+        this.preparedStmtCtxs.remove(stmtName);
+    }
+
     public PrepareStmtContext getPreparedStmt(String stmtName) {
         return this.preparedStmtCtxs.get(stmtName);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
index 734ec0edf3..7b4a60a5a1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
@@ -180,6 +180,16 @@ public class ConnectProcessor {
         ctx.getState().setOk();
     }
 
+    private void handleStmtClose() {
+        packetBuf = packetBuf.order(ByteOrder.LITTLE_ENDIAN);
+        int stmtId = packetBuf.getInt();
+        LOG.debug("close stmt id: {}", stmtId);
+        ConnectContext.get().removePrepareStmt(String.valueOf(stmtId));
+        // No response packet is sent back to the client, see
+        // 
https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_stmt_close.html
+        ctx.getState().setNoop();
+    }
+
     private void debugPacket() {
         byte[] bytes = packetBuf.array();
         StringBuilder printB = new StringBuilder();
@@ -597,8 +607,7 @@ public class ConnectProcessor {
                 handleStmtReset();
                 break;
             case COM_STMT_CLOSE:
-                // TODO
-                handleStmtReset();
+                handleStmtClose();
                 break;
             default:
                 ctx.getState().setError(ErrorCode.ERR_UNKNOWN_COM_ERROR, 
"Unsupported command(" + command + ")");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/QueryState.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/QueryState.java
index b075ccc984..3619a15876 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/QueryState.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/QueryState.java
@@ -69,6 +69,10 @@ public class QueryState {
         return stateType;
     }
 
+    public void setNoop() {
+        stateType = MysqlStateType.NOOP;
+    }
+
     public void setEof() {
         stateType = MysqlStateType.EOF;
     }
diff --git a/regression-test/suites/point_query_p0/test_point_query.groovy 
b/regression-test/suites/point_query_p0/test_point_query.groovy
index 2cf7cb4949..48cea40718 100644
--- a/regression-test/suites/point_query_p0/test_point_query.groovy
+++ b/regression-test/suites/point_query_p0/test_point_query.groovy
@@ -142,6 +142,7 @@ suite("test_point_query") {
       stmt.setBigDecimal(2, new BigDecimal("120939.11130"))
       stmt.setString(3, generateString(298))
       qe_point_select stmt
+      stmt.close()
 
       stmt = prepareStatement "select * from ${tableName} where k1 = 1235 and 
k2 = ? and k3 = ?"
       assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to