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

iamhucong 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 88d6f10f554 Support Oracle package routine names (#39607)
88d6f10f554 is described below

commit 88d6f10f554bf6b944021858900f726f259f7f67
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Aug 27 10:48:46 2026 +0800

    Support Oracle package routine names (#39607)
    
    * Support Oracle package routine names
    
    * Update release notes for Oracle package routine names
    
    * Add tests for Oracle package routine names
---
 RELEASE-NOTES.md                                   |  1 +
 .../CreateDatabaseObjectStatementContextTest.java  |  6 +++
 .../statement/type/OracleDDLStatementVisitor.java  | 58 +++++++++++++++++++++-
 .../type/ddl/pkg/CreatePackageStatement.java       |  8 +++
 .../ddl/pkg/OracleCreatePackageStatement.java      | 56 ++++++++++++++++++---
 .../type/OracleCreatePackageStatementAssert.java   | 20 +++++++-
 .../OracleCreatePackageStatementTestCase.java      |  6 ++-
 .../src/main/resources/case/ddl/create-package.xml | 11 ++++
 8 files changed, 155 insertions(+), 11 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index b766ec13e90..67e4e6bcaf3 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -101,6 +101,7 @@
 1. SQL Parser: Support SQLServer table variable declaration parse - 
[#38904](https://github.com/apache/shardingsphere/pull/38904)
 1. SQL Parser: Support Oracle procedure parser and binder - 
[#39231](https://github.com/apache/shardingsphere/pull/39231)
 1. SQL Parser: Support Oracle database object DDL parsing - 
[#39286](https://github.com/apache/shardingsphere/pull/39286)
+1. SQL Parser: Support Oracle package routine name parsing and binding - 
[#39607](https://github.com/apache/shardingsphere/pull/39607)
 1. SQL Parser: Support parsing Oracle CREATE INDEX sql - 
[#39292](https://github.com/apache/shardingsphere/pull/39292)
 1. SQL Parser: Support parsing Oracle CREATE INDEXTYPE sql and Add CREATE 
INDEX/OPERATOR sql it test - 
[#39302](https://github.com/apache/shardingsphere/pull/39302) 
 1. SQL Parser: Support function table alias column parsing for PostgreSQL and 
openGauss - [#39268](https://github.com/apache/shardingsphere/pull/39268)
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateDatabaseObjectStatementContextTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateDatabaseObjectStatementContextTest.java
index e7ce28778f1..7acfca2efb7 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateDatabaseObjectStatementContextTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateDatabaseObjectStatementContextTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.packages.PackageSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.RoutineBodySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.ValidStatementSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -176,6 +177,11 @@ class CreateDatabaseObjectStatementContextTest {
             return Collections.emptyList();
         }
         
+        @Override
+        public Collection<FunctionNameSegment> getPackageRoutineNames() {
+            return Collections.emptyList();
+        }
+        
         @Override
         public Collection<ExpressionSegment> 
getDynamicSqlStatementExpressions() {
             return Collections.emptyList();
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 7909e2911bb..34d725b5ec5 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -123,6 +123,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Cursor
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CursorForLoopStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CursorParameterDecContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTypeDefinitionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DeclareItemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DisassociateStatisticsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropClusterContext;
@@ -170,6 +171,9 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Flashb
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ForLoopStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ForallStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionDeclarationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionDefinitionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexExpressionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexExpressionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexNameContext;
@@ -193,16 +197,20 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OutOfL
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OutOfLineRefConstraintContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OwnerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PackageNameContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PackageSpecificationItemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ParameterDeclarationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PartitionExtendedNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlBlockContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlFunctionSourceContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlPackageBodySourceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlPackageSourceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlProcedureSourceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlStatementsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlTriggerSourceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlaceholderContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureCallContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureDeclarationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PseudorecordContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PurgeContext;
@@ -913,7 +921,7 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitCreatePackage(final CreatePackageContext ctx) {
-        OracleStatementParser.PlsqlPackageBodySourceContext body = 
ctx.plsqlPackageBodySource();
+        PlsqlPackageBodySourceContext body = ctx.plsqlPackageBodySource();
         if (null != body) {
             body.declareItem().forEach(this::visit);
         }
@@ -946,11 +954,55 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         result.getColumns().addAll(typeAttributeSegments.getColumns());
         result.getSqlStatements().addAll(getSqlStatementsInPlsql());
         result.getProcedureCallNames().addAll(getProcedureCallNames());
+        
result.getPackageRoutineNames().addAll(extractPackageRoutineNames(specification,
 body));
         
result.getDynamicSqlStatementExpressions().addAll(getDynamicSqlStatementExpressions());
         
result.getCursorForLoopStatements().addAll(getCursorForLoopStatementSegments());
         return result;
     }
     
+    private Collection<FunctionNameSegment> extractPackageRoutineNames(final 
PlsqlPackageSourceContext specification, final PlsqlPackageBodySourceContext 
body) {
+        Collection<FunctionNameSegment> result = new LinkedList<>();
+        if (null != specification) {
+            for (PackageSpecificationItemContext each : 
specification.packageSpecificationItem()) {
+                addPackageRoutineName(result, each.functionDeclaration());
+                addPackageRoutineName(result, each.procedureDeclaration());
+            }
+        }
+        if (null != body) {
+            for (DeclareItemContext each : body.declareItem()) {
+                addPackageRoutineName(result, each.functionDeclaration());
+                addPackageRoutineName(result, each.procedureDeclaration());
+                addPackageRoutineName(result, each.functionDefinition());
+                addPackageRoutineName(result, each.procedureDefinition());
+            }
+        }
+        return result;
+    }
+    
+    private void addPackageRoutineName(final Collection<FunctionNameSegment> 
routineNames, final FunctionDeclarationContext declaration) {
+        if (null != declaration) {
+            
routineNames.add(createFunctionNameSegment(declaration.functionHeading().functionName()));
+        }
+    }
+    
+    private void addPackageRoutineName(final Collection<FunctionNameSegment> 
routineNames, final ProcedureDeclarationContext declaration) {
+        if (null != declaration) {
+            routineNames.add(createProcedureNameSegment(null, 
declaration.procedureHeading().procedureName()));
+        }
+    }
+    
+    private void addPackageRoutineName(final Collection<FunctionNameSegment> 
routineNames, final FunctionDefinitionContext definition) {
+        if (null != definition) {
+            
routineNames.add(createFunctionNameSegment(definition.functionHeading().functionName()));
+        }
+    }
+    
+    private void addPackageRoutineName(final Collection<FunctionNameSegment> 
routineNames, final ProcedureDefinitionContext definition) {
+        if (null != definition) {
+            addPackageRoutineName(routineNames, 
definition.procedureDeclaration());
+        }
+    }
+    
     @Override
     public ASTNode visitCreateTypeBody(final CreateTypeBodyContext ctx) {
         return new OracleCreateTypeBodyStatement(getDatabaseType(), 
ctx.plsqlTypeBodySource().typeName(0).getText());
@@ -1519,6 +1571,10 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         return result;
     }
     
+    private FunctionNameSegment createFunctionNameSegment(final 
FunctionNameContext ctx) {
+        return new FunctionNameSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
+    }
+    
     private FunctionNameSegment createFunctionNameSegment(final 
SchemaNameContext schemaName, final FunctionContext function) {
         FunctionNameSegment result = createFunctionNameSegment(function);
         if (null == schemaName) {
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/pkg/CreatePackageStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/pkg/CreatePackageStatement.java
index faf0230f156..bca238e845f 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/pkg/CreatePackageStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/pkg/CreatePackageStatement.java
@@ -18,6 +18,7 @@
 package 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.pkg;
 
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.packages.PackageSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
@@ -73,6 +74,13 @@ public interface CreatePackageStatement {
      */
     Collection<ProcedureCallNameSegment> getProcedureCallNames();
     
+    /**
+     * Get package routine names.
+     *
+     * @return package routine names
+     */
+    Collection<FunctionNameSegment> getPackageRoutineNames();
+    
     /**
      * Get dynamic SQL statement expressions.
      *
diff --git 
a/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/pkg/OracleCreatePackageStatement.java
 
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/pkg/OracleCreatePackageStatement.java
index b41548bae29..c8c8ae02eb8 100644
--- 
a/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/pkg/OracleCreatePackageStatement.java
+++ 
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/pkg/OracleCreatePackageStatement.java
@@ -17,9 +17,11 @@
 
 package org.apache.shardingsphere.sql.parser.statement.oracle.ddl.pkg;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.packages.PackageSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.RoutineBodySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
@@ -46,7 +48,8 @@ public final class OracleCreatePackageStatement extends 
DDLStatement implements
     
     private final PackageSegment packageName;
     
-    private final Optional<PackageSegment> packageEndName;
+    @Getter(AccessLevel.NONE)
+    private final PackageSegment packageEndName;
     
     private final boolean body;
     
@@ -54,16 +57,21 @@ public final class OracleCreatePackageStatement extends 
DDLStatement implements
     
     private final boolean ifNotExists;
     
-    private final Optional<Edition> edition;
+    @Getter(AccessLevel.NONE)
+    private final Edition edition;
     
-    private final Optional<Authorization> authorization;
+    @Getter(AccessLevel.NONE)
+    private final Authorization authorization;
     
-    private final Optional<RoutineBodySegment> initialization;
+    @Getter(AccessLevel.NONE)
+    private final RoutineBodySegment initialization;
     
     private final List<SQLStatementSegment> sqlStatements = new ArrayList<>();
     
     private final List<ProcedureCallNameSegment> procedureCallNames = new 
ArrayList<>();
     
+    private final List<FunctionNameSegment> packageRoutineNames = new 
ArrayList<>();
+    
     private final List<ExpressionSegment> dynamicSqlStatementExpressions = new 
ArrayList<>();
     
     private final List<CursorForLoopStatementSegment> cursorForLoopStatements 
= new ArrayList<>();
@@ -91,16 +99,48 @@ public final class OracleCreatePackageStatement extends 
DDLStatement implements
                                         final RoutineBodySegment 
initialization, final Collection<SimpleTableSegment> tables) {
         super(databaseType);
         this.packageName = packageName;
-        this.packageEndName = Optional.ofNullable(packageEndName);
+        this.packageEndName = packageEndName;
         this.body = body;
         this.replace = replace;
         this.ifNotExists = ifNotExists;
-        this.edition = Optional.ofNullable(edition);
-        this.authorization = Optional.ofNullable(authorization);
-        this.initialization = Optional.ofNullable(initialization);
+        this.edition = edition;
+        this.authorization = authorization;
+        this.initialization = initialization;
         attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables), new 
ProcedureCallNamesSQLStatementAttribute(procedureCallNames));
     }
     
+    @Override
+    public Optional<PackageSegment> getPackageEndName() {
+        return Optional.ofNullable(packageEndName);
+    }
+    
+    /**
+     * Get package edition mode.
+     *
+     * @return package edition mode
+     */
+    public Optional<Edition> getEdition() {
+        return Optional.ofNullable(edition);
+    }
+    
+    /**
+     * Get package authorization mode.
+     *
+     * @return package authorization mode
+     */
+    public Optional<Authorization> getAuthorization() {
+        return Optional.ofNullable(authorization);
+    }
+    
+    /**
+     * Get package initialization body.
+     *
+     * @return package initialization body
+     */
+    public Optional<RoutineBodySegment> getInitialization() {
+        return Optional.ofNullable(initialization);
+    }
+    
     /**
      * Oracle package edition mode.
      */
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreatePackageStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreatePackageStatementAssert.java
index 33ac86a0ba6..c0269ac05de 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreatePackageStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreatePackageStatementAssert.java
@@ -19,14 +19,20 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.pkg.OracleCreatePackageStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.pkg.OracleCreatePackageStatement;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.packages.PackageAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.plsql.RoutineNameAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
+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.statement.ddl.dialect.oracle.OracleCreatePackageStatementTestCase;
 
+import java.util.Collection;
+import java.util.Iterator;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -68,5 +74,17 @@ public final class OracleCreatePackageStatementAssert {
         if (!expected.getColumns().isEmpty()) {
             ColumnAssert.assertIs(assertContext, actual.getColumns(), 
expected.getColumns());
         }
+        assertPackageRoutineNames(assertContext, 
actual.getPackageRoutineNames(), expected.getPackageRoutineNames());
+    }
+    
+    private static void assertPackageRoutineNames(final SQLCaseAssertContext 
assertContext, final Collection<FunctionNameSegment> actual, final 
Collection<ExpectedRoutineName> expected) {
+        if (expected.isEmpty()) {
+            return;
+        }
+        assertThat(assertContext.getText("Package routine names size 
mismatched: "), actual.size(), is(expected.size()));
+        Iterator<FunctionNameSegment> actualIterator = actual.iterator();
+        for (ExpectedRoutineName each : expected) {
+            RoutineNameAssert.assertIs(assertContext, actualIterator.next(), 
each);
+        }
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreatePackageStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreatePackageStatementTestCase.java
index 4f8085c8ab4..beb385a7eba 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreatePackageStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreatePackageStatementTestCase.java
@@ -20,8 +20,9 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 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.packages.ExpectedPackage;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.packages.ExpectedPackage;
+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.table.ExpectedSimpleTable;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -68,4 +69,7 @@ public final class OracleCreatePackageStatementTestCase 
extends SQLParserTestCas
     
     @XmlElement(name = "column")
     private final List<ExpectedColumn> columns = new LinkedList<>();
+    
+    @XmlElement(name = "package-routine-name")
+    private final List<ExpectedRoutineName> packageRoutineNames = new 
LinkedList<>();
 }
diff --git a/test/it/parser/src/main/resources/case/ddl/create-package.xml 
b/test/it/parser/src/main/resources/case/ddl/create-package.xml
index 50b6b8339ac..a01dd2f0d42 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-package.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-package.xml
@@ -22,6 +22,8 @@
             <owner name="foo_schema" start-index="38" stop-index="47" />
         </package>
         <package-end-name name="foo_pkg" start-index="180" stop-index="186" />
+        <package-routine-name name="set_value" start-index="112" 
stop-index="120" />
+        <package-routine-name name="get_value" start-index="151" 
stop-index="159" />
     </create-package>
     
     <create-package 
sql-case-id="create_or_replace_noneditionable_package_body" body="true" 
replace="true" edition="NONEDITIONABLE" has-initialization="true">
@@ -29,11 +31,14 @@
             <owner name="foo_schema" start-index="46" stop-index="55" />
         </package>
         <package-end-name name="foo_pkg" start-index="257" stop-index="263" />
+        <package-routine-name name="set_value" start-index="101" 
stop-index="109" />
+        <package-routine-name name="get_value" start-index="175" 
stop-index="183" />
     </create-package>
     
     <create-package sql-case-id="create_package_body_if_not_exists" 
body="true" if-not-exists="true">
         <package name="foo_pkg" start-index="34" stop-index="40" />
         <package-end-name name="foo_pkg" start-index="81" stop-index="87" />
+        <package-routine-name name="p" start-index="55" stop-index="55" />
     </create-package>
 
     <create-package sql-case-id="create_package_visitor_oracle" replace="true" 
if-not-exists="true" edition="EDITIONABLE" authorization="CURRENT_USER">
@@ -43,6 +48,8 @@
         <package-end-name name="foo_pkg" start-index="221" stop-index="227" />
         <table name="T_USER" start-index="147" stop-index="152" />
         <table name="T_USER" start-index="195" stop-index="200" />
+        <package-routine-name name="set_value" start-index="126" 
stop-index="134" />
+        <package-routine-name name="get_value" start-index="178" 
stop-index="186" />
     </create-package>
 
     <create-package sql-case-id="create_package_body_visitor_oracle" 
body="true" replace="true" edition="NONEDITIONABLE" has-initialization="true" 
sql-statement-count="2">
@@ -52,6 +59,8 @@
         <package-end-name name="foo_pkg" start-index="290" stop-index="296" />
         <table name="T_USER" start-index="99" stop-index="104" />
         <table name="T_USER" start-index="199" stop-index="204" />
+        <package-routine-name name="set_value" start-index="78" 
stop-index="86" />
+        <package-routine-name name="read_value" start-index="181" 
stop-index="190" />
     </create-package>
 
     <create-package 
sql-case-id="create_package_body_with_type_attributes_visitor_oracle" 
body="true" replace="true">
@@ -69,5 +78,7 @@
         <column name="ID" start-index="341" stop-index="342">
             <owner name="T_E2E_RDL_CONVERT" start-index="323" stop-index="339" 
/>
         </column>
+        <package-routine-name name="INSERT_ROW" start-index="64" 
stop-index="73" />
+        <package-routine-name name="READ_PASSWORD" start-index="301" 
stop-index="313" />
     </create-package>
 </sql-parser-test-cases>

Reply via email to