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

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


The following commit(s) were added to refs/heads/master by this push:
     new e4b688cc5d2 support parse oracle create procedure body end name. 
(#29775)
e4b688cc5d2 is described below

commit e4b688cc5d242786fda9a3dd1b829ddc831f8e6c
Author: Chuxin Chen <[email protected]>
AuthorDate: Fri Jan 19 16:13:48 2024 +0800

    support parse oracle create procedure body end name. (#29775)
---
 .../visitor/statement/OracleStatementVisitor.java  |  3 ++
 .../statement/type/OracleDDLStatementVisitor.java  |  8 +++-
 .../oracle/ddl/OracleCreateProcedureStatement.java |  3 ++
 .../oracle/plsql/ProcedureBodyEndNameSegment.java  | 42 +++++++++++++++++
 .../ddl/CreateProcedureStatementHandlerTest.java   |  3 +-
 .../statement/plsql/PLSQLStatementAssert.java      | 12 +++++
 .../cases/parser/jaxb/RootSQLParserTestCases.java  |  4 +-
 .../plsql/ExpectedProcedureBodyEndNameSegment.java | 35 ++++++++++++++
 .../ddl/CreateProcedureStatementTestCase.java      | 54 ----------------------
 .../statement/plsql/CreateProcedureTestCase.java   |  5 ++
 .../main/resources/case/ddl/create-procedure.xml   | 22 +++++++--
 .../main/resources/case/plsql/create-procedure.xml | 13 ++++--
 12 files changed, 138 insertions(+), 66 deletions(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index 4420a4e23ff..cd9f8cc8112 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -171,6 +171,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.xml.XmlTa
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.xml.XmlTableOptionsSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleSelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.CursorForLoopStatementSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureCallNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.SQLStatementSegment;
 
@@ -199,6 +200,8 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
     
     private final List<ProcedureCallNameSegment> procedureCallNames = new 
ArrayList<>();
     
+    private final List<ProcedureBodyEndNameSegment> 
procedureBodyEndNameSegments = new ArrayList<>();
+    
     private final List<ExpressionSegment> dynamicSqlStatementExpressions = new 
ArrayList<>();
     
     private final Collection<String> variableNames = new HashSet<>();
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 00863f408ad..fcc33088378 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -344,6 +344,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleTruncateStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleSelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.CursorForLoopStatementSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureCallNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.SQLStatementSegment;
 
@@ -1343,7 +1344,8 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         
getSqlStatementsInPlsql().sort(Comparator.comparingInt(SQLStatementSegment::getStartIndex));
         
getProcedureCallNames().sort(Comparator.comparingInt(ProcedureCallNameSegment::getStartIndex));
         
getDynamicSqlStatementExpressions().sort(Comparator.comparingInt(ExpressionSegment::getStartIndex));
-        OracleCreateProcedureStatement result = new 
OracleCreateProcedureStatement(getSqlStatementsInPlsql(), 
getProcedureCallNames(), getDynamicSqlStatementExpressions());
+        OracleCreateProcedureStatement result = new 
OracleCreateProcedureStatement(getSqlStatementsInPlsql(), 
getProcedureCallNames(), getProcedureBodyEndNameSegments(),
+                getDynamicSqlStatementExpressions());
         
result.setProcedureName(visitProcedureName(ctx.plsqlProcedureSource()));
         result.getVariableNames().addAll(getVariableNames());
         getSqlStatementsInPlsql().forEach(each -> 
each.getSqlStatement().getVariableNames().addAll(getVariableNames()));
@@ -1446,6 +1448,10 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
                 visit(each);
             }
         }
+        if (null != ctx.identifier()) {
+            getProcedureBodyEndNameSegments().add(
+                    new 
ProcedureBodyEndNameSegment(ctx.identifier().getStart().getStartIndex(), 
ctx.identifier().getStop().getStopIndex(), new 
IdentifierValue(ctx.identifier().getText())));
+        }
         return defaultResult();
     }
     
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateProcedureStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateProcedureStatement.java
index 69b28bde8be..9f6bfcd29d0 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateProcedureStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateProcedureStatement.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateProcedureStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.CursorForLoopStatementSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureCallNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.SQLStatementSegment;
 
@@ -40,6 +41,8 @@ public final class OracleCreateProcedureStatement extends 
CreateProcedureStateme
     
     private final List<ProcedureCallNameSegment> procedureCallNames;
     
+    private final List<ProcedureBodyEndNameSegment> 
procedureBodyEndNameSegments;
+    
     private final List<ExpressionSegment> dynamicSqlStatementExpressions;
     
     private final List<CursorForLoopStatementSegment> cursorForLoopStatements 
= new ArrayList<>();
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/plsql/ProcedureBodyEndNameSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/plsql/ProcedureBodyEndNameSegment.java
new file mode 100644
index 00000000000..b37c1d3ae92
--- /dev/null
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/plsql/ProcedureBodyEndNameSegment.java
@@ -0,0 +1,42 @@
+/*
+ * 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.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+
+/**
+ * PL/SQL procedure body end name segment.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class ProcedureBodyEndNameSegment implements SQLSegment {
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private final IdentifierValue identifier;
+    
+    @Override
+    public String toString() {
+        return identifier.getValueWithQuoteCharacters();
+    }
+}
diff --git 
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateProcedureStatementHandlerTest.java
 
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateProcedureStatementHandlerTest.java
index d0eca72b025..021cf283d07 100644
--- 
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateProcedureStatementHandlerTest.java
+++ 
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateProcedureStatementHandlerTest.java
@@ -52,7 +52,8 @@ class CreateProcedureStatementHandlerTest {
     @Test
     void assertGetRoutineBodySegmentForOtherDatabases() {
         assertFalse(CreateProcedureStatementHandler.getRoutineBodySegment(new 
OpenGaussCreateProcedureStatement()).isPresent());
-        assertFalse(CreateProcedureStatementHandler.getRoutineBodySegment(new 
OracleCreateProcedureStatement(Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList())).isPresent());
+        assertFalse(CreateProcedureStatementHandler.getRoutineBodySegment(new 
OracleCreateProcedureStatement(Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList(),
+                Collections.emptyList())).isPresent());
         assertFalse(CreateProcedureStatementHandler.getRoutineBodySegment(new 
PostgreSQLCreateProcedureStatement()).isPresent());
         assertFalse(CreateProcedureStatementHandler.getRoutineBodySegment(new 
SQLServerCreateProcedureStatement()).isPresent());
     }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/plsql/PLSQLStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/plsql/PLSQLStatementAssert.java
index 31795720692..c90091e97c2 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/plsql/PLSQLStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/plsql/PLSQLStatementAssert.java
@@ -23,11 +23,13 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateProcedureStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.ProcedureCallNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.plsql.SQLStatementSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedDynamicSqlStatementExpressionSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedProcedureCallNameSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedSQLStatementSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.plsql.CreateFunctionTestCase;
@@ -80,6 +82,16 @@ public final class PLSQLStatementAssert {
             assertTrue(actual.getProcedureName().isPresent(), 
assertContext.getText("Procedure name should be exist."));
             assertThat(assertContext.getText("Procedure name mismatched:"), 
actual.getProcedureName().get().getIdentifier().getValue(), 
is(expected.getProcedureName().getName()));
         }
+        if (null == expected.getProcedureBodyEndNameSegments()) {
+            assertThat(assertContext.getText("Procedure body end names size 
mismatched:"), actual.getProcedureBodyEndNameSegments().size(), is(0));
+        } else {
+            assertThat(assertContext.getText("Procedure body end names size 
mismatched:"), actual.getProcedureBodyEndNameSegments().size(), 
is(expected.getProcedureBodyEndNameSegments().size()));
+            for (int i = 0; i < 
expected.getProcedureBodyEndNameSegments().size(); i++) {
+                ProcedureBodyEndNameSegment actualSegment = 
actual.getProcedureBodyEndNameSegments().get(i);
+                ExpectedProcedureBodyEndNameSegment expectedSegment = 
expected.getProcedureBodyEndNameSegments().get(i);
+                assertThat(assertContext.getText("Procedure body end name 
mismatched:"), actualSegment.toString(), is(expectedSegment.getName()));
+            }
+        }
     }
     
     private static void assertFunctionName(final SQLCaseAssertContext 
assertContext, final OracleCreateFunctionStatement actual, final 
CreateFunctionTestCase expected) {
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
index 869b7b50623..7c45a7a431e 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
@@ -191,7 +191,6 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateOperatorStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreatePFileStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreatePolicyStatementTestCase;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateProcedureStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateProfileStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreatePublicationStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateRestorePointStatementTestCase;
@@ -305,6 +304,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.MergeStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.SelectStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.UpdateStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.plsql.CreateProcedureTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.AlterComputeNodeStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.AlterGlobalClockRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.AlterLocalTransactionRuleStatementTestCase;
@@ -739,7 +739,7 @@ public final class RootSQLParserTestCases {
     private final List<CreateFunctionStatementTestCase> 
createFunctionTestCases = new LinkedList<>();
     
     @XmlElement(name = "create-procedure")
-    private final List<CreateProcedureStatementTestCase> 
createProcedureTestCases = new LinkedList<>();
+    private final List<CreateProcedureTestCase> createProcedureTestCases = new 
LinkedList<>();
     
     @XmlElement(name = "create-server")
     private final List<CreateServerStatementTestCase> createServerTestCases = 
new LinkedList<>();
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/plsql/ExpectedProcedureBodyEndNameSegment.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/plsql/ExpectedProcedureBodyEndNameSegment.java
new file mode 100644
index 00000000000..f6983ffd244
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/plsql/ExpectedProcedureBodyEndNameSegment.java
@@ -0,0 +1,35 @@
+/*
+ * 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.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql;
+
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * Expected procedure body end name segment.
+ */
+@Getter
+@Setter
+public final class ExpectedProcedureBodyEndNameSegment extends 
AbstractExpectedSQLSegment {
+    
+    @XmlAttribute
+    private String name;
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateProcedureStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateProcedureStatementTestCase.java
deleted file mode 100644
index d18d1ca17b0..00000000000
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateProcedureStatementTestCase.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl;
-
-import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedDynamicSqlStatementExpressionSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedProcedureCallNameSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedRoutineName;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedSQLStatementSegment;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Create procedure statement test case.
- */
-@Getter
-@Setter
-public final class CreateProcedureStatementTestCase extends SQLParserTestCase {
-    
-    @XmlElement(name = "procedure-name")
-    private ExpectedRoutineName procedureName;
-    
-    @XmlElementWrapper(name = "sql-statements")
-    @XmlElement(name = "sql-statement")
-    private List<ExpectedSQLStatementSegment> sqlStatements = new 
LinkedList<>();
-    
-    @XmlElementWrapper(name = "procedure-calls")
-    @XmlElement(name = "procedure-call")
-    private List<ExpectedProcedureCallNameSegment> procedureCalls = new 
LinkedList<>();
-    
-    @XmlElementWrapper(name = "dynamic-sql-statement-expressions")
-    @XmlElement(name = "dynamic-sql-statement-expression")
-    private List<ExpectedDynamicSqlStatementExpressionSegment> 
dynamicSqlStatementExpressions = new LinkedList<>();
-}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/plsql/CreateProcedureTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/plsql/CreateProcedureTestCase.java
index fe02ef653ab..da99b5dee9b 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/plsql/CreateProcedureTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/plsql/CreateProcedureTestCase.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedDynamicSqlStatementExpressionSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedProcedureCallNameSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedRoutineName;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.plsql.ExpectedSQLStatementSegment;
@@ -48,6 +49,10 @@ public final class CreateProcedureTestCase extends 
SQLParserTestCase {
     @XmlElement(name = "procedure-call")
     private List<ExpectedProcedureCallNameSegment> procedureCalls = new 
LinkedList<>();
     
+    @XmlElementWrapper(name = "procedure-body-end-names")
+    @XmlElement(name = "procedure-body-end-name")
+    private List<ExpectedProcedureBodyEndNameSegment> 
procedureBodyEndNameSegments = new LinkedList<>();
+    
     @XmlElementWrapper(name = "dynamic-sql-statement-expressions")
     @XmlElement(name = "dynamic-sql-statement-expression")
     private List<ExpectedDynamicSqlStatementExpressionSegment> 
dynamicSqlStatementExpressions = new LinkedList<>();
diff --git a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml 
b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
index 0776ec466d6..9f2011c67bf 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
@@ -30,9 +30,25 @@
     <create-procedure 
sql-case-id="create_procedure_with_create_view_as_select_into_outfile" />
     <create-procedure 
sql-case-id="create_procedure_with_sqlexception_and_create_view" />
     <create-procedure 
sql-case-id="create_procedure_with_deterministic_create_view" />
-    <create-procedure 
sql-case-id="create_procedure_with_update_statement_oracle" />
+    <create-procedure 
sql-case-id="create_procedure_with_update_statement_oracle">
+        <procedure-name name="update_order" />
+        <sql-statements>
+            <sql-statement start-index="95" stop-index="154" 
statement-class-simple-name="OracleUpdateStatement" />
+        </sql-statements>
+    </create-procedure>
     <create-procedure sql-case-id="create_procedure_with_prepare_commit" />
-    <create-procedure sql-case-id="create_procedure_with_cursor_definition" />
-    <create-procedure 
sql-case-id="create_procedure_with_collection_type_definition" />
+    <create-procedure sql-case-id="create_procedure_with_cursor_definition">
+        <procedure-name name="my_proc" />
+        <sql-statements>
+            <sql-statement start-index="69" stop-index="94" 
statement-class-simple-name="OracleSelectStatement" />
+            <sql-statement start-index="143" stop-index="175" 
statement-class-simple-name="OracleInsertStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_collection_type_definition">
+        <procedure-name name="my_proc" />
+        <sql-statements>
+            <sql-statement start-index="100" stop-index="132" 
statement-class-simple-name="OracleInsertStatement" />
+        </sql-statements>
+    </create-procedure>
     <create-procedure sql-case-id="create_plsql_block" />
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/plsql/create-procedure.xml 
b/test/it/parser/src/main/resources/case/plsql/create-procedure.xml
index 44d0f76e012..3a419e20e7d 100644
--- a/test/it/parser/src/main/resources/case/plsql/create-procedure.xml
+++ b/test/it/parser/src/main/resources/case/plsql/create-procedure.xml
@@ -20,15 +20,18 @@
     <create-procedure sql-case-id="pl_sql_create_procedure">
         <procedure-name name="test_procedure" />
         <sql-statements>
-            <sql-statement start-index="167" stop-index="192" 
statement-class-simple-name="OracleSavepointStatement" />
-            <sql-statement start-index="210" stop-index="274" 
statement-class-simple-name="OracleSelectStatement" />
-            <sql-statement start-index="1205" stop-index="1210" 
statement-class-simple-name="OracleCommitStatement" />
-            <sql-statement start-index="1251" stop-index="1293" 
statement-class-simple-name="OracleRollbackStatement" />
-            <sql-statement start-index="1408" stop-index="1450" 
statement-class-simple-name="OracleRollbackStatement" />
+            <sql-statement start-index="162" stop-index="187" 
statement-class-simple-name="OracleSavepointStatement" />
+            <sql-statement start-index="205" stop-index="269" 
statement-class-simple-name="OracleSelectStatement" />
+            <sql-statement start-index="1200" stop-index="1205" 
statement-class-simple-name="OracleCommitStatement" />
+            <sql-statement start-index="1246" stop-index="1288" 
statement-class-simple-name="OracleRollbackStatement" />
+            <sql-statement start-index="1403" stop-index="1445" 
statement-class-simple-name="OracleRollbackStatement" />
         </sql-statements>
         <procedure-calls>
             <procedure-call name="DBMS_OUTPUT.PUT_LINE" />
             <procedure-call name="DBMS_OUTPUT.PUT_LINE" />
         </procedure-calls>
+        <procedure-body-end-names>
+            <procedure-body-end-name name="cp_SHOPBudget_Gy" />
+        </procedure-body-end-names>
     </create-procedure>
 </sql-parser-test-cases>

Reply via email to