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

terrymanu 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 0ad723bf5ef Support SQLServer table variable declaration parse (#38904)
0ad723bf5ef is described below

commit 0ad723bf5ef83f04f9746105ffa7d280316442ac
Author: Claire <[email protected]>
AuthorDate: Fri Jun 26 22:02:29 2026 +0800

    Support SQLServer table variable declaration parse (#38904)
    
    * support declare statement
    
    * release-notes
    
    * update
    
    * update
    
    * update version
    
    * support declare statement
    
    * support declare statement
    
    * update
    
    * update
    
    * update
    
    * add test
---
 RELEASE-NOTES.md                                   |  1 +
 .../core/database/visitor/SQLVisitorRule.java      |  2 +
 .../main/antlr4/imports/sqlserver/DDLStatement.g4  | 12 +++--
 .../sql/parser/autogen/SQLServerStatement.g4       |  1 +
 .../type/SQLServerDDLStatementVisitor.java         | 42 +++++++++++++++
 .../sqlserver/ddl/DeclareVariableStatement.java    | 43 +++++++++++++++
 .../sqlserver/SQLServerDDLStatementAssert.java     |  6 +++
 .../SQLServerDeclareVariableStatementAssert.java   | 61 ++++++++++++++++++++++
 .../cases/parser/jaxb/RootSQLParserTestCases.java  |  4 ++
 ...erverDeclareTableVariableStatementTestCase.java | 42 +++++++++++++++
 .../main/resources/case/ddl/create-function.xml    | 34 ++++++++++++
 .../main/resources/case/ddl/create-procedure.xml   | 42 +++++++++++++++
 .../src/main/resources/case/ddl/create-trigger.xml |  5 ++
 .../parser/src/main/resources/case/ddl/declare.xml | 13 +++++
 .../sql/supported/ddl/create-function.xml          | 48 +++++++++++++++++
 .../sql/supported/ddl/create-procedure.xml         | 46 ++++++++++++++++
 .../resources/sql/supported/ddl/create-trigger.xml |  5 ++
 .../main/resources/sql/supported/ddl/declare.xml   |  1 +
 18 files changed, 404 insertions(+), 4 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 52b9d1cb824..c5b587f741a 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -67,6 +67,7 @@
 1. Encrypt: Support SqlServer update statement for Specifying a view as the 
target object when use encrypt feature - 
[#38896](https://github.com/apache/shardingsphere/pull/38896)
 1. Sharding: Fix HASH_MOD routing mismatch for same negative numeric values 
across numeric Java types with compatibility switch 
`normalize-numeric-int-range` - 
[#38327](https://github.com/apache/shardingsphere/pull/38327)
 1. Proxy Native: Support building Proxy Native via GraalVM CE for JDK 25 - 
[#38682](https://github.com/apache/shardingsphere/pull/38682)
+1. SQL Parser: Support SQLServer table variable declaration parse - 
[#38904](https://github.com/apache/shardingsphere/pull/38904)
 
 ## Release 5.5.3
 
diff --git 
a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
 
b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
index ea28239459b..3b042b3a844 100644
--- 
a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
+++ 
b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
@@ -855,6 +855,8 @@ public enum SQLVisitorRule {
     
     UPDATE_STATISTICS("UpdateStatistics", SQLStatementType.DDL),
     
+    DECLARE_VARIABLE("DeclareVariable", SQLStatementType.DDL),
+    
     SPOOL("Spool", SQLStatementType.DAL),
     
     START_REPLICA("StartReplica", SQLStatementType.DAL),
diff --git 
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DDLStatement.g4
 
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DDLStatement.g4
index 7848792fa46..e3656414c1d 100644
--- 
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DDLStatement.g4
+++ 
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DDLStatement.g4
@@ -637,7 +637,11 @@ databaseLogOns
     ;
 
 declareVariable
-    : DECLARE (variable (COMMA_ variable)* | tableVariable)
+    : DECLARE tableVariable
+    ;
+
+declareLocalVariable
+    : DECLARE variable (COMMA_ variable)*
     ;
 
 variable
@@ -658,7 +662,7 @@ tableVariableClause
     ;
 
 variableTableColumnDefinition
-    : columnName (dataTypeName | AS expr) (COLLATE collationName)? ((DEFAULT 
expr)? | IDENTITY (LP_ NUMBER_ COMMA_ NUMBER_ RP_)?) ROWGUIDCOL? 
variableTableColumnConstraint
+    : columnName (dataType | AS expr) (COLLATE collationName)? ((DEFAULT 
expr)? | IDENTITY (LP_ NUMBER_ COMMA_ NUMBER_ RP_)?) ROWGUIDCOL? 
variableTableColumnConstraint
     ;
 
 variableTableColumnConstraint
@@ -742,7 +746,7 @@ functionOption
 
 validStatement
     : (createTable | alterTable | dropTable | truncateTable | insert
-    | update | delete | select | setVariable | declareVariable) SEMI_?
+    | update | delete | select | setVariable | declareLocalVariable | 
declareVariable) SEMI_?
     ;
 
 procParameters
@@ -804,7 +808,7 @@ commonTableExpr
 createTriggerClause
     : (WITH dmlTriggerOption COMMA_ dmlTriggerOption)? (FOR | AFTER | INSTEAD 
OF)
     INSERT? COMMA_? UPDATE? COMMA_? DELETE? COMMA_? (WITH APPEND)? (NOT FOR 
REPLICATION)?
-    AS (compoundStatement | EXTERNAL NAME methodSpecifier)
+    AS (BEGIN? compoundStatement END? | EXTERNAL NAME methodSpecifier)
     ;
 
 dmlTriggerOption
diff --git 
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
 
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
index c67787e4a7c..cc6d5decbc2 100644
--- 
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
+++ 
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
@@ -81,5 +81,6 @@ execute
     | revert
     | updateStatistics
     | merge
+    | declareVariable
     ) SEMI_? EOF
     ;
diff --git 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
index c1df322b240..2b94d5a8eee 100644
--- 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
@@ -55,6 +55,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Cre
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableDefinitionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTriggerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateViewContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DeclareVariableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropColumnSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropConstraintNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropDatabaseContext;
@@ -69,8 +70,12 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Dro
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropViewContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ModifyColumnSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableConstraintContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableVariableClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TruncateTableContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.VariableTableColumnConstraintContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.VariableTableColumnDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.engine.sqlserver.visitor.statement.SQLServerStatementVisitor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.CreateDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
@@ -113,6 +118,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tr
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.DropTriggerStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.DeclareVariableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
@@ -500,4 +506,40 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
     public ASTNode visitDropSequence(final DropSequenceContext ctx) {
         return new DropSequenceStatement(getDatabaseType(), 
Collections.emptyList());
     }
+    
+    @Override
+    public ASTNode visitDeclareVariable(final DeclareVariableContext ctx) {
+        VariableSegment variableName = (VariableSegment) 
visit(ctx.tableVariable().variableName());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        for (TableVariableClauseContext each : 
ctx.tableVariable().variTableTypeDefinition().tableVariableClause()) {
+            if (null != each.variableTableColumnDefinition()) {
+                columnDefinitions.add((ColumnDefinitionSegment) 
visit(each.variableTableColumnDefinition()));
+            }
+        }
+        return new DeclareVariableStatement(getDatabaseType(), variableName, 
columnDefinitions);
+    }
+    
+    @Override
+    public ASTNode visitVariableTableColumnDefinition(final 
VariableTableColumnDefinitionContext ctx) {
+        ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
+        DataTypeSegment dataType = null == ctx.dataType() ? null : 
(DataTypeSegment) visit(ctx.dataType());
+        return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType,
+                isVariableTableColumnPrimaryKey(ctx), 
isVariableTableColumnNotNull(ctx), getText(ctx));
+    }
+    
+    private boolean isVariableTableColumnNotNull(final 
VariableTableColumnDefinitionContext ctx) {
+        if (null == ctx.variableTableColumnConstraint()) {
+            return false;
+        }
+        VariableTableColumnConstraintContext constraint = 
ctx.variableTableColumnConstraint();
+        return null != constraint.NOT() && null != constraint.NULL();
+    }
+    
+    private boolean isVariableTableColumnPrimaryKey(final 
VariableTableColumnDefinitionContext ctx) {
+        if (null == ctx.variableTableColumnConstraint()) {
+            return false;
+        }
+        VariableTableColumnConstraintContext constraint = 
ctx.variableTableColumnConstraint();
+        return null != constraint.PRIMARY() && null != constraint.KEY();
+    }
 }
diff --git 
a/parser/sql/statement/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/DeclareVariableStatement.java
 
b/parser/sql/statement/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/DeclareVariableStatement.java
new file mode 100644
index 00000000000..c85d8332302
--- /dev/null
+++ 
b/parser/sql/statement/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/DeclareVariableStatement.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl;
+
+import lombok.Getter;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
+
+import java.util.Collection;
+
+/**
+ * Declare table variable statement for SQLServer.
+ */
+@Getter
+public final class DeclareVariableStatement extends DDLStatement {
+    
+    private final VariableSegment variableName;
+    
+    private final Collection<ColumnDefinitionSegment> columnDefinitions;
+    
+    public DeclareVariableStatement(final DatabaseType databaseType, final 
VariableSegment variableName, final Collection<ColumnDefinitionSegment> 
columnDefinitions) {
+        super(databaseType);
+        this.variableName = variableName;
+        this.columnDefinitions = columnDefinitions;
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/SQLServerDDLStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/SQLServerDDLStatementAssert.java
index d61a43ae076..339705fe44f 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/SQLServerDDLStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/SQLServerDDLStatementAssert.java
@@ -20,11 +20,14 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.DeclareVariableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.statistics.SQLServerUpdateStatisticsStatement;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.sqlserver.type.SQLServerDeclareVariableStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.sqlserver.type.SQLServerUpdateStatisticsStatementAssert;
 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.statement.ddl.dialect.sqlserver.statistics.SQLServerUpdateStatisticsStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.variable.SQLServerDeclareTableVariableStatementTestCase;
 
 /**
  * DDL statement assert for SQLServer.
@@ -43,5 +46,8 @@ public final class SQLServerDDLStatementAssert {
         if (actual instanceof SQLServerUpdateStatisticsStatement) {
             SQLServerUpdateStatisticsStatementAssert.assertIs(assertContext, 
(SQLServerUpdateStatisticsStatement) actual, 
(SQLServerUpdateStatisticsStatementTestCase) expected);
         }
+        if (actual instanceof DeclareVariableStatement) {
+            SQLServerDeclareVariableStatementAssert.assertIs(assertContext, 
(DeclareVariableStatement) actual, 
(SQLServerDeclareTableVariableStatementTestCase) expected);
+        }
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/type/SQLServerDeclareVariableStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/type/SQLServerDeclareVariableStatementAssert.java
new file mode 100644
index 00000000000..d3deb5d7b13
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/dialect/sqlserver/type/SQLServerDeclareVariableStatementAssert.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.dialect.sqlserver.type;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.DeclareVariableStatement;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnDefinitionAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.variable.SQLServerDeclareTableVariableStatementTestCase;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Declare table variable statement assert for SQLServer.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SQLServerDeclareVariableStatementAssert {
+    
+    /**
+     * Assert declare table variable statement is correct with expected parser 
result.
+     *
+     * @param assertContext assert context
+     * @param actual actual declare variable statement
+     * @param expected expected parser result
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final DeclareVariableStatement actual,
+                                final 
SQLServerDeclareTableVariableStatementTestCase expected) {
+        SQLSegmentAssert.assertIs(assertContext, actual.getVariableName(), 
expected.getVariableName());
+        assertThat(assertContext.getText("Variable name assertion error: "), 
actual.getVariableName().getVariable(), 
is(expected.getVariableName().getVariable()));
+        assertColumnDefinitions(assertContext, actual, expected);
+    }
+    
+    private static void assertColumnDefinitions(final SQLCaseAssertContext 
assertContext, final DeclareVariableStatement actual,
+                                                final 
SQLServerDeclareTableVariableStatementTestCase expected) {
+        assertThat(assertContext.getText("Column definitions size assertion 
error: "), actual.getColumnDefinitions().size(), 
is(expected.getColumnDefinitions().size()));
+        int count = 0;
+        for (ColumnDefinitionSegment each : actual.getColumnDefinitions()) {
+            ColumnDefinitionAssert.assertIs(assertContext, each, 
expected.getColumnDefinitions().get(count));
+            count++;
+        }
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
index 589e29fb41b..145d887a3c9 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
@@ -303,6 +303,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.service.SQLServerCreateServiceStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.service.SQLServerDropServiceStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.statistics.SQLServerUpdateStatisticsStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.variable.SQLServerDeclareTableVariableStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.AlterPackageStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.CloseStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.CommentStatementTestCase;
@@ -2041,6 +2042,9 @@ public final class RootSQLParserTestCases {
     @XmlElement(name = "update-statistics")
     private final List<SQLServerUpdateStatisticsStatementTestCase> 
updateStatisticsStatementTestCases = new LinkedList<>();
     
+    @XmlElement(name = "declare-table-variable")
+    private final List<SQLServerDeclareTableVariableStatementTestCase> 
declareTableVariableStatementTestCases = new LinkedList<>();
+    
     @XmlElement(name = "spool")
     private final List<OracleSpoolStatementTestCase> 
oracleSpoolStatementTestCases = new LinkedList<>();
     
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/sqlserver/variable/SQLServerDeclareTableVariableStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/sqlserver/variable/SQLServerDeclareTableVariableStatementTestCase.java
new file mode 100644
index 00000000000..a558e4b5527
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/dialect/sqlserver/variable/SQLServerDeclareTableVariableStatementTestCase.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.dialect.sqlserver.variable;
+
+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.definition.ExpectedColumnDefinition;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedVariableSegment;
+
+import javax.xml.bind.annotation.XmlElement;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Declare table variable statement test case for SQLServer.
+ */
+@Getter
+@Setter
+public final class SQLServerDeclareTableVariableStatementTestCase extends 
SQLParserTestCase {
+    
+    @XmlElement(name = "variable-name")
+    private ExpectedVariableSegment variableName;
+    
+    @XmlElement(name = "column-definition")
+    private final List<ExpectedColumnDefinition> columnDefinitions = new 
LinkedList<>();
+}
diff --git a/test/it/parser/src/main/resources/case/ddl/create-function.xml 
b/test/it/parser/src/main/resources/case/ddl/create-function.xml
index a492633c7c7..c59893efd63 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-function.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-function.xml
@@ -22,6 +22,40 @@
     <create-function 
sql-case-id="create_function_with_multiple_output_parameters" />
     <create-function sql-case-id="create_function_return_table" />
     <create-function sql-case-id="create_function_with_execute" />
+    <create-function sql-case-id="create_function_with_declare">
+        <function-name name="ufnGetName" />
+        <sql-statements>
+            <sql-statement start-index="141" stop-index="160" 
statement-class-simple-name="SetStatement" />
+            <sql-statement start-index="174" stop-index="186" 
statement-class-simple-name="SelectStatement" />
+        </sql-statements>
+    </create-function>
+    <create-function sql-case-id="create_function_with_declare_table_variable">
+        <function-name name="ufnTableVar" />
+        <sql-statements>
+            <sql-statement start-index="130" stop-index="152" 
statement-class-simple-name="UpdateStatement" />
+        </sql-statements>
+    </create-function>
+    <create-function sql-case-id="create_function_or_alter_with_declare">
+        <function-name name="ufnRefresh" />
+        <sql-statements>
+            <sql-statement start-index="133" stop-index="147" 
statement-class-simple-name="SetStatement" />
+        </sql-statements>
+    </create-function>
+    <create-function sql-case-id="create_function_with_declare_cursor">
+        <function-name name="ufnCursor" />
+    </create-function>
+    <create-function 
sql-case-id="create_function_with_declare_multiple_variables">
+        <function-name name="ufnMulti" />
+        <sql-statements>
+            <sql-statement start-index="121" stop-index="132" 
statement-class-simple-name="SetStatement" />
+        </sql-statements>
+    </create-function>
+    <create-function 
sql-case-id="create_function_with_schemabinding_and_declare">
+        <function-name name="ufnSchema" />
+    </create-function>
+    <create-function 
sql-case-id="create_function_with_returns_null_on_null_input_and_declare">
+        <function-name name="ufnNullOnNull" />
+    </create-function>
     <create-function sql-case-id="create_function_inline_table" />
     <create-function sql-case-id="create_function_declare_without_at" />
     <create-function sql-case-id="create_function_call_spec_java" />
diff --git a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml 
b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
index 96562a8d460..82a6d2f4a10 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
@@ -263,4 +263,46 @@
             <sql-statement start-index="651" stop-index="676" 
statement-class-simple-name="SetStatement" />
         </sql-statements>
     </create-procedure>
+    <create-procedure sql-case-id="create_procedure_with_declare">
+        <procedure-name name="MyProcedure" />
+        <sql-statements>
+            <sql-statement start-index="167" stop-index="191" 
statement-class-simple-name="SetStatement" />
+            <sql-statement start-index="205" stop-index="271" 
statement-class-simple-name="SelectStatement" />
+            <sql-statement start-index="285" stop-index="325" 
statement-class-simple-name="SelectStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_declare_table_variable">
+        <procedure-name name="uspUpdateTableVar" />
+        <sql-statements>
+            <sql-statement start-index="158" stop-index="202" 
statement-class-simple-name="UpdateStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure sql-case-id="create_procedure_or_alter_with_declare">
+        <procedure-name name="uspRefresh" />
+        <sql-statements>
+            <sql-statement start-index="126" stop-index="145" 
statement-class-simple-name="SetStatement" />
+            <sql-statement start-index="159" stop-index="171" 
statement-class-simple-name="SelectStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure sql-case-id="create_procedure_with_declare_cursor">
+        <procedure-name name="uspCursor" />
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_declare_multiple_variables">
+        <procedure-name name="uspMulti" />
+        <sql-statements>
+            <sql-statement start-index="107" stop-index="118" 
statement-class-simple-name="SetStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_recompile_and_declare">
+        <procedure-name name="uspRecompile" />
+        <sql-statements>
+            <sql-statement start-index="134" stop-index="143" 
statement-class-simple-name="SelectStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure sql-case-id="create_procedure_proc_with_declare">
+        <procedure-name name="uspShort" />
+        <sql-statements>
+            <sql-statement start-index="90" stop-index="100" 
statement-class-simple-name="SetStatement" />
+        </sql-statements>
+    </create-procedure>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
index bb4a6448a97..ac30b30cb42 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
@@ -19,6 +19,11 @@
 <sql-parser-test-cases>
     <create-trigger sql-case-id="create_trigger" />
     <create-trigger sql-case-id="create_trigger_with_database_scoped" />
+    <create-trigger sql-case-id="create_trigger_with_declare" />
+    <create-trigger sql-case-id="create_trigger_with_declare_table_variable" />
+    <create-trigger sql-case-id="create_trigger_or_alter_with_declare" />
+    <create-trigger sql-case-id="create_trigger_with_declare_cursor" />
+    <create-trigger 
sql-case-id="create_trigger_with_declare_multiple_variables" />
 <!--    <create-trigger sql-case-id="create_trigger_of_balance" />-->
 <!--    <create-trigger sql-case-id="create_trigger_with_when" />-->
 <!--    <create-trigger sql-case-id="create_trigger_after_update" />-->
diff --git a/test/it/parser/src/main/resources/case/ddl/declare.xml 
b/test/it/parser/src/main/resources/case/ddl/declare.xml
index c546b788a6c..b82c71543b3 100644
--- a/test/it/parser/src/main/resources/case/ddl/declare.xml
+++ b/test/it/parser/src/main/resources/case/ddl/declare.xml
@@ -28,4 +28,17 @@
             </projections>
         </select>
     </declare>
+
+    <declare-table-variable sql-case-id="declare_table_variable">
+        <variable-name variable="@MyTableVar" start-index="8" stop-index="18" 
/>
+        <column-definition type="INT" not-null="true" start-index="28" 
stop-index="45">
+            <column name="EmpID" />
+        </column-definition>
+        <column-definition type="INT" start-index="48" stop-index="67">
+            <column name="NewVacationHours" />
+        </column-definition>
+        <column-definition type="DATETIME" start-index="70" stop-index="90">
+            <column name="ModifiedDate" />
+        </column-definition>
+    </declare-table-variable>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
index d37aff9fb6a..cea315de443 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
@@ -43,6 +43,54 @@
             SET @ISOweek=1;
             RETURN(@ISOweek);
         END" db-types="SQLServer" />
+    <sql-case id="create_function_with_declare" value="CREATE FUNCTION 
dbo.ufnGetName (@Id INT)
+        RETURNS NVARCHAR(100) AS
+        BEGIN
+            DECLARE @Name NVARCHAR(100);
+            SET @Name = N'test';
+            SELECT @Name;
+            RETURN 0;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_with_declare_table_variable" value="CREATE 
FUNCTION dbo.ufnTableVar (@Id INT)
+        RETURNS INT AS
+        BEGIN
+            DECLARE @T TABLE (Id INT);
+            UPDATE @T SET Id = @Id;
+            RETURN @Id;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_or_alter_with_declare" value="CREATE OR 
ALTER FUNCTION dbo.ufnRefresh (@Id INT)
+        RETURNS INT AS
+        BEGIN
+            DECLARE @Val INT = 0;
+            SET @Val = @Id;
+            RETURN @Val;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_with_declare_cursor" value="CREATE FUNCTION 
dbo.ufnCursor ()
+        RETURNS INT AS
+        BEGIN
+            DECLARE @cur CURSOR;
+            RETURN 0;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_with_declare_multiple_variables" 
value="CREATE FUNCTION dbo.ufnMulti ()
+        RETURNS INT AS
+        BEGIN
+            DECLARE @A INT, @B INT = 1;
+            SET @A = @B;
+            RETURN @A;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_with_schemabinding_and_declare" 
value="CREATE FUNCTION dbo.ufnSchema (@X INT)
+        RETURNS INT WITH SCHEMABINDING AS
+        BEGIN
+            DECLARE @Y INT = @X;
+            RETURN @Y;
+        END" db-types="SQLServer" />
+    <sql-case id="create_function_with_returns_null_on_null_input_and_declare" 
value="CREATE FUNCTION dbo.ufnNullOnNull (@X INT)
+        RETURNS INT
+        WITH RETURNS NULL ON NULL INPUT AS
+        BEGIN
+            DECLARE @Y INT = @X;
+            RETURN @Y;
+        END" db-types="SQLServer" />
     <sql-case id="create_function_inline_table" value="CREATE FUNCTION 
Sales.ufn_SalesByStore (@storeid int)
         RETURNS TABLE AS RETURN (
             SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
index df0e01b97ef..b04bd4fc0e8 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
@@ -76,4 +76,50 @@
     <sql-case id="create_procedure_p1_select_set" value="CREATE PROCEDURE p1(x 
int) BEGIN SELECT count(*) FROM t1; SELECT * FROM t1; SET @x = x; END;" 
db-types="MySQL" />
     <sql-case id="create_procedure_test_if_commit" value="CREATE PROCEDURE 
test_if_commit() BEGIN ROLLBACK; SELECT IF (COUNT(*) &gt; 0, &quot;YES&quot;, 
&quot;NO&quot;) AS &quot;IMPLICIT COMMIT&quot; FROM trans; DELETE FROM trans; 
COMMIT; END;" db-types="MySQL" />
     <sql-case id="create_procedure_p1_repeat_handlers" value="create procedure 
p1() begin declare counter integer default 0; declare continue handler for 
sqlexception begin set counter = counter + 10;end; repeat if rand()&gt;0.5 then 
start transaction; end if; if rand()&gt;0.5 then select var_samp(1), 
exists(select 1 from t1 lock in share mode) from t1 into @a,@b; end if; if 
rand()&gt;0.5 then select var_samp(1), exists(select 1 from t1 for update) from 
t1 into @a,@b; end if; if rand()&g [...]
+    <sql-case id="create_procedure_with_declare" value="CREATE PROCEDURE 
dbo.MyProcedure @InputParam INT
+        AS
+        BEGIN
+            DECLARE @LocalVar NVARCHAR(100);
+            DECLARE @Count INT = 0;
+            SET @LocalVar = N'Hello';
+            SELECT @Count = COUNT(*) FROM dbo.SomeTable WHERE ID = @InputParam;
+            SELECT @LocalVar AS Msg, @Count AS Total;
+        END;" db-types="SQLServer" />
+    <sql-case id="create_procedure_with_declare_table_variable" value="CREATE 
PROCEDURE dbo.uspUpdateTableVar
+        AS
+        BEGIN
+            DECLARE @MyTableVar TABLE (EmpID INT NOT NULL, NewVacationHours 
INT);
+            UPDATE @MyTableVar SET NewVacationHours = 40;
+        END" db-types="SQLServer" />
+    <sql-case id="create_procedure_or_alter_with_declare" value="CREATE OR 
ALTER PROCEDURE dbo.uspRefresh @Id INT
+        AS
+        BEGIN
+            DECLARE @Name NVARCHAR(50);
+            SET @Name = N'test';
+            SELECT @Name;
+        END" db-types="SQLServer" />
+    <sql-case id="create_procedure_with_declare_cursor" value="CREATE 
PROCEDURE dbo.uspCursor
+        AS
+        BEGIN
+            DECLARE @cur CURSOR;
+        END" db-types="SQLServer" />
+    <sql-case id="create_procedure_with_declare_multiple_variables" 
value="CREATE PROCEDURE dbo.uspMulti
+        AS
+        BEGIN
+            DECLARE @A INT, @B INT = 1;
+            SET @A = @B;
+        END" db-types="SQLServer" />
+    <sql-case id="create_procedure_with_recompile_and_declare" value="CREATE 
PROCEDURE dbo.uspRecompile @X INT
+        WITH RECOMPILE
+        AS
+        BEGIN
+            DECLARE @Y INT = @X;
+            SELECT @Y;
+        END" db-types="SQLServer" />
+    <sql-case id="create_procedure_proc_with_declare" value="CREATE PROC 
dbo.uspShort
+        AS
+        BEGIN
+            DECLARE @V INT;
+            SET @V = 1;
+        END" db-types="SQLServer" />
 </sql-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
index 0e289492da6..f8a1b29cbe6 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
@@ -19,6 +19,11 @@
 <sql-cases>
     <sql-case id="create_trigger" value="CREATE TRIGGER reminder1 ON 
Sales.Customer AFTER INSERT, UPDATE AS INSERT INTO SalesPersonQuotaHistory 
VALUES(t1, 100)" db-types="SQLServer" />
     <sql-case id="create_trigger_with_database_scoped" value="CREATE TRIGGER 
ddl_trig_database ON ALL SERVER AFTER INSERT AS SELECT EVENTDATA()" 
db-types="SQLServer" />
+    <sql-case id="create_trigger_with_declare" value="CREATE TRIGGER 
dbo.trgCustomer ON Sales.Customer AFTER INSERT AS BEGIN DECLARE @Count INT = 0; 
SET @Count = 1; SELECT @Count; END" db-types="SQLServer" />
+    <sql-case id="create_trigger_with_declare_table_variable" value="CREATE 
TRIGGER dbo.trgTableVar ON dbo.Orders AFTER UPDATE AS BEGIN DECLARE @T TABLE 
(Id INT); UPDATE @T SET Id = 1; END" db-types="SQLServer" />
+    <sql-case id="create_trigger_or_alter_with_declare" value="CREATE OR ALTER 
TRIGGER dbo.trgRefresh ON dbo.Orders AFTER INSERT AS BEGIN DECLARE @Name 
NVARCHAR(50); SET @Name = N'test'; END" db-types="SQLServer" />
+    <sql-case id="create_trigger_with_declare_cursor" value="CREATE TRIGGER 
dbo.trgCursor ON dbo.Orders AFTER DELETE AS BEGIN DECLARE @cur CURSOR; END" 
db-types="SQLServer" />
+    <sql-case id="create_trigger_with_declare_multiple_variables" 
value="CREATE TRIGGER dbo.trgMulti ON dbo.Orders AFTER INSERT AS BEGIN DECLARE 
@A INT, @B INT = 1; SET @A = @B; END" db-types="SQLServer" />
     <sql-case id="create_trigger_with_create_view" value="CREATE TRIGGER tr1 
BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as select 1; END" 
db-types="MySQL,Doris" />
     <sql-case id="create_trigger_with_dml_event_clause" value="CREATE TRIGGER 
scott.emp_permit_changes BEFORE DELETE OR INSERT OR UPDATE ON scott.emp BEGIN 
IF (IS_SERVERERROR (1017)) THEN NULL; ELSE NULL; END IF; END;" 
db-types="Oracle" />
     <sql-case id="create_trigger_with_body" value="CREATE TRIGGER log_errors 
AFTER SERVERERROR ON DATABASE BEGIN IF (IS_SERVERERROR (1017)) THEN NULL; ELSE 
NULL; END IF; END;" db-types="Oracle" />
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/declare.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/declare.xml
index 38bcd5de17b..df55d63b61a 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/declare.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/declare.xml
@@ -18,4 +18,5 @@
 
 <sql-cases>
     <sql-case id="declare_cursor" value="DECLARE t_order_cursor BINARY CURSOR 
FOR SELECT * FROM t_order;" db-types="PostgreSQL,openGauss" />
+    <sql-case id="declare_table_variable" value="DECLARE @MyTableVar TABLE ( 
EmpID INT NOT NULL, NewVacationHours INT, ModifiedDate DATETIME);" 
db-types="SQLServer" />
 </sql-cases>


Reply via email to