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 8dcb32d  Add Oracle SQL - CREATE DATABASE (#13936)
8dcb32d is described below

commit 8dcb32dd1c26471d93528ef82dc7436385422bd2
Author: Liangda-w <[email protected]>
AuthorDate: Mon Dec 6 08:00:40 2021 +0100

    Add Oracle SQL - CREATE DATABASE (#13936)
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     | 12 +++
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 | 95 ++++++++++++++++++++--
 .../main/antlr4/imports/oracle/OracleKeyword.g4    | 72 ++++++++++++++++
 .../sql/parser/autogen/OracleStatement.g4          |  1 +
 .../impl/OracleDDLStatementSQLVisitor.java         |  7 ++
 .../oracle/ddl/OracleCreateDatabaseStatement.java  | 29 +++++++
 .../main/resources/case/ddl/create-database.xml    |  2 +
 .../sql/supported/ddl/create-database.xml          | 56 +++++++++++++
 8 files changed, 268 insertions(+), 6 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 9c276d4..674d1a2 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
@@ -1188,3 +1188,15 @@ inCondition
 isOfTypeCondition
     : expr IS NOT? OF TYPE? LP_ ONLY? typeName (COMMA_ ONLY? typeName)* RP_
     ;
+
+databaseCharset
+    : AL32UTF8
+    ;
+
+nationalCharset
+    : AL16UTF16 | UTF8
+    ;
+
+filenamePattern
+    : STRING_
+    ;
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 c0b2e1f..19dd2ba 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
@@ -529,7 +529,7 @@ storageClause
     ;
 
 sizeClause
-    : NUMBER_ ('K' | 'M' | 'G' | 'T' | 'P' | 'E')?
+    : (NUMBER_ | INTEGER_) ('K' | 'M' | 'G' | 'T' | 'P' | 'E')?
     ;
 
 maxsizeClause
@@ -994,7 +994,7 @@ modifyListPartition
 
 partitionExtendedName
     : PARTITION partitionName
-    | PARTITION FOR LR_ partitionKeyValue (COMMA_ partitionKeyValue)* RP_
+    | PARTITION FOR LP_ partitionKeyValue (COMMA_ partitionKeyValue)* RP_
     ;
 
 addRangeSubpartition
@@ -1320,7 +1320,11 @@ databaseFileClauses
 
 createDatafileClause
     : CREATE DATAFILE (fileName | fileNumber) (COMMA_ (fileName | fileNumber))*
-    ( AS (fileSpecification (COMMA_ fileSpecification)* | NEW))?
+    ( AS (fileSpecifications | NEW))?
+    ;
+
+fileSpecifications
+    : fileSpecification (COMMA_ fileSpecification)*
     ;
 
 fileSpecification
@@ -1429,7 +1433,7 @@ maximizeStandbyDbClause
     ;
 
 registerLogfileClause
-    : REGISTER (OR REPLACE)? (PHYSICAL | LOGICAL)? LOGFILE fileSpecification 
(COMMA_ fileSpecification)* (FOR logminerSessionName)?
+    : REGISTER (OR REPLACE)? (PHYSICAL | LOGICAL)? LOGFILE fileSpecifications 
(FOR logminerSessionName)?
     ;
 
 commitSwitchoverClause
@@ -1462,7 +1466,7 @@ failoverClause
 
 defaultSettingsClauses
     : DEFAULT EDITION EQ_ editionName
-    | SET DEFAULT (BIGFILE | SMALLFILE) TABLESPACE
+    | SET DEFAULT bigOrSmallFiles TABLESPACE
     | DEFAULT TABLESPACE tablespaceName
     | DEFAULT LOCAL? TEMPORARY TABLESPACE (tablespaceName | 
tablespaceGroupName)
     | RENAME GLOBAL_NAME TO databaseName DOT_ domain (DOT_ domain)*
@@ -1476,7 +1480,7 @@ defaultSettingsClauses
     ;
 
 setTimeZoneClause
-    : SET TIME_ZONE EQ_ SQ_ ( (PLUS_ | MINUS_) dateValue  | timeZoneRegion ) 
SQ_
+    : SET TIME_ZONE EQ_ ((PLUS_ | MINUS_) dateValue | timeZoneRegion) 
     ;
 
 timeZoneRegion
@@ -1926,3 +1930,82 @@ purge
 rename
     : RENAME name TO name
     ;
+
+createDatabase
+    : CREATE DATABASE databaseName? createDatabaseClauses+
+    ;
+
+createDatabaseClauses
+    : USER SYS IDENTIFIED BY password
+    | USER SYSTEM IDENTIFIED BY password
+    | CONTROLFILE REUSE
+    | MAXDATAFILES INTEGER_
+    | MAXINSTANCES INTEGER_
+    | CHARACTER SET databaseCharset
+    | NATIONAL CHARACTER SET nationalCharset
+    | SET DEFAULT bigOrSmallFiles TABLESPACE
+    | databaseLoggingClauses
+    | tablespaceClauses
+    | setTimeZoneClause
+    | bigOrSmallFiles? USER_DATA TABLESPACE tablespaceName DATAFILE 
datafileTempfileSpec (COMMA_ datafileTempfileSpec)*
+    | enablePluggableDatabase
+    | databaseName USING MIRROR COPY mirrorName
+    ;
+
+databaseLoggingClauses
+    : LOGFILE (GROUP INTEGER_)? fileSpecification (COMMA_ (GROUP INTEGER_)? 
fileSpecification)*
+    | MAXLOGFILES INTEGER_
+    | MAXLOGMEMBERS INTEGER_
+    | MAXLOGHISTORY INTEGER_
+    | (ARCHIVELOG | NOARCHIVELOG)
+    | FORCE LOGGING
+    | SET STANDBY NOLOGGING FOR (DATA AVAILABILITY | LOAD PERFORMANCE)
+    ;
+
+tablespaceClauses
+    : EXTENT MANAGEMENT LOCAL
+    | DATAFILE fileSpecifications
+    | SYSAUX DATAFILE fileSpecifications
+    | defaultTablespace
+    | defaultTempTablespace
+    | undoTablespace
+    ;
+
+defaultTablespace
+    : DEFAULT TABLESPACE tablespaceName (DATAFILE datafileTempfileSpec)? 
extentManagementClause?
+    ;
+
+defaultTempTablespace
+    : bigOrSmallFiles? DEFAULT 
+    (TEMPORARY TABLESPACE | LOCAL TEMPORARY TABLESPACE FOR (ALL | LEAF)) 
tablespaceName
+    (TEMPFILE fileSpecifications)? extentManagementClause?
+    ;
+
+undoTablespace
+    : bigOrSmallFiles? UNDO TABLESPACE tablespaceName (DATAFILE 
fileSpecifications)?
+    ;
+
+bigOrSmallFiles
+    : BIGFILE | SMALLFILE
+    ;
+
+extentManagementClause
+    : EXTENT MANAGEMENT LOCAL (AUTOALLOCATE | UNIFORM (SIZE sizeClause)?)?
+    ;
+
+enablePluggableDatabase
+    : ENABLE PLUGGABLE DATABASE 
+    (SEED fileNameConvert? (SYSTEM tablespaceDatafileClauses)? (SYSAUX 
tablespaceDatafileClauses)?)? undoModeClause?
+    ;
+
+fileNameConvert
+    : FILE_NAME_CONVERT EQ_ (LP_ replaceFileNamePattern (COMMA_ 
replaceFileNamePattern)* RP_| NONE)
+    ;
+
+replaceFileNamePattern
+    : filenamePattern COMMA_ filenamePattern 
+    ;
+
+tablespaceDatafileClauses
+    : DATAFILES (SIZE sizeClause | autoextendClause)+
+    ;
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 46349d5..ef4ce59 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
@@ -2542,3 +2542,75 @@ LIKE_REGEX
 EQ_REGEX
     : E Q UL_ R E G E X
     ;
+
+SYS
+    : S Y S
+    ;
+
+MAXDATAFILES
+    : M A X D A T A F I L E S
+    ;
+
+MAXINSTANCES
+    : M A X I N S T A N C E S
+    ;
+
+AL32UTF8
+    : A L '3' '2' U T F '8'
+    ;
+
+AL16UTF16
+    : A L '1' '6' U T F '1' '6'
+    ;
+
+UTF8
+    : U T F '8'
+    ;
+
+USER_DATA
+    : U S E R UL_ D A T A
+    ;
+
+MAXLOGFILES
+    : M A X L O G F I L E S
+    ;
+
+MAXLOGMEMBERS
+    : M A X L O G M E M B E R S
+    ;
+
+MAXLOGHISTORY
+    : M A X L O G H I S T O R Y
+    ;
+
+EXTENT
+    : E X T E N T
+    ;
+
+SYSAUX
+    : S Y S A U X
+    ;
+
+LEAF
+    : L E A F
+    ;
+
+AUTOALLOCATE
+    : A U T O A L L O C A T E
+    ;
+
+UNIFORM
+    : U N I F O R M
+    ;
+
+FILE_NAME_CONVERT
+    : F I L E UL_ N A M E UL_ C O N V E R T
+    ;
+
+ALLOCATE
+    : A L L O C A T E
+    ;
+
+DEALLOCATE
+    : D E A L L O C A T E
+    ;
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 43f05e8..5a1c9c4 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
@@ -61,5 +61,6 @@ execute
     | flashbackTable
     | purge
     | rename
+    | createDatabase
     ) 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 725e926..c5ff74a 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
@@ -38,6 +38,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Column
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnOrVirtualDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CommentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ConstraintClausesContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDatabaseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDefinitionClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateIndexContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext;
@@ -96,6 +97,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleAssociateStatisticsStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleAuditStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCommentStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateDatabaseStatement;
 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;
@@ -545,4 +547,9 @@ public final class OracleDDLStatementSQLVisitor extends 
OracleStatementSQLVisito
     public ASTNode visitRename(final RenameContext ctx) {
         return new OracleRenameStatement();
     }
+
+    @Override
+    public ASTNode visitCreateDatabase(final CreateDatabaseContext ctx) {
+        return new OracleCreateDatabaseStatement();
+    }
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateDatabaseStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateDatabaseStatement.java
new file mode 100644
index 0000000..cb65162
--- /dev/null
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateDatabaseStatement.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.CreateDatabaseStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
+
+/**
+ * Oracle create database statement.
+ */
+@ToString
+public final class OracleCreateDatabaseStatement extends 
CreateDatabaseStatement implements OracleStatement {
+}
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-database.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-database.xml
index eb0bbc5..e7adbc3 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-database.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/create-database.xml
@@ -23,4 +23,6 @@
     <create-database sql-case-id="create_database_with_location_and_encoding" 
/>
     <create-database sql-case-id="create_database_with_location" />
     <create-database sql-case-id="create_database_with_file" />
+    <create-database sql-case-id="create_database_oracle1" />
+    <create-database sql-case-id="create_database_oracle2" />
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-database.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-database.xml
index 1cba206..d87f675 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-database.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ddl/create-database.xml
@@ -34,4 +34,60 @@
         LOG ON ( NAME = Sales_log,
             FILENAME = 'C:\Program Files\Microsoft SQL 
Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\salelog.ldf',
             SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ;" 
db-types="SQLServer" />
+    <sql-case id="create_database_oracle1" value="CREATE DATABASE sample
+        CONTROLFILE REUSE 
+        LOGFILE
+           GROUP 1 ('diskx:log1.log', 'disky:log1.log') SIZE 50K, 
+           GROUP 2 ('diskx:log2.log', 'disky:log2.log') SIZE 50K 
+        MAXLOGFILES 5 
+        MAXLOGHISTORY 100 
+        MAXDATAFILES 10 
+        MAXINSTANCES 2 
+        ARCHIVELOG 
+        CHARACTER SET AL32UTF8
+        NATIONAL CHARACTER SET AL16UTF16
+        DATAFILE  
+           'disk1:df1.dbf' AUTOEXTEND ON,
+           'disk2:df2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
+        DEFAULT TEMPORARY TABLESPACE temp_ts
+        UNDO TABLESPACE undo_ts 
+        SET TIME_ZONE = '+02:00'" db-types="Oracle" />
+    <sql-case id="create_database_oracle2" value="CREATE DATABASE newcdb
+        USER SYS IDENTIFIED BY sys_password
+        USER SYSTEM IDENTIFIED BY system_password
+        LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log')
+                   SIZE 100M BLOCKSIZE 512,
+                GROUP 2 ('/u01/logs/my/redo02a.log','/u02/logs/my/redo02b.log')
+                   SIZE 100M BLOCKSIZE 512,
+                GROUP 3 ('/u01/logs/my/redo03a.log','/u02/logs/my/redo03b.log')
+                   SIZE 100M BLOCKSIZE 512
+        MAXLOGHISTORY 1
+        MAXLOGFILES 16
+        MAXLOGMEMBERS 3
+        MAXDATAFILES 1024
+        CHARACTER SET AL32UTF8
+        NATIONAL CHARACTER SET AL16UTF16
+        EXTENT MANAGEMENT LOCAL
+        DATAFILE '/u01/app/oracle/oradata/newcdb/system01.dbf'
+          SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
+        SYSAUX DATAFILE '/u01/app/oracle/oradata/newcdb/sysaux01.dbf'
+          SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
+        DEFAULT TABLESPACE deftbs
+          DATAFILE '/u01/app/oracle/oradata/newcdb/deftbs01.dbf'
+          SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
+        DEFAULT TEMPORARY TABLESPACE tempts1
+          TEMPFILE '/u01/app/oracle/oradata/newcdb/temp01.dbf'
+          SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
+        UNDO TABLESPACE undotbs1
+          DATAFILE '/u01/app/oracle/oradata/newcdb/undotbs01.dbf'
+          SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
+        ENABLE PLUGGABLE DATABASE
+          SEED
+          FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/newcdb/',
+                               '/u01/app/oracle/oradata/pdbseed/')
+          SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
+          SYSAUX DATAFILES SIZE 100M
+        USER_DATA TABLESPACE usertbs
+          DATAFILE '/u01/app/oracle/oradata/pdbseed/usertbs01.dbf'
+          SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED" db-types="Oracle" />
 </sql-cases>

Reply via email to