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 d434619464f Support oracle column length unit type SQL parsing (#32502)
d434619464f is described below

commit d434619464f7ab65b811907d2eaab8702a1945e6
Author: ZhangCheng <[email protected]>
AuthorDate: Wed Aug 14 15:46:14 2024 +0800

    Support oracle column length unit type SQL parsing (#32502)
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
    
    * Support oracle column length unit type SQL parsing
---
 .../oracle/src/main/antlr4/imports/oracle/BaseRule.g4      |  2 +-
 .../oracle/visitor/statement/OracleStatementVisitor.java   |  7 +++++--
 .../visitor/statement/type/OracleDDLStatementVisitor.java  |  8 ++++----
 .../core/segment/generic/DataTypeLengthSegment.java        | 11 +++++++++++
 .../asserts/segment/definition/ColumnDefinitionAssert.java |  4 ++++
 .../internal/asserts/segment/generic/DataTypeAssert.java   | 14 ++++++++++++++
 .../segment/impl/definition/ExpectedColumnDefinition.java  |  4 ++++
 .../parser/jaxb/segment/impl/generic/ExpectedDataType.java |  4 ++++
 .../{ExpectedDataType.java => ExpectedDataTypeLength.java} | 13 +++++++------
 .../it/parser/src/main/resources/case/ddl/create-table.xml |  6 ++++++
 10 files changed, 60 insertions(+), 13 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 020502377b9..a921e26c347 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
@@ -639,7 +639,7 @@ alias
     ;
 
 dataTypeLength
-    : LP_ (INTEGER_ (COMMA_ (MINUS_)? INTEGER_)? (CHAR | BYTE)?)? RP_
+    : LP_ (length=INTEGER_ (COMMA_ (MINUS_)? INTEGER_)? type=(CHAR | BYTE)?)? 
RP_
     ;
 
 primaryKey
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 eb80e3b5c9e..8bbad56b215 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
@@ -1236,13 +1236,16 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         result.setStartIndex(ctx.start.getStartIndex());
         result.setStopIndex(ctx.stop.getStartIndex());
         List<TerminalNode> numbers = ctx.INTEGER_();
-        if (numbers.size() == 1) {
+        if (1 == numbers.size()) {
             result.setPrecision(Integer.parseInt(numbers.get(0).getText()));
         }
-        if (numbers.size() == 2) {
+        if (2 == numbers.size()) {
             result.setPrecision(Integer.parseInt(numbers.get(0).getText()));
             result.setScale(Integer.parseInt(numbers.get(1).getText()));
         }
+        if (null != ctx.type) {
+            result.setType(ctx.type.getText());
+        }
         return result;
     }
     
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 5358531ea11..f1bb7da89a6 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
@@ -239,9 +239,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterDisk
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterFlashbackArchiveStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterHierarchyStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterInMemoryJoinGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterIndexTypeStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterInMemoryJoinGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterJavaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterLibraryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterLockdownProfileStatement;
@@ -279,8 +279,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateDis
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateEditionStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateFlashbackArchiveStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateFunctionStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateInMemoryJoinGroupStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateJavaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateLibraryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateLockdownProfileStatement;
@@ -315,9 +315,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropDiskg
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropEditionStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropFlashbackArchiveStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropFunctionStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropInMemoryJoinGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropIndexTypeStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropInMemoryJoinGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropJavaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropLibraryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropLockdownProfileStatement;
@@ -334,8 +334,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropResto
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropRollbackSegmentStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropSequenceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropSynonymStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropTablespaceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropTableStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropTablespaceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropTriggerStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropTypeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropViewStatement;
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/DataTypeLengthSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/DataTypeLengthSegment.java
index 7b24181dacb..bfe590e03f4 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/DataTypeLengthSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/DataTypeLengthSegment.java
@@ -35,6 +35,8 @@ public final class DataTypeLengthSegment implements 
SQLSegment {
     
     private int scale;
     
+    private String type;
+    
     /**
      * Get scale.
      *
@@ -43,4 +45,13 @@ public final class DataTypeLengthSegment implements 
SQLSegment {
     public Optional<Integer> getScale() {
         return Optional.of(scale);
     }
+    
+    /**
+     * Get type.
+     *
+     * @return type
+     */
+    public Optional<String> getType() {
+        return Optional.ofNullable(type);
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
index 9eb025e7fc4..fd29c2ea25b 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.generic.DataTypeAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedColumnDefinition;
 
@@ -47,6 +48,9 @@ public final class ColumnDefinitionAssert {
         if (null != expected.getType()) {
             assertNotNull(actual.getDataType(), assertContext.getText("Column 
definition data type should exist."));
             assertThat(assertContext.getText("Column definition data type 
assertion error: "), actual.getDataType().getDataTypeName(), 
is(expected.getType()));
+            if (null != expected.getDataType()) {
+                DataTypeAssert.assertIs(assertContext, actual.getDataType(), 
expected.getDataType());
+            }
         } else {
             assertNull(actual.getDataType(), assertContext.getText("Column 
definition data type should not exist."));
         }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
index 9815d51da5b..7386b44610f 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/generic/DataTypeAssert.java
@@ -19,9 +19,11 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.ge
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeLengthSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedDataType;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedDataTypeLength;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -46,5 +48,17 @@ public final class DataTypeAssert {
                 actual.getStartIndex(), is(expected.getStartIndex()));
         assertThat(assertContext.getText(String.format("%s end index assertion 
error: ", "dataType")),
                 actual.getStopIndex(), is(expected.getStopIndex()));
+        if (null != expected.getDataLength()) {
+            DataTypeLengthSegment actualDataLength = actual.getDataLength();
+            ExpectedDataTypeLength expectedDataLength = 
expected.getDataLength();
+            if (null != expectedDataLength.getType()) {
+                assertThat(assertContext.getText(String.format("%s name 
assertion error: ", "dataTypeLength")),
+                        actualDataLength.getType().get(), 
is(expectedDataLength.getType()));
+            }
+            if (null != expectedDataLength.getPrecision()) {
+                assertThat(assertContext.getText(String.format("%s name 
assertion error: ", "dataTypeLength")),
+                        actualDataLength.getPrecision(), 
is(expectedDataLength.getPrecision()));
+            }
+        }
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
index d4a3abe69a2..b2b1ba1996a 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedDataType;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -47,6 +48,9 @@ public final class ExpectedColumnDefinition extends 
AbstractExpectedSQLSegment {
     @XmlElement
     private ExpectedColumn column;
     
+    @XmlElement
+    private ExpectedDataType dataType;
+    
     @XmlAttribute(name = "not-null")
     private boolean notNull;
     
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
index 45a2b3b7ab9..425d5c91693 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedBaseSimpleExpression;
 
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
 
 /**
  * Expected data type.
@@ -32,4 +33,7 @@ public final class ExpectedDataType extends 
ExpectedBaseSimpleExpression {
     
     @XmlAttribute
     private String value;
+    
+    @XmlElement
+    private ExpectedDataTypeLength dataLength;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataTypeLength.java
similarity index 84%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataTypeLength.java
index 45a2b3b7ab9..156ef97e12e 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataType.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/generic/ExpectedDataTypeLength.java
@@ -21,15 +21,16 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedBaseSimpleExpression;
 
-import javax.xml.bind.annotation.XmlAttribute;
-
 /**
- * Expected data type.
+ * Expected data type length.
  */
 @Getter
 @Setter
-public final class ExpectedDataType extends ExpectedBaseSimpleExpression {
+public final class ExpectedDataTypeLength extends ExpectedBaseSimpleExpression 
{
+    
+    private Integer precision;
+    
+    private int scale;
     
-    @XmlAttribute
-    private String value;
+    private String type;
 }
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 82520c027d0..6930a5b7a3d 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
@@ -1908,9 +1908,15 @@
         <table name="t_order" start-index="13" stop-index="19" />
         <column-definition type="VARCHAR2" start-index="22" stop-index="62">
             <column name="SYS_ID" />
+            <dataType value="VARCHAR2" start-index="29" stop-index="45" >
+                <dataLength precision="32" scale="0" type="CHAR" 
start-index="37" stop-index="45" />
+            </dataType>
         </column-definition>
         <column-definition type="VARCHAR2" start-index="65" stop-index="118">
             <column name="ATTACHMENT_NAME" />
+            <dataType value="VARCHAR2" start-index="81" stop-index="99" >
+                <dataLength precision="1024" scale="0" type="BYTE" 
start-index="89" stop-index="99" />
+            </dataType>
         </column-definition>
     </create-table>
 

Reply via email to