This is an automated email from the ASF dual-hosted git repository.
zouxinyi 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 50aadf6960f [fix](plsql) Fix handle select that fe can do without be
(#33363)
50aadf6960f is described below
commit 50aadf6960f974d25dc28b8b846aa74a6522b6a5
Author: Xinyi Zou <[email protected]>
AuthorDate: Wed Apr 10 10:53:35 2024 +0800
[fix](plsql) Fix handle select that fe can do without be (#33363)
CREATE OR REPLACE PROCEDURE procedure_test1()
BEGIN
select 1;
END;
call procedure_test1()
fix `ERROR 2027 (HY000): Malformed packet`
---
.../src/main/java/org/apache/doris/plsql/Stmt.java | 2 +-
.../doris/plsql/executor/PlsqlQueryExecutor.java | 1 +
.../apache/doris/plsql/executor/PlsqlResult.java | 3 ++-
.../apache/doris/plsql/executor/QueryResult.java | 4 ++++
.../java/org/apache/doris/qe/ConnectProcessor.java | 4 ++++
.../java/org/apache/doris/qe/StmtExecutor.java | 7 ++++++
.../data/plsql_p0/test_plsql_variable.out | 6 +++++
.../suites/plsql_p0/test_plsql_variable.groovy | 27 ++++++++++++++++++++++
8 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/plsql/Stmt.java
b/fe/fe-core/src/main/java/org/apache/doris/plsql/Stmt.java
index d86a648b99a..2166b5a8378 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/plsql/Stmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/plsql/Stmt.java
@@ -142,7 +142,7 @@ public class Stmt {
}
} else if (ctx instanceof Doris_statementContext) { // only from
visitStatement
// Print all results for standalone Statement.
- if (query.metadata() != null) {
+ if (query.metadata() != null && !query.isHandleQueryInFe()) {
resultListener.onMetadata(query.metadata());
int cols = query.columnCount();
if (trace) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlQueryExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlQueryExecutor.java
index 7978b4fc598..f9c7ca767fc 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlQueryExecutor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlQueryExecutor.java
@@ -53,6 +53,7 @@ public class PlsqlQueryExecutor implements QueryExecutor {
return new QueryResult(new DorisRowResult(executor.getCoord(),
executor.getColumns(),
executor.getReturnTypes()), () -> metadata(executor),
processor, null);
} else {
+ // If ResultExpr is empty, not need to return result in
plsql.Stmt.statement()
return new QueryResult(new DorisRowResult(executor.getCoord(),
executor.getColumns(), null),
null, processor, null);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlResult.java
b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlResult.java
index 76e600e7fcc..3191872b270 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlResult.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/PlsqlResult.java
@@ -121,7 +121,8 @@ public class PlsqlResult implements ResultListener, Console
{
@Override
public void onFinalize() {
// If metadata not null, it means that mysql channel sent query
results.
- if (metadata == null) {
+ // If selectByFe, send result in handleQueryStmt.
+ if (metadata == null && !processor.isHandleQueryInFe()) {
return;
}
finalizeCommand();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/QueryResult.java
b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/QueryResult.java
index af1d32155f5..53d85474771 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/QueryResult.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/plsql/executor/QueryResult.java
@@ -58,6 +58,10 @@ public class QueryResult {
return metadata != null ? metadata().columnCount() : 0;
}
+ public boolean isHandleQueryInFe() {
+ return processor.isHandleQueryInFe();
+ }
+
/**
* Get the nth column from the row result.
* The index is 0 based unlike in JDBC.
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 a85beef3088..16c6b6afb82 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
@@ -106,6 +106,10 @@ public abstract class ConnectProcessor {
return ctx;
}
+ public boolean isHandleQueryInFe() {
+ return executor.isHandleQueryInFe();
+ }
+
// change current database of this session.
protected void handleInitDb(String fullDbName) {
String catalogName = null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 5bbe01ef793..15d8c22af5e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -274,6 +274,8 @@ public class StmtExecutor {
private String mysqlLoadId;
// Distinguish from prepare and execute command
private boolean isExecuteStmt = false;
+ // Handle selects that fe can do without be
+ private boolean isHandleQueryInFe = false;
// The profile of this execution
private final Profile profile;
@@ -505,6 +507,10 @@ public class StmtExecutor {
return parsedStmt;
}
+ public boolean isHandleQueryInFe() {
+ return isHandleQueryInFe;
+ }
+
// query with a random sql
public void execute() throws Exception {
UUID uuid = UUID.randomUUID();
@@ -1711,6 +1717,7 @@ public class StmtExecutor {
Optional<ResultSet> resultSet =
planner.handleQueryInFe(parsedStmt);
if (resultSet.isPresent()) {
sendResultSet(resultSet.get());
+ isHandleQueryInFe = true;
LOG.info("Query {} finished",
DebugUtil.printId(context.queryId));
return;
}
diff --git a/regression-test/data/plsql_p0/test_plsql_variable.out
b/regression-test/data/plsql_p0/test_plsql_variable.out
index 2fc878d6fcf..d486d47bae2 100644
--- a/regression-test/data/plsql_p0/test_plsql_variable.out
+++ b/regression-test/data/plsql_p0/test_plsql_variable.out
@@ -11,3 +11,9 @@
-- !select --
0
+-- !select --
+0
+
+-- !select --
+1 2024-04-07 9989012.0
+
diff --git a/regression-test/suites/plsql_p0/test_plsql_variable.groovy
b/regression-test/suites/plsql_p0/test_plsql_variable.groovy
index eace315c40c..566bd78c86e 100644
--- a/regression-test/suites/plsql_p0/test_plsql_variable.groovy
+++ b/regression-test/suites/plsql_p0/test_plsql_variable.groovy
@@ -108,8 +108,35 @@ suite("test_plsql_variable") {
"""
qt_select """call plsql_variable3()"""
+ sql """
+ CREATE OR REPLACE PROCEDURE plsql_variable4()
+ BEGIN
+ select 1;
+ select now();
+ select to_date("2024-04-07 00:00:00");
+ select 9999 * 999 + 99 / 9;
+ END;
+ """
+ // qt_select """call plsql_variable4()""" // Groovy jdbc not support
procedure return select results.
+
+ sql "DROP TABLE IF EXISTS plsql_variable2"
+ sql """
+ create table plsql_variable2 (k1 int, k2 varchar(20), k3 double)
DUPLICATE key(`k1`) distributed by hash (`k1`) buckets 1
+ properties ("replication_num"="1");
+ """
+ sql """
+ CREATE OR REPLACE PROCEDURE plsql_variable5()
+ BEGIN
+ INSERT INTO plsql_variable2 select 1, to_date("2024-04-07
00:00:00"), 9999 * 999 + 99 / 9;
+ END;
+ """
+ qt_select """call plsql_variable5()"""
+ qt_select "select * from plsql_variable2"
+
sql """DROP PROCEDURE plsql_variable1"""
sql """DROP PROCEDURE plsql_variable2"""
sql """DROP PROCEDURE plsql_variable3"""
+ sql """DROP PROCEDURE plsql_variable4"""
+ sql """DROP PROCEDURE plsql_variable5"""
sql """DROP PROC plsql_variable_insert"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]