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>