This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 6c9a8c9a517 [Oracle SQL] Support REF column in create table clause 
(#28264)
6c9a8c9a517 is described below

commit 6c9a8c9a517d0526c1c5fbee63bda71044c0087e
Author: Liao Lanyu <[email protected]>
AuthorDate: Mon Sep 4 15:55:59 2023 +0800

    [Oracle SQL] Support REF column in create table clause (#28264)
    
    * fix
    
    * check style
    
    * fix
---
 .../oracle/src/main/antlr4/imports/oracle/DDLStatement.g4     |  2 +-
 .../visitor/statement/type/OracleDDLStatementVisitor.java     |  3 +++
 .../common/segment/ddl/column/ColumnDefinitionSegment.java    |  4 ++++
 test/it/parser/src/main/resources/case/ddl/create-table.xml   | 11 +++++++++++
 .../src/main/resources/sql/supported/ddl/create-table.xml     |  1 +
 5 files changed, 20 insertions(+), 1 deletion(-)

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 39dc62a3e6c..a6a5c4c9493 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
@@ -260,7 +260,7 @@ relationalProperty
     ;
 
 columnDefinition
-    : columnName dataType SORT? visibleClause (defaultNullClause expr | 
identityClause)? (ENCRYPT encryptionSpecification)? (inlineConstraint+ | 
inlineRefConstraint)?
+    : columnName REF? dataType SORT? visibleClause (defaultNullClause expr | 
identityClause)? (ENCRYPT encryptionSpecification)? (inlineConstraint+ | 
inlineRefConstraint)?
     | REF LP_ columnName RP_ WITH ROWID
     ;
 
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 8935a1ffd1c..4e83af5ae14 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
@@ -392,6 +392,9 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         boolean isPrimaryKey = ctx.inlineConstraint().stream().anyMatch(each 
-> null != each.primaryKey());
         boolean isNotNull = ctx.inlineConstraint().stream().anyMatch(each -> 
null != each.NOT() && null != each.NULL());
         ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull);
+        if (null != ctx.REF() && null != ctx.dataType()) {
+            result.setRef(true);
+        }
         for (InlineConstraintContext each : ctx.inlineConstraint()) {
             if (null != each.referencesClause()) {
                 result.getReferencedTables().add((SimpleTableSegment) 
visit(each.referencesClause().tableName()));
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/ColumnDefinitionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/ColumnDefinitionSegment.java
index 4376d58774e..6372e4eb6c5 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/ColumnDefinitionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/ColumnDefinitionSegment.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.CreateDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
@@ -47,4 +48,7 @@ public final class ColumnDefinitionSegment implements 
CreateDefinitionSegment {
     private final boolean notNull;
     
     private final Collection<SimpleTableSegment> referencedTables = new 
LinkedList<>();
+    
+    @Setter
+    private boolean isRef;
 }
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 9d1a21b2fa1..41a5308aa82 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
@@ -2021,4 +2021,15 @@
             <column name="COL4" />
         </column-definition>
     </create-table>
+
+    <create-table sql-case-id="create_table_with_ref_data_type">
+        <table name="location_table" start-index="13" stop-index="26"  />
+        <column-definition type="NUMBER" start-index="29" stop-index="50">
+            <column name="location_number" />
+        </column-definition>
+        <column-definition type="warehouse_typ" start-index="53" 
stop-index="103">
+            <column name="building" />
+            <referenced-table name="warehouse_table" start-index="89" 
stop-index="103" />
+        </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 bfc79818444..c54d8c9d0d7 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
@@ -148,4 +148,5 @@
     <sql-case id="create_table_with_unsigned_int" value="CREATE TABLE t_order 
(order_id INT, user_id INT, status UNSIGNED INT)" db-types="MySQL" />
     <sql-case id="create_table_with_partition_less_than" value="CREATE TABLE 
t_sales (order_id INTEGER NOT NULL, goods_name CHAR(20) NOT NULL, sales_date 
DATE NOT NULL, sales_volume INTEGER, sales_store CHAR(20), PRIMARY KEY ( 
order_id )) PARTITION BY RANGE (sales_date) (PARTITION season1 VALUES LESS 
THAN('2023-04-01 00:00:00'),PARTITION season2 VALUES LESS THAN('2023-07-01 
00:00:00'),PARTITION season3 VALUES LESS THAN('2023-10-01 00:00:00'),PARTITION 
season4 VALUES LESS THAN(MAXVALUE))" [...]
     <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-cases>

Reply via email to