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 (