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>