This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new bfd634f9c79 [fix](protocol) only return multi result when
CLIENT_MULTI_STATEMENTS been set (#36759) (#36919)
bfd634f9c79 is described below
commit bfd634f9c79bd30511a90cb3021df4802046b96e
Author: morrySnow <[email protected]>
AuthorDate: Thu Jun 27 18:35:40 2024 +0800
[fix](protocol) only return multi result when CLIENT_MULTI_STATEMENTS been
set (#36759) (#36919)
pick from master #36759
multi statement support by PR #3050.
But there is a minor issue in implementation.
as MySQL dev doc say in
https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_command_phase_sp.html#sect_protocol_command_phase_sp_multi_statement
server should only process multi statement
when client set CLIENT_MULTI_STATEMENTS.
When client not set CLIENT_MULTI_STATEMENTS, server should treat query
as single statement.
but Doris do slightly different with MySQL server. Doris always treat
query as multi statement, but only return multi result when client set
CLIENT_MULTI_STATEMENTS. When client do not set CLIENT_MULTI_STATEMENTS,
Doris will return the last statement result only.
Co-authored-by: Mingyu Chen <[email protected]>
---
.../src/main/java/org/apache/doris/mysql/MysqlCapability.java | 6 +++++-
.../src/main/java/org/apache/doris/qe/ConnectProcessor.java | 8 +++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlCapability.java
b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlCapability.java
index 0701b6ac2f8..b3d4793eeb2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlCapability.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlCapability.java
@@ -161,9 +161,13 @@ public class MysqlCapability {
return (flags & Flag.CLIENT_DEPRECATE_EOF.getFlagBit()) != 0;
}
+ public boolean isClientMultiStatements() {
+ return (flags & Flag.CLIENT_MULTI_STATEMENTS.getFlagBit()) != 0;
+ }
+
@Override
public boolean equals(Object obj) {
- if (obj == null || !(obj instanceof MysqlCapability)) {
+ if (!(obj instanceof MysqlCapability)) {
return false;
}
if (flags != ((MysqlCapability) obj).flags) {
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 51911c03333..358e5d1a078 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
@@ -315,7 +315,13 @@ public abstract class ConnectProcessor {
if (i != stmts.size() - 1) {
ctx.getState().serverStatus |=
MysqlServerStatusFlag.SERVER_MORE_RESULTS_EXISTS;
if (ctx.getState().getStateType() !=
MysqlStateType.ERR) {
- finalizeCommand();
+ // here, doris do different with mysql.
+ // when client not request
CLIENT_MULTI_STATEMENTS, mysql treat all query as
+ // single statement. Doris treat it with multi
statement, but only return
+ // the last statement result.
+ if
(getConnectContext().getCapability().isClientMultiStatements()) {
+ finalizeCommand();
+ }
}
}
} else if
(connectType.equals(ConnectType.ARROW_FLIGHT_SQL)) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]