This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 e343ca1c6d1 Support parsing Oracle CREATE TYPE BODY SQL (#39589)
e343ca1c6d1 is described below
commit e343ca1c6d1c4c32e7c92533d1d8f1ed226acac7
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 24 00:55:01 2026 +0800
Support parsing Oracle CREATE TYPE BODY SQL (#39589)
- Add createTypeBody, plsqlTypeBodySource and typeBodyElement rules to the
Oracle
PLSQL grammar, covering MEMBER/STATIC function and procedure bodies,
CONSTRUCTOR
FUNCTION with RETURN SELF AS RESULT, and MAP/ORDER MEMBER FUNCTION bodies
with
optional declare sections and full PL/SQL statement bodies
- Reuse the existing body, declareSection and parameterDeclaration building
blocks
already exercised by CREATE PACKAGE BODY, CREATE FUNCTION and CREATE
TRIGGER, and
dispatch createTypeBody before createType in the execute rule
- Build a lightweight OracleCreateTypeBodyStatement carrying the type name
and
register the CREATE_TYPE_BODY visitor rule, DDL assert branch and JAXB
test case
- Add 4 parser IT cases from issue #27005 and the official PL/SQL reference
examples
Fixes #27005
---
.../core/database/visitor/SQLVisitorRule.java | 2 +
.../oracle/src/main/antlr4/imports/oracle/PLSQL.g4 | 15 +++++++
.../sql/parser/autogen/OracleStatement.g4 | 1 +
.../statement/type/OracleDDLStatementVisitor.java | 7 ++++
.../oracle/ddl/OracleCreateTypeBodyStatement.java | 36 +++++++++++++++++
.../dialect/oracle/OracleDDLStatementAssert.java | 5 +++
.../type/OracleCreateTypeBodyStatementAssert.java | 47 ++++++++++++++++++++++
.../cases/parser/jaxb/RootSQLParserTestCases.java | 4 ++
.../OracleCreateTypeBodyStatementTestCase.java | 35 ++++++++++++++++
.../main/resources/case/ddl/create-type-body.xml | 24 +++++++++++
.../sql/supported/ddl/create-type-body.xml | 24 +++++++++++
11 files changed, 200 insertions(+)
diff --git
a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
index d5146dfcde9..c8944f85b9d 100644
---
a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
+++
b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
@@ -695,6 +695,8 @@ public enum SQLVisitorRule {
CREATE_TYPE("CreateType", SQLStatementType.DDL),
+ CREATE_TYPE_BODY("CreateTypeBody", SQLStatementType.DDL),
+
DROP_CONVERSION("DropConversion", SQLStatementType.DDL),
ALTER_DOMAIN("AlterDomain", SQLStatementType.DDL),
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 7bfb5c3f80f..8ece6d35a9f 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
@@ -115,6 +115,21 @@ packageInitialization
: BEGIN plsqlStatements (EXCEPTION exceptionHandler+)?
;
+createTypeBody
+ : CREATE (OR REPLACE)? (EDITIONABLE | NONEDITIONABLE)? TYPE BODY
plsqlTypeBodySource
+ ;
+
+plsqlTypeBodySource
+ : typeName (IS | AS) typeBodyElement+ END typeName? SEMI_?
+ ;
+
+typeBodyElement
+ : (MEMBER | STATIC)? FUNCTION function (LP_ parameterDeclaration (COMMA_
parameterDeclaration)* RP_)? returnDateType (IS | AS) declareSection? body
+ | (MEMBER | STATIC)? PROCEDURE procedureName (LP_ parameterDeclaration
(COMMA_ parameterDeclaration)* RP_)? (IS | AS) declareSection? body
+ | (FINAL | INSTANTIABLE)? CONSTRUCTOR FUNCTION function (LP_
parameterDeclaration (COMMA_ parameterDeclaration)* RP_)? RETURN SELF AS RESULT
(IS | AS) declareSection? body
+ | (MAP | ORDER) MEMBER FUNCTION function (LP_ parameterDeclaration (COMMA_
parameterDeclaration)* RP_)? returnDateType (IS | AS) declareSection? body
+ ;
+
plsqlProcedureSource
: (schemaName DOT_)? procedureName (LP_ parameterDeclaration (COMMA_
parameterDeclaration)* RP_)? sharingClause?
((defaultCollationClause | invokerRightsClause | accessibleByClause)*)?
(IS | AS) (callSpec | declareSection? body)
diff --git
a/parser/sql/engine/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
b/parser/sql/engine/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
index 8c9f3e8b9cf..74779178012 100644
---
a/parser/sql/engine/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
+++
b/parser/sql/engine/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
@@ -153,6 +153,7 @@ execute
| dropCluster
| systemAction
| alterType
+ | createTypeBody
| createType
| createCluster
| createJava
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 f79dba740b6..7909e2911bb 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
@@ -116,6 +116,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTablespaceContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTriggerContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTypeBodyContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTypeContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateViewContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CursorDefinitionContext;
@@ -375,6 +376,7 @@ import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.Oracle
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.OracleCreateLockdownProfileStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.OracleDropLockdownProfileStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleAlterOutlineStatement;
+import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateTypeBodyStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleCreateOutlineStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleDropOutlineStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.pkg.OracleCreatePackageStatement;
@@ -949,6 +951,11 @@ public final class OracleDDLStatementVisitor extends
OracleStatementVisitor impl
return result;
}
+ @Override
+ public ASTNode visitCreateTypeBody(final CreateTypeBodyContext ctx) {
+ return new OracleCreateTypeBodyStatement(getDatabaseType(),
ctx.plsqlTypeBodySource().typeName(0).getText());
+ }
+
private PackageSegment createPackageEndNameSegment(final
List<PackageNameContext> packageNames) {
return packageNames.size() < 2 ? null : (PackageSegment)
visit(packageNames.get(packageNames.size() - 1));
}
diff --git
a/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/OracleCreateTypeBodyStatement.java
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/OracleCreateTypeBodyStatement.java
new file mode 100644
index 00000000000..35a6135edf1
--- /dev/null
+++
b/parser/sql/statement/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/statement/oracle/ddl/OracleCreateTypeBodyStatement.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.statement.oracle.ddl;
+
+import lombok.Getter;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
+
+/**
+ * Create type body statement for Oracle.
+ */
+@Getter
+public final class OracleCreateTypeBodyStatement extends DDLStatement {
+
+ private final String typeName;
+
+ public OracleCreateTypeBodyStatement(final DatabaseType databaseType,
final String typeName) {
+ super(databaseType);
+ this.typeName = typeName;
+ }
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/OracleDDLStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/OracleDDLStatementAssert.java
index dd29ad37c12..c86d5d763df 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/OracleDDLStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/OracleDDLStatementAssert.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterSess
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterSystemStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAnalyzeStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAuditStatement;
+import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateTypeBodyStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleNoAuditStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OraclePurgeStatement;
import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleFlashbackTableStatement;
@@ -38,6 +39,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.dialect.oracle.type.OracleAssociateStatisticsStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleAuditStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleCreatePackageStatementAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleCreateTypeBodyStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleDisassociateStatisticsStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleFlashbackTableStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.oracle.type.OracleNoAuditStatementAssert;
@@ -48,6 +50,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.dialect.oracle.OracleAnalyzeStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleAuditStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleCreatePackageStatementTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleCreateTypeBodyStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleNoAuditStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OraclePurgeStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.flashback.OracleFlashbackTableStatementTestCase;
@@ -83,6 +86,8 @@ public final class OracleDDLStatementAssert {
OracleAuditStatementAssert.assertIs(assertContext,
(OracleAuditStatement) actual, (OracleAuditStatementTestCase) expected);
} else if (actual instanceof OracleCreatePackageStatement) {
OracleCreatePackageStatementAssert.assertIs(assertContext,
(OracleCreatePackageStatement) actual, (OracleCreatePackageStatementTestCase)
expected);
+ } else if (actual instanceof OracleCreateTypeBodyStatement) {
+ OracleCreateTypeBodyStatementAssert.assertIs(assertContext,
(OracleCreateTypeBodyStatement) actual, (OracleCreateTypeBodyStatementTestCase)
expected);
} else if (actual instanceof OracleNoAuditStatement) {
OracleNoAuditStatementAssert.assertIs(assertContext,
(OracleNoAuditStatement) actual, (OracleNoAuditStatementTestCase) expected);
} else if (actual instanceof OracleFlashbackTableStatement) {
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreateTypeBodyStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreateTypeBodyStatementAssert.java
new file mode 100644
index 00000000000..b4135a5d9c7
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/oracle/type/OracleCreateTypeBodyStatementAssert.java
@@ -0,0 +1,47 @@
+/*
+ * 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.dialect.oracle.type;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateTypeBodyStatement;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleCreateTypeBodyStatementTestCase;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Create type body statement assert for Oracle.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class OracleCreateTypeBodyStatementAssert {
+
+ /**
+ * Assert create type body statement is correct with expected parser
result.
+ *
+ * @param assertContext assert context
+ * @param actual actual create type body statement
+ * @param expected expected create type body statement test case
+ */
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final OracleCreateTypeBodyStatement actual, final
OracleCreateTypeBodyStatementTestCase expected) {
+ if (null != expected.getTypeName()) {
+ assertThat(assertContext.getText("Actual type name does not match:
"), actual.getTypeName(), is(expected.getTypeName()));
+ }
+ }
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
index 56ace0c2853..cf53eb8535c 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
@@ -186,6 +186,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.dialect.oracle.OracleAnalyzeStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleAuditStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleCreatePackageStatementTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleCreateTypeBodyStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleDropPackageStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OracleNoAuditStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle.OraclePurgeStatementTestCase;
@@ -1061,6 +1062,9 @@ public final class RootSQLParserTestCases {
@XmlElement(name = "create-package")
private final List<OracleCreatePackageStatementTestCase>
createPackageTestCases = new LinkedList<>();
+ @XmlElement(name = "create-type-body")
+ private final List<OracleCreateTypeBodyStatementTestCase>
createTypeBodyTestCases = new LinkedList<>();
+
@XmlElement(name = "create-dimension")
private final List<OracleCreateDimensionStatementTestCase>
createDimensionTestCases = new LinkedList<>();
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreateTypeBodyStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreateTypeBodyStatementTestCase.java
new file mode 100644
index 00000000000..fa8f91b0d0f
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/oracle/OracleCreateTypeBodyStatementTestCase.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.oracle;
+
+import lombok.Getter;
+import lombok.Setter;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * Create type body statement test case for Oracle.
+ */
+@Getter
+@Setter
+public final class OracleCreateTypeBodyStatementTestCase extends
SQLParserTestCase {
+
+ @XmlAttribute(name = "type-name")
+ private String typeName;
+}
diff --git a/test/it/parser/src/main/resources/case/ddl/create-type-body.xml
b/test/it/parser/src/main/resources/case/ddl/create-type-body.xml
new file mode 100644
index 00000000000..43a05f9773e
--- /dev/null
+++ b/test/it/parser/src/main/resources/case/ddl/create-type-body.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<sql-parser-test-cases>
+ <create-type-body
sql-case-id="create_type_body_with_member_functions_oracle"
type-name="data_typ1" />
+ <create-type-body
sql-case-id="create_type_body_with_map_member_and_procedure_oracle"
type-name="rational" />
+ <create-type-body
sql-case-id="create_type_body_with_constructor_member_and_static_oracle"
type-name="rectangle" />
+ <create-type-body sql-case-id="create_type_body_with_order_member_oracle"
type-name="point" />
+</sql-parser-test-cases>
diff --git
a/test/it/parser/src/main/resources/sql/supported/ddl/create-type-body.xml
b/test/it/parser/src/main/resources/sql/supported/ddl/create-type-body.xml
new file mode 100644
index 00000000000..401fe9bf889
--- /dev/null
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-type-body.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<sql-cases>
+ <sql-case id="create_type_body_with_member_functions_oracle" value="CREATE
OR REPLACE TYPE BODY data_typ1 IS MEMBER FUNCTION prod (invent NUMBER) RETURN
NUMBER IS BEGIN RETURN (year + invent); END; MEMBER FUNCTION qtr(der_qtr DATE)
RETURN CHAR IS BEGIN IF (der_qtr < TO_DATE('01-APR', 'DD-MON')) THEN RETURN
'FIRST'; ELSIF (der_qtr < TO_DATE('01-JUL', 'DD-MON')) THEN RETURN 'SECOND';
ELSIF (der_qtr < TO_DATE('01-OCT', 'DD-MON')) THEN RETURN 'THIRD'; ELSE
RETURN 'FOURTH'; END I [...]
+ <sql-case id="create_type_body_with_map_member_and_procedure_oracle"
value="CREATE OR REPLACE TYPE BODY rational AS MAP MEMBER FUNCTION convert
RETURN REAL IS BEGIN RETURN num / den; END convert; MEMBER PROCEDURE normalize
IS g INTEGER; BEGIN g := gcd(num, den); num := num / g; den := den / g; END
normalize; END;" db-types="Oracle" />
+ <sql-case id="create_type_body_with_constructor_member_and_static_oracle"
value="CREATE OR REPLACE TYPE BODY rectangle AS CONSTRUCTOR FUNCTION
rectangle(len NUMBER, wid NUMBER) RETURN SELF AS RESULT IS BEGIN length := len;
width := wid; RETURN; END; MEMBER FUNCTION get_length RETURN NUMBER IS BEGIN
RETURN length; END; STATIC FUNCTION new_square(side NUMBER) RETURN rectangle IS
result rectangle := rectangle(side, side); BEGIN RETURN result; END; END;"
db-types="Oracle" />
+ <sql-case id="create_type_body_with_order_member_oracle" value="CREATE OR
REPLACE TYPE BODY point AS ORDER MEMBER FUNCTION match(p NUMBER) RETURN NUMBER
IS BEGIN IF id = p THEN RETURN 0; ELSE RETURN 1; END IF; END; END;"
db-types="Oracle" />
+</sql-cases>