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

FlyingZC 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 5b287c36194 Support Oracle database object DDL parsing (#39286)
5b287c36194 is described below

commit 5b287c36194cc088e1f81d96be9146f2800a4eb5
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jul 31 14:28:01 2026 +0800

    Support Oracle database object DDL parsing (#39286)
    
    * Support Oracle database object DDL parsing
    
    * Update release notes for Oracle database object DDL parsing
    
    * Fix Oracle trigger CALL procedure name parsing
    
    * Fix Oracle create function parser IT cases
---
 RELEASE-NOTES.md                                   |   1 +
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 |   2 +-
 .../oracle/src/main/antlr4/imports/oracle/PLSQL.g4 |  58 ++++++++--
 .../visitor/statement/OracleStatementVisitor.java  |  12 +++
 .../statement/type/OracleDDLStatementVisitor.java  | 117 ++++++++++++++++++---
 .../type/ddl/function/CreateFunctionStatement.java |  18 ++++
 .../type/ddl/trigger/CreateTriggerStatement.java   |  53 ++++++++++
 .../ddl/view/CreateMaterializedViewStatement.java  |  12 +++
 .../function/OracleCreateFunctionStatement.java    |  18 ++--
 .../ddl/standard/StandardDDLStatementAssert.java   |   5 +
 .../type/CreateTriggerStatementAssert.java         |  62 +++++++++++
 .../trigger/CreateTriggerStatementTestCase.java    |  13 +++
 .../src/main/resources/case/ddl/create-trigger.xml |   5 +
 .../sql/supported/ddl/create-function.xml          |   5 +-
 .../resources/sql/supported/ddl/create-trigger.xml |   1 +
 15 files changed, 349 insertions(+), 33 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 10184f9e1f3..7b5bc17a918 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -75,6 +75,7 @@
 1. SQL Parser: Support Hive parser and binder for insert select columns and 
transform expressions - 
[#39269](https://github.com/apache/shardingsphere/pull/39269)
 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 function table alias column parsing for PostgreSQL and 
openGauss - [#39268](https://github.com/apache/shardingsphere/pull/39268)
 1. SQL Binder: Support select order by index bind metadata - 
[#38386](https://github.com/apache/shardingsphere/pull/38386)
 1. SQL Binder: Support SQL bind when with temp table name is same with 
physical table - [#38411](https://github.com/apache/shardingsphere/pull/38411)
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 333dbeb4e15..12bdf657689 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++ 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -2786,7 +2786,7 @@ javaDeclaration
 cDeclaration
     : (LANGUAGE SINGLE_C | EXTERNAL)
     ((NAME name)? LIBRARY libName| LIBRARY libName (NAME name)?)
-    (AGENT IN RP_ argument (COMMA_ argument)* LP_)?
+    (AGENT IN LP_ argument (COMMA_ argument)* RP_)?
     (WITH CONTEXT)?
     (PARAMETERS LP_ externalParameter (COMMA_ externalParameter)* RP_)?
     ;
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
index 20694cf95eb..ec9e6b4346d 100644
--- a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
+++ b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/PLSQL.g4
@@ -87,10 +87,8 @@ plsqlFunctionSource
     | deterministicClause
     | parallelEnableClause
     | resultCacheClause
-    | aggregateClause
-    | pipelinedClause
     | sqlMacroClause)*
-    (IS | AS) (callSpec | declareSection? body)
+    (aggregateClause SEMI_? | PIPELINED USING implementationType SEMI_? | 
pipelinedClause? (IS | AS) (callSpec | declareSection? body))
     ;
 
 returnDateType
@@ -652,15 +650,39 @@ seriallyReusablePragma
     ;
 
 plsqlTriggerSource
-    : (schemaName DOT_)? triggerName sharingClause? defaultCollationClause? 
(simpleDmlTrigger | systemTrigger)
+    : (schemaName DOT_)? triggerName sharingClause? defaultCollationClause? 
(simpleDmlTrigger | compoundDmlTrigger | systemTrigger)
     ;
 
 simpleDmlTrigger
-    : (BEFORE | AFTER) dmlEventClause (FOR EACH ROW)? triggerBody
+    : (BEFORE | AFTER | INSTEAD OF) dmlEventClause referencingClause? (FOR 
EACH ROW)? triggerEditionClause? triggerOrderingClause? (ENABLE | DISABLE)? 
triggerWhenClause? triggerBody
+    ;
+
+compoundDmlTrigger
+    : FOR dmlEventClause referencingClause? triggerEditionClause? 
triggerOrderingClause? (ENABLE | DISABLE)? triggerWhenClause? 
compoundTriggerBlock
+    ;
+
+compoundTriggerBlock
+    : COMPOUND TRIGGER declareSection? compoundTriggerSection+ END 
triggerName? SEMI_?
+    ;
+
+compoundTriggerSection
+    : compoundTriggerTimingPoint IS compoundTriggerBody
+    ;
+
+compoundTriggerTimingPoint
+    : BEFORE STATEMENT
+    | BEFORE EACH ROW
+    | AFTER STATEMENT
+    | AFTER EACH ROW
+    | INSTEAD OF EACH ROW
+    ;
+
+compoundTriggerBody
+    : BEGIN plsqlStatements? (EXCEPTION exceptionHandler+)? END 
compoundTriggerTimingPoint? SEMI_?
     ;
 
 dmlEventClause
-    : dmlEventElement (OR dmlEventElement)* ON viewName
+    : dmlEventElement (OR dmlEventElement)* ON (NESTED TABLE columnName OF)? 
viewName
     ;
 
 dmlEventElement
@@ -668,7 +690,27 @@ dmlEventElement
     ;
 
 systemTrigger
-    : (BEFORE | AFTER | INSTEAD OF) (ddlEvent (OR ddlEvent)* | databaseEvent 
(OR databaseEvent)* | dmlEvent) ON ((PLUGGABLE? DATABASE) | (schemaName DOT_)? 
SCHEMA?) tableName? triggerBody
+    : (BEFORE | AFTER | INSTEAD OF) (ddlEvent (OR ddlEvent)* | databaseEvent 
(OR databaseEvent)* | dmlEvent) ON ((PLUGGABLE? DATABASE) | (schemaName DOT_)? 
SCHEMA?) tableName? triggerOrderingClause? triggerBody
+    ;
+
+referencingClause
+    : REFERENCING referencingItem+
+    ;
+
+referencingItem
+    : (OLD | NEW | PARENT) AS? name
+    ;
+
+triggerEditionClause
+    : (FORWARD | REVERSE) CROSSEDITION
+    ;
+
+triggerOrderingClause
+    : (FOLLOWS | PRECEDES) triggerName (COMMA_ triggerName)*
+    ;
+
+triggerWhenClause
+    : WHEN LP_ expr RP_
     ;
 
 ddlEvent
@@ -716,5 +758,5 @@ dmlEvent
     ;
 
 triggerBody
-    : plsqlBlock
+    : plsqlBlock | call
     ;
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
index 59ae5044e63..774ff498b85 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
@@ -67,6 +67,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.JsonOb
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.JsonObjectKeyValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.KeepClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.LiteralsContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MaterializedViewNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.NullValueLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.NumberLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OrderByClauseContext;
@@ -531,6 +532,17 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         return result;
     }
     
+    @Override
+    public final ASTNode visitMaterializedViewName(final 
MaterializedViewNameContext ctx) {
+        SimpleTableSegment result = new SimpleTableSegment(new 
TableNameSegment(ctx.name().getStart().getStartIndex(),
+                ctx.name().getStop().getStopIndex(), new 
IdentifierValue(ctx.name().identifier().getText())));
+        OwnerContext owner = ctx.owner();
+        if (null != owner) {
+            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+        }
+        return result;
+    }
+    
     @Override
     public final ASTNode visitIndexName(final IndexNameContext ctx) {
         IndexNameSegment indexName = new 
IndexNameSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
(IdentifierValue) visit(ctx.name()));
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 330beb87799..9afefc6729e 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
@@ -68,6 +68,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditC
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditTraditionalContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditUnifiedContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BodyContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CallContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CollectionVariableDeclContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnClausesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnDefinitionContext;
@@ -187,6 +188,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlB
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlFunctionSourceContext;
 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.ProcedureCallContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PurgeContext;
@@ -200,6 +202,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Statem
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SwitchContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SystemActionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNameContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TriggerBodyContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TriggerNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TruncateTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TypeNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.VariableNameContext;
@@ -820,7 +824,71 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitCreateTrigger(final CreateTriggerContext ctx) {
-        return new CreateTriggerStatement(getDatabaseType());
+        visit(ctx.plsqlTriggerSource());
+        addTriggerBodyEndName(ctx.plsqlTriggerSource());
+        
getSqlStatementsInPlsql().sort(Comparator.comparingInt(SQLStatementSegment::getStartIndex));
+        
getProcedureCallNames().sort(Comparator.comparingInt(ProcedureCallNameSegment::getStartIndex));
+        
getDynamicSqlStatementExpressions().sort(Comparator.comparingInt(ExpressionSegment::getStartIndex));
+        CreateTriggerStatement result = new 
CreateTriggerStatement(getDatabaseType());
+        result.setTriggerName(visitTriggerName(ctx.plsqlTriggerSource()));
+        findTriggerTable(ctx.plsqlTriggerSource()).ifPresent(result::setTable);
+        result.getSqlStatements().addAll(getSqlStatementsInPlsql());
+        result.getProcedureCallNames().addAll(getProcedureCallNames());
+        
result.getTriggerBodyEndNameSegments().addAll(getProcedureBodyEndNameSegments());
+        
result.getDynamicSqlStatementExpressions().addAll(getDynamicSqlStatementExpressions());
+        return result;
+    }
+    
+    private Optional<SimpleTableSegment> findTriggerTable(final 
PlsqlTriggerSourceContext ctx) {
+        if (null != ctx.simpleDmlTrigger()) {
+            return Optional.of((SimpleTableSegment) 
visit(ctx.simpleDmlTrigger().dmlEventClause().viewName()));
+        }
+        if (null != ctx.compoundDmlTrigger()) {
+            return Optional.of((SimpleTableSegment) 
visit(ctx.compoundDmlTrigger().dmlEventClause().viewName()));
+        }
+        return null == ctx.systemTrigger().tableName() ? Optional.empty() : 
Optional.of((SimpleTableSegment) visit(ctx.systemTrigger().tableName()));
+    }
+    
+    private void addTriggerBodyEndName(final PlsqlTriggerSourceContext ctx) {
+        if (null != ctx.compoundDmlTrigger()) {
+            TriggerNameContext triggerName = 
ctx.compoundDmlTrigger().compoundTriggerBlock().triggerName();
+            if (null != triggerName) {
+                getProcedureBodyEndNameSegments().add(new 
ProcedureBodyEndNameSegment(triggerName.name().start.getStartIndex(), 
triggerName.name().stop.getStopIndex(),
+                        new IdentifierValue(triggerName.name().getText())));
+            }
+            return;
+        }
+        TriggerBodyContext triggerBody = null == ctx.simpleDmlTrigger() ? 
ctx.systemTrigger().triggerBody() : ctx.simpleDmlTrigger().triggerBody();
+        if (null == triggerBody.plsqlBlock()) {
+            return;
+        }
+        BodyContext body = triggerBody.plsqlBlock().body();
+        if (null != body.identifier()) {
+            getProcedureBodyEndNameSegments().add(new 
ProcedureBodyEndNameSegment(body.identifier().getStart().getStartIndex(), 
body.identifier().getStop().getStopIndex(),
+                    new IdentifierValue(body.identifier().getText())));
+        }
+    }
+    
+    private FunctionNameSegment visitTriggerName(final 
PlsqlTriggerSourceContext ctx) {
+        TriggerNameContext triggerNameContext = ctx.triggerName();
+        IdentifierValue triggerName = (IdentifierValue) 
visit(triggerNameContext.name().identifier());
+        OwnerSegment owner = getTriggerOwner(ctx, triggerNameContext);
+        if (null == owner) {
+            return new 
FunctionNameSegment(triggerNameContext.start.getStartIndex(), 
triggerNameContext.stop.getStopIndex(), triggerName);
+        }
+        FunctionNameSegment result = new 
FunctionNameSegment(owner.getStartIndex(), 
triggerNameContext.stop.getStopIndex(), triggerName);
+        result.setOwner(owner);
+        return result;
+    }
+    
+    private OwnerSegment getTriggerOwner(final PlsqlTriggerSourceContext ctx, 
final TriggerNameContext triggerNameContext) {
+        if (null != ctx.schemaName()) {
+            return new OwnerSegment(ctx.schemaName().start.getStartIndex(), 
ctx.schemaName().stop.getStopIndex(), (IdentifierValue) 
visit(ctx.schemaName().identifier()));
+        }
+        return null == triggerNameContext.owner()
+                ? null
+                : new 
OwnerSegment(triggerNameContext.owner().start.getStartIndex(), 
triggerNameContext.owner().stop.getStopIndex(),
+                        (IdentifierValue) 
visit(triggerNameContext.owner().identifier()));
     }
     
     @Override
@@ -1075,6 +1143,11 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     }
     
     private ASTNode visitCreateFunction0(final CreateFunctionContext ctx) {
+        if (null != ctx.plsqlFunctionSource().parameterDeclaration()) {
+            for (ParameterDeclarationContext each : 
ctx.plsqlFunctionSource().parameterDeclaration()) {
+                visit(each);
+            }
+        }
         if (null != ctx.plsqlFunctionSource().declareSection()) {
             visit(ctx.plsqlFunctionSource().declareSection());
         }
@@ -1083,9 +1156,12 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         }
         
getSqlStatementsInPlsql().sort(Comparator.comparingInt(SQLStatementSegment::getStartIndex));
         
getProcedureCallNames().sort(Comparator.comparingInt(ProcedureCallNameSegment::getStartIndex));
+        
getProcedureBodyEndNameSegments().sort(Comparator.comparingInt(ProcedureBodyEndNameSegment::getStartIndex));
         
getDynamicSqlStatementExpressions().sort(Comparator.comparingInt(ExpressionSegment::getStartIndex));
+        getSqlStatementsInPlsql().forEach(each -> 
each.getSqlStatement().getVariableNames().addAll(getVariableNames()));
         return new OracleCreateFunctionStatement(
-                getDatabaseType(), getSqlStatementsInPlsql(), 
getProcedureCallNames(), visitFunctionName(ctx.plsqlFunctionSource()), 
getDynamicSqlStatementExpressions());
+                getDatabaseType(), getSqlStatementsInPlsql(), 
getProcedureCallNames(), getProcedureBodyEndNameSegments(), 
visitFunctionName(ctx.plsqlFunctionSource()),
+                getDynamicSqlStatementExpressions());
     }
     
     private FunctionNameSegment visitFunctionName(final 
PlsqlFunctionSourceContext ctx) {
@@ -1476,18 +1552,27 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitProcedureCall(final ProcedureCallContext ctx) {
-        int startIndex = ctx.procedureName().start.getStartIndex();
-        PackageSegment packageSegment = null;
-        if (null != ctx.packageName()) {
-            startIndex = ctx.packageName().start.getStartIndex();
-            packageSegment = (PackageSegment) visit(ctx.packageName());
-        }
-        ProcedureCallNameSegment result = new 
ProcedureCallNameSegment(startIndex, ctx.procedureName().stop.getStopIndex(), 
(IdentifierValue) visit(ctx.procedureName().identifier()));
-        result.setPackageSegment(packageSegment);
-        getProcedureCallNames().add(result);
+        PackageSegment packageSegment = null == ctx.packageName() ? null : 
(PackageSegment) visit(ctx.packageName());
+        
getProcedureCallNames().add(createProcedureCallNameSegment(ctx.procedureName(), 
packageSegment));
         return defaultResult();
     }
     
+    @Override
+    public ASTNode visitCall(final CallContext ctx) {
+        PackageSegment packageSegment = null == ctx.schemaName()
+                ? null
+                : new PackageSegment(ctx.schemaName().start.getStartIndex(), 
ctx.schemaName().stop.getStopIndex(), (IdentifierValue) 
visit(ctx.schemaName().identifier()));
+        
getProcedureCallNames().add(createProcedureCallNameSegment(ctx.procedureName(), 
packageSegment));
+        return defaultResult();
+    }
+    
+    private ProcedureCallNameSegment createProcedureCallNameSegment(final 
ProcedureNameContext procedureName, final PackageSegment packageSegment) {
+        int startIndex = null == packageSegment ? 
procedureName.start.getStartIndex() : packageSegment.getStartIndex();
+        ProcedureCallNameSegment result = new 
ProcedureCallNameSegment(startIndex, procedureName.stop.getStopIndex(), 
(IdentifierValue) visit(procedureName.identifier()));
+        result.setPackageSegment(packageSegment);
+        return result;
+    }
+    
     @Override
     public ASTNode visitCursorForLoopStatement(final 
CursorForLoopStatementContext ctx) {
         SQLStatement relatedCursorStatement;
@@ -1757,7 +1842,15 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitCreateMaterializedView(final 
CreateMaterializedViewContext ctx) {
-        return new CreateMaterializedViewStatement(getDatabaseType());
+        CreateMaterializedViewStatement result = new 
CreateMaterializedViewStatement(getDatabaseType());
+        OracleDMLStatementVisitor visitor = new 
OracleDMLStatementVisitor(getDatabaseType());
+        
getGlobalParameterMarkerSegments().addAll(visitor.getGlobalParameterMarkerSegments());
+        
getStatementParameterMarkerSegments().addAll(visitor.getStatementParameterMarkerSegments());
+        result.setView((SimpleTableSegment) visit(ctx.materializedViewName()));
+        result.setSelect((SelectStatement) 
visitor.visit(ctx.selectSubquery()));
+        result.setViewDefinition(getOriginalText(ctx.selectSubquery()));
+        result.addParameterMarkers(getGlobalParameterMarkerSegments());
+        return result;
     }
     
     @Override
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/function/CreateFunctionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/function/CreateFunctionStatement.java
index b672a993e57..146033422df 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/function/CreateFunctionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/function/CreateFunctionStatement.java
@@ -23,6 +23,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtrac
 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.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureBodyEndNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.SQLStatementSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
@@ -41,15 +44,30 @@ public class CreateFunctionStatement extends DDLStatement {
     
     private final RoutineBodySegment routineBody;
     
+    private final List<SQLStatementSegment> sqlStatements;
+    
+    private final List<ProcedureCallNameSegment> procedureCallNames;
+    
+    private final List<ProcedureBodyEndNameSegment> 
functionBodyEndNameSegments;
+    
     private final List<ExpressionSegment> dynamicSqlStatementExpressions;
     
     private final SQLStatementAttributes attributes;
     
     public CreateFunctionStatement(final DatabaseType databaseType,
                                    final FunctionNameSegment functionName, 
final RoutineBodySegment routineBody, final List<ExpressionSegment> 
dynamicSqlStatementExpressions) {
+        this(databaseType, functionName, routineBody, Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList(), 
dynamicSqlStatementExpressions);
+    }
+    
+    public CreateFunctionStatement(final DatabaseType databaseType, final 
FunctionNameSegment functionName, final RoutineBodySegment routineBody,
+                                   final List<SQLStatementSegment> 
sqlStatements, final List<ProcedureCallNameSegment> procedureCallNames,
+                                   final List<ProcedureBodyEndNameSegment> 
functionBodyEndNameSegments, final List<ExpressionSegment> 
dynamicSqlStatementExpressions) {
         super(databaseType);
         this.functionName = functionName;
         this.routineBody = routineBody;
+        this.sqlStatements = sqlStatements;
+        this.procedureCallNames = procedureCallNames;
+        this.functionBodyEndNameSegments = functionBodyEndNameSegments;
         this.dynamicSqlStatementExpressions = dynamicSqlStatementExpressions;
         attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(null == routineBody ? Collections.emptyList() : new 
TableExtractor().extractExistTableFromRoutineBody(routineBody)));
     }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/trigger/CreateTriggerStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/trigger/CreateTriggerStatement.java
index 32ddb0c7df5..7b1a8dabe6c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/trigger/CreateTriggerStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/trigger/CreateTriggerStatement.java
@@ -17,15 +17,68 @@
 
 package 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger;
 
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureBodyEndNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.SQLStatementSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+
 /**
  * Create trigger statement.
  */
+@Getter
+@Setter
 public final class CreateTriggerStatement extends DDLStatement {
     
+    private FunctionNameSegment triggerName;
+    
+    private final List<SQLStatementSegment> sqlStatements = new ArrayList<>();
+    
+    private final List<ProcedureCallNameSegment> procedureCallNames = new 
ArrayList<>();
+    
+    private final List<ProcedureBodyEndNameSegment> triggerBodyEndNameSegments 
= new ArrayList<>();
+    
+    private final List<ExpressionSegment> dynamicSqlStatementExpressions = new 
ArrayList<>();
+    
+    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
+    
+    private final SQLStatementAttributes attributes = new 
SQLStatementAttributes(new TableSQLStatementAttribute(tables));
+    
     public CreateTriggerStatement(final DatabaseType databaseType) {
         super(databaseType);
     }
+    
+    /**
+     * Get trigger name segment.
+     *
+     * @return trigger name segment
+     */
+    public Optional<FunctionNameSegment> getTriggerName() {
+        return Optional.ofNullable(triggerName);
+    }
+    
+    /**
+     * Set trigger table.
+     *
+     * @param table trigger table
+     */
+    public void setTable(final SimpleTableSegment table) {
+        tables.clear();
+        if (null != table) {
+            tables.add(table);
+        }
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/view/CreateMaterializedViewStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/view/CreateMaterializedViewStatement.java
index efd10cc4783..05009539003 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/view/CreateMaterializedViewStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/view/CreateMaterializedViewStatement.java
@@ -17,14 +17,26 @@
 
 package 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view;
 
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 
 /**
  * Create materialized view statement.
  */
+@Getter
+@Setter
 public final class CreateMaterializedViewStatement extends DDLStatement {
     
+    private SimpleTableSegment view;
+    
+    private String viewDefinition;
+    
+    private SelectStatement select;
+    
     public CreateMaterializedViewStatement(final DatabaseType databaseType) {
         super(databaseType);
     }
diff --git 
a/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/function/OracleCreateFunctionStatement.java
 
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/function/OracleCreateFunctionStatement.java
index f2f53056c0a..45571ed2e4a 100644
--- 
a/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/function/OracleCreateFunctionStatement.java
+++ 
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/function/OracleCreateFunctionStatement.java
@@ -17,30 +17,30 @@
 
 package org.apache.shardingsphere.sql.parser.statement.oracle.ddl.function;
 
-import lombok.Getter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureBodyEndNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.SQLStatementSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.CreateFunctionStatement;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
  * Create function statement for Oracle.
  */
-@Getter
 public final class OracleCreateFunctionStatement extends 
CreateFunctionStatement {
     
-    private final List<SQLStatementSegment> sqlStatements;
-    
-    private final List<ProcedureCallNameSegment> procedureCallNames;
-    
     public OracleCreateFunctionStatement(final DatabaseType databaseType, 
final List<SQLStatementSegment> sqlStatements, final 
List<ProcedureCallNameSegment> procedureCallNames,
                                          final FunctionNameSegment 
functionName, final List<ExpressionSegment> dynamicSqlStatementExpressions) {
-        super(databaseType, functionName, null, 
dynamicSqlStatementExpressions);
-        this.sqlStatements = sqlStatements;
-        this.procedureCallNames = procedureCallNames;
+        this(databaseType, sqlStatements, procedureCallNames, 
Collections.emptyList(), functionName, dynamicSqlStatementExpressions);
+    }
+    
+    public OracleCreateFunctionStatement(final DatabaseType databaseType, 
final List<SQLStatementSegment> sqlStatements, final 
List<ProcedureCallNameSegment> procedureCallNames,
+                                         final 
List<ProcedureBodyEndNameSegment> functionBodyEndNameSegments, final 
FunctionNameSegment functionName,
+                                         final List<ExpressionSegment> 
dynamicSqlStatementExpressions) {
+        super(databaseType, functionName, null, sqlStatements, 
procedureCallNames, functionBodyEndNameSegments, 
dynamicSqlStatementExpressions);
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/StandardDDLStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/StandardDDLStatementAssert.java
index c5737fb5375..160eab3a18f 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/StandardDDLStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/StandardDDLStatementAssert.java
@@ -44,6 +44,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.ta
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.AlterTablespaceStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.CreateTriggerStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
@@ -67,6 +68,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.d
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateProcedureStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateSequenceStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateTableStatementAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateTriggerStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateViewStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.CreateFileStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.standard.type.DropEncryptKeyStatementAssert;
@@ -108,6 +110,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.ddl.standard.table.DropTableStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.table.RenameTableStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.tablespace.AlterTablespaceStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.trigger.CreateTriggerStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.view.AlterViewStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.view.CreateViewStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.view.DropViewStatementTestCase;
@@ -173,6 +176,8 @@ public final class StandardDDLStatementAssert {
             CreateSequenceStatementAssert.assertIs(assertContext, 
(CreateSequenceStatement) actual, (CreateSequenceStatementTestCase) expected);
         } else if (actual instanceof CreateProcedureStatement) {
             CreateProcedureStatementAssert.assertIs(assertContext, 
(CreateProcedureStatement) actual, (CreateProcedureTestCase) expected);
+        } else if (actual instanceof CreateTriggerStatement) {
+            CreateTriggerStatementAssert.assertIs(assertContext, 
(CreateTriggerStatement) actual, (CreateTriggerStatementTestCase) expected);
         } else if (actual instanceof AlterCatalogStatement) {
             AlterCatalogStatementAssert.assertIs(assertContext, 
(AlterCatalogStatement) actual, (AlterCatalogStatementTestCase) expected);
         } else if (actual instanceof AlterDatabaseStatement) {
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTriggerStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTriggerStatementAssert.java
new file mode 100644
index 00000000000..b624ab97fc6
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTriggerStatementAssert.java
@@ -0,0 +1,62 @@
+/*
+ * 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.asserts.statement.ddl.standard.type;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.CreateTriggerStatement;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+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.statement.ddl.standard.trigger.CreateTriggerStatementTestCase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Create trigger statement assert.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class CreateTriggerStatementAssert {
+    
+    /**
+     * Assert create trigger statement is correct with expected parser result.
+     *
+     * @param assertContext assert context
+     * @param actual actual create trigger statement
+     * @param expected expected create trigger statement test case
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final CreateTriggerStatement actual, final CreateTriggerStatementTestCase 
expected) {
+        if (null != expected.getProcedureCalls()) {
+            assertProcedureCallNames(assertContext, 
actual.getProcedureCallNames(), expected.getProcedureCalls());
+        }
+    }
+    
+    private static void assertProcedureCallNames(final SQLCaseAssertContext 
assertContext, final List<ProcedureCallNameSegment> actual,
+                                                 final 
List<ExpectedProcedureCallNameSegment> expectedProcedureCallSegments) {
+        assertThat(assertContext.getText("Procedure call names size 
mismatched: "), actual.size(), is(expectedProcedureCallSegments.size()));
+        List<ProcedureCallNameSegment> actualSegments = new 
ArrayList<>(actual);
+        List<ExpectedProcedureCallNameSegment> expectedSegments = new 
ArrayList<>(expectedProcedureCallSegments);
+        for (int i = 0; i < actualSegments.size(); i++) {
+            assertThat(assertContext.getText("Procedure call name 
mismatched:"), actualSegments.get(i).toString(), 
is(expectedSegments.get(i).getName()));
+        }
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/trigger/CreateTriggerStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/trigger/CreateTriggerStatementTestCase.java
index 837baa3945a..8f8140c2a08 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/trigger/CreateTriggerStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/trigger/CreateTriggerStatementTestCase.java
@@ -17,10 +17,23 @@
 
 package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.trigger;
 
+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.ExpectedProcedureCallNameSegment;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import java.util.List;
 
 /**
  * Create trigger statement test case.
  */
+@Getter
+@Setter
 public final class CreateTriggerStatementTestCase extends SQLParserTestCase {
+    
+    @XmlElementWrapper(name = "procedure-calls")
+    @XmlElement(name = "procedure-call")
+    private List<ExpectedProcedureCallNameSegment> procedureCalls;
 }
diff --git a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
index ac30b30cb42..f5ab004003b 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
@@ -33,6 +33,11 @@
     <create-trigger 
sql-case-id="create_trigger_with_execute_immediate_statement" />
     <create-trigger sql-case-id="create_trigger_with_assignment_statement" />
     <create-trigger sql-case-id="create_trigger_with_logon" />
+    <create-trigger sql-case-id="create_trigger_with_call_statement">
+        <procedure-calls>
+            <procedure-call name="DBMS_OUTPUT.PUT_LINE" />
+        </procedure-calls>
+    </create-trigger>
     <create-trigger sql-case-id="create_trigger_with_cascade_1" />
     <create-trigger sql-case-id="create_trigger_with_cascade_2" />
     <create-trigger sql-case-id="create_trigger_with_cascade_3" />
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
index cea315de443..72c3ee642a5 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
@@ -106,8 +106,7 @@
             DECLARE v1 VARCHAR(10) DEFAULT null;
             SELECT f2 INTO v1 FROM t3 WHERE f1 = p1; RETURN v1;
         END" db-types="MySQL" />
-    <sql-case id="create_function_call_spec_java" value="CREATE FUNCTION 
SecondMax (input NUMBER) RETURN NUMBER
-        PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl AS LANGUAGE JAVA NAME 
'name'" db-types="Oracle" />
+    <sql-case id="create_function_call_spec_java" value="CREATE FUNCTION 
java_max (input NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'SecondMax.max(int) 
return int'" db-types="Oracle" />
     <sql-case id="create_function_call_spec_c" value="CREATE FUNCTION get_val
         (x_val IN NUMBER,
          y_val IN NUMBER,
@@ -120,7 +119,7 @@
     <sql-case id="create_function_with_set_var" value="CREATE DEFINER = 
u1@localhost FUNCTION f2() RETURNS int BEGIN DECLARE n int; DECLARE m int; SET 
n:= (SELECT min(a) FROM t1); SET m:= (SELECT max(a) FROM t1); RETURN n &lt; m; 
END ;" db-types="MySQL" />
     <sql-case id="create_function_with_create_view" value="CREATE FUNCTION 
bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END" 
db-types="MySQL" />
     <sql-case id="create_function_with_loop" value="CREATE FUNCTION f(cur 
SYS_REFCURSOR, mgr_hiredate DATE) RETURN NUMBER IS emp_hiredate DATE; before 
number :=0; after number:=0; begin loop fetch cur into emp_hiredate; exit when 
cur%NOTFOUND; if emp_hiredate > mgr_hiredate then after:=after+1; else 
before:=before+1; end if; end loop; close cur; if before > after then return 1; 
else return 0; end if; end;" db-types="Oracle" />
-    <sql-case id="create_function_with_aggregate_using_function" value="CREATE 
OR REPLACE EDITIONABLE FUNCTION MY_FUNC (P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE 
USING MY_AGG_FUNC AS LANGUAGE JAVA NAME 'test';" db-types="Oracle" />
+    <sql-case id="create_function_with_aggregate_using_function" value="CREATE 
OR REPLACE EDITIONABLE FUNCTION MY_FUNC (P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE 
USING MY_AGG_FUNC;" db-types="Oracle" />
     <sql-case id="create_function_with_simple_arithmetic" value="CREATE 
FUNCTION ADD_INT(A INT, B INT DEFAULT 0) RETURNS INT AS BEGIN RETURN A+B; END" 
db-types="Firebird"/>
     <sql-case id="create_temporary_function_basic" value="CREATE TEMPORARY 
FUNCTION parse_json AS 'com.example.JsonParser';" db-types="Hive" />
     <sql-case id="create_function_basic" value="CREATE FUNCTION 
calculate_score AS 'com.example.ScoreCalculator';" db-types="Hive" />
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
index f8a1b29cbe6..e13bdaab478 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
@@ -30,6 +30,7 @@
     <sql-case id="create_trigger_with_execute_immediate_statement" 
value="CREATE TRIGGER adg_logon_sync_trigger AFTER LOGON ON user.schema begin 
if (SYS_CONTEXT('USERENV', 'DATABASE_ROLE')  IN ('PHYSICAL STANDBY')) then 
execute immediate 'alter session sync with primary'; end if; end;" 
db-types="Oracle" />
     <sql-case id="create_trigger_with_assignment_statement" value="CREATE 
TRIGGER Contacts_BI BEFORE INSERT ON Contacts FOR EACH ROW BEGIN :NEW.ID := 
Contacts_Seq.NEXTVAL; END;" db-types="Oracle" />
     <sql-case id="create_trigger_with_logon" value="CREATE OR REPLACE TRIGGER 
check_user AFTER LOGON ON DATABASE BEGIN check_user; EXCEPTION WHEN OTHERS THEN 
RAISE_APPLICATION_ERROR (-20000, 'Unexpected error: '|| 
DBMS_Utility.Format_Error_Stack); END;" db-types="Oracle" />
+    <sql-case id="create_trigger_with_call_statement" value="CREATE TRIGGER 
call_error_handler AFTER SERVERERROR ON DATABASE CALL 
DBMS_OUTPUT.PUT_LINE('error')" db-types="Oracle" />
     <sql-case id="create_trigger_with_cascade_1" value="CREATE OR REPLACE 
TRIGGER dept_cascade3 AFTER UPDATE OF Deptno ON dept BEGIN UPDATE emp SET 
Update_id = NULL WHERE Update_id = Integritypackage.Updateseq; END;" 
db-types="Oracle" />
     <sql-case id="create_trigger_with_cascade_2" value="CREATE OR REPLACE 
TRIGGER dept_del_cascade AFTER DELETE ON dept FOR EACH ROW BEGIN DELETE FROM 
emp WHERE emp.Deptno = :OLD.Deptno; END;" db-types="Oracle" />
     <sql-case id="create_trigger_with_cascade_3" value="CREATE OR REPLACE 
TRIGGER dept_cascade2 AFTER DELETE OR UPDATE OF Deptno ON dept FOR EACH ROW 
BEGIN IF UPDATING THEN UPDATE emp SET Deptno = :NEW.Deptno, Update_id = 
Integritypackage.Updateseq WHERE emp.Deptno = :OLD.Deptno AND Update_id IS 
NULL; END IF; IF DELETING THEN DELETE FROM emp WHERE emp.Deptno = :OLD.Deptno; 
END IF; END;" db-types="Oracle" />

Reply via email to