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>