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 &quot;c_get_val&quot;
+          LIBRARY c_utils
+          PARAMETERS (CONTEXT)" db-types="Oracle" />
 </sql-cases>

Reply via email to