This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 4b9b74361b8 Support parsing CREATE JAVA in Oracle (#28652)
4b9b74361b8 is described below
commit 4b9b74361b8eeaef31ce538254c3ca0ac2250b56
Author: +7 <[email protected]>
AuthorDate: Sun Oct 8 13:56:09 2023 +0800
Support parsing CREATE JAVA in Oracle (#28652)
* Support parsing createJava SQL in Oracle
* Support parsing createJava SQL in Oracle
* fix createJava test case
* format code
---
.../src/main/antlr4/imports/oracle/BaseRule.g4 | 40 ++++++++++++++++++++++
.../src/main/antlr4/imports/oracle/DDLStatement.g4 | 17 +++++++++
.../sql/parser/autogen/OracleStatement.g4 | 1 +
.../statement/type/OracleDDLStatementVisitor.java | 7 ++++
.../core/database/visitor/SQLVisitorRule.java | 4 ++-
.../oracle/ddl/OracleCreateJavaStatement.java | 27 +++++++++++++++
.../cases/parser/jaxb/RootSQLParserTestCases.java | 4 +++
.../statement/ddl/CreateJavaStatementTestCase.java | 26 ++++++++++++++
.../src/main/resources/case/ddl/create-java.xml | 21 ++++++++++++
.../resources/sql/supported/ddl/create-java.xml | 21 ++++++++++++
10 files changed, 167 insertions(+), 1 deletion(-)
diff --git
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 4dc59bf2c6c..874e85b90e4 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -2066,3 +2066,43 @@ multisetOperator
superview
: identifier
;
+
+primaryName
+ : identifier
+ ;
+
+directoryObjectName
+ : identifier
+ ;
+
+serverFileName
+ : identifier
+ ;
+
+keyForBlob
+ : identifier
+ ;
+
+sourceText
+ : identifier
+ ;
+
+primaryName
+ : identifier
+ ;
+
+directoryObjectName
+ : identifier
+ ;
+
+serverFileName
+ : identifier
+ ;
+
+keyForBlob
+ : identifier
+ ;
+
+sourceText
+ : identifier
+ ;
diff --git
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 1cce32a7c6a..4735550c0d1 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -4104,3 +4104,20 @@ createCluster
(SINGLE TABLE)? HASHKEYS INTEGER_ (HASH IS functionName LP_ (argument
(COMMA_ argument)*) RP_)?)?
parallelClause? (NOROWDEPENDENCIES | ROWDEPENDENCIES)? (CACHE | NOCACHE)?
;
+
+createJava
+ : CREATE (OR REPLACE)? (AND (RESOLVE | COMPILE))? NOFORCE? JAVA
+ ((SOURCE | RESOURCE) NAMED (schemaName DOT_)? primaryName
+ | CLASS (SCHEMA schemaName)?) invokerRightsClause? resolveClauses?
+ (usingClause | AS sourceText)
+ ;
+
+usingClause
+ : USING (fileType (LP_ directoryName COMMA_ serverFileName RP_ | subquery)
| BQ_ keyForBlob BQ_)
+ ;
+
+fileType
+ : BFILE
+ | CLOB
+ | BLOB
+ ;
diff --git
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
index 92800a99bca..aecb65025c5 100644
---
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
+++
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
@@ -153,5 +153,6 @@ execute
| alterType
| createType
| createCluster
+ | createJava
) SEMI_?
;
diff --git
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 802ec6c4fb2..9c7e24df8aa 100644
---
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -84,6 +84,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateIndexContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateInmemoryJoinGroupContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateJavaContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateLockdownProfileContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewLogContext;
@@ -245,6 +246,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateFunctionStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateIndexStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateInmemoryJoinGroupStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateJavaStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateLockdownProfileStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewLogStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewStatement;
@@ -1328,4 +1330,9 @@ public final class OracleDDLStatementVisitor extends
OracleStatementVisitor impl
public ASTNode visitAlterType(final AlterTypeContext ctx) {
return new OracleAlterTypeStatement();
}
+
+ @Override
+ public ASTNode visitCreateJava(final CreateJavaContext ctx) {
+ return new OracleCreateJavaStatement();
+ }
}
diff --git
a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
index 14edbebacd0..80ee96d2202 100644
---
a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
+++
b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
@@ -693,7 +693,9 @@ public enum SQLVisitorRule {
SYSTEM_ACTION("SystemAction", SQLStatementType.DDL),
- EMPTY_STATEMENT("EmptyStatement", SQLStatementType.DAL);
+ EMPTY_STATEMENT("EmptyStatement", SQLStatementType.DAL),
+
+ CREATE_JAVA("CreateJava", SQLStatementType.DDL);
private final String name;
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateJavaStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateJavaStatement.java
new file mode 100644
index 00000000000..e33742c05ba
--- /dev/null
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateJavaStatement.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl;
+
+import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
+
+/**
+ * Oracle create java statement.
+ */
+public final class OracleCreateJavaStatement extends AbstractSQLStatement
implements OracleStatement {
+}
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 88821886f53..8900b7676ae 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
@@ -181,6 +181,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.CreateFunctionStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateIndexStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateInmemoryJoinGroupStatementTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateJavaStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateLanguageStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateLockdownProfileStatementTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.CreateMaterializedViewLogStatementTestCase;
@@ -1712,6 +1713,9 @@ public final class RootSQLParserTestCases {
@XmlElement(name = "change-replication-source-to")
private final List<ChangeReplicationSourceToStatementTestCase>
changeReplicationSourceToStatementTestCases = new LinkedList<>();
+ @XmlElement(name = "create-java")
+ private final List<CreateJavaStatementTestCase>
createJavaStatementTestCases = new LinkedList<>();
+
/**
* Get all SQL parser test cases.
*
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateJavaStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateJavaStatementTestCase.java
new file mode 100644
index 00000000000..08ab8adb99e
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateJavaStatementTestCase.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl;
+
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+
+/**
+ * Create java statement test case.
+ */
+public final class CreateJavaStatementTestCase extends SQLParserTestCase {
+}
diff --git a/test/it/parser/src/main/resources/case/ddl/create-java.xml
b/test/it/parser/src/main/resources/case/ddl/create-java.xml
new file mode 100644
index 00000000000..d583d7d659d
--- /dev/null
+++ b/test/it/parser/src/main/resources/case/ddl/create-java.xml
@@ -0,0 +1,21 @@
+<?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-java sql-case-id="create_java" />
+</sql-parser-test-cases>
diff --git
a/test/it/parser/src/main/resources/sql/supported/ddl/create-java.xml
b/test/it/parser/src/main/resources/sql/supported/ddl/create-java.xml
new file mode 100644
index 00000000000..81fda18cf7c
--- /dev/null
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-java.xml
@@ -0,0 +1,21 @@
+<?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_java" value="CREATE JAVA SOURCE NAMED
"Welcome" AS public class Welcome { public static String welcome() {
return "Welcome World";" db-types="Oracle" />
+</sql-cases>