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

zhaojinchao 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 fccffd0a1c5 Fix oracle parser create table. (#26934)
fccffd0a1c5 is described below

commit fccffd0a1c5f74478602a7ccd68ee14dfab80066
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Jul 13 12:01:49 2023 +0800

    Fix oracle parser create table. (#26934)
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4       |  6 +++---
 .../oracle/src/main/antlr4/imports/oracle/Keyword.g4 | 12 ++++++++++++
 .../visitor/statement/OracleStatementVisitor.java    |  7 ++++++-
 .../src/main/resources/case/ddl/create-table.xml     | 20 ++++++++++++++++++++
 .../resources/sql/supported/ddl/create-table.xml     |  2 ++
 5 files changed, 43 insertions(+), 4 deletions(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index d240005b086..c6576e7047f 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -767,15 +767,15 @@ dataType
     ;
 
 specialDatatype
-    : dataTypeName (LP_ NUMBER_ CHAR RP_) | NATIONAL dataTypeName VARYING? LP_ 
NUMBER_ RP_ | dataTypeName LP_? columnName RP_?
+    : dataTypeName (LP_ NUMBER_ CHAR RP_) | NATIONAL? dataTypeName VARYING? 
LP_ (INTEGER_ | NUMBER_) RP_ | dataTypeName LP_? columnName RP_? | (SYS DOT_)? 
dataTypeName
     ;
 
 dataTypeName
-    : CHAR | NCHAR | RAW | VARCHAR | VARCHAR2 | NVARCHAR2 | LONG | LONG RAW | 
BLOB | CLOB | NCLOB | BINARY_FLOAT | BINARY_DOUBLE
+    : CHARACTER | CHAR | NCHAR | RAW | VARCHAR | VARCHAR2 | NVARCHAR2 | LONG | 
LONG RAW | BLOB | CLOB | NCLOB | BINARY_FLOAT | BINARY_DOUBLE
     | BOOLEAN | PLS_INTEGER | BINARY_INTEGER | INTEGER | NUMBER | NATURAL | 
NATURALN | POSITIVE | POSITIVEN | SIGNTYPE
     | SIMPLE_INTEGER | BFILE | MLSLABEL | UROWID | DATE | TIMESTAMP | 
TIMESTAMP WITH TIME ZONE | TIMESTAMP WITH LOCAL TIME ZONE
     | INTERVAL DAY TO SECOND | INTERVAL YEAR TO MONTH | JSON | FLOAT | REAL | 
DOUBLE PRECISION | INT | SMALLINT
-    | DECIMAL | NUMERIC | DEC | IDENTIFIER_ | XMLTYPE | ROWID
+    | DECIMAL | NUMERIC | DEC | IDENTIFIER_ | XMLTYPE | ROWID | ANYDATA | 
ANYTYPE | ANYDATASET
     ;
 
 datetimeTypeSuffix
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
index 94ed9c6d5e9..e5690b3ea7e 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
@@ -791,3 +791,15 @@ PATH
 EXTRACT
     : E X T R A C T
     ;
+    
+ANYDATA
+    : A N Y D A T A
+    ;
+    
+ANYTYPE
+    : A N Y T Y P E
+    ;
+    
+ANYDATASET
+    : A N Y D A T A S E T
+    ;
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index 1a009736275..54c012a16ec 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -810,7 +810,12 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
     @Override
     public final ASTNode visitDataType(final DataTypeContext ctx) {
         DataTypeSegment result = new DataTypeSegment();
-        result.setDataTypeName(((KeywordValue) 
visit(ctx.dataTypeName())).getValue());
+        if (null != ctx.dataTypeName()) {
+            result.setDataTypeName(((KeywordValue) 
visit(ctx.dataTypeName())).getValue());
+        }
+        if (null != ctx.specialDatatype()) {
+            result.setDataTypeName(((KeywordValue) 
visit(ctx.specialDatatype().dataTypeName())).getValue());
+        }
         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 3830944e75f..e2f5fca87fd 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
@@ -196,6 +196,26 @@
     <create-table sql-case-id="create_object_table">
         <table name="t_log" start-index="13" stop-index="17" />
     </create-table>
+
+    <create-table sql-case-id="create_table_with_char_varing">
+        <table name="t_log" start-index="13" stop-index="17" />
+        <column-definition type="char" start-index="19" stop-index="38">
+            <column name="id" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_with_any_type">
+        <table name="t_log" start-index="13" stop-index="17" />
+        <column-definition type="AnyData" start-index="19" stop-index="39">
+            <column name="a_anydata" />
+        </column-definition>
+        <column-definition type="AnyType" start-index="42" stop-index="62">
+            <column name="a_anytype" />
+        </column-definition>
+        <column-definition type="AnyDataSet" start-index="65" stop-index="91">
+            <column name="a_anydataset" />
+        </column-definition>
+    </create-table>
   
     <create-table sql-case-id="create_local_temp_table">
         <table name="t_temp_log" start-index="24" stop-index="33" />
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 c67da6bc605..ca5eb9a787d 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
@@ -37,6 +37,8 @@
     <sql-case id="create_table_with_optimize_write" value="CREATE TABLE 
t_log(id int PRIMARY KEY, status varchar(10)) MEMOPTIMIZE FOR WRITE" 
db-types="Oracle" />
     <sql-case id="create_table_with_parent" value="CREATE TABLE t_log(id int 
PRIMARY KEY, status varchar(10)) PARENT t_log_parent" db-types="Oracle" />
     <sql-case id="create_object_table" value="CREATE TABLE t_log OF 
t_log_type" db-types="Oracle" />
+    <sql-case id="create_table_with_char_varing" value="CREATE TABLE t_log(id 
char varying (20))" db-types="Oracle" />
+    <sql-case id="create_table_with_any_type" value="CREATE TABLE 
t_log(a_anydata SYS.AnyData, a_anytype SYS.AnyType, a_anydataset 
SYS.AnyDataSet)" db-types="Oracle" />
     <sql-case id="create_local_temp_table" value="CREATE LOCAL TEMP TABLE 
t_temp_log(id int, status varchar(10))" db-types="PostgreSQL,openGauss" />
     <sql-case id="create_unlogged_table" value="CREATE UNLOGGED TABLE t_log(id 
int, status varchar(10))" db-types="PostgreSQL,openGauss" />
     <sql-case id="create_table_with_space" value="    CREATE TABLE 
t_order_item (

Reply via email to