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 64869fd2f23 Support parsing SQL Server INSERT OPENQUERY sql (#30173)
64869fd2f23 is described below

commit 64869fd2f23b642937585bbdb70b08f621dca3f1
Author: LotusMoon <[email protected]>
AuthorDate: Sun Feb 18 18:07:47 2024 +0800

    Support parsing SQL Server INSERT OPENQUERY sql (#30173)
    
    * Support parsing SQL Server INSERT OPENQUERY sql
    
    * Add blank line after java doc.
---
 .../src/main/antlr4/imports/sqlserver/BaseRule.g4  |  10 +-
 .../main/antlr4/imports/sqlserver/DMLStatement.g4  |   2 +-
 .../antlr4/imports/sqlserver/SQLServerKeyword.g4   |   4 +
 .../statement/SQLServerStatementVisitor.java       |  27 ++++-
 .../handler/dml/InsertStatementHandler.java        |  14 +++
 .../sqlserver/dml/SQLServerInsertStatement.java    |  12 ++
 .../statement/dml/impl/InsertStatementAssert.java  |  13 +++
 .../statement/dml/InsertStatementTestCase.java     |   4 +
 .../parser/src/main/resources/case/dml/insert.xml  | 128 +++++++++++++++++++++
 .../main/resources/sql/supported/dml/insert.xml    |   4 +
 10 files changed, 215 insertions(+), 3 deletions(-)

diff --git 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
index b3705b51ed8..66298dd7e22 100644
--- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
+++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
@@ -121,7 +121,7 @@ unreservedWord
     | ELASTIC_POOL | SERVICE_OBJECTIVE | DATABASE_NAME | ALLOW_CONNECTIONS | 
GEO | NAMED | DATEFIRST | BACKUP_STORAGE_REDUNDANCY | 
FORCE_FAILOVER_ALLOW_DATA_LOSS | SECONDARY | FAILOVER | 
DEFAULT_FULLTEXT_LANGUAGE
     | DEFAULT_LANGUAGE | INLINE | NESTED_TRIGGERS | TRANSFORM_NOISE_WORDS | 
TWO_DIGIT_YEAR_CUTOFF | PERSISTENT_LOG_BUFFER | DIRECTORY_NAME | DATEFORMAT | 
DELAYED_DURABILITY | TRANSFER | SCHEMA | PASSWORD | AUTHORIZATION
     | MEMBER | SEARCH | TEXT | SECOND | PRECISION | VIEWS | PROVIDER | COLUMNS 
| SUBSTRING | RETURNS | SIZE | CONTAINS | MONTH | INPUT | YEAR
-    | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID
+    | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID | OPENQUERY
     ;
 
 databaseName
@@ -379,6 +379,14 @@ openRowSetFunction
     | OPENROWSET LP_ BULK expr (COMMA_ expr)* RP_
     ;
 
+openQueryFunction
+    : OPENQUERY LP_ expr COMMA_ expr RP_
+    ;
+
+rowSetFunction
+    : openRowSetFunction | openQueryFunction
+    ;
+
 regularFunction
     : regularFunctionName LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_
     ;
diff --git 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
index d93a3299d43..a9bd8eced7b 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
+++ 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
@@ -20,7 +20,7 @@ grammar DMLStatement;
 import BaseRule;
 
 insert
-    : withClause? INSERT top? INTO? tableName (AS? alias)? withTableHint?  
(insertDefaultValue | insertValuesClause | insertSelectClause | 
insertExecClause)
+    : withClause? INSERT top? INTO? (tableName | rowSetFunction) (AS? alias)? 
withTableHint?  (insertDefaultValue | insertValuesClause | insertSelectClause | 
insertExecClause)
     ;
 
 insertDefaultValue
diff --git 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index ff4385b0e36..6fd981aa533 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++ 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -1958,3 +1958,7 @@ TRY_CAST
 TRY_CONVERT
     : T R Y UL_ C O N V E R T
     ;
+
+OPENQUERY
+    : O P E N Q U E R Y
+    ;
diff --git 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index d86e3676d08..fdfdc64e568 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++ 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -129,6 +129,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Whe
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WindowFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithTableHintContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.RowSetFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OpenQueryFunctionContext;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
@@ -831,6 +833,15 @@ public abstract class SQLServerStatementVisitor extends 
SQLServerStatementBaseVi
         return result;
     }
     
+    @Override
+    public ASTNode visitOpenQueryFunction(final OpenQueryFunctionContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.OPENQUERY().getText(), getOriginalText(ctx));
+        for (ExprContext each : ctx.expr()) {
+            result.getParameters().add((ExpressionSegment) visit(each));
+        }
+        return result;
+    }
+    
     @Override
     public final ASTNode visitRegularFunction(final RegularFunctionContext 
ctx) {
         FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.regularFunctionName().getText(), getOriginalText(ctx));
@@ -1100,11 +1111,25 @@ public abstract class SQLServerStatementVisitor extends 
SQLServerStatementBaseVi
         if (null != ctx.withTableHint()) {
             result.setWithTableHintSegment((WithTableHintSegment) 
visit(ctx.withTableHint()));
         }
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        if (null != ctx.tableName()) {
+            result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        }
+        if (null != ctx.rowSetFunction()) {
+            result.setRowSetFunctionSegment((FunctionSegment) 
visit(ctx.rowSetFunction()));
+        }
         result.addParameterMarkerSegments(getParameterMarkerSegments());
         return result;
     }
     
+    @Override
+    public ASTNode visitRowSetFunction(final RowSetFunctionContext ctx) {
+        if (null != ctx.openRowSetFunction()) {
+            return visit(ctx.openRowSetFunction());
+        } else {
+            return visit(ctx.openQueryFunction());
+        }
+    }
+    
     @Override
     public ASTNode visitWithTableHint(final WithTableHintContext ctx) {
         WithTableHintSegment result = new 
WithTableHintSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
index ac43fd87143..676e201bf5f 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
@@ -335,4 +336,17 @@ public final class InsertStatementHandler implements 
SQLStatementHandler {
         }
         return Optional.empty();
     }
+    
+    /**
+     * Get rowSet function segment.
+     *
+     * @param insertStatement insert statement
+     * @return rowSet function segment
+     */
+    public static Optional<FunctionSegment> getRowSetFunctionSegment(final 
InsertStatement insertStatement) {
+        if (insertStatement instanceof SQLServerInsertStatement) {
+            return ((SQLServerInsertStatement) 
insertStatement).getRowSetFunctionSegment();
+        }
+        return Optional.empty();
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerInsertStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerInsertStatement.java
index 55e6e87e056..788ec98d5e0 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerInsertStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dml/SQLServerInsertStatement.java
@@ -18,6 +18,7 @@
 package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml;
 
 import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.sqlserver.hint.WithTableHintSegment;
@@ -41,6 +42,8 @@ public final class SQLServerInsertStatement extends 
InsertStatement implements S
     
     private WithTableHintSegment withTableHintSegment;
     
+    private FunctionSegment rowSetFunctionSegment;
+    
     /**
      * Get with segment.
      *
@@ -76,4 +79,13 @@ public final class SQLServerInsertStatement extends 
InsertStatement implements S
     public Optional<WithTableHintSegment> getWithTableHintSegment() {
         return Optional.ofNullable(withTableHintSegment);
     }
+    
+    /**
+     * Get rowSet function segment.
+     *
+     * @return rowSet function segment.
+     */
+    public Optional<FunctionSegment> getRowSetFunctionSegment() {
+        return Optional.ofNullable(rowSetFunctionSegment);
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
index 075f73f6878..572a777316e 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
@@ -32,6 +33,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.table.Mul
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.sqlserver.exec.ExecSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.sqlserver.hint.WithTableHintSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.hint.WithTableHintClauseAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertExecClauseAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertColumnsClauseAssert;
@@ -83,6 +85,7 @@ public final class InsertStatementAssert {
         assertReturningClause(assertContext, actual, expected);
         assertInsertExecClause(assertContext, actual, expected);
         assertWithTableHintClause(assertContext, actual, expected);
+        assertRowSetFunctionClause(assertContext, actual, expected);
     }
     
     private static void assertTable(final SQLCaseAssertContext assertContext, 
final InsertStatement actual, final InsertStatementTestCase expected) {
@@ -221,4 +224,14 @@ public final class InsertStatementAssert {
             WithTableHintClauseAssert.assertIs(assertContext, 
withTableHintSegment.get(), expected.getExpectedWithTableHintClause());
         }
     }
+    
+    private static void assertRowSetFunctionClause(final SQLCaseAssertContext 
assertContext, final InsertStatement actual, final InsertStatementTestCase 
expected) {
+        Optional<FunctionSegment> rowSetFunctionSegment = 
InsertStatementHandler.getRowSetFunctionSegment(actual);
+        if (null == expected.getExpectedRowSetFunctionClause()) {
+            assertFalse(rowSetFunctionSegment.isPresent(), 
assertContext.getText("Actual row set function should not exist."));
+        } else {
+            assertTrue(rowSetFunctionSegment.isPresent(), 
assertContext.getText("Actual row set function should exist."));
+            ExpressionAssert.assertFunction(assertContext, 
rowSetFunctionSegment.get(), expected.getExpectedRowSetFunctionClause());
+        }
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
index 63588b50636..6ea8b5df0c2 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.exec.ExpectedExecClause;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.function.ExpectedFunction;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.hint.ExpectedWithTableHintClause;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertColumnsClause;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertValuesClause;
@@ -91,4 +92,7 @@ public final class InsertStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "table-hints")
     private ExpectedWithTableHintClause expectedWithTableHintClause;
+    
+    @XmlElement(name = "rowset-function")
+    private ExpectedFunction expectedRowSetFunctionClause;
 }
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 918aa58877b..adaa95a4eb6 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -3770,4 +3770,132 @@
             </where>
         </select>
     </insert>
+
+    <insert sql-case-id="insert_with_open_query_function_limit">
+        <rowset-function text="OPENQUERY (MyLinkServer, 'SELECT Name, 
GroupName FROM AdventureWorks2022.HumanResources.Department')" 
function-name="OPENQUERY" start-index="7" stop-index="106">
+            <parameter>
+                <column name="MyLinkServer" start-index="18" stop-index="29"/>
+            </parameter>
+            <parameter>
+                <literal-expression value="SELECT Name, GroupName FROM 
AdventureWorks2022.HumanResources.Department" start-index="32" 
stop-index="105"/>
+            </parameter>
+        </rowset-function>
+        <columns start-index="107" stop-index="107"/>
+        <values>
+            <value>
+                <assignment-value>
+                    <literal-expression value="Environmental Impact" 
start-index="116" stop-index="137"/>
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="Engineering" start-index="140" 
stop-index="152"/>
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
+
+    <insert sql-case-id="insert_with_hint_and_open_row_set_function">
+        <table name="Department" start-index="12" stop-index="36">
+            <owner name="HumanResources" start-index="12" stop-index="25"/>
+        </table>
+        <columns start-index="61" stop-index="77">
+            <column name="Name" start-index="62" stop-index="65"/>
+            <column name="GroupName" start-index="68" stop-index="76"/>
+        </columns>
+        <table-hints start-index="38" stop-index="59">
+            <table-hint value="IGNORE_TRIGGERS" start-index="44" 
stop-index="58"/>
+        </table-hints>
+        <select>
+            <projections start-index="86" stop-index="104">
+                <column-projection name="Name" start-index="86" 
stop-index="91">
+                    <owner name="b" start-index="86" stop-index="86"/>
+                </column-projection>
+                <column-projection name="GroupName" start-index="94" 
stop-index="104">
+                    <owner name="b" start-index="94" stop-index="94"/>
+                </column-projection>
+            </projections>
+            <from>
+                <function-table start-index="111" stop-index="231" 
table-alias="b">
+                    <table-function function-name="OPENROWSET" 
text="OPENROWSET (BULK 'C:SQLFilesDepartmentData.txt', FORMATFILE = 
'C:SQLFilesBulkloadFormatFile.xml', ROWS_PER_BATCH = 15000)">
+                        <parameter>
+                            <literal-expression 
value="C:SQLFilesDepartmentData.txt" start-index="128" stop-index="157"/>
+                        </parameter>
+                        <parameter>
+                            <binary-operation-expression start-index="160" 
stop-index="206">
+                                <left>
+                                    <column name="FORMATFILE" 
start-index="160" stop-index="169"/>
+                                </left>
+                                <right>
+                                    <literal-expression 
value="C:SQLFilesBulkloadFormatFile.xml" start-index="173" stop-index="206"/>
+                                </right>
+                                <operator>=</operator>
+                            </binary-operation-expression>
+                        </parameter>
+                        <parameter>
+                            <binary-operation-expression start-index="209" 
stop-index="230">
+                                <left>
+                                    <column name="ROWS_PER_BATCH" 
start-index="209" stop-index="222"/>
+                                </left>
+                                <right>
+                                    <literal-expression value="15000" 
start-index="226" stop-index="230"/>
+                                </right>
+                                <operator>=</operator>
+                            </binary-operation-expression>
+                        </parameter>
+                    </table-function>
+                </function-table>
+            </from>
+        </select>
+    </insert>
+
+    <insert sql-case-id="insert_with_xlock_hint">
+        <table name="Location" start-index="12" stop-index="30">
+            <owner name="Production" start-index="12" stop-index="21"/>
+        </table>
+        <table-hints start-index="32" stop-index="43">
+            <table-hint value="XLOCK" start-index="38" stop-index="42"/>
+        </table-hints>
+        <columns start-index="45" stop-index="74">
+            <column name="Name" start-index="46" stop-index="49"/>
+            <column name="CostRate" start-index="52" stop-index="59"/>
+            <column name="Availability" start-index="62" stop-index="73"/>
+        </columns>
+        <values>
+            <value>
+                <assignment-value>
+                    <literal-expression value="Final Inventory" 
start-index="85" stop-index="102"/>
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="15.00" start-index="105" 
stop-index="109"/>
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="80.00" start-index="112" 
stop-index="116"/>
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
+
+    <insert sql-case-id="insert_with_output_input">
+        <table name="ScrapReason" start-index="7" stop-index="28">
+            <owner name="Production" start-index="7" stop-index="16"/>
+        </table>
+        <columns start-index="29" stop-index="29"/>
+        <output start-index="30" stop-index="113">
+            <output-columns start-index="37" stop-index="96">
+                <column-projection name="ScrapReasonID" start-index="37" 
stop-index="58"/>
+                <column-projection name="Name" start-index="61" 
stop-index="73"/>
+                <column-projection name="ModifiedDate" start-index="76" 
stop-index="96"/>
+            </output-columns>
+            <output-table name="@MyTableVar" start-index="103" 
stop-index="113"/>
+        </output>
+        <values>
+            <value>
+                <assignment-value>
+                    <literal-expression value="Operator error" 
start-index="123" stop-index="139"/>
+                </assignment-value>
+                <assignment-value>
+                    <function text="GETDATE()" start-index="142" 
stop-index="150" function-name="GETDATE"/>
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
 </sql-parser-test-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 1812613d936..9ae8959e3cc 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
@@ -142,4 +142,8 @@
     <sql-case id="insert_with_cross_database_values" value="INSERT 
[SourceDatabase].[dbo].[SourceTable] VALUES (1, N'Bob'),(2, N'Susan')" 
db-types="SQLServer"/>
     <sql-case id="insert_with_cross_database_select" value="INSERT 
[DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM 
[SourceDatabase].[dbo].[SourceTable]" db-types="SQLServer"/>
     <sql-case id="insert_with_select_with_table_hint_no_with_keyword" 
value="INSERT INTO #tmpdbs ([dbid], [dbname], [isdone]) SELECT database_id, 
name, 0 FROM master.sys.databases (NOLOCK) WHERE is_read_only = 0 AND state = 
0" db-types="SQLServer"/>
+    <sql-case id="insert_with_open_query_function_limit" value="INSERT 
OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM 
AdventureWorks2022.HumanResources.Department') VALUES ('Environmental Impact', 
'Engineering')" db-types="SQLServer"/>
+    <sql-case id="insert_with_hint_and_open_row_set_function" value="INSERT 
INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName) SELECT 
b.Name, b.GroupName FROM OPENROWSET (BULK 'C:SQLFilesDepartmentData.txt', 
FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml', ROWS_PER_BATCH = 15000)AS b" 
db-types="SQLServer"/>
+    <sql-case id="insert_with_xlock_hint" value="INSERT INTO 
Production.Location WITH (XLOCK) (Name, CostRate, Availability) VALUES ( 
N'Final Inventory', 15.00, 80.00)" db-types="SQLServer"/>
+    <sql-case id="insert_with_output_input" value="INSERT 
Production.ScrapReason OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, 
INSERTED.ModifiedDate INTO @MyTableVar VALUES (N'Operator error', GETDATE())" 
db-types="SQLServer"/>
 </sql-cases>

Reply via email to