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 < 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" />