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>