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

duanzhengqiang 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 a9027548f4c Fix oracle insert and alter table parse error (#28467)
a9027548f4c is described below

commit a9027548f4c6a7afbdf681c01f96d6c2e111b6d7
Author: niu niu <[email protected]>
AuthorDate: Sun Sep 24 16:02:40 2023 +0800

    Fix oracle insert and alter table parse error (#28467)
    
    * Fix oracle insert and alter table parse error
    
    * Change addColumnSpecification define
    
    * Add modify constraint definition test
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |   2 +-
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 |   2 +-
 .../ddl/impl/AlterTableStatementAssert.java        |  19 ++++
 .../statement/ddl/AlterTableStatementTestCase.java |   3 +
 .../src/main/resources/case/ddl/alter-table.xml    |  16 ++-
 .../parser/src/main/resources/case/dml/insert.xml  | 107 ++++++++++++++++++++-
 .../resources/sql/supported/ddl/alter-table.xml    |   1 +
 .../main/resources/sql/supported/dml/insert.xml    |   1 +
 8 files changed, 143 insertions(+), 8 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 385a3b837de..4dc59bf2c6c 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
@@ -115,7 +115,7 @@ unreservedWord1
     | DO | DEFINER | CURRENT_USER | CASCADED | CLOSE | OPEN | NEXT | NAME | 
NAMES
     | COLLATION | REAL | TYPE | FIRST | RANK | SAMPLE | SYSTIMESTAMP | MINUTE 
| ANY 
     | LENGTH | SINGLE_C | TIME_UNIT | TARGET | PUBLIC | ID | STATE | PRIORITY
-    | CONSTRAINT | PRIMARY | FOREIGN | KEY | POSITION | PRECISION | FUNCTION | 
PROCEDURE | SPECIFICATION | CASE
+    | PRIMARY | FOREIGN | KEY | POSITION | PRECISION | FUNCTION | PROCEDURE | 
SPECIFICATION | CASE
     | WHEN | CAST | TRIM | SUBSTRING | FULL | INNER | OUTER | LEFT | RIGHT | 
CROSS
     | USING | FALSE | SAVEPOINT | BODY | CHARACTER | ARRAY | TIME | TIMEOUT | 
TIMESTAMP | LOCALTIME
     | DAY | ENABLE | DISABLE | CALL | INSTANCE | CLOSE | NEXT | NAME | NUMERIC
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 568a20d1a74..ae5907cbe82 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -476,7 +476,7 @@ operateColumnClause
     ;
 
 addColumnSpecification
-    : ADD LP_ columnOrVirtualDefinitions RP_ columnProperties?
+    : ADD (LP_ columnOrVirtualDefinitions RP_ | columnOrVirtualDefinitions) 
columnProperties?
     ;
 
 columnOrVirtualDefinitions
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterTableStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterTableStatementAssert.java
index 1fe30ca563c..f2d32a4a583 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterTableStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterTableStatementAssert.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyCollectionRetrievalSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.RenameColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.RenameIndexDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.ConvertTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -46,6 +47,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.tab
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedAddColumnDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedChangeColumnDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedColumnDefinition;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedModifyColumnDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameIndexDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameColumnDefinition;
@@ -81,6 +83,7 @@ public final class AlterTableStatementAssert {
         assertRenameTable(assertContext, actual, expected);
         assertAddColumnDefinitions(assertContext, actual, expected);
         assertAddConstraintDefinitions(assertContext, actual, expected);
+        assertModifyConstraintDefinitions(assertContext, actual, expected);
         assertModifyColumnDefinitions(assertContext, actual, expected);
         assertChangeColumnDefinitions(assertContext, actual, expected);
         assertDropColumns(assertContext, actual, expected);
@@ -152,6 +155,22 @@ public final class AlterTableStatementAssert {
         }
     }
     
+    private static void assertModifyConstraintDefinitions(final 
SQLCaseAssertContext assertContext, final AlterTableStatement actual, final 
AlterTableStatementTestCase expected) {
+        assertThat(assertContext.getText("Modify constraint definitions size 
assertion error: "), actual.getModifyConstraintDefinitions().size(), 
is(expected.getModifyConstraints().size()));
+        int count = 0;
+        for (ModifyConstraintDefinitionSegment each : 
actual.getModifyConstraintDefinitions()) {
+            ExpectedConstraintDefinition expectedConstraintDefinition = 
expected.getModifyConstraints().get(count);
+            if (null == expectedConstraintDefinition.getConstraintName()) {
+                assertNull(each.getConstraintName(), "Actual modify constraint 
name should not exist.");
+            } else {
+                assertNotNull(each.getConstraintName(), "Actual modify 
constraint name should exist.");
+                assertThat(assertContext.getText("Actual modify constraint 
name assertion error."),
+                        each.getConstraintName().getIdentifier().getValue(), 
is(expectedConstraintDefinition.getConstraintName()));
+            }
+            count++;
+        }
+    }
+    
     private static void assertModifyColumnDefinitions(final 
SQLCaseAssertContext assertContext, final AlterTableStatement actual, final 
AlterTableStatementTestCase expected) {
         assertThat(assertContext.getText("Modify column definitions size 
assertion error: "), actual.getModifyColumnDefinitions().size(), 
is(expected.getModifyColumns().size()));
         int count = 0;
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterTableStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterTableStatementTestCase.java
index c968cff0ad1..36bd3a45950 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterTableStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterTableStatementTestCase.java
@@ -57,6 +57,9 @@ public final class AlterTableStatementTestCase extends 
SQLParserTestCase {
     @XmlElement(name = "add-constraint")
     private final List<ExpectedConstraintDefinition> addConstraints = new 
LinkedList<>();
     
+    @XmlElement(name = "modify-constraint")
+    private final List<ExpectedConstraintDefinition> modifyConstraints = new 
LinkedList<>();
+    
     @XmlElement(name = "modify-column")
     private final List<ExpectedModifyColumnDefinition> modifyColumns = new 
LinkedList<>();
     
diff --git a/test/it/parser/src/main/resources/case/ddl/alter-table.xml 
b/test/it/parser/src/main/resources/case/ddl/alter-table.xml
index adb5985c32e..56feac1d810 100644
--- a/test/it/parser/src/main/resources/case/ddl/alter-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/alter-table.xml
@@ -141,6 +141,7 @@
     
     <alter-table sql-case-id="alter_table_modify7">
         <table name="locations" start-index="12" stop-index="20" />
+        <modify-constraint start-index="22" stop-index="55" />
     </alter-table>
     
     <alter-table sql-case-id="alter_table_modify8">
@@ -154,11 +155,7 @@
     
     <alter-table sql-case-id="alter_table_modify9">
         <table name="sales" start-index="12" stop-index="16" />
-        <modify-column>
-            <column-definition type="time_view_fk" start-index="25" 
stop-index="52">
-                <column name="CONSTRAINT" />
-            </column-definition>
-        </modify-column>
+        <modify-constraint start-index="18" stop-index="52" 
constraint-name="time_view_fk" />
     </alter-table>
     
     <alter-table sql-case-id="alter_table_modify10">
@@ -1702,4 +1699,13 @@
             </column-definition>
         </add-column>
     </alter-table>
+
+    <alter-table sql-case-id="alter_table_add_column_no_parentheses">
+        <table name="T_MASK" start-index="12" stop-index="17" />
+        <add-column>
+            <column-definition type="VARCHAR2" start-index="23" 
stop-index="46">
+                <column name="new_column" />
+            </column-definition>
+        </add-column>
+    </alter-table>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml 
b/test/it/parser/src/main/resources/case/dml/insert.xml
index 224f5948cfd..197fccd0f65 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -2563,7 +2563,7 @@
             </value>
         </values>
     </insert>
-    
+
     <insert sql-case-id="insert_with_oracle_datetime_type">
         <table name="t_order" start-index="12" stop-index="18" />
         <columns start-index="20" stop-index="93">
@@ -2615,4 +2615,109 @@
             </value>
         </values>
     </insert>
+
+    <insert sql-case-id="insert_all_into">
+        <multi-table-insert-type value="ALL" />
+        <multi-table-insert-into start-index="11" stop-index="213">
+            <insert-statement>
+                <table name="T_MASK" start-index="16" stop-index="21" />
+                <columns start-index="22" stop-index="50">
+                    <column name="ID" start-index="23" stop-index="24" />
+                    <column name="EMAIL" start-index="26" stop-index="30" />
+                    <column name="NAME" start-index="32" stop-index="35" />
+                    <column name="PHONE" start-index="37" stop-index="41" />
+                    <column name="ADDRESS" start-index="43" stop-index="49" />
+                </columns>
+                <values>
+                    <value>
+                        <assignment-value>
+                            <literal-expression value="1" start-index="60" 
stop-index="60" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="2" start-index="62" 
stop-index="64" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="3" start-index="66" 
stop-index="68" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="4" start-index="70" 
stop-index="72" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="5" start-index="74" 
stop-index="76" />
+                        </assignment-value>
+                    </value>
+                </values>
+            </insert-statement>
+            <insert-statement>
+                <table name="T_MASK" start-index="84" stop-index="89" />
+                <columns start-index="90" stop-index="118">
+                    <column name="ID" start-index="91" stop-index="92" />
+                    <column name="EMAIL" start-index="94" stop-index="98" />
+                    <column name="NAME" start-index="100" stop-index="103" />
+                    <column name="PHONE" start-index="105" stop-index="109" />
+                    <column name="ADDRESS" start-index="111" stop-index="117" 
/>
+                </columns>
+                <values>
+                    <value>
+                        <assignment-value>
+                            <literal-expression value="2" start-index="128" 
stop-index="128" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="2" start-index="130" 
stop-index="132" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="3" start-index="134" 
stop-index="136" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="4" start-index="138" 
stop-index="140" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="5" start-index="142" 
stop-index="144" />
+                        </assignment-value>
+                    </value>
+                </values>
+            </insert-statement>
+            <insert-statement>
+                <table name="T_MASK" start-index="152" stop-index="157" />
+                <columns start-index="158" stop-index="186">
+                    <column name="ID" start-index="159" stop-index="160" />
+                    <column name="EMAIL" start-index="162" stop-index="166" />
+                    <column name="NAME" start-index="168" stop-index="171" />
+                    <column name="PHONE" start-index="173" stop-index="177" />
+                    <column name="ADDRESS" start-index="179" stop-index="185" 
/>
+                </columns>
+                <values>
+                    <value>
+                        <assignment-value>
+                            <literal-expression value="3" start-index="196" 
stop-index="196" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="2" start-index="198" 
stop-index="200" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="3" start-index="202" 
stop-index="204" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="4" start-index="206" 
stop-index="208" />
+                        </assignment-value>
+                        <assignment-value>
+                            <literal-expression value="5" start-index="210" 
stop-index="212" />
+                        </assignment-value>
+                    </value>
+                </values>
+            </insert-statement>
+        </multi-table-insert-into>
+        <select>
+            <projections start-index="222" stop-index="222">
+                <expression-projection start-index="222" stop-index="222" 
text="1">
+                    <expr>
+                        <literal-expression start-index="222" stop-index="222" 
value="1" />
+                    </expr>
+                </expression-projection>
+            </projections>
+            <from>
+                <simple-table name="DUAL" start-index="229" stop-index="232" />
+            </from>
+        </select>
+    </insert>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
index 12195abe562..b690d25a6a8 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
@@ -227,4 +227,5 @@
     <sql-case id="alter_table_move_subpartition_tablespace_parallel" 
value="ALTER TABLE scuba_gear MOVE SUBPARTITION bcd_types TABLESPACE tbs23 
PARALLEL (DEGREE 2)" db-types="Oracle" />
     <sql-case id="alter_table_add_ref_with_rowid" value="ALTER TABLE staff  
ADD (REF(dept) WITH ROWID)" db-types="Oracle" />
     <sql-case id="alter_table_add_scope_for_is" value="ALTER TABLE staff ADD 
(SCOPE FOR (dept) IS offices)" db-types="Oracle" />
+    <sql-case id="alter_table_add_column_no_parentheses" value="ALTER TABLE 
T_MASK ADD new_column VARCHAR2(100)" db-types="Oracle" />
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index f1eaa3eae3f..e0b952221e6 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -96,4 +96,5 @@
     <sql-case id="insert_with_connect_by_and_prior" value="Insert Into t 
(c1,c2,c3,c4,c5) select c1,c2,regexp_substr(c3, '[^,]+', 1, l) c3,c4,c5 from t 
where id=1 connect by l &lt;= regexp_count(c3, ',') + 1 and ID = prior ID and 
prior dbms_random.value is not null;" db-types="Oracle" />
     <sql-case id="insert_with_national_character_set" value="INSERT INTO 
customers VALUES (1000, TO_NCHAR('John Smith'),N'500 Oracle Parkway',sysdate);" 
db-types="Oracle" />
     <sql-case id="insert_with_oracle_datetime_type" value="INSERT INTO t_order 
(create_date, create_timestamp, create_interval_year, create_interval_day) 
VALUES (TO_DATE('2009', 'YYYY'), TO_DATE('2009', 'YYYY'), (TO_DATE('2009', 
'YYYY') - TO_DATE('2009', 'YYYY')) year to MONTH, (TO_DATE('2009', 'YYYY') - 
TO_DATE('2009', 'YYYY')) DAY TO SECOND);" db-types="Oracle" />
+    <sql-case id="insert_all_into" value="INSERT ALL INTO 
T_MASK(ID,EMAIL,NAME,PHONE,ADDRESS) VALUES (1,'2','3','4','5') INTO 
T_MASK(ID,EMAIL,NAME,PHONE,ADDRESS) VALUES (2,'2','3','4','5') INTO 
T_MASK(ID,EMAIL,NAME,PHONE,ADDRESS) VALUES (3,'2','3','4','5') SELECT 1 FROM 
DUAL" db-types="Oracle" />
 </sql-cases>

Reply via email to