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 a4dacde4e9a Refactor the syntax of the Oracle create table section 
(#29210)
a4dacde4e9a is described below

commit a4dacde4e9a7e7564a1276de048be451a6eacef9
Author: niu niu <[email protected]>
AuthorDate: Sun Nov 26 18:48:53 2023 +0800

    Refactor the syntax of the Oracle create table section (#29210)
    
    * Refactor the syntax of the Oracle create table section
    
    * Add parse test
---
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 | 80 ++++++++++------------
 .../main/antlr4/imports/oracle/OracleKeyword.g4    | 24 +++++++
 .../statement/type/OracleDDLStatementVisitor.java  | 15 +++-
 .../src/main/resources/case/ddl/create-table.xml   | 45 ++++++++++++
 .../resources/sql/supported/ddl/create-table.xml   |  7 ++
 5 files changed, 127 insertions(+), 44 deletions(-)

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 2dd58acd942..d1dcc2d7cda 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
@@ -176,7 +176,7 @@ truncateTable
     ;
 
 createTableSpecification
-    : ((GLOBAL | PRIVATE) TEMPORARY | SHARDED | DUPLICATED)?
+    : ((GLOBAL | PRIVATE) TEMPORARY | SHARDED | DUPLICATED | IMMUTABLE? 
BLOCKCHAIN | IMMUTABLE)?
     ;
 
 tablespaceClauseWithParen
@@ -192,11 +192,7 @@ createSharingClause
     ;
 
 createDefinitionClause
-    : createRelationalTableClause | createObjectTableClause | 
createTableAsSelectClause | createXMLTypeTableClause
-    ;
-
-createTableAsSelectClause
-    : AS selectSubquery
+    : createRelationalTableClause | createObjectTableClause | 
createXMLTypeTableClause
     ;
 
 createXMLTypeTableClause
@@ -247,23 +243,9 @@ oidIndexClause
     ;
 
 createRelationalTableClause
-    : (LP_ relationalProperties RP_)
-    | (LP_ relationalProperties RP_) collationClause
-    | (LP_ relationalProperties RP_) commitClause
-    | (LP_ relationalProperties RP_) physicalProperties
-    | (LP_ relationalProperties RP_) tableProperties
-    | (LP_ relationalProperties RP_) collationClause commitClause
-    | (LP_ relationalProperties RP_) collationClause physicalProperties
-    | (LP_ relationalProperties RP_) collationClause tableProperties
-    | (LP_ relationalProperties RP_) collationClause commitClause 
physicalProperties
-    | (LP_ relationalProperties RP_) collationClause commitClause 
tableProperties
-    | (LP_ relationalProperties RP_) collationClause commitClause 
physicalProperties tableProperties
-    | (LP_ relationalProperties RP_) commitClause physicalProperties
-    | (LP_ relationalProperties RP_) commitClause tableProperties
-    | (LP_ relationalProperties RP_) commitClause physicalProperties 
tableProperties
-    | (LP_ relationalProperties RP_) physicalProperties tableProperties
+    : (LP_ relationalProperties RP_)? immutableTableClauses? 
blockchainTableClauses? collationClause? commitClause? physicalProperties? 
tableProperties?
     ;
-    
+
 createMemOptimizeClause
     : (MEMOPTIMIZE FOR READ)? (MEMOPTIMIZE FOR WRITE)? 
     ;    
@@ -282,12 +264,41 @@ relationalProperties
     : relationalProperty (COMMA_ relationalProperty)*
     ;
 
+immutableTableClauses
+    : immutableTableNoDropClause? immutableTableNoDeleteClause?
+    ;
+
+immutableTableNoDropClause
+    : NO DROP (UNTIL INTEGER_ DAYS IDLE)?
+    ;
+
+immutableTableNoDeleteClause
+    : NO DELETE (LOCKED? | UNTIL INTEGER_ DAYS AFTER INSERT LOCKED?)
+    ;
+
+blockchainTableClauses
+    : blockchainDropTableClause | blockchainRowRetentionClause | 
blockchainHashAndDataFormatClause
+    ;
+
+blockchainDropTableClause
+    : NO DROP (UNTIL INTEGER_ DAYS IDLE)?
+    ;
+
+blockchainRowRetentionClause
+    : NO DELETE (LOCKED? | UNTIL INTEGER_ DAYS AFTER INSERT LOCKED?)
+    ;
+
+blockchainHashAndDataFormatClause
+    : HASHING USING 'sha2_512' VERSION 'v1'
+    ;
+
 relationalProperty
     : columnDefinition | virtualColumnDefinition | outOfLineConstraint | 
outOfLineRefConstraint
     ;
 
 columnDefinition
-    : columnName REF? dataType SORT? visibleClause (defaultNullClause expr | 
identityClause)? (ENCRYPT encryptionSpecification)? (inlineConstraint+ | 
inlineRefConstraint)?
+    : columnName REF? (dataType (COLLATE columnCollationName)?)? SORT? 
visibleClause (DEFAULT (ON NULL)? expr | identityClause)? 
+    ( ENCRYPT encryptionSpecification)? (inlineConstraint+ | 
inlineRefConstraint)?
     | REF LP_ columnName RP_ WITH ROWID
     | SCOPE FOR LP_ columnName RP_ IS identifier
     ;
@@ -296,10 +307,6 @@ visibleClause
     : (VISIBLE | INVISIBLE)?
     ;
 
-defaultNullClause
-    : DEFAULT (ON NULL)?
-    ;
-
 identityClause
     : GENERATED (ALWAYS | BY DEFAULT (ON NULL)?) AS IDENTITY identifyOptions
     ;
@@ -744,7 +751,7 @@ createSynonym
     ;
 
 commitClause
-    : (ON COMMIT (DROP | PRESERVE) ROWS)? (ON COMMIT (DELETE | PRESERVE) ROWS)?
+    : (ON COMMIT (DROP | PRESERVE) DEFINITION)? (ON COMMIT (DELETE | PRESERVE) 
ROWS)?
     ;
 
 physicalProperties
@@ -908,20 +915,9 @@ clusterRelatedClause
     ;
 
 tableProperties
-    :columnProperties?
-     readOnlyClause?
-     indexingClause?
-     tablePartitioningClauses?
-     attributeClusteringClause?
-     (CACHE | NOCACHE)?
-     ( RESULT_CACHE ( MODE (DEFAULT | FORCE) ) )?
-     parallelClause?
-     (ROWDEPENDENCIES | NOROWDEPENDENCIES)?
-     enableDisableClause*
-     rowMovementClause?
-     flashbackArchiveClause?
-     (ROW ARCHIVAL)?
-     (AS subquery | FOR EXCHANGE WITH TABLE tableName)?
+    : columnProperties? readOnlyClause? indexingClause? 
tablePartitioningClauses? attributeClusteringClause? (CACHE | NOCACHE)? 
parallelClause?
+    ( RESULT_CACHE (MODE (DEFAULT | FORCE)))? (ROWDEPENDENCIES | 
NOROWDEPENDENCIES)? enableDisableClause* rowMovementClause? 
logicalReplicationClause? flashbackArchiveClause?
+    ( ROW ARCHIVAL)? (AS selectSubquery | FOR EXCHANGE WITH TABLE tableName)?
     ;
 
 readOnlyClause
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index 79d5e31517f..8961e60a929 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -7747,3 +7747,27 @@ DB_RECOVERY_FILE_DEST_SIZE
 MANDATORY
     : M A N D A T O R Y
     ;
+
+IMMUTABLE
+    : I M M U T A B L E
+    ;
+
+BLOCKCHAIN
+    : B L O C K C H A I N
+    ;
+
+IDLE
+    : I D L E
+    ;
+
+HASHING
+    : H A S H I N G
+    ;
+
+DEFINITION
+    : D E F I N I T I O N
+    ;
+
+COLLATE
+    : C O L L A T E
+    ;
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 35cf88cca75..7c145bfc395 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
@@ -93,6 +93,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateProcedureContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateProfileContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRestorePointContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRelationalTableClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRollbackSegmentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSPFileContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSequenceContext;
@@ -402,13 +403,23 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         return new TypeDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.name().getText(), (DataTypeSegment) 
visit(ctx.dataType()));
     }
     
+    @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateDefinitionClause(final 
CreateDefinitionClauseContext ctx) {
         CollectionValue<CreateDefinitionSegment> result = new 
CollectionValue<>();
-        if (null == ctx.createRelationalTableClause()) {
+        if (null != ctx.createRelationalTableClause()) {
+            result.combine((CollectionValue<CreateDefinitionSegment>) 
visit(ctx.createRelationalTableClause()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitCreateRelationalTableClause(final 
CreateRelationalTableClauseContext ctx) {
+        CollectionValue<CreateDefinitionSegment> result = new 
CollectionValue<>();
+        if (null == ctx.relationalProperties()) {
             return result;
         }
-        for (RelationalPropertyContext each : 
ctx.createRelationalTableClause().relationalProperties().relationalProperty()) {
+        for (RelationalPropertyContext each : 
ctx.relationalProperties().relationalProperty()) {
             if (null != each.columnDefinition()) {
                 result.getValue().add((ColumnDefinitionSegment) 
visit(each.columnDefinition()));
             }
diff --git a/test/it/parser/src/main/resources/case/ddl/create-table.xml 
b/test/it/parser/src/main/resources/case/ddl/create-table.xml
index 521c7c3cdef..02d5c30eb61 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-table.xml
@@ -2036,4 +2036,49 @@
     <create-table sql-case-id="create_table_with_select">
         <table name="t_order_new" start-index="13" stop-index="23"/>
     </create-table>
+    
+    <create-table 
sql-case-id="create_table_organization_index_parallel_with_select">
+        <table name="admin_iot3" start-index="13" stop-index="22"  />
+        <column-definition start-index="24" stop-index="36" primary-key="true">
+            <column name="i" start-index="24" stop-index="24" />
+        </column-definition>
+        <column-definition start-index="39" stop-index="39">
+            <column name="j" start-index="39" stop-index="39" />
+        </column-definition>
+        <column-definition start-index="42" stop-index="42">
+            <column name="k" start-index="42" stop-index="42" />
+        </column-definition>
+        <column-definition start-index="45" stop-index="45">
+            <column name="l" start-index="45" stop-index="45" />
+        </column-definition>
+    </create-table>
+    
+    <create-table sql-case-id="create_table_partition_by_range">
+        <table name="costs_demo" start-index="13" stop-index="22"  />
+        <column-definition type="NUMBER" start-index="25" stop-index="41">
+            <column name="prod_id" start-index="25" stop-index="31" />
+        </column-definition>
+        <column-definition type="DATE" start-index="44" stop-index="55">
+            <column name="time_id" start-index="44" stop-index="50" />
+        </column-definition>
+        <column-definition type="NUMBER" start-index="58" stop-index="79">
+            <column name="unit_cost" start-index="58" stop-index="66" />
+        </column-definition>
+        <column-definition type="NUMBER" start-index="82" stop-index="104">
+            <column name="unit_price" start-index="82" stop-index="91" />
+        </column-definition>
+    </create-table>
+    
+    <create-table sql-case-id="create_table_default_user">
+        <table name="audit_trail" start-index="13" stop-index="23"  />
+        <column-definition type="NUMBER" start-index="26" stop-index="38">
+            <column name="value1" start-index="26" stop-index="31" />
+        </column-definition>
+        <column-definition type="VARCHAR2" start-index="41" stop-index="59">
+            <column name="value2" start-index="41" stop-index="46" />
+        </column-definition>
+        <column-definition type="VARCHAR2" start-index="62" stop-index="95">
+            <column name="inserter" start-index="62" stop-index="69" />
+        </column-definition>
+    </create-table>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
index d9bfa0a1a65..c2dbb1f21ac 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
@@ -150,4 +150,11 @@
     <sql-case id="create_table_with_negative_data_type" value="CREATE TABLE 
T(COL1 NUMBER, COL2 NUMBER(3), COL3 NUMBER(3,2), COL4 NUMBER(6,-2))" 
db-types="Oracle" />
     <sql-case id="create_table_with_ref_data_type" value="CREATE TABLE 
location_table (location_number NUMBER, building REF warehouse_typ SCOPE IS 
warehouse_table);" db-types="Oracle" />
     <sql-case id="create_table_with_select" value="CREATE TABLE t_order_new AS 
SELECT * FROM t_order" db-types="Oracle"/>
+    <sql-case id="create_table_organization_index_parallel_with_select" 
value="CREATE TABLE admin_iot3(i PRIMARY KEY, j, k, l) ORGANIZATION INDEX 
PARALLEL AS SELECT * FROM hr.jobs" db-types="Oracle" />
+    <sql-case id="create_table_partition_by_range" value="CREATE TABLE 
costs_demo (prod_id NUMBER(6), time_id DATE, unit_cost NUMBER(10,2), unit_price 
NUMBER(10,2))
+    PARTITION BY RANGE (time_id) (PARTITION costs_old VALUES LESS THAN 
(TO_DATE('01-JAN-2003', 'DD-MON-YYYY')) COMPRESS,
+    PARTITION costs_q1_2003 VALUES LESS THAN (TO_DATE('01-APR-2003', 
'DD-MON-YYYY')),
+    PARTITION costs_q2_2003 VALUES LESS THAN (TO_DATE('01-JUN-2003', 
'DD-MON-YYYY')),
+    PARTITION costs_recent VALUES LESS THAN (MAXVALUE))" db-types="Oracle" />
+    <sql-case id="create_table_default_user" value="CREATE TABLE audit_trail 
(value1 NUMBER, value2 VARCHAR2(32), inserter VARCHAR2(30) DEFAULT USER)" 
db-types="Oracle" />
 </sql-cases>

Reply via email to