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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 4bfecac08ae4d570bb1fd222597c5ca881c83595
Author: Vallish Pai <vallish...@gmail.com>
AuthorDate: Fri Mar 8 07:30:45 2024 +0530

    [enhancement](plsql) Support show procedure and show create procedure 
(#31297) (#31763)
---
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |  2 +
 .../antlr4/org/apache/doris/nereids/PLParser.g4    |  9 +++
 .../doris/nereids/parser/LogicalPlanBuilder.java   | 16 +++++
 .../apache/doris/nereids/trees/plans/PlanType.java |  4 +-
 .../plans/commands/ShowCreateProcedureCommand.java | 78 ++++++++++++++++++++++
 .../plans/commands/ShowProcedureStatusCommand.java | 76 +++++++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        | 10 +++
 .../plsql/functions/DorisFunctionRegistry.java     | 46 ++++++++++++-
 .../doris/plsql/functions/FunctionRegistry.java    |  6 ++
 .../plsql/functions/InMemoryFunctionRegistry.java  | 20 ++++--
 .../apache/doris/plsql/metastore/PlsqlManager.java |  4 ++
 .../doris/plsql/metastore/PlsqlMetaClient.java     | 20 ++++--
 .../plsql/metastore/PlsqlStoredProcedure.java      | 12 +++-
 gensrc/thrift/FrontendService.thrift               |  2 +
 14 files changed, 290 insertions(+), 15 deletions(-)

diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index a70df9eec92..8492b812a8d 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -38,6 +38,8 @@ statement
     | CALL name=multipartIdentifier LEFT_PAREN (expression (COMMA 
expression)*)? RIGHT_PAREN #callProcedure
     | (ALTER | CREATE (OR REPLACE)? | REPLACE) (PROCEDURE | PROC) 
name=multipartIdentifier LEFT_PAREN .*? RIGHT_PAREN .*? #createProcedure
     | DROP (PROCEDURE | PROC) (IF EXISTS)? name=multipartIdentifier 
#dropProcedure
+    | SHOW PROCEDURE STATUS (LIKE pattern=valueExpression | whereClause)? 
#showProcedureStatus
+    | SHOW CREATE PROCEDURE name=multipartIdentifier #showCreateProcedure
     ;
 
 statementBase
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
index b132f6537da..b052818c29e 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
@@ -99,6 +99,8 @@ stmt :
      | create_procedure_stmt
      | declare_stmt
      | drop_procedure_stmt
+     | show_procedure_stmt
+     | show_create_procedure_stmt
      | exec_stmt
      | exit_stmt
      | fetch_stmt
@@ -333,6 +335,13 @@ create_procedure_stmt :
 drop_procedure_stmt:
       DROP (PROCEDURE | PROC) (IF EXISTS)? name=multipartIdentifier
     ;
+show_procedure_stmt:
+      SHOW PROCEDURE STATUS (LIKE pattern=valueExpression | whereClause)?
+    ;
+
+show_create_procedure_stmt:
+      SHOW CREATE PROCEDURE name=multipartIdentifier
+    ;      
 
 create_routine_params :
        LEFT_PAREN RIGHT_PAREN
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 2ad86977c81..42b9540a20d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -161,6 +161,8 @@ import 
org.apache.doris.nereids.DorisParser.SelectColumnClauseContext;
 import org.apache.doris.nereids.DorisParser.SelectHintContext;
 import org.apache.doris.nereids.DorisParser.SetOperationContext;
 import org.apache.doris.nereids.DorisParser.ShowConstraintContext;
+import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext;
+import org.apache.doris.nereids.DorisParser.ShowProcedureStatusContext;
 import org.apache.doris.nereids.DorisParser.SimpleColumnDefContext;
 import org.apache.doris.nereids.DorisParser.SimpleColumnDefsContext;
 import org.apache.doris.nereids.DorisParser.SingleStatementContext;
@@ -370,6 +372,8 @@ import 
org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ResumeMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand;
 import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
 import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVInfo;
 import 
org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVPropertyInfo;
@@ -3372,4 +3376,16 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         FuncNameInfo procedureName = new FuncNameInfo(nameParts);
         return ParserUtils.withOrigin(ctx, () -> new 
DropProcedureCommand(procedureName, getOriginSql(ctx)));
     }
+
+    @Override
+    public LogicalPlan visitShowProcedureStatus(ShowProcedureStatusContext 
ctx) {
+        return ParserUtils.withOrigin(ctx, () -> new 
ShowProcedureStatusCommand());
+    }
+
+    @Override
+    public LogicalPlan visitShowCreateProcedure(ShowCreateProcedureContext 
ctx) {
+        List<String> nameParts = visitMultipartIdentifier(ctx.name);
+        FuncNameInfo procedureName = new FuncNameInfo(nameParts);
+        return ParserUtils.withOrigin(ctx, () -> new 
ShowCreateProcedureCommand(procedureName));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index dc6358d3dec..af27885fce3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -143,5 +143,7 @@ public enum PlanType {
     CANCEL_MTMV_TASK_COMMAND,
     CALL_COMMAND,
     CREATE_PROCEDURE_COMMAND,
-    DROP_PROCEDURE_COMMAND
+    DROP_PROCEDURE_COMMAND,
+    SHOW_PROCEDURE_COMMAND,
+    SHOW_CREATE_PROCEDURE_COMMAND
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateProcedureCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateProcedureCommand.java
new file mode 100644
index 00000000000..85c97a2ba15
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateProcedureCommand.java
@@ -0,0 +1,78 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.FuncNameInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSet;
+import org.apache.doris.qe.ShowResultSetMetaData;
+import org.apache.doris.qe.StmtExecutor;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * show create procedure command
+ */
+public class ShowCreateProcedureCommand extends Command implements NoForward {
+
+    public static final Logger LOG = 
LogManager.getLogger(ShowCreateProcedureCommand.class);
+    public static final ImmutableList<String> TITLE_NAMES = new 
ImmutableList.Builder<String>().add("Procedure")
+                                                                .add("Create 
Procedure").build();
+    private final FuncNameInfo procedureName;
+    /**
+     * constructor
+     */
+
+    public ShowCreateProcedureCommand(FuncNameInfo procedureName) {
+        super(PlanType.SHOW_PROCEDURE_COMMAND);
+        this.procedureName = procedureName;
+
+    }
+
+    public ShowResultSetMetaData getMetaData() {
+        ShowResultSetMetaData.Builder builder = 
ShowResultSetMetaData.builder();
+        for (String title : TITLE_NAMES) {
+            builder.addColumn(new Column(title, 
ScalarType.createStringType()));
+        }
+        return builder.build();
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        List<List<String>> results = new ArrayList<>();
+        
ctx.getPlSqlOperation().getExec().functions.showCreateProcedure(this.procedureName,
 results);
+        if (!results.isEmpty()) {
+            ShowResultSet commonResultSet = new ShowResultSet(getMetaData(), 
results);
+            executor.sendResultSet(commonResultSet);
+        }
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitShowCreateProcedureCommand(this, context);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowProcedureStatusCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowProcedureStatusCommand.java
new file mode 100644
index 00000000000..4ba6688d4f4
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowProcedureStatusCommand.java
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSet;
+import org.apache.doris.qe.ShowResultSetMetaData;
+import org.apache.doris.qe.StmtExecutor;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * show procedure status command
+ */
+public class ShowProcedureStatusCommand extends Command implements NoForward {
+
+    public static final Logger LOG = 
LogManager.getLogger(ShowProcedureStatusCommand.class);
+    public static final ImmutableList<String> TITLE_NAMES = new 
ImmutableList.Builder<String>().add("ProcedureName")
+                                                                
.add("CatalogId").add("DbId").add("PackageName")
+                                                                
.add("OwnerName").add("CreateTime").add("ModifyTime")
+                                                                .build();
+
+    /**
+     * constructor
+     */
+    public ShowProcedureStatusCommand() {
+        super(PlanType.SHOW_PROCEDURE_COMMAND);
+    }
+
+    public ShowResultSetMetaData getMetaData() {
+        ShowResultSetMetaData.Builder builder = 
ShowResultSetMetaData.builder();
+        for (String title : TITLE_NAMES) {
+            builder.addColumn(new Column(title, 
ScalarType.createStringType()));
+        }
+        return builder.build();
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        List<List<String>> results = new ArrayList<>();
+        ctx.getPlSqlOperation().getExec().functions.showProcedure(results);
+        if (!results.isEmpty()) {
+            ShowResultSet commonResultSet = new ShowResultSet(getMetaData(), 
results);
+            executor.sendResultSet(commonResultSet);
+        }
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitShowProcedureStatusCommand(this, context);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
index 07e9020f1ff..9626942e10b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
@@ -41,6 +41,8 @@ import 
org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ResumeMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand;
 import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
 
 /** CommandVisitor. */
@@ -146,4 +148,12 @@ public interface CommandVisitor<R, C> {
     default R visitDropProcedureCommand(DropProcedureCommand 
dropProcedureCommand, C context) {
         return visitCommand(dropProcedureCommand, context);
     }
+
+    default R visitShowProcedureStatusCommand(ShowProcedureStatusCommand 
showProcedureStatusCommand, C context) {
+        return visitCommand(showProcedureStatusCommand, context);
+    }
+
+    default R visitShowCreateProcedureCommand(ShowCreateProcedureCommand 
showCreateProcedureCommand, C context) {
+        return visitCommand(showCreateProcedureCommand, context);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/DorisFunctionRegistry.java
 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/DorisFunctionRegistry.java
index 8316962a209..82283fc9ad5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/DorisFunctionRegistry.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/DorisFunctionRegistry.java
@@ -32,6 +32,7 @@ import org.apache.doris.plsql.Exec;
 import org.apache.doris.plsql.Scope;
 import org.apache.doris.plsql.Var;
 import org.apache.doris.plsql.metastore.PlsqlMetaClient;
+import org.apache.doris.plsql.metastore.PlsqlProcedureKey;
 import org.apache.doris.plsql.metastore.PlsqlStoredProcedure;
 import org.apache.doris.qe.ConnectContext;
 
@@ -39,8 +40,11 @@ import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.ParserRuleContext;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
@@ -85,6 +89,35 @@ public class DorisFunctionRegistry implements 
FunctionRegistry {
         return (ConnectContext.get().getDatabase() + "." + name).toUpperCase();
     }
 
+    @Override
+    public void showProcedure(List<List<String>> columns) {
+        Map<PlsqlProcedureKey, PlsqlStoredProcedure> allProc = 
client.getAllPlsqlStoredProcedures();
+        for (Map.Entry<PlsqlProcedureKey, PlsqlStoredProcedure> entry : 
allProc.entrySet()) {
+            List<String> row = new ArrayList<>();
+            PlsqlStoredProcedure proc = entry.getValue();
+            row.add(proc.getName());
+            row.add(Long.toString(proc.getCatalogId()));
+            row.add(Long.toString(proc.getDbId()));
+            row.add(proc.getPackageName());
+            row.add(proc.getOwnerName());
+            row.add(proc.getCreateTime());
+            row.add(proc.getModifyTime());
+            row.add(proc.getSource());
+            columns.add(row);
+        }
+    }
+
+    @Override
+    public void showCreateProcedure(FuncNameInfo procedureName, 
List<List<String>> columns) {
+        List<String> row = new ArrayList<>();
+        PlsqlStoredProcedure proc = 
client.getPlsqlStoredProcedure(procedureName.getName(),
+                                                                
procedureName.getCtlId(), procedureName.getDbId());
+        if (proc != null) {
+            row.add(proc.getName());
+            row.add(proc.getSource());
+            columns.add(row);
+        }
+    }
 
     @Override
     public boolean exec(FuncNameInfo procedureName, Expr_func_paramsContext 
ctx) {
@@ -196,10 +229,21 @@ public class DorisFunctionRegistry implements 
FunctionRegistry {
     @Override
     public void save(FuncNameInfo procedureName, String source, boolean 
isForce) {
         try {
+            SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String createTime = f.format(Calendar.getInstance().getTime());
+            String modifyTime = createTime;
+            if (isForce) {
+                // need to get create time and use that.
+                PlsqlStoredProcedure oldProc = 
client.getPlsqlStoredProcedure(procedureName.getName(),
+                                                        
procedureName.getCtlId(), procedureName.getDbId());
+                if (oldProc != null) {
+                    createTime = oldProc.getCreateTime();
+                }
+            }
             // TODO support packageName
             client.addPlsqlStoredProcedure(procedureName.getName(), 
procedureName.getCtlId(), procedureName.getDbId(),
                     "",
-                    ConnectContext.get().getQualifiedUser(), source, isForce);
+                    ConnectContext.get().getQualifiedUser(), source, 
createTime, modifyTime, isForce);
         } catch (Exception e) {
             throw new RuntimeException("failed to save procedure", e);
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/FunctionRegistry.java
 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/FunctionRegistry.java
index e9d07c31682..abd0e819d18 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/FunctionRegistry.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/FunctionRegistry.java
@@ -25,6 +25,8 @@ import 
org.apache.doris.nereids.PLParser.Create_procedure_stmtContext;
 import org.apache.doris.nereids.PLParser.Expr_func_paramsContext;
 import org.apache.doris.nereids.trees.plans.commands.info.FuncNameInfo;
 
+import java.util.List;
+
 public interface FunctionRegistry {
     boolean exec(FuncNameInfo procedureName, Expr_func_paramsContext ctx);
 
@@ -39,4 +41,8 @@ public interface FunctionRegistry {
     void remove(FuncNameInfo procedureName);
 
     void removeCached(String name);
+
+    void showProcedure(List<List<String>> columns);
+
+    void showCreateProcedure(FuncNameInfo procedureName, List<List<String>> 
columns);
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/InMemoryFunctionRegistry.java
 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/InMemoryFunctionRegistry.java
index 59143a57194..67e0eb7d097 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/InMemoryFunctionRegistry.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/functions/InMemoryFunctionRegistry.java
@@ -37,6 +37,7 @@ import org.antlr.v4.runtime.ParserRuleContext;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -71,6 +72,14 @@ public class InMemoryFunctionRegistry implements 
FunctionRegistry {
         procMap.remove(procedureName.toString());
     }
 
+    public void showProcedure(List<List<String>> columns) {
+
+    }
+
+    public void showCreateProcedure(FuncNameInfo procedureName, 
List<List<String>> columns) {
+
+    }
+
     @Override
     public boolean exec(FuncNameInfo procedureName, Expr_func_paramsContext 
ctx) {
         if (builtinFunctions.exec(procedureName.toString(), ctx)) {
@@ -134,7 +143,7 @@ public class InMemoryFunctionRegistry implements 
FunctionRegistry {
         visit(procCtx.procedure_block());
         exec.callStackPop();
         exec.leaveScope();
-        for (Map.Entry<String, Var> i : out.entrySet()) {      // Set OUT 
parameters, related to prepare statement.
+        for (Map.Entry<String, Var> i : out.entrySet()) { // Set OUT 
parameters, related to prepare statement.
             exec.setVariable(i.getKey(), i.getValue());
         }
         return true;
@@ -143,9 +152,8 @@ public class InMemoryFunctionRegistry implements 
FunctionRegistry {
     /**
      * Set parameters for user-defined function call
      */
-    public static void setCallParameters(String procName, 
Expr_func_paramsContext actual,
-            ArrayList<Var> actualValues, Create_routine_paramsContext formal, 
HashMap<String, Var> out,
-            Exec exec) {
+    public static void setCallParameters(String procName, 
Expr_func_paramsContext actual, ArrayList<Var> actualValues,
+            Create_routine_paramsContext formal, HashMap<String, Var> out, 
Exec exec) {
         if (actual == null || actual.func_param() == null || actualValues == 
null) {
             return;
         }
@@ -169,8 +177,8 @@ public class InMemoryFunctionRegistry implements 
FunctionRegistry {
             }
             Var var = setCallParameter(name, type, len, scale, 
actualValues.get(i), exec);
             exec.trace(actual, "SET PARAM " + name + " = " + var.toString());
-            if (out != null && a.expr_atom() != null && a.expr_atom().qident() 
!= null && (p.OUT() != null
-                    || p.INOUT() != null)) {
+            if (out != null && a.expr_atom() != null && a.expr_atom().qident() 
!= null
+                    && (p.OUT() != null || p.INOUT() != null)) {
                 String actualName = a.expr_atom().qident().getText();
                 if (actualName != null) {
                     out.put(actualName, var);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlManager.java
index 0057c9b7275..87cbd7b58a3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlManager.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlManager.java
@@ -48,6 +48,10 @@ public class PlsqlManager implements Writable {
         return nameToStoredProcedures.get(plsqlProcedureKey);
     }
 
+    public Map<PlsqlProcedureKey, PlsqlStoredProcedure> 
getAllPlsqlStoredProcedures() {
+        return nameToStoredProcedures;
+    }
+
     public void addPlsqlStoredProcedure(PlsqlStoredProcedure procedure, 
boolean isForce) {
         PlsqlProcedureKey plsqlProcedureKey = new 
PlsqlProcedureKey(procedure.getName(), procedure.getCatalogId(),
                 procedure.getDbId());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlMetaClient.java
 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlMetaClient.java
index 15974511b78..cef95e826c3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlMetaClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlMetaClient.java
@@ -35,6 +35,7 @@ import org.apache.doris.thrift.TStatusCode;
 
 import org.apache.thrift.TException;
 
+import java.util.Map;
 import java.util.Objects;
 
 public class PlsqlMetaClient {
@@ -42,16 +43,18 @@ public class PlsqlMetaClient {
     }
 
     public void addPlsqlStoredProcedure(String name, long catalogId, long 
dbId, String packageName,
-            String ownerName, String source,
+            String ownerName, String source, String createTime, String 
modifyTime,
             boolean isForce) {
         checkPriv();
         if (Env.getCurrentEnv().isMaster()) {
             Env.getCurrentEnv().getPlsqlManager()
                     .addPlsqlStoredProcedure(
-                            new PlsqlStoredProcedure(name, catalogId, dbId, 
packageName, ownerName, source),
+                            new PlsqlStoredProcedure(name, catalogId, dbId, 
packageName, ownerName, source,
+                            createTime, modifyTime),
                             isForce);
         } else {
-            addPlsqlStoredProcedureThrift(name, catalogId, dbId, packageName, 
ownerName, source, isForce);
+            addPlsqlStoredProcedureThrift(name, catalogId, dbId, packageName, 
ownerName, source,
+                                            createTime, modifyTime, isForce);
         }
     }
 
@@ -70,6 +73,11 @@ public class PlsqlMetaClient {
                 .getPlsqlStoredProcedure(new PlsqlProcedureKey(name, 
catalogId, dbId));
     }
 
+    public Map<PlsqlProcedureKey, PlsqlStoredProcedure> 
getAllPlsqlStoredProcedures() {
+        return Env.getCurrentEnv().getPlsqlManager()
+                .getAllPlsqlStoredProcedures();
+    }
+
     public void addPlsqlPackage(String name, long catalogId, long dbId, String 
ownerName, String header,
             String body) {
         checkPriv();
@@ -97,10 +105,12 @@ public class PlsqlMetaClient {
 
     protected void addPlsqlStoredProcedureThrift(String name, long catalogId, 
long dbId, String packageName,
             String ownerName,
-            String source, boolean isForce) {
+            String source, String createTime, String modifyTime, boolean 
isForce) {
         TPlsqlStoredProcedure tPlsqlStoredProcedure = new 
TPlsqlStoredProcedure().setName(name)
                 .setCatalogId(catalogId).setDbId(dbId)
-                
.setPackageName(packageName).setOwnerName(ownerName).setSource(source);
+                
.setPackageName(packageName).setOwnerName(ownerName).setSource(source)
+                .setCreateTime(createTime).setModifyTime(modifyTime);
+
         TAddPlsqlStoredProcedureRequest tAddPlsqlStoredProcedureRequest = new 
TAddPlsqlStoredProcedureRequest()
                 .setPlsqlStoredProcedure(tPlsqlStoredProcedure);
         tAddPlsqlStoredProcedureRequest.setIsForce(isForce);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlStoredProcedure.java
 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlStoredProcedure.java
index 9325684cc47..c17b0b9105b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlStoredProcedure.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/plsql/metastore/PlsqlStoredProcedure.java
@@ -51,14 +51,22 @@ public class PlsqlStoredProcedure implements Writable {
     @SerializedName(value = "source")
     private String source;
 
+    @SerializedName(value = "createTime")
+    private String createTime;
+
+    @SerializedName(value = "modifyTime")
+    private String modifyTime;
+
     public TPlsqlStoredProcedure toThrift() {
         return new 
TPlsqlStoredProcedure().setName(name).setCatalogId(catalogId).setDbId(dbId)
-                
.setPackageName(packageName).setOwnerName(ownerName).setSource(source);
+                
.setPackageName(packageName).setOwnerName(ownerName).setSource(source)
+                .setCreateTime(createTime).setModifyTime(modifyTime);
     }
 
     public static PlsqlStoredProcedure fromThrift(TPlsqlStoredProcedure 
procedure) {
         return new PlsqlStoredProcedure(procedure.getName(), 
procedure.getCatalogId(), procedure.getDbId(),
-                procedure.getPackageName(), procedure.getOwnerName(), 
procedure.source);
+                procedure.getPackageName(), procedure.getOwnerName(), 
procedure.source,
+                procedure.getCreateTime(), procedure.getModifyTime());
     }
 
     @Override
diff --git a/gensrc/thrift/FrontendService.thrift 
b/gensrc/thrift/FrontendService.thrift
index 44e4954e9d2..176199325c7 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -1147,6 +1147,8 @@ struct TPlsqlStoredProcedure {
     4: optional string packageName
     5: optional string ownerName
     6: optional string source
+    7: optional string createTime
+    8: optional string modifyTime
 }
 
 struct TPlsqlPackage {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to