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 2d11c99 Add Oracle SQL - CREATE FUNCTION call spec (#15854)
2d11c99 is described below
commit 2d11c99904dcb2abbafb8c4b474d41f890e36395
Author: Liangda-w <[email protected]>
AuthorDate: Tue Mar 8 01:30:11 2022 +0100
Add Oracle SQL - CREATE FUNCTION call spec (#15854)
* Add base rule
* Add create function grammar
* small fix
* fix test errors
---
.../src/main/antlr4/imports/oracle/BaseRule.g4 | 31 +++++-
.../src/main/antlr4/imports/oracle/DDLStatement.g4 | 107 +++++++++++++++++++++
.../main/antlr4/imports/oracle/OracleKeyword.g4 | 68 +++++++++++++
.../sql/parser/autogen/OracleStatement.g4 | 1 +
.../impl/OracleDDLStatementSQLVisitor.java | 7 ++
.../oracle/ddl/OracleCreateFunctionStatement.java | 29 ++++++
.../main/resources/case/ddl/create-function.xml | 2 +
.../sql/supported/ddl/create-function.xml | 16 ++-
8 files changed, 259 insertions(+), 2 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/BaseRule.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 11f5c38..37e00c1 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -96,7 +96,8 @@ unreservedWord
| BECOME | CHANGE | NOTIFICATION | PRIVILEGE | PURGE | RESUMABLE
| SYSGUID | SYSBACKUP | SYSDBA | SYSDG | SYSKM | SYSOPER | DBA_RECYCLEBIN
|SCHEMA
| DO | DEFINER | CURRENT_USER | CASCADED | CLOSE | OPEN | NEXT | NAME |
NAMES
- | COLLATION | REAL | TYPE | FIRST | RANK | SAMPLE | SYSTIMESTAMP |
INTERVAL | MINUTE | ANY
+ | COLLATION | REAL | TYPE | FIRST | RANK | SAMPLE | SYSTIMESTAMP |
INTERVAL | MINUTE | ANY
+ | LENGTH | SINGLE_C
;
schemaName
@@ -1212,3 +1213,31 @@ filenamePattern
connectString
: STRING_
;
+
+argument
+ : identifier
+ ;
+
+dataSource
+ : identifier
+ ;
+
+implementationType
+ : (owner DOT_)? name
+ ;
+
+implementationPackage
+ : (owner DOT_)? name
+ ;
+
+label
+ : identifier
+ ;
+
+libName
+ : identifier
+ ;
+
+externalDatatype
+ : dataType
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 36323b7..9881179 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -2064,3 +2064,110 @@ alterDimensionDropClause
dropDimension
: DROP DIMENSION dimensionName
;
+
+createFunction
+ : CREATE (OR REPLACE)? (EDITIONABLE | NONEDITIONABLE)? FUNCTION
plsqlFunctionSource
+ ;
+
+plsqlFunctionSource
+ : function (LP_ parameterDeclaration (COMMA_ parameterDeclaration)* RP_)?
RETURN dataType
+ sharingClause? (invokerRightsClause
+ | accessibleByClause
+ | defaultCollationoOptionClause
+ | deterministicClause
+ | parallelEnableClause
+ | resultCacheClause
+ | aggregateClause
+ | pipelinedClause
+ | sqlMacroClause)*
+ (IS | AS) callSpec
+ ;
+
+parameterDeclaration
+ : parameterName (IN? dataType ((COLON_ EQ_ | DEFAULT) expr)? | IN? OUT
NOCOPY? dataType)?
+ ;
+
+sharingClause
+ : SHARING EQ_ (METADATA | NONE)
+ ;
+
+invokerRightsClause
+ : AUTHID (CURRENT_USER DEFINER)
+ ;
+
+accessibleByClause
+ : ACCESSIBLE BY LP_ accessor (COMMA_ accessor)* RP_
+ ;
+
+accessor
+ : unitKind unitName
+ ;
+
+unitKind
+ : FUNCTION | PROCEDURE | PACKAGE | TRIGGER | TYPE
+ ;
+
+defaultCollationoOptionClause
+ : DEFAULT COLLATION collationOption
+ ;
+
+collationOption
+ : USING_NLS_COMP
+ ;
+
+deterministicClause
+ : DETERMINISTIC
+ ;
+
+parallelEnableClause
+ : PARALLEL_ENABLE (LP_ PARTITION argument BY (ANY
+ | (HASH | RANGE) LP_ columnName (COMMA_ columnName)* RP_ streamingCluase?
+ | VALUE LP_ columnName RP_) RP_)?
+ ;
+
+streamingCluase
+ : (ORDER | CLUSTER) expr BY LP_ columnName (COMMA_ columnName)* RP_
+ ;
+
+resultCacheClause
+ : RESULT_CACHE (RELIES_ON LP_ (dataSource (COMMA_ dataSource)*)? RP_)?
+ ;
+
+aggregateClause
+ : AGGREGATE USING implementationType
+ ;
+
+pipelinedClause
+ : PIPELINED ((USING implementationType)?
+ | (ROW | TABLE) POLYMORPHIC (USING implementationPackage)?)
+ ;
+
+sqlMacroClause
+ : SQL_MARCO
+ ;
+
+callSpec
+ : javaDeclaration | cDeclaration
+ ;
+
+javaDeclaration
+ : LANGUAGE JAVA NAME STRING_
+ ;
+
+cDeclaration
+ : (LANGUAGE SINGLE_C | EXTERNAL)
+ ((NAME name)? LIBRARY libName| LIBRARY libName (NAME name)?)
+ (AGENT IN RP_ argument (COMMA_ argument)* LP_)?
+ (WITH CONTEXT)?
+ (PARAMETERS LP_ externalParameter (COMMA_ externalParameter)* RP_)?
+ ;
+
+externalParameter
+ : (CONTEXT
+ | SELF (TDO | property)?
+ | (parameterName | RETURN) property? (BY REFERENCE)? externalDatatype)
+ ;
+
+property
+ : (INDICATOR (STRUCT | TDO)? | LENGTH | DURATION | MAXLEN | CHARSETID |
CHARSETFORM)
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index 4694a5f..06f17b6 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -2638,3 +2638,71 @@ CHILD
DETERMINES
: D E T E R M I N E S
;
+
+RELIES_ON
+ : R E L I E S UL_ O N
+ ;
+
+AGGREGATE
+ : A G G R E G A T E
+ ;
+
+POLYMORPHIC
+ : P O L Y M O R P H I C
+ ;
+
+SQL_MARCO
+ : S Q L UL_ M A R C O
+ ;
+
+LANGUAGE
+ : L A N G U A G E
+ ;
+
+AGENT
+ : A G E N T
+ ;
+
+SELF
+ : S E L F
+ ;
+
+TDO
+ : T D O
+ ;
+
+INDICATOR
+ : I N D I C A T O R
+ ;
+
+STRUCT
+ : S T R U C T
+ ;
+
+LENGTH
+ : L E N G T H
+ ;
+
+DURATION
+ : D U R A T I O N
+ ;
+
+MAXLEN
+ : M A X L E N
+ ;
+
+CHARSETID
+ : C H A R S E T I D
+ ;
+
+CHARSETFORM
+ : C H A R S E T F O R M
+ ;
+
+SINGLE_C
+ : C
+ ;
+
+SYSTIMESTAMP
+ : S Y S T I M E S T A M P
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
index d648d6b..722b9e2 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
@@ -66,5 +66,6 @@ execute
| createDimension
| alterDimension
| dropDimension
+ | createFunction
) SEMI_?
;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDDLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDDLStatementSQLVisitor.java
index 0991038..ee3f873 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDDLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDDLStatementSQLVisitor.java
@@ -43,6 +43,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDatabaseLinkContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDefinitionClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDimensionContext;
+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.CreateTableContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DisassociateStatisticsContext;
@@ -105,6 +106,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateDatabaseLinkStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateDatabaseStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateDimensionStatement;
+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.OracleCreateTableStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDisassociateStatisticsStatement;
@@ -580,4 +582,9 @@ public final class OracleDDLStatementSQLVisitor extends
OracleStatementSQLVisito
public ASTNode visitDropDimension(final DropDimensionContext ctx) {
return new OracleDropDimensionStatement();
}
+
+ @Override
+ public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
+ return new OracleCreateFunctionStatement();
+ }
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateFunctionStatement.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateFunctionStatement.java
new file mode 100644
index 0000000..940b227
--- /dev/null
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateFunctionStatement.java
@@ -0,0 +1,29 @@
+/*
+ * 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 lombok.ToString;
+import
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateFunctionStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
+
+/**
+ * Oracle create function statement.
+ */
+@ToString
+public final class OracleCreateFunctionStatement extends
CreateFunctionStatement implements OracleStatement {
+}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-function.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-function.xml
index 6953258..e7b9112 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-function.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-function.xml
@@ -24,4 +24,6 @@
<create-function sql-case-id="create_function_with_execute" />
<create-function sql-case-id="create_function_inline_table" />
<create-function sql-case-id="create_function_declare_without_at" />
+ <create-function sql-case-id="create_function_call_spec_java" />
+ <create-function sql-case-id="create_function_call_spec_c" />
</sql-parser-test-cases>
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-function.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-function.xml
index 7cd5c85..813ee16 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-function.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-function.xml
@@ -54,5 +54,19 @@
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);" db-types="SQLServer" />
- <sql-case id="create_function_declare_without_at" value="CREATE FUNCTION
bug13575 ( p1 integer ) returns varchar(3) BEGIN 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_declare_without_at" value="CREATE FUNCTION
bug13575 ( p1 integer ) returns varchar(3)
+ BEGIN
+ 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_c" value="CREATE FUNCTION get_val
+ (x_val IN NUMBER,
+ y_val IN NUMBER,
+ image IN LONG RAW)
+ RETURN BINARY_INTEGER AS LANGUAGE C
+ NAME "c_get_val"
+ LIBRARY c_utils
+ PARAMETERS (CONTEXT)" db-types="Oracle" />
</sql-cases>