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

strongduanmu 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 b88fdcf349a Support Oracle Create TABLE sql statement parse (#38667)
b88fdcf349a is described below

commit b88fdcf349ad7830799bbef5c33ea8be4f533863
Author: Claire <[email protected]>
AuthorDate: Thu May 14 18:30:57 2026 +0800

    Support Oracle Create TABLE sql statement parse (#38667)
    
    * good first issue
    
    * update release-notes
    
    * update according review suggestion
---
 RELEASE-NOTES.md                                   |  1 +
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 |  1 +
 .../visitor/statement/OracleStatementVisitor.java  |  3 +
 .../src/main/resources/case/ddl/create-table.xml   | 64 +++++++++++++++++++++-
 .../resources/sql/supported/ddl/create-table.xml   |  6 ++
 5 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index c4da05de705..9c6818c23e7 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -29,6 +29,7 @@
 1. SQL Parser: Support additional MySQL SELECT index hint and MATCH ... 
AGAINST WITH ROLLUP syntax - 
[#38233](https://github.com/apache/shardingsphere/pull/38233)
 1. SQL Parser: Support MySQL CREATE EVENT and additional CREATE FUNCTION 
RETURN syntax - [#38237](https://github.com/apache/shardingsphere/pull/38237)
 1. SQL Parser: Support MySQL subquery table projection alias visit to SQL 
statement - [#38320](https://github.com/apache/shardingsphere/pull/38320)
+1. SQL Parser: Support Oracle Create TABLE sql statement parse - 
[#38667](https://github.com/apache/shardingsphere/pull/38667)
 1. SQL Parser: Enhance select window partition by order by, lead placeholder 
parse - [#38392](https://github.com/apache/shardingsphere/pull/38392)
 1. SQL Parser: Support MariaDB cycleClause, groupConcatLimitClause, MEDIAN 
window function parse - 
[#38579](https://github.com/apache/shardingsphere/pull/38579)
 1. SQL Parser: Support mysql, doris insert & replace rows statement parse - 
[#38585](https://github.com/apache/shardingsphere/pull/38585)
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 04a9f8c4b76..333dbeb4e15 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++ 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -689,6 +689,7 @@ columnProperty
     : objectTypeColProperties
     | xmlTypeColProperties
     | lobStorageClause
+    | nestedTableColProperties
     ;
 
 xmlTypeColProperties
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
index 06a8a268833..ef07816714b 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
@@ -1493,6 +1493,9 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.specialDatatype()) {
             result.setDataTypeName(((KeywordValue) 
visit(ctx.specialDatatype().dataTypeName())).getValue());
         }
+        if (null != ctx.customDataType()) {
+            result.setDataTypeName(ctx.customDataType().getText());
+        }
         result.setStartIndex(ctx.start.getStartIndex());
         result.setStopIndex(ctx.stop.getStopIndex());
         if (null != ctx.dataTypeLength()) {
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 4cfea986a44..b63af445aea 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
@@ -2135,6 +2135,64 @@
             <referenced-table name="warehouse_table" start-index="89" 
stop-index="103" />
         </column-definition>
     </create-table>
+
+    <create-table sql-case-id="create_table_with_nested_table_store_as" 
db-types="Oracle">
+        <table name="people_reltab" start-index="13" stop-index="28">
+            <owner name="oe" start-index="13" stop-index="14" />
+        </table>
+        <column-definition type="NUMBER" primary-key="true" start-index="32" 
stop-index="83">
+            <column name="id" />
+        </column-definition>
+        <column-definition type="VARCHAR2" start-index="86" stop-index="108">
+            <column name="first_name" />
+        </column-definition>
+        <column-definition type="VARCHAR2" start-index="111" stop-index="132">
+            <column name="last_name" />
+        </column-definition>
+        <column-definition type="oe.phone_ntabtyp" start-index="135" 
stop-index="162">
+            <column name="phones_ntab" />
+        </column-definition>
+    </create-table>
+
+    <create-table 
sql-case-id="create_table_with_nested_table_mixed_column_properties_xmltype_first"
 db-types="Oracle">
+        <table name="t_nested_mix" start-index="13" stop-index="24" />
+        <column-definition type="XMLTYPE" start-index="27" stop-index="37">
+            <column name="doc" />
+        </column-definition>
+        <column-definition type="phone_ntabtyp" start-index="40" 
stop-index="64">
+            <column name="phones_ntab" />
+        </column-definition>
+    </create-table>
+
+    <create-table 
sql-case-id="create_table_with_nested_table_mixed_column_properties_nested_first"
 db-types="Oracle">
+        <table name="t_nested_mix2" start-index="13" stop-index="25" />
+        <column-definition type="XMLTYPE" start-index="28" stop-index="38">
+            <column name="doc" />
+        </column-definition>
+        <column-definition type="phone_ntabtyp" start-index="41" 
stop-index="65">
+            <column name="phones_ntab" />
+        </column-definition>
+    </create-table>
+
+    <create-table 
sql-case-id="create_table_with_nested_table_mixed_column_properties_lob_first" 
db-types="Oracle">
+        <table name="t_nested_lob_mix" start-index="13" stop-index="28" />
+        <column-definition type="CLOB" start-index="31" stop-index="38">
+            <column name="doc" />
+        </column-definition>
+        <column-definition type="phone_ntabtyp" start-index="41" 
stop-index="65">
+            <column name="phones_ntab" />
+        </column-definition>
+    </create-table>
+
+    <create-table 
sql-case-id="create_table_with_nested_table_mixed_column_properties_nested_first_lob"
 db-types="Oracle">
+        <table name="t_nested_lob_mix2" start-index="13" stop-index="29" />
+        <column-definition type="CLOB" start-index="32" stop-index="39">
+            <column name="doc" />
+        </column-definition>
+        <column-definition type="phone_ntabtyp" start-index="42" 
stop-index="66">
+            <column name="phones_ntab" />
+        </column-definition>
+    </create-table>
     
     <create-table sql-case-id="create_table_with_select" db-types="Doris">
         <table name="t_order_new" start-index="13" stop-index="23"/>
@@ -2190,7 +2248,11 @@
     <create-table sql-case-id="create_table_with_select_without_query" 
db-types="Oracle">
         <table name="t_order_new" start-index="13" stop-index="23"/>
     </create-table>
-    
+
+    <create-table sql-case-id="create_table_as_select_with_pivot" 
db-types="Oracle">
+        <table name="pivot_table" 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">
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 0f5471d6ab6..dccb4ed914b 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
@@ -158,12 +158,18 @@
     <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-case id="create_table_with_nested_table_store_as" value="CREATE TABLE 
oe.people_reltab ( id NUMBER(4) CONSTRAINT pk_people_reltab PRIMARY KEY, 
first_name VARCHAR2(20), last_name VARCHAR2(20), phones_ntab oe.phone_ntabtyp) 
NESTED TABLE phones_ntab STORE AS phone_store_ntab ((PRIMARY KEY 
(NESTED_TABLE_ID, location)));" db-types="Oracle" />
+    <sql-case 
id="create_table_with_nested_table_mixed_column_properties_xmltype_first" 
value="CREATE TABLE t_nested_mix (doc XMLTYPE, phones_ntab phone_ntabtyp) 
XMLTYPE COLUMN doc STORE AS CLOB NESTED TABLE phones_ntab STORE AS 
phone_store_ntab;" db-types="Oracle" />
+    <sql-case 
id="create_table_with_nested_table_mixed_column_properties_nested_first" 
value="CREATE TABLE t_nested_mix2 (doc XMLTYPE, phones_ntab phone_ntabtyp) 
NESTED TABLE phones_ntab STORE AS phone_store_ntab XMLTYPE COLUMN doc STORE AS 
CLOB;" db-types="Oracle" />
+    <sql-case 
id="create_table_with_nested_table_mixed_column_properties_lob_first" 
value="CREATE TABLE t_nested_lob_mix (doc CLOB, phones_ntab phone_ntabtyp) LOB 
(doc) STORE AS doc_lob_seg NESTED TABLE phones_ntab STORE AS phone_store_ntab;" 
db-types="Oracle" />
+    <sql-case 
id="create_table_with_nested_table_mixed_column_properties_nested_first_lob" 
value="CREATE TABLE t_nested_lob_mix2 (doc CLOB, phones_ntab phone_ntabtyp) 
NESTED TABLE phones_ntab STORE AS phone_store_ntab LOB (doc) STORE AS 
doc_lob_seg;" db-types="Oracle" />
     <sql-case id="create_table_with_select" value="CREATE TABLE t_order_new AS 
SELECT * FROM t_order" db-types="Doris"/>
     <sql-case id="create_table_with_comment_doris" value="CREATE TABLE 
t_comment (id INT) ENGINE=olap COMMENT 'doris table comment'" db-types="Doris" 
/>
     <sql-case id="create_table_with_unique_constraint_doris" value="CREATE 
TABLE t_unique (id INT, UNIQUE (id))" db-types="Doris" />
     <sql-case id="create_table_with_foreign_key_constraint_doris" 
value="CREATE TABLE t_fk (id INT, CONSTRAINT fk_order FOREIGN KEY (id) 
REFERENCES ref_table (id))" db-types="Doris" />
     <sql-case id="create_table_with_inline_reference_doris" value="CREATE 
TABLE t_col_fk (id INT REFERENCES ref_table(id))" db-types="Doris" />
     <sql-case id="create_table_with_select_without_query" value="CREATE TABLE 
t_order_new AS SELECT * FROM t_order" db-types="Oracle"/>
+    <sql-case id="create_table_as_select_with_pivot" value="CREATE TABLE 
pivot_table AS SELECT * FROM (SELECT EXTRACT(YEAR FROM order_date) year, 
order_mode, order_total FROM orders) PIVOT (SUM(order_total) FOR order_mode IN 
('direct' AS Store, 'online' AS Internet));" 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,

Reply via email to