From c803ebce1e22a21bc2f42e879229acb0337d1e68 Mon Sep 17 00:00:00 2001 From: Dhruv Relwani Date: Wed, 28 May 2025 20:59:01 +0000 Subject: [PATCH 1/6] Merged PR 1669134: Create Table As Clone - Fabric DW This pull request introduces a new feature to support table cloning via the "CREATE TABLE AS CLONE" syntax only for Fabric DW. CREATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name } AS CLONE OF { database_name.schema_name.table_name | schema_name.table_name | table_name } [AT {point_in_time}] [CREATE TABLE AS CLONE OF - SQL Server | Microsoft Learn](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-as-clone-of-transact-sql?view=fabric&preserve-view=true#syntax) #### PR Summary The changes implement cloning functionality by extending both the SQL script generator and parser to handle the new clone syntax with an optional point-in-time clause. - `SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateTableStatement.cs`: Added code to generate the `AS CLONE OF` syntax with an optional `AT` clause and bypass standard logic if clone details are provided. - `SqlScriptDom/Parser/TSql/TSqlFabricDW.g` and `SqlScriptDom/Parser/TSql/Ast.xml`: Updated the grammar and AST definitions to include new members (`CloneSource` and `ClonePointInTime`) for clone statements. - Test suite modifications: Added new test files (`CloneTableTestsFabricDW.sql`) for the clone syntax and removed obsolete scalar function test files. Related work items: #4200381 --- SqlScriptDom/Parser/TSql/Ast.xml | 3 + .../Parser/TSql/CodeGenerationSupporter.cs | 1 + SqlScriptDom/Parser/TSql/TSqlFabricDW.g | 15 ++ ...ptGeneratorVisitor.CreateTableStatement.cs | 14 ++ .../CloneTableTestsFabricDW.sql | 7 + ...CreateProcedureCloneTableTestsFabricDW.sql | 21 ++ Test/SqlDom/OnlyFabricDWSyntaxTests.cs | 194 +++++++++++++++++- Test/SqlDom/ParserTest.cs | 25 ++- .../TestScripts/CloneTableTestsFabricDW.sql | 7 + ...CreateProcedureCloneTableTestsFabricDW.sql | 21 ++ 10 files changed, 300 insertions(+), 8 deletions(-) create mode 100644 Test/SqlDom/BaselinesFabricDW/CloneTableTestsFabricDW.sql create mode 100644 Test/SqlDom/BaselinesFabricDW/CreateProcedureCloneTableTestsFabricDW.sql create mode 100644 Test/SqlDom/TestScripts/CloneTableTestsFabricDW.sql create mode 100644 Test/SqlDom/TestScripts/CreateProcedureCloneTableTestsFabricDW.sql diff --git a/SqlScriptDom/Parser/TSql/Ast.xml b/SqlScriptDom/Parser/TSql/Ast.xml index 5c73908..917a30e 100644 --- a/SqlScriptDom/Parser/TSql/Ast.xml +++ b/SqlScriptDom/Parser/TSql/Ast.xml @@ -2674,6 +2674,9 @@ + + + diff --git a/SqlScriptDom/Parser/TSql/CodeGenerationSupporter.cs b/SqlScriptDom/Parser/TSql/CodeGenerationSupporter.cs index f9a8834..daa8b35 100644 --- a/SqlScriptDom/Parser/TSql/CodeGenerationSupporter.cs +++ b/SqlScriptDom/Parser/TSql/CodeGenerationSupporter.cs @@ -208,6 +208,7 @@ internal static class CodeGenerationSupporter internal const string Cluster = "CLUSTER"; internal const string Clustered = "CLUSTERED"; internal const string ClearPort = "CLEAR_PORT"; + internal const string Clone = "CLONE"; internal const string CodePage = "CODEPAGE"; internal const string Collection = "COLLECTION"; internal const string Column = "COLUMN"; diff --git a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g index 588ff07..f4e3a9b 100644 --- a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g +++ b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g @@ -26504,6 +26504,8 @@ createTableStatement returns [CreateTableStatement vResult = this.FragmentFactor TableDefinition vTableDefinition; FederationScheme vFederationScheme; FileGroupOrPartitionScheme vFileGroupOrPartitionScheme; + SchemaObjectName vCloneSource; + ScalarExpression vCloneTime; } : tCreate:Create Table vSchemaObjectName=schemaObjectThreePartName { @@ -26534,6 +26536,19 @@ createTableStatement returns [CreateTableStatement vResult = this.FragmentFactor ) | ctasCreateTableStatement[vResult] + | + As tClone:Identifier Of vCloneSource=schemaObjectThreePartName + { + Match(tClone, CodeGenerationSupporter.Clone); + vResult.CloneSource = vCloneSource; + } + ( + tAt:Identifier vCloneTime=stringLiteral + { + Match(tAt, CodeGenerationSupporter.At); + vResult.ClonePointInTime = vCloneTime; + } + )? | As tFileTableOrGraphEdge:Identifier { diff --git a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateTableStatement.cs b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateTableStatement.cs index 514b512..3f96d44 100644 --- a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateTableStatement.cs +++ b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateTableStatement.cs @@ -20,6 +20,20 @@ public override void ExplicitVisit(CreateTableStatement node) GenerateSpaceAndFragmentIfNotNull(node.SchemaObjectName); + if (node.CloneSource != null) + { + GenerateSpaceAndKeyword(TSqlTokenType.As); + GenerateSpaceAndIdentifier(CodeGenerationSupporter.Clone); + GenerateSpaceAndKeyword(TSqlTokenType.Of); + GenerateSpaceAndFragmentIfNotNull(node.CloneSource); + + if (node.ClonePointInTime != null) + { + GenerateSpaceAndIdentifier(CodeGenerationSupporter.At); + GenerateSpaceAndFragmentIfNotNull(node.ClonePointInTime); + } + } + if (node.Definition != null) { List columnsAndConstraintsAndIndexesAndPeriods = new List(); diff --git a/Test/SqlDom/BaselinesFabricDW/CloneTableTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/CloneTableTestsFabricDW.sql new file mode 100644 index 0000000..32c3106 --- /dev/null +++ b/Test/SqlDom/BaselinesFabricDW/CloneTableTestsFabricDW.sql @@ -0,0 +1,7 @@ +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA; + +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA; + +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA AT '2023-05-23T14:24:10.325'; + +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA AT '2023-05-23T14:24:10'; \ No newline at end of file diff --git a/Test/SqlDom/BaselinesFabricDW/CreateProcedureCloneTableTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/CreateProcedureCloneTableTestsFabricDW.sql new file mode 100644 index 0000000..a6cf794 --- /dev/null +++ b/Test/SqlDom/BaselinesFabricDW/CreateProcedureCloneTableTestsFabricDW.sql @@ -0,0 +1,21 @@ +CREATE PROCEDURE CloneEmployeeLocal +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA; + + +GO +CREATE PROCEDURE CloneEmployeeFromDbo1 +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA; + + +GO +CREATE PROCEDURE CloneEmployeeAtTimestamp +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA AT '2023-05-23T14:24:10.325'; + + +GO +CREATE PROCEDURE CloneEmployeeFromDbo1AtTimestamp +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA AT '2023-05-23T14:24:10'; \ No newline at end of file diff --git a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs index 7ae7fc2..454b358 100644 --- a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs +++ b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs @@ -9,6 +9,8 @@ public partial class SqlDomTests // Note: These filenames are case sensitive, make sure they match the checked-in file exactly private static readonly ParserTest[] OnlyFabricDWTestInfos = { + new ParserTestFabricDW("CloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), + new ParserTestFabricDW("CreateProcedureCloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), new ParserTestFabricDW("ScalarFunctionIntTestsFabricDW.sql", nErrors80: 0, nErrors90: 0, nErrors100: 0, nErrors110: 0, nErrors120: 0, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0), new ParserTestFabricDW("ScalarFunctionVarCharTestsFabricDW.sql", nErrors80: 0, nErrors90: 0, nErrors100: 0, nErrors110: 0, nErrors120: 0, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0) }; @@ -25,13 +27,201 @@ public void TSqlFabricDWSyntaxParserTest() ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._resultFabricDW); } - parser = new TSqlFabricDWParser(true, SqlEngineType.All); - scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.SqlFabricDW); scriptGen.Options.SqlEngineType = SqlEngineType.All; foreach (ParserTest ti in OnlyFabricDWTestInfos) { ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._resultFabricDW); } } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn80ParserTest() + { + TSql80Parser parser = new TSql80Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql80); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result80); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result80); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn90ParserTest() + { + TSql90Parser parser = new TSql90Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql90); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result90); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result90); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn100ParserTest() + { + TSql100Parser parser = new TSql100Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql100); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result100); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result100); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn110ParserTest() + { + TSql110Parser parser = new TSql110Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql110); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result110); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result110); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn120ParserTest() + { + TSql120Parser parser = new TSql120Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql120); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result120); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result120); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn130ParserTest() + { + TSql130Parser parser = new TSql130Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql130); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result130); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result130); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn140ParserTest() + { + TSql140Parser parser = new TSql140Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql140); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result140); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result140); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn150ParserTest() + { + TSql150Parser parser = new TSql150Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql150); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result150); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result150); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn160ParserTest() + { + TSql160Parser parser = new TSql160Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql160); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result160); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result160); + } + } + + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void TSqlFabricDWSyntaxIn170ParserTest() + { + TSql170Parser parser = new TSql170Parser(true); + SqlScriptGenerator scriptGen = ParserTestUtils.CreateScriptGen(SqlVersion.Sql170); + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result170); + } + + scriptGen.Options.SqlEngineType = SqlEngineType.All; + foreach (ParserTest ti in OnlyFabricDWTestInfos) + { + ParserTest.ParseAndVerify(parser, scriptGen, ti._scriptFilename, ti._result170); + } + } } } \ No newline at end of file diff --git a/Test/SqlDom/ParserTest.cs b/Test/SqlDom/ParserTest.cs index 73851cd..49f9fb7 100644 --- a/Test/SqlDom/ParserTest.cs +++ b/Test/SqlDom/ParserTest.cs @@ -50,6 +50,21 @@ public ParserTest( _resultFabricDW = resultFabricDW; } + public ParserTest( + string scriptFilename, + ParserTestOutput result80, ParserTestOutput result90, ParserTestOutput result100, + ParserTestOutput result110, ParserTestOutput result120, ParserTestOutput result130, + ParserTestOutput result140, ParserTestOutput result150, ParserTestOutput result160, + ParserTestOutput result170) + : this( + scriptFilename, + result80, result90, result100, + result110, result120, result130, + result140, result150, result160, + result170, result170) + { + } + public ParserTest( string scriptFilename, ParserTestOutput result80, ParserTestOutput result90, ParserTestOutput result100, @@ -60,7 +75,7 @@ public ParserTest( result80, result90, result100, result110, result120, result130, result140, result150, result160, - result160, result160) + result160) { } @@ -73,8 +88,7 @@ public ParserTest( scriptFilename, result80, result90, result100, result110, result120, result130, - result140, result150, result150, - result150, result150) + result140, result150, result150) { } @@ -474,7 +488,7 @@ public ParserTest170(string scriptFilename, int nErrors80, int nErrors90, int nE new ParserTestOutput(nErrors80), new ParserTestOutput(nErrors90), new ParserTestOutput(nErrors100), new ParserTestOutput(nErrors110), new ParserTestOutput(nErrors120), new ParserTestOutput(nErrors130), new ParserTestOutput(nErrors140), new ParserTestOutput(nErrors150), new ParserTestOutput(nErrors160), - new ParserTestOutput("Baselines170"), new ParserTestOutput(nErrors160)) + new ParserTestOutput("Baselines170")) { } public ParserTest170(string scriptFilename, ParserTestOutput output80, ParserTestOutput output90, ParserTestOutput output100, @@ -487,8 +501,7 @@ public ParserTest170(string scriptFilename, ParserTestOutput output80, ParserTes output140, output150, output160, - new ParserTestOutput("Baselines170"), - output160) + new ParserTestOutput("Baselines170")) { } public ParserTest170(string scriptFilename, params ParserErrorInfo[] errors80And90And100And110And120and130and140and150and160) diff --git a/Test/SqlDom/TestScripts/CloneTableTestsFabricDW.sql b/Test/SqlDom/TestScripts/CloneTableTestsFabricDW.sql new file mode 100644 index 0000000..32c3106 --- /dev/null +++ b/Test/SqlDom/TestScripts/CloneTableTestsFabricDW.sql @@ -0,0 +1,7 @@ +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA; + +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA; + +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA AT '2023-05-23T14:24:10.325'; + +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA AT '2023-05-23T14:24:10'; \ No newline at end of file diff --git a/Test/SqlDom/TestScripts/CreateProcedureCloneTableTestsFabricDW.sql b/Test/SqlDom/TestScripts/CreateProcedureCloneTableTestsFabricDW.sql new file mode 100644 index 0000000..a6cf794 --- /dev/null +++ b/Test/SqlDom/TestScripts/CreateProcedureCloneTableTestsFabricDW.sql @@ -0,0 +1,21 @@ +CREATE PROCEDURE CloneEmployeeLocal +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA; + + +GO +CREATE PROCEDURE CloneEmployeeFromDbo1 +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA; + + +GO +CREATE PROCEDURE CloneEmployeeAtTimestamp +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA AT '2023-05-23T14:24:10.325'; + + +GO +CREATE PROCEDURE CloneEmployeeFromDbo1AtTimestamp +AS +CREATE TABLE dbo.Employee AS CLONE OF dbo1.EmployeeUSA AT '2023-05-23T14:24:10'; \ No newline at end of file From 613bf14c76e2e778975bac494b48916cce79f807 Mon Sep 17 00:00:00 2001 From: Dhruv Relwani Date: Thu, 29 May 2025 16:04:39 +0000 Subject: [PATCH 2/6] Merged PR 1676494: CREATE OR ALTER Scalar Functions - TSqlFabricDW This pull request modifies the Scalar Function feature only for Fabric DW, while keeping the existing implementation for Table Value Functions unchanged. This is the exact syntax we are looking to support for Fabric SQL: ``` CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] parameter_data_type [ = default ] } [ ,...n ] ] ) RETURNS return_data_type [ WITH [ ,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END [ ; ] ::= { [ SCHEMABINDING ] | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ] | [EXECUTE AS] } ``` Hence the changes made to the TSqlFabricDW.g grammar file in this PR aim to achieve the following code diff in supported TSQL Syntax for Fabric: ![image.png](https://msdata.visualstudio.com/c6789c20-b819-4bfd-9917-11471655156e/_apis/git/repositories/2247f543-55d8-45df-a9fe-23820ae656af/pullRequests/1676494/attachments/image.png) [Task 1639617](https://dev.azure.com/powerbi/AI/_workitems/edit/1639617): ScriptDom - Table & Scalar valued functions support ---- #### AI description (iteration 1) #### PR Classification This pull request implements new scalar function support by updating the TSqlFabricDW parser grammar and associated tests. #### PR Summary The changes add new grammar productions for scalar function parameters and attributes, update function productions to use these new definitions, and introduce new positive and negative test scripts while removing outdated Int/VarChar tests. - Updated `/SqlScriptDom/Parser/TSql/TSqlFabricDW.g` to add new productions for scalar function parameters, attributes, and options. - Modified existing productions (`functionParameter` and `functionReturnTypeAndBody`) to integrate the new scalar function definitions. - Added new test scripts in `/Test/SqlDom/BaselinesFabricDW/` and `/Test/SqlDom/TestScripts/` for scalar function positive and negative cases. - Adjusted `/Test/SqlDom/OnlyFabricDWSyntaxTests.cs` to include the new positive test while removing references to deprecated test files. Related work items: #4219784 --- SqlScriptDom/Parser/TSql/TSqlFabricDW.g | 91 +- .../ScalarFunctionIntTestsFabricDW.sql | 11 - .../ScalarFunctionTestsFabricDW.sql | 53 + .../ScalarFunctionVarCharTestsFabricDW.sql | 7 - Test/SqlDom/OnlyFabricDWSyntaxTests.cs | 3 +- Test/SqlDom/ParserErrorsTests.cs | 1048 +++++++++-------- .../ScalarFunctionIntTestsFabricDW.sql | 11 - .../ScalarFunctionTestsFabricDW.sql | 53 + .../ScalarFunctionVarCharTestsFabricDW.sql | 7 - 9 files changed, 752 insertions(+), 532 deletions(-) delete mode 100644 Test/SqlDom/BaselinesFabricDW/ScalarFunctionIntTestsFabricDW.sql create mode 100644 Test/SqlDom/BaselinesFabricDW/ScalarFunctionTestsFabricDW.sql delete mode 100644 Test/SqlDom/BaselinesFabricDW/ScalarFunctionVarCharTestsFabricDW.sql delete mode 100644 Test/SqlDom/TestScripts/ScalarFunctionIntTestsFabricDW.sql create mode 100644 Test/SqlDom/TestScripts/ScalarFunctionTestsFabricDW.sql delete mode 100644 Test/SqlDom/TestScripts/ScalarFunctionVarCharTestsFabricDW.sql diff --git a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g index f4e3a9b..d786a4c 100644 --- a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g +++ b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g @@ -13006,6 +13006,93 @@ functionParameterList[FunctionStatementBody vResult] )* ; +scalarFunctionParameter[ProcedureParameter vParent] +{ + DataTypeReference vDataType; + ScalarExpression vDefault; +} + : vDataType=scalarDataType + { + vParent.DataType = vDataType; + } + ( + EqualsSign + ( + vDefault=possibleNegativeConstantOrIdentifierWithDefault + { + vParent.Value = vDefault; + } + ) + )? + ( + tId2:Identifier + { + if (TryMatch(tId2, CodeGenerationSupporter.Output) || TryMatch(tId2, CodeGenerationSupporter.Out)) + { + ThrowParseErrorException("SQL46039", tId2, TSqlParserResource.SQL46039Message); + } + else + { + ThrowParseErrorException("SQL46026", tId2, TSqlParserResource.SQL46026Message, tId2.getText()); + } + } + )? + ; + +scalarFunctionAttributeNoExecuteAs returns [FunctionOption vResult = FragmentFactory.CreateFragment()] + : tOption:Identifier + { + if (TryMatch(tOption, CodeGenerationSupporter.SchemaBinding)) + { + vResult.OptionKind = FunctionOptionKind.SchemaBinding; + } + else + { + ThrowParseErrorException("SQL46026", tOption, TSqlParserResource.SQL46026Message, tOption.getText()); + } + UpdateTokenInfo(vResult, tOption); + } + | tReturns:Identifier Null On Null tInput:Identifier + { + Match(tReturns,CodeGenerationSupporter.Returns); + Match(tInput,CodeGenerationSupporter.Input); + vResult.OptionKind = FunctionOptionKind.ReturnsNullOnNullInput; + UpdateTokenInfo(vResult, tInput); + } + | tCalled:Identifier On Null tInput2:Identifier + { + Match(tCalled,CodeGenerationSupporter.Called); + Match(tInput2,CodeGenerationSupporter.Input); + vResult.OptionKind = FunctionOptionKind.CalledOnNullInput; + UpdateTokenInfo(vResult, tInput2); + } + ; + + +scalarFunctionAttribute returns [FunctionOption vResult] + : vResult=scalarFunctionAttributeNoExecuteAs + | vResult=functionExecuteAsOption + ; + +scalarFunctionAttributes [FunctionStatementBody vParent] +{ + FunctionOption vOption; + long encounteredOptions = 0; +} + : With vOption=scalarFunctionAttribute + { + CheckOptionDuplication(ref encounteredOptions, (int)vOption.OptionKind, vOption); + AddAndUpdateTokenInfo(vParent, vParent.Options, vOption); + } + ( + Comma vOption=scalarFunctionAttribute + { + CheckOptionDuplication(ref encounteredOptions, (int)vOption.OptionKind, vOption); + AddAndUpdateTokenInfo(vParent, vParent.Options, vOption); + } + )* + ; + functionParameter returns[ProcedureParameter vResult = FragmentFactory.CreateFragment()] { Identifier vIdentifier; @@ -13014,7 +13101,7 @@ functionParameter returns[ProcedureParameter vResult = FragmentFactory.CreateFra { vResult.VariableName = vIdentifier; } - scalarProcedureParameter[vResult, false, true] + scalarFunctionParameter[vResult] ; functionReturnTypeAndBody [FunctionStatementBody vParent, out bool vParseErrorOccurred] @@ -13034,7 +13121,7 @@ functionReturnTypeAndBody [FunctionStatementBody vParent, out bool vParseErrorOc vScalarResult.DataType = vDataType; vParent.ReturnType = vScalarResult; } - (functionAttributes[vParent])? (As)? + (scalarFunctionAttributes[vParent])? (As)? ( vCompoundStatement = beginEndBlockStatement { diff --git a/Test/SqlDom/BaselinesFabricDW/ScalarFunctionIntTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/ScalarFunctionIntTestsFabricDW.sql deleted file mode 100644 index d348a7e..0000000 --- a/Test/SqlDom/BaselinesFabricDW/ScalarFunctionIntTestsFabricDW.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE FUNCTION dbo.ConvertInput -(@MyValueIn INT) -RETURNS DECIMAL (10, 2) -AS -BEGIN - DECLARE @MyValueOut AS INT; - SET @MyValueOut = CAST (@MyValueIn AS DECIMAL (10, 2)); - RETURN (@MyValueOut); -END -GO -SELECT dbo.ConvertInput(15) AS 'ConvertedValue'; \ No newline at end of file diff --git a/Test/SqlDom/BaselinesFabricDW/ScalarFunctionTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/ScalarFunctionTestsFabricDW.sql new file mode 100644 index 0000000..fed9aef --- /dev/null +++ b/Test/SqlDom/BaselinesFabricDW/ScalarFunctionTestsFabricDW.sql @@ -0,0 +1,53 @@ +CREATE OR ALTER FUNCTION dbo.GetFullName +(@firstName NVARCHAR (50)='John', @lastName NVARCHAR (50)) +RETURNS NVARCHAR (101) +WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT +AS +BEGIN + RETURN @firstName + ' ' + @lastName; +END + + +GO +CREATE OR ALTER FUNCTION dbo.CalculateTotal +(@price DECIMAL (10, 2), @quantity INT=1) +RETURNS DECIMAL (10, 2) +WITH EXECUTE AS SELF, CALLED ON NULL INPUT +AS +BEGIN + RETURN @price * @quantity; +END + + +GO +CREATE OR ALTER FUNCTION sales.ComputeDiscount +(@amount FLOAT, @discount FLOAT) +RETURNS FLOAT +WITH RETURNS NULL ON NULL INPUT +AS +BEGIN + RETURN @amount - (@amount * @discount / 100); +END + + +GO +CREATE FUNCTION dbo.GetFullName +(@FirstName VARCHAR (50), @LastName VARCHAR (50)) +RETURNS VARCHAR (101) +AS +BEGIN + RETURN @FirstName + ' ' + @LastName; +END + +GO +CREATE FUNCTION dbo.ConvertInput +(@MyValueIn INT) +RETURNS DECIMAL (10, 2) +AS +BEGIN + DECLARE @MyValueOut AS INT; + SET @MyValueOut = CAST (@MyValueIn AS DECIMAL (10, 2)); + RETURN (@MyValueOut); +END +GO +SELECT dbo.ConvertInput(15) AS 'ConvertedValue'; \ No newline at end of file diff --git a/Test/SqlDom/BaselinesFabricDW/ScalarFunctionVarCharTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/ScalarFunctionVarCharTestsFabricDW.sql deleted file mode 100644 index 6c492a3..0000000 --- a/Test/SqlDom/BaselinesFabricDW/ScalarFunctionVarCharTestsFabricDW.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE FUNCTION dbo.GetFullName -(@FirstName VARCHAR (50), @LastName VARCHAR (50)) -RETURNS VARCHAR (101) -AS -BEGIN - RETURN @FirstName + ' ' + @LastName; -END \ No newline at end of file diff --git a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs index 454b358..7f5c9fa 100644 --- a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs +++ b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs @@ -11,8 +11,7 @@ public partial class SqlDomTests { new ParserTestFabricDW("CloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), new ParserTestFabricDW("CreateProcedureCloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), - new ParserTestFabricDW("ScalarFunctionIntTestsFabricDW.sql", nErrors80: 0, nErrors90: 0, nErrors100: 0, nErrors110: 0, nErrors120: 0, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0), - new ParserTestFabricDW("ScalarFunctionVarCharTestsFabricDW.sql", nErrors80: 0, nErrors90: 0, nErrors100: 0, nErrors110: 0, nErrors120: 0, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0) + new ParserTestFabricDW("ScalarFunctionTestsFabricDW.sql", nErrors80: 3, nErrors90: 2, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0), }; [TestMethod] diff --git a/Test/SqlDom/ParserErrorsTests.cs b/Test/SqlDom/ParserErrorsTests.cs index ac99d5e..dd9a9a4 100644 --- a/Test/SqlDom/ParserErrorsTests.cs +++ b/Test/SqlDom/ParserErrorsTests.cs @@ -19,8 +19,8 @@ public partial class SqlDomTests /// as user id/name start/end columns /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTableGeneratedAlwaysNegativeTest() { // Generated always as UserId start column must be unique @@ -255,11 +255,11 @@ [Data1] NVARCHAR (32) HIDDEN MASKED WITH (FUNCTION = 'default()') DEFAULT 'a' N [Data2] NVARCHAR (32) MASKED WITH (FUNCTION = 'default()') DEFAULT 'b' NOT NULL, CONSTRAINT [constr1] PRIMARY KEY ([PK]));"; ParserTestUtils.ErrorTest140(hiddenMaskedSyntax, - new ParserErrorInfo(hiddenMaskedSyntax.IndexOf("HIDDEN MASKED")+7, "SQL46010", "MASKED")); + new ParserErrorInfo(hiddenMaskedSyntax.IndexOf("HIDDEN MASKED") + 7, "SQL46010", "MASKED")); } - /// + /// /// Negative tests for BULK INSERT command /// [TestMethod] @@ -282,8 +282,8 @@ public void BulkInsertNegativeTestCases() /// as user id/name start/end columns /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterTableAddGeneratedAlwaysNegativeTest() { // Generated always as UserId start column must be unique @@ -311,8 +311,8 @@ public void AlterTableAddGeneratedAlwaysNegativeTest() /// Negative tests for alter column with generated always /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterColumnAddGeneratedAlwaysNegativeTest() { ParserTestUtils.ErrorTest130("ALTER TABLE T ALTER COLUMN C GENERATED ALWAYS AS SUSER_SID START", @@ -348,8 +348,8 @@ public void AlterColumnAddGeneratedAlwaysNegativeTest() /// for temporal generated always columns /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AddDropHiddenNegativeTests() { ParserTestUtils.ErrorTest130("ALTER TABLE T1 ALTER COLUMN C1 ADD DROP HIDDEN", @@ -376,8 +376,8 @@ public void AddDropHiddenNegativeTests() /// for ALTER TABLE /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AddSplitMergeNegativeTests() { ParserTestUtils.ErrorTest130("ALTER TABLE T SPLI RANGE ('2004-01-01')", @@ -400,8 +400,8 @@ public void AddSplitMergeNegativeTests() /// Negative tests for OPENJSON syntax. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void OpenJsonNegativeTest() { ParserTestUtils.ErrorTest130("select * from openjson()", @@ -507,8 +507,8 @@ public void JsonArraySyntaxNegativeTest() /// Negative tests for Data Masking Alter Column syntax. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DataMaskingAlterColumnSyntaxNegativeTest() { // Add data masking: missing WITH keyword @@ -601,8 +601,8 @@ public void DataMaskingAlterColumnSyntaxNegativeTest() /// Negative tests for Data Masking Column Definition syntax. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DataMaskingColumnDefinitionSyntaxNegativeTest() { // Missing WITH keyword @@ -655,8 +655,8 @@ public void DataMaskingColumnDefinitionSyntaxNegativeTest() /// Only ON and OFF options are allowed for ALTER INDEX REORGANIZE's COMPRESS_ALL_ROW_GROUPS option. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterIndexReorganizeCompressAllRowGroupsOptionNegativeTest() { ParserTestUtils.ErrorTest130("ALTER INDEX cci ON cciTable REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ONN);", @@ -690,8 +690,8 @@ public void AlterIndexReorganizeCompressAllRowGroupsOptionNegativeTest() /// Only columnstore indexes should accept compression delay on inline index create. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTableWithInlineIndexWithCompressionDelayNegativeTests() { ParserTestUtils.ErrorTest130("CREATE TABLE t (col0 INT, INDEX ind (col0) WITH (COMPRESSION_DELAY = 2));", @@ -704,8 +704,8 @@ public void CreateTableWithInlineIndexWithCompressionDelayNegativeTests() /// Only columnstore indexes should accept compression delay on index create. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateIndexWithCompressionDelayNegativeTests() { ParserTestUtils.ErrorTest130("CREATE INDEX ind ON table1 (col0) WITH (COMPRESSION_DELAY = 2));", @@ -716,8 +716,8 @@ public void CreateIndexWithCompressionDelayNegativeTests() /// ALTER INDEX [indexName] ON [tableName] SET (COMPRESSION_DELAY = value MINUTES) accepts AUTO and numbers in [0, maxint]. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterIndexSetCompressionDelayOptionNegativeTest() { ParserTestUtils.ErrorTest130("ALTER INDEX cci ON cciTable SET(COMPRESSION_DELAY = ON);", @@ -754,72 +754,72 @@ public void AlterIndexSetCompressionDelayOptionNegativeTest() } - /// - /// Within a create statement, SUPPRESS_MESSAGES can only be set when IGNORE_DUP_KEY is ON, and it must be a suboption of IGNORE_DUP_KEY. - /// + /// + /// Within a create statement, SUPPRESS_MESSAGES can only be set when IGNORE_DUP_KEY is ON, and it must be a suboption of IGNORE_DUP_KEY. + /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] - public void CreateTableWithInlineIndexWithSuppressMessagesNegativeTests() - { - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (SUPPRESS_MESSAGES = ON);", - new ParserErrorInfo(59, "SQL46010", "SUPPRESS_MESSAGES")); + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void CreateTableWithInlineIndexWithSuppressMessagesNegativeTests() + { + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (SUPPRESS_MESSAGES = ON);", + new ParserErrorInfo(59, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (SUPPRESS_MESSAGES = OFF);", - new ParserErrorInfo(59, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (SUPPRESS_MESSAGES = OFF);", + new ParserErrorInfo(59, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = ON));", - new ParserErrorInfo(80, "SQL46010", "(")); + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = ON));", + new ParserErrorInfo(80, "SQL46010", "(")); - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = OFF));", - new ParserErrorInfo(80, "SQL46010", "(")); + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = OFF));", + new ParserErrorInfo(80, "SQL46010", "(")); - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = ON));", - new ParserErrorInfo(80, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = ON));", + new ParserErrorInfo(80, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = OFF));", - new ParserErrorInfo(80, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("CREATE UNIQUE NONCLUSTERED INDEX nci ON table1(col1) WITH (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = OFF));", + new ParserErrorInfo(80, "SQL46010", "SUPPRESS_MESSAGES")); - } + } - /// - /// Within an ALTER statement, SUPPRESS_MESSAGES is a suboption of IGNORE_DUP_KEY only when IGNORE_DUP_KEY is ON. - /// + /// + /// Within an ALTER statement, SUPPRESS_MESSAGES is a suboption of IGNORE_DUP_KEY only when IGNORE_DUP_KEY is ON. + /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] - public void AlterIndexSetSuppressMessagesOptionNegativeTest() - { - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (SUPPRESS_MESSAGES = ON);", - new ParserErrorInfo(31, "SQL46010", "SUPPRESS_MESSAGES")); + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void AlterIndexSetSuppressMessagesOptionNegativeTest() + { + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (SUPPRESS_MESSAGES = ON);", + new ParserErrorInfo(31, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (SUPPRESS_MESSAGES = OFF);", - new ParserErrorInfo(31, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (SUPPRESS_MESSAGES = OFF);", + new ParserErrorInfo(31, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = ON));", - new ParserErrorInfo(52, "SQL46010", "(")); + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = ON));", + new ParserErrorInfo(52, "SQL46010", "(")); - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = OFF));", - new ParserErrorInfo(52, "SQL46010", "(")); + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = OFF (SUPPRESS_MESSAGES = OFF));", + new ParserErrorInfo(52, "SQL46010", "(")); - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = ON);", - new ParserErrorInfo(52, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = ON);", + new ParserErrorInfo(52, "SQL46010", "SUPPRESS_MESSAGES")); - ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = OFF);", - new ParserErrorInfo(52, "SQL46010", "SUPPRESS_MESSAGES")); + ParserTestUtils.ErrorTest140("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON, SUPPRESS_MESSAGES = OFF);", + new ParserErrorInfo(52, "SQL46010", "SUPPRESS_MESSAGES")); - // Check that parsers below 140 don't recognize SUPPRESS_MESSAGES as valid. - // - ParserTestUtils.ErrorTest130("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON (SUPPRESS_MESSAGES = ON));", - new ParserErrorInfo(51, "SQL46010", "(")); - } + // Check that parsers below 140 don't recognize SUPPRESS_MESSAGES as valid. + // + ParserTestUtils.ErrorTest130("ALTER INDEX ci ON ciTable SET (IGNORE_DUP_KEY = ON (SUPPRESS_MESSAGES = ON));", + new ParserErrorInfo(51, "SQL46010", "(")); + } /// /// Column level and table level filtered indexes on hekaton tables are not allowed. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void HekatonTableInlineFilteredIndex() { ParserTestUtils.ErrorTest130("CREATE TABLE T1 (C1 INT NOT NULL PRIMARY KEY NONCLUSTERED, C2 INT NOT NULL INDEX idx NONCLUSTERED WHERE C2 > 10) WITH (MEMORY_OPTIMIZED=on);", @@ -833,8 +833,8 @@ public void HekatonTableInlineFilteredIndex() /// Nonclustered columnstore indexes are not allowed on hekaton tables. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void HekatonTableNonClusteredColumnStoreIndex() { ParserTestUtils.ErrorTest130("CREATE TABLE T1 (C1 INT NOT NULL PRIMARY KEY NONCLUSTERED, C2 INT NOT NULL, INDEX idx NONCLUSTERED COLUMNSTORE (C2)) WITH (MEMORY_OPTIMIZED=ON);", @@ -845,8 +845,8 @@ public void HekatonTableNonClusteredColumnStoreIndex() /// Negative tests for FOR JSON syntax. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void JsonForClauseNegativeTest() { ParserTestUtils.ErrorTest130("select * from t1 for json", @@ -893,8 +893,8 @@ public void JsonForClauseNegativeTest() /// Negative tests for Temporal syntax. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void TemporalSyntaxNegativeTest() { // Issuing select statement using temporal clause and an expression as source. @@ -958,7 +958,7 @@ PERIOD FOR SYSTEM_TIME (SYS_START, SYS_END) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.t_history, DATA_CONSISTENCY_CHECK = ON, , HISTORY_RETENTION_PERIOD = 5 DAYS))"; ParserTestUtils.ErrorTest140(query4, - new ParserErrorInfo(query4.IndexOf(", ,")+2, "SQL46010", ",")); + new ParserErrorInfo(query4.IndexOf(", ,") + 2, "SQL46010", ",")); string query5 = @"CREATE TABLE tab_with_retention ( COL0 INT , @@ -1156,7 +1156,7 @@ PERIOD FOR SYSTEM_TIME (SYS_START, SYS_END) ) WITH (SYSTEM_VERSIONING = ON ())"; ParserTestUtils.ErrorTest130(query18, - new ParserErrorInfo(query18.IndexOf("())")+1, "SQL46010", ")")); + new ParserErrorInfo(query18.IndexOf("())") + 1, "SQL46010", ")")); string query19 = @"CREATE TABLE tab_with_retention ( COL0 INT , @@ -1205,8 +1205,8 @@ PERIOD FOR SYSTEM_TIME (SYS_START, SYS_END) /// Negative tests for inline COLUMNSTORE indexes /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ColumnStoreInlineIndexNegativeTest() { // Columns in CCI @@ -1244,8 +1244,8 @@ public void ColumnStoreInlineIndexNegativeTest() /// Negative tests for DROP IF EXISTS statements /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DropIfExistsNegativeTest() { // DROP DATABASE @@ -1410,8 +1410,8 @@ public void DropIfExistsNegativeTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTableInlineFilteredIndexNegativeTests() { // Table level inline clustered index with filter @@ -1428,8 +1428,8 @@ public void CreateTableInlineFilteredIndexNegativeTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void FederationStatementErrorTest() { //Two and Three-Part name @@ -1463,7 +1463,7 @@ public void FederationStatementErrorTest() // This is a limitation of SQLDOM parser. There are a number of instances where this happens, and an UNDONE to allow errors to take into account multiple options. So here can't say expected HIGH or LOW // SQL46005: Expected HIGH but encountered K1 instead. // - ParserTestUtils.ErrorTest110("ALTER FEDERATION FED DROP AT (K1 = 10)", new ParserErrorInfo(30, "SQL46005", new string[]{"HIGH","K1"})); + ParserTestUtils.ErrorTest110("ALTER FEDERATION FED DROP AT (K1 = 10)", new ParserErrorInfo(30, "SQL46005", new string[] { "HIGH", "K1" })); ParserTestUtils.ErrorTest110("ALTER FEDERATION FED DROP AT (low K1 10)", new ParserErrorInfo(37, "SQL46010", "10")); // USE @@ -1481,8 +1481,8 @@ public void FederationStatementErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTableDanglingCommaTest() { // One dangling comma is ok - but only in create table @@ -1520,11 +1520,11 @@ private void TestErrorRecoverySingleErrorTest(TSqlParser parser, string fileName } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTriggerStatementErrorTests() { - ParserTestUtils.ExecuteTestForAllParsers(delegate(TSqlParser parser) + ParserTestUtils.ExecuteTestForAllParsers(delegate (TSqlParser parser) { TestErrorRecoverySingleErrorTest(parser, "CreateTriggerStatementErrorTests.sql", new ParserErrorInfo(141, "SQL46010", ";")); @@ -1549,11 +1549,11 @@ public void CreateTriggerStatementErrorTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateSchemaStatementErrorTests() { - ParserTestUtils.ExecuteTestForAllParsers(delegate(TSqlParser parser) + ParserTestUtils.ExecuteTestForAllParsers(delegate (TSqlParser parser) { TestErrorRecoverySingleErrorTest(parser, "CreateSchemaStatementErrorTests.sql", new ParserErrorInfo(102, "SQL46010", "on")); @@ -1561,8 +1561,8 @@ public void CreateSchemaStatementErrorTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void MultipleErrorTests() { ParserTestUtils.ExecuteTestForAllParsers(MultipleErrorTestImpl, true); @@ -1594,8 +1594,8 @@ public void MultipleErrorTestImpl(TSqlParser parser) } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ViewOptionRepeatErrorTest() { const string source = "CREATE View v1 WITH encryption, schemabinding, encryption as select 10;"; @@ -1605,8 +1605,8 @@ public void ViewOptionRepeatErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void QueryOptimizerHintErrorTest() { const string source = "SELECT * FROM t1 OPTION (SOME_HINT_NEVER_EXISTS);"; @@ -1620,8 +1620,8 @@ public void QueryOptimizerHintErrorTest() /// Tests the USE HINT query hint mechanism /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void QueryOptimizerUseHintClauseErrorTest() { // SQL DOM doesn't check for valid/invalid strings, so this should only fail on parsers @@ -1665,7 +1665,7 @@ public void QueryOptimizerUseHintClauseErrorTest() ParserTestUtils.ErrorTest100(sourceNoHintKeyword, new ParserErrorInfo(29, "SQL46010", "(")); ParserTestUtils.ErrorTest110(sourceNoHintKeyword, new ParserErrorInfo(29, "SQL46010", "(")); ParserTestUtils.ErrorTest120(sourceNoHintKeyword, new ParserErrorInfo(29, "SQL46010", "(")); - ParserTestUtils.ErrorTest130(sourceNoHintKeyword, new ParserErrorInfo(25, "SQL46010", "USE")); + ParserTestUtils.ErrorTest130(sourceNoHintKeyword, new ParserErrorInfo(25, "SQL46010", "USE")); ParserTestUtils.ErrorTest140(sourceNoHintKeyword, new ParserErrorInfo(25, "SQL46010", "USE")); // USE keyword is omitted, should fail on all parsers. @@ -1729,8 +1729,8 @@ CREATE EXTERNAL DATA SOURCE InvalidPushdown_ExternalDataSource ParserTestUtils.ErrorTest150(externalDataSourceCreateCommand, new ParserErrorInfo(externalDataSourceCreateCommand.IndexOf("TEST"), "SQL46010", "TEST")); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void BeginEndStatementErrorTests() { ParserTestUtils.ExecuteTestForAllParsers(BeginEndStatementErrorTestImpl, true); @@ -1751,8 +1751,8 @@ public void BeginEndStatementErrorTestImpl(TSqlParser parser) } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void MLPOptionErrorTest() { // Syntax errors @@ -1803,8 +1803,8 @@ public void MLPOptionErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void InlineIndexErrors() { // Syntax errors @@ -1823,8 +1823,8 @@ public void InlineIndexErrors() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterDatabaseSetEqualsOnOfOptionErrors() { // Syntax errors @@ -1837,8 +1837,8 @@ public void AlterDatabaseSetEqualsOnOfOptionErrors() /// Only Secondary database can accept a PRIMARY value for configuration option /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterDatabaseScopedConfigurationOptionNegativeTests() { // Case: Setting invalid values for primary database @@ -1913,8 +1913,8 @@ public void AlterDatabaseScopedConfigurationOptionNegativeTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void TruncatePartitionsErrorTests() { // Syntax errors @@ -1924,8 +1924,8 @@ public void TruncatePartitionsErrorTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void LexerErrorTest() { ParserTestUtils.ErrorTestAllParsers("CREATE TABLE table1 (c1 int) [])", @@ -1946,7 +1946,7 @@ public void WindowClauseNegativeTest() // const string windowInOverClause = "SELECT Sum(c1) OVER Win1 FROM t1 WINDOW Win1 AS (PARTITION BY c1);"; - ParserTestUtils.ErrorTest150(windowInOverClause,new ParserErrorInfo(15, "SQL46010", "OVER")); + ParserTestUtils.ErrorTest150(windowInOverClause, new ParserErrorInfo(15, "SQL46010", "OVER")); ParserTestUtils.ErrorTest140(windowInOverClause, new ParserErrorInfo(15, "SQL46010", "OVER")); ParserTestUtils.ErrorTest130(windowInOverClause, new ParserErrorInfo(15, "SQL46010", "OVER")); @@ -2015,8 +2015,8 @@ public void IsNotDistinctFromNegativeTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46002Test() { ParserTestUtils.ErrorTestAllParsers("create table t1 (c1 national int varying);", @@ -2027,8 +2027,8 @@ public void SQL46002Test() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46003Test() { string testNumber = "SQL46003"; @@ -2042,8 +2042,8 @@ public void SQL46003Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46004Test() { ParserTestUtils.ErrorTestAllParsers("create table t1 (column1 float varying);", @@ -2055,8 +2055,8 @@ public void SQL46004Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46005Test() { string testNumber = "SQL46005"; @@ -2067,8 +2067,8 @@ public void SQL46005Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46006Test() { string testNumber = "SQL46006"; @@ -2082,8 +2082,8 @@ CREATE TABLE t1 (int i1)", [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46007Test() { string testNumber = "SQL46007"; @@ -2098,8 +2098,8 @@ public void SQL46007Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46008Test() { string testNumber = "SQL46008"; @@ -2110,8 +2110,8 @@ public void SQL46008Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46009Test() { string testNumber = "SQL46009"; @@ -2122,8 +2122,8 @@ public void SQL46009Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46010Test() { string testNumber = "SQL46010"; @@ -2140,15 +2140,15 @@ public void SQL46010Test() sql46010TestSyntax, new ParserErrorInfo(16, testNumber, "column1"), new ParserErrorInfo(sql46010TestSyntax.IndexOf(@"[labelName]"), testNumber, "[labelName]"), - new ParserErrorInfo(sql46010TestSyntax.IndexOf(@"...t1")+3, testNumber, "t1"), + new ParserErrorInfo(sql46010TestSyntax.IndexOf(@"...t1") + 3, testNumber, "t1"), new ParserErrorInfo(sql46010TestSyntax.IndexOf(@"t1));"), testNumber, "t1") ); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46011Test() { string testScript = "create table t1 (c1 int, c2 as -c1 check (c2 < 10));"; @@ -2161,8 +2161,8 @@ public void SQL46011Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46012Test() { string testNumber = "SQL46012"; @@ -2173,8 +2173,8 @@ public void SQL46012Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46013Test() { string testNumber = "SQL46013"; @@ -2185,8 +2185,8 @@ public void SQL46013Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46014Test() { string testNumber = "SQL46014"; @@ -2197,8 +2197,8 @@ public void SQL46014Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46015Test() { string testNumber = "SQL46015"; @@ -2210,8 +2210,8 @@ public void SQL46015Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46016Test() { string testNumber = "SQL46016"; @@ -2229,8 +2229,8 @@ public void SQL46016Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ForeignKeyInDeclareTableErrorTest() { string testScript = @@ -2254,12 +2254,12 @@ public void GraphDbEdgeInDeclareTableError() ParserTestUtils.ErrorTest150( testScript, new ParserErrorInfo(27, "SQL46010", "constraint"), - new ParserErrorInfo(testScript.IndexOf(@"to n2",60), "SQL46010", "to")); + new ParserErrorInfo(testScript.IndexOf(@"to n2", 60), "SQL46010", "to")); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46018Test() { string testNumber = "SQL46018"; @@ -2270,8 +2270,8 @@ public void SQL46018Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46019Test() { string testNumber = "SQL46019"; @@ -2282,8 +2282,8 @@ public void SQL46019Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46020Test() { string testNumber = "SQL46020"; @@ -2294,8 +2294,8 @@ public void SQL46020Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46021Test() { string testNumber = "SQL46021"; @@ -2317,16 +2317,16 @@ CREATE PROCEDURE dbName..p1 AS select * from t1 ParserTestUtils.ErrorTestAllParsers( sql46021TestSyntax, new ParserErrorInfo(15, testNumber, CodeGenerationSupporter.Default), - new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"rule dbName")+5, testNumber, CodeGenerationSupporter.Rule), - new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"trigger dbName")+8, testNumber, CodeGenerationSupporter.Trigger), - new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"PROCEDURE dbName")+10, testNumber, CodeGenerationSupporter.Procedure) + new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"rule dbName") + 5, testNumber, CodeGenerationSupporter.Rule), + new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"trigger dbName") + 8, testNumber, CodeGenerationSupporter.Trigger), + new ParserErrorInfo(sql46021TestSyntax.IndexOf(@"PROCEDURE dbName") + 10, testNumber, CodeGenerationSupporter.Procedure) ); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46022Test() { string testNumber = "SQL46022"; @@ -2337,8 +2337,8 @@ public void SQL46022Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46023Test() { string testNumber = "SQL46023"; @@ -2349,8 +2349,8 @@ public void SQL46023Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46025Test() { string testNumber = "SQL46025"; @@ -2363,8 +2363,8 @@ public void SQL46025Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46026Test() { string testNumber = "SQL46026"; @@ -2379,8 +2379,8 @@ public void SQL46026Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46027Test() { string testNumber = "SQL46027"; @@ -2391,8 +2391,8 @@ public void SQL46027Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46028Test() { string testNumber = "SQL46028"; @@ -2418,8 +2418,8 @@ select a.b.c.d.e.* [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46029Test() { string testNumber = "SQL46029"; @@ -2430,8 +2430,8 @@ public void SQL46029Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46049Test() { //Function Execute AS @@ -2457,9 +2457,9 @@ FROM SERVICE [//Adventure-Works.com/ExpenseClient] TO SERVICE '//Adventure-Works.com/Expenses' ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] WITH LIFETIME=60, ENCRYPTION=ON"; - ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", LIFETIME=10;", new ParserErrorInfo(beginDialogConversation.Length+2, "SQL46049", "LIFETIME")); - ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", RELATED_CONVERSATION_GROUP = @existing_conversation_handle, RELATED_CONVERSATION = @existing_conversation_handle ;", new ParserErrorInfo(beginDialogConversation.Length+62, "SQL46049", "RELATED_CONVERSATION")); - ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", ENCRYPTION=OFF;", new ParserErrorInfo(beginDialogConversation.Length+2, "SQL46049", "ENCRYPTION")); + ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", LIFETIME=10;", new ParserErrorInfo(beginDialogConversation.Length + 2, "SQL46049", "LIFETIME")); + ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", RELATED_CONVERSATION_GROUP = @existing_conversation_handle, RELATED_CONVERSATION = @existing_conversation_handle ;", new ParserErrorInfo(beginDialogConversation.Length + 62, "SQL46049", "RELATED_CONVERSATION")); + ParserTestUtils.ErrorTest90AndAbove(beginDialogConversation + ", ENCRYPTION=OFF;", new ParserErrorInfo(beginDialogConversation.Length + 2, "SQL46049", "ENCRYPTION")); //Create Database // @@ -2494,13 +2494,13 @@ ADD FILE SIZE = 10MB, FILEGROWTH = 5MB );"; - ParserTestUtils.ErrorTestAllParsers(alterDatabase, new ParserErrorInfo(alterDatabase.IndexOf("SIZE",205), "SQL46049", "SIZE")); + ParserTestUtils.ErrorTestAllParsers(alterDatabase, new ParserErrorInfo(alterDatabase.IndexOf("SIZE", 205), "SQL46049", "SIZE")); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46035Test() { ParserTestUtils.ErrorTestAllParsers("select * from { oj t1 cross join t2 }", @@ -2509,8 +2509,8 @@ public void SQL46035Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46036Test() { ParserTestUtils.ErrorTestAllParsers(@"select * from --(* vendor(microsoft),product(odbc) oj t1 cross join t2 *)--", @@ -2519,8 +2519,8 @@ public void SQL46036Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46038Test() { ParserTestUtils.ErrorTestAllParsers("drop statistics s1", @@ -2529,8 +2529,8 @@ public void SQL46038Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46039Test() { ParserTestUtils.ErrorTestAllParsers("create function f1(@p int output) returns int as begin return 1; end", @@ -2539,8 +2539,8 @@ public void SQL46039Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46040Test() { TSql100Parser parser = new TSql100Parser(true); @@ -2551,8 +2551,8 @@ public void SQL46040Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46041Test() { TSql100Parser parser = new TSql100Parser(true); @@ -2566,8 +2566,8 @@ public void SQL46041Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46042Test() { ParserTestUtils.ErrorTestAllParsers( @@ -2577,8 +2577,8 @@ public void SQL46042Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46043Test() { ParserTestUtils.ErrorTestAllParsers( @@ -2588,8 +2588,8 @@ public void SQL46043Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46047Test() { ParserTestUtils.ErrorTestAllParsers( @@ -2599,8 +2599,8 @@ public void SQL46047Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46048Test() { ParserTestUtils.ErrorTestAllParsers( @@ -2610,8 +2610,8 @@ public void SQL46048Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46050Test() { ParserTestUtils.ErrorTest100( @@ -2624,8 +2624,8 @@ public void SQL46050Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46058Test() { TSql100Parser parser100 = new TSql100Parser(true); @@ -2638,8 +2638,8 @@ public void SQL46058Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46059Test() { ParserTestUtils.ErrorTest100("CREATE INDEX i1 ON t1(c1) WHERE c1 < CONVERT(int, CONVERT(int, 20))", @@ -2650,8 +2650,8 @@ public void SQL46059Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46060Test() { ParserTestUtils.ErrorTestAllParsers("CREATE TABLE t1(c1 INT PRIMARY KEY WITH FILLFACTOR = 105)", @@ -2662,8 +2662,8 @@ public void SQL46060Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46061Test() { TSql100Parser parser100 = new TSql100Parser(true); @@ -2703,8 +2703,8 @@ public void SQL46061Test_160() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46062Test() { ParserTestUtils.ErrorTestAllParsers("CREATE DATABASE db1 ON (NAME=n1, NEWNAME=n2, FILENAME='zzz')", @@ -2786,8 +2786,8 @@ public void IndexFilterErrorTests() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void IntoClauseErrorTests() { ParserTestUtils.ErrorTestAllParsers("insert t1 select c1 into t2", @@ -2808,8 +2808,8 @@ public void OnClauseErrorTests() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void UnclosedTokenTest() { ParserTestUtils.ErrorTestAllParsers("create table t1(c1 int) 'zz", @@ -2828,8 +2828,8 @@ public void UnclosedTokenTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void TokenStreamRecognitionExceptionTest() { ParserTestUtils.ErrorTestAllParsers( @@ -2839,8 +2839,8 @@ public void TokenStreamRecognitionExceptionTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void IPAddressErrorTest() { // T-SQL 80 doesn't have IPs! @@ -2861,8 +2861,8 @@ public void IPAddressErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void EmptyParserInputTest() { ParserTestUtils.ErrorTestAllParsers(string.Empty); @@ -2870,8 +2870,8 @@ public void EmptyParserInputTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void QuotedIdentifierErrorTest() { // Check, that tokens like "aaa" are treated as ascii literals if quoted identifiers are off @@ -2884,13 +2884,13 @@ public void QuotedIdentifierErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void QuotedIdentfierPerBatchResetTest() { string SwitchingOffScript = "CREATE TABLE \"t1\"(c1 int);\n\r GO SET QUOTED_IDENTIFIER OFF; CREATE TABLE \"t2\"(c1 int);"; - ParserTestUtils.ExecuteTestForAllParsers(delegate(TSqlParser parser) + ParserTestUtils.ExecuteTestForAllParsers(delegate (TSqlParser parser) { ParserTestUtils.ErrorTest(parser, SwitchingOffScript, new ParserErrorInfo(72, "SQL46010", "\"t2\"")); @@ -2899,7 +2899,7 @@ public void QuotedIdentfierPerBatchResetTest() string SwitchingOnScript = "SET QUOTED_IDENTIFIER ON; CREATE TABLE \"t1\"(c1 int);\n\r GO CREATE TABLE \"t2\"(c1 int)"; - ParserTestUtils.ExecuteTestForAllParsers(delegate(TSqlParser parser) + ParserTestUtils.ExecuteTestForAllParsers(delegate (TSqlParser parser) { ParserTestUtils.ErrorTest(parser, SwitchingOnScript, new ParserErrorInfo(71, "SQL46010", "\"t2\"")); @@ -2908,8 +2908,8 @@ public void QuotedIdentfierPerBatchResetTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ProcNameSemiColonErrorTest() { ParserTestUtils.ErrorTestAllParsers( @@ -2920,8 +2920,8 @@ public void ProcNameSemiColonErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void RequiredSemiColonTest() { ParserTestUtils.ErrorTest100AndAbove( @@ -2952,17 +2952,17 @@ WHEN MATCHED @"ALTER SEARCH PROPERTY LIST foo DROP 'bax'", new ParserErrorInfo(27, "SQL46097", "Search Property List")); - ParserTestUtils.ErrorTest110( + ParserTestUtils.ErrorTest110( @"drop search property list list1", - new ParserErrorInfo(26, "SQL46097", "Search Property List")); + new ParserErrorInfo(26, "SQL46097", "Search Property List")); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateEventNotificationStatementErrorTest() { // T-SQL 80 doesn't have CREATE EVENT NOTIFICATION statement @@ -2983,8 +2983,8 @@ public void CreateEventNotificationStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateLogonTriggerStatementErrorTest() { ParserTestUtils.ErrorTest90AndAbove("create trigger trig1 on database for logon as Create Table t1 (int i1);", @@ -2993,8 +2993,8 @@ public void CreateLogonTriggerStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateTriggerStatementWithUnkownEventsErrorTest() { ParserTestUtils.ErrorTest90AndAbove("create trigger trig1 on database for blah_blah as Create Table t1 (int i1);", @@ -3003,8 +3003,8 @@ public void CreateTriggerStatementWithUnkownEventsErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateResourcePoolStatementErrorTest() { ParserTestUtils.ErrorTest100("create resource pool res_pool with (MIN_CPU_PERCENT = 105);", @@ -3044,7 +3044,7 @@ public void CreateResourcePoolStatementErrorTest() [TestMethod] - [Priority(0)] + [Priority(0)] public void CreateExternalResourcePoolStatementErrorTest() { ParserTestUtils.ErrorTest130("create external resource pool res_pool with (MAX_MEMORY_PERCENT = 0);", @@ -3113,8 +3113,8 @@ public void CreateExternalResourcePoolStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterExternalResourcePoolStatementErrorTest() { ParserTestUtils.ErrorTest130("alter external resource pool res_pool with (MAX_MEMORY_PERCENT = 0);", @@ -3183,8 +3183,8 @@ public void AlterExternalResourcePoolStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateWorkloadGroupStatementErrorTest() { ParserTestUtils.ErrorTest100("create workload group wg1 with (IMPORTANC = HIGH);", @@ -3256,7 +3256,7 @@ public void CreateWorkloadClassifierStatementErrorTest() IMPORTANCE = HIGH )"; ParserTestUtils.ErrorTest130(query1, - new ParserErrorInfo(query1.IndexOf("START_TIME")+13, "SQL46134", "START_TIME")); + new ParserErrorInfo(query1.IndexOf("START_TIME") + 13, "SQL46134", "START_TIME")); string query2 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( @@ -3269,7 +3269,7 @@ public void CreateWorkloadClassifierStatementErrorTest() IMPORTANCE = HIGH )"; ParserTestUtils.ErrorTest130(query2, - new ParserErrorInfo(query2.IndexOf("END_TIME")+11, "SQL46134", "END_TIME")); + new ParserErrorInfo(query2.IndexOf("END_TIME") + 11, "SQL46134", "END_TIME")); string query3 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( @@ -3298,7 +3298,7 @@ public void CreateWorkloadClassifierStatementErrorTest() )"; ParserTestUtils.ErrorTest130(query4, new ParserErrorInfo(query4.IndexOf("MEMBERNAME", 300), "SQL46049", "MEMBERNAME")); - + string query5 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( WORKLOAD_GROUP = 'wgDefaultParams', @@ -3311,8 +3311,8 @@ public void CreateWorkloadClassifierStatementErrorTest() IMPORTANCE = HIGH )"; ParserTestUtils.ErrorTest130(query5, - new ParserErrorInfo(query5.IndexOf("WLM_CONTEXT",400), "SQL46049", "WLM_CONTEXT")); - + new ParserErrorInfo(query5.IndexOf("WLM_CONTEXT", 400), "SQL46049", "WLM_CONTEXT")); + string query6 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( WORKLOAD_GROUP = 'wgDefaultParams', @@ -3326,7 +3326,7 @@ public void CreateWorkloadClassifierStatementErrorTest() )"; ParserTestUtils.ErrorTest130(query6, new ParserErrorInfo(query6.IndexOf("WLM_LABEL", 500), "SQL46049", "WLM_LABEL")); - + string query7 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( WORKLOAD_GROUP = 'wgDefaultParams', @@ -3340,7 +3340,7 @@ public void CreateWorkloadClassifierStatementErrorTest() )"; ParserTestUtils.ErrorTest130(query7, new ParserErrorInfo(query7.IndexOf("IMPORTANCE", 550), "SQL46049", "IMPORTANCE")); - + string query8 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( WORKLOAD_GROUP = 'wgDefaultParams', @@ -3354,7 +3354,7 @@ public void CreateWorkloadClassifierStatementErrorTest() )"; ParserTestUtils.ErrorTest130(query8, new ParserErrorInfo(query8.IndexOf("START_TIME", 430), "SQL46049", "START_TIME")); - + string query9 = @"CREATE WORKLOAD CLASSIFIER wcAllOptions WITH( WORKLOAD_GROUP = 'wgDefaultParams', @@ -3386,8 +3386,8 @@ public void PredictErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateBrokerPriorityStatementErrorTest() { ParserTestUtils.ErrorTest100("create broker priority bp1 for conversatio;", @@ -3412,8 +3412,8 @@ public void CreateBrokerPriorityStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterTableAlterIndexElementStatementErrorTest() { ParserTestUtils.ErrorTest130("ALTER TABLE t1 ALTER INDEX i1 REBUILD WITH (BUCKET_COUNT = 1, BUCKET_COUNT = 1);", @@ -3424,8 +3424,8 @@ public void AlterTableAlterIndexElementStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterTableChangeTrackingDisableWithOptionsErrorTest() { ParserTestUtils.ErrorTest100("ALTER TABLE t1 DISABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON)", @@ -3434,8 +3434,8 @@ public void AlterTableChangeTrackingDisableWithOptionsErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void MultipleForClauseTest() { ParserTestUtils.ErrorTest100("select 1 for browse for xml", @@ -3459,8 +3459,8 @@ public void MultipleForClauseTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ColumnDefinitionStorageAttributesErrorTest() { TSql100Parser parser = new TSql100Parser(true); @@ -3503,8 +3503,8 @@ public void ColumnDefinitionStorageAttributesErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void NotForReplicationNotAllowedInTableVariablesFunctionsTypesErrorTest() { // Column check constraint @@ -3534,8 +3534,8 @@ public void NotForReplicationNotAllowedInTableVariablesFunctionsTypesErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void NoConstraintNamesInTableVariablesFunctionsTypesErrorTest() { // Named column constraints @@ -3559,8 +3559,8 @@ public void NoConstraintNamesInTableVariablesFunctionsTypesErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void ServerAuditStatementsErrorTest() { TSql100Parser parser100 = new TSql100Parser(true); @@ -3591,8 +3591,8 @@ public void ServerAuditStatementsErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SecurityStatementsErrorTest() { //Columns cannot be specified on both the permission and the object in grant/deny/revoke @@ -3607,8 +3607,8 @@ public void SecurityStatementsErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void EventSessionStatementErrorTest() { TSql100Parser parser = new TSql100Parser(true); @@ -3649,8 +3649,8 @@ public void EventSessionStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void When_session_scope_is_other_than_database_or_server_CREATE_EVENT_SESSION_fails_for_130() { var tSql130Parser = new TSql130Parser(true); @@ -3670,8 +3670,8 @@ public void When_session_scope_is_other_than_database_or_server_CREATE_EVENT_SES // Test the key option duplication is not allowed [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void KeyOptionDuplicationErrorTest() { ParserTestUtils.ErrorTest90AndAbove( @@ -3697,8 +3697,8 @@ public void KeyOptionDuplicationErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46069Test() { ParserTestUtils.ErrorTest90AndAbove("create queue q1 with status = on, Activation(status = on, procedure_name = dbo..p1, execute as self), retention = off;", @@ -3713,8 +3713,8 @@ public void SQL46069Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void MaxParameterInDataTypesErrorTest() { ParserTestUtils.ErrorTest90AndAbove("CREATE TABLE t1(c1 CHAR(max))", @@ -3727,8 +3727,8 @@ public void MaxParameterInDataTypesErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateSpatialIndexStatementErrorTest() { TSql100Parser parser = new TSql100Parser(true); @@ -3809,8 +3809,8 @@ public void SequenceStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void OffsetErrorTest() { //Offset no order by @@ -3820,8 +3820,8 @@ public void OffsetErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CommitTransactionErrorTest() { ParserTestUtils.ErrorTest120("COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ONN)", new ParserErrorInfo(46, "SQL46010", "ONN")); @@ -3834,8 +3834,8 @@ public void CommitTransactionErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterDatabaseErrorTest() { ParserTestUtils.ErrorTest120("ALTER DATABASE testdb SET DELAYED_DURABILITY = ALLOWEDD)", new ParserErrorInfo(47, "SQL46010", "ALLOWEDD")); @@ -3903,8 +3903,8 @@ public void CtasStatementErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterDatabaseModifyFilegroupErrorTest() { ParserTestUtils.ErrorTest130("ALTER DATABASE testdb MODIFY FILEGROUP [PRIMARY] READ ONLY)", new ParserErrorInfo(49, "SQL46010", "READ")); @@ -3915,8 +3915,8 @@ public void AlterDatabaseModifyFilegroupErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void IncrementalStatisticsErrorTest() { ParserTestUtils.ErrorTest120("ALTER DATABASE testdb SET AUTO_CREATE_STATISTICS ON (INCREMENTAL)", new ParserErrorInfo(64, "SQL46010", ")")); @@ -3937,8 +3937,8 @@ public void IncrementalStatisticsErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void Dev10Bug462552() { ParserTestUtils.ErrorTestAllParsers("CREATE PROCEDURE Proc1 @CurrencyCursor CURSOR AS SET @CurrencyCursor = CURSOR FORWARD_ONLY STATIC FOR SELECT column_1 FROM Table1;", @@ -3954,8 +3954,8 @@ public void Dev10Bug462552() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46070Test() { // Tests for checking that duplication of options in DROP INDEX STATEMENT is not allowed @@ -3976,8 +3976,8 @@ public void SQL46070Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46071Test() { ParserTestUtils.ErrorTestAllParsers("CREATE STATISTICS [stat] ON t1 (c1, c2) WITH FULLSCAN, NORECOMPUTE, SAMPLE 12 ROWS;", @@ -3990,8 +3990,8 @@ public void SQL46071Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46072Test() { ParserTestUtils.ErrorTest100("WITH change_tracking_context (0xff),DIRREPS(C1,c2) as (SELECT c1 FROM t1) select c1 from t1", @@ -4002,8 +4002,8 @@ public void SQL46072Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46074Test() { ParserTestUtils.ErrorTestAllParsers("INSERT INTO pi WITH (INDEX (i1)) DEFAULT VALUES", @@ -4031,8 +4031,8 @@ OUTPUT c1" /// Currently, only INSERT allows sub-DMLs /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46075Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4059,8 +4059,8 @@ public void SQL46075Test() /// Checks, that sub-DML are not allowed in SELECT which is not source for insert /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46076Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4093,8 +4093,8 @@ public void SQL46076Test() /// Checks, that sub-DMLs are not allowed in UPDATE or DELETE FROM clauses /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46077Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4119,8 +4119,8 @@ public void SQL46077Test() /// Checks, that sub-DMLs are not allowed in USING clause of MERGE statement /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46078Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4141,8 +4141,8 @@ public void SQL46078Test() /// Checks, that sub-DMLs have OUTPUT clause /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46079Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4170,8 +4170,8 @@ public void SQL46079Test() /// Checks, that WHERE CURRENT OF is not allowed in sub-dmls /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46083Test() { TSql100Parser parser = new TSql100Parser(true); @@ -4190,8 +4190,8 @@ public void SQL46083Test() /// Checks that OPENROWSETBULK has at SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB or FORMATFILE option /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46082Test() { ParserTestUtils.ErrorTest90andAboveUntil150( @@ -4203,8 +4203,8 @@ public void SQL46082Test() /// Checks that CUBE, ROLLUP and GROUPING SETS are not allowed in GROUP BY ALL clause /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46084Test() { ParserTestUtils.ErrorTestAllParsers("SELECT c1 FROM t1 GROUP BY ALL c1 WITH CUBE", @@ -4225,8 +4225,8 @@ public void SQL46084Test() /// Checks that WITH CUBE and WITH ROLLUP are not allowed when CUBE, ROLLUP or GROUPING SETS specified /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46085Test() { TSql100Parser parser100 = new TSql100Parser(true); @@ -4272,8 +4272,8 @@ public void GroupByDistributedAggErrorTest() /// Checks that DISTINCT is not allowed in aggregate calls with OVER clause /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46086Test() { // User-defined aggregate @@ -4293,8 +4293,8 @@ public void SQL46086Test() /// Check that OUTPUT only allowed when passing variable to procedure /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46088Test() { ParserTestUtils.ErrorTestAllParsers("EXEC zzz 1 OUTPUT", @@ -4307,8 +4307,8 @@ public void SQL46088Test() /// Check that simple parameters ('value') are not allowed in procedure call after '@name = value' syntax /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46089Test() { ParserTestUtils.ErrorTestAllParsers("EXEC zzz 1, N'q', @v1 = 2, @v2 = 'a'"); @@ -4321,8 +4321,8 @@ public void SQL46089Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateServerAuditStatementErrorTest() { // CHECKS IF THE VALUE OF MAX_ROLLOVER_FILES IS LESS THAN 2147483647 @@ -4332,8 +4332,8 @@ public void CreateServerAuditStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateEndpointStatementErrorTest() { // CHECKS IF THE VALUE FOR THE OPTIONS AUTH_REALM AND DEFAULT_LOGON_DOMAIN ARE NON-EMPTY STRINGS @@ -4358,8 +4358,8 @@ public void CreateEndpointStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateIndexStatementErrorTest() { ParserTestUtils.ErrorTest100("CREATE INDEX ind1 ON t1(c1) WHERE (...f1.IDENTITYCOL IS NULL)", @@ -4380,8 +4380,8 @@ public void CreateIndexStatementErrorTest() /// Check that the value of MAXDOP index option is within range /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46091Test() { ParserTestUtils.ErrorTest90AndAbove("CREATE INDEX ind1 ON dbo.t1 (c1) WITH (MAXDOP = 40000)", @@ -4390,8 +4390,8 @@ public void SQL46091Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void RouteOptionDuplicationErrorTest() { string duplicateServiceNameSyntax = @"CREATE ROUTE [Route1] WITH @@ -4399,7 +4399,7 @@ public void RouteOptionDuplicationErrorTest() SERVICE_NAME = '//Adventure-Works.com/Expenses'"; ParserTestUtils.ErrorTest90AndAbove( duplicateServiceNameSyntax, - new ParserErrorInfo(duplicateServiceNameSyntax.IndexOf(@"SERVICE_NAME",75), "SQL46049", "SERVICE_NAME")); + new ParserErrorInfo(duplicateServiceNameSyntax.IndexOf(@"SERVICE_NAME", 75), "SQL46049", "SERVICE_NAME")); ParserTestUtils.ErrorTest90AndAbove( @"CREATE ROUTE [Route1] WITH LIFETIME = 10, LIFETIME = 10", @@ -4408,8 +4408,8 @@ public void RouteOptionDuplicationErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46092Test() { ParserTestUtils.ErrorTestAllParsers("CREATE VIEW #v_temp AS SELECT * FROM sysobjects", @@ -4421,8 +4421,8 @@ public void SQL46092Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46093Test() { ParserTestUtils.ErrorTestAllParsers("CREATE FUNCTION #fun_test (@param1 int) RETURNS TABLE AS RETURN (SELECT @param1 AS c1)", @@ -4436,8 +4436,8 @@ public void SQL46093Test() /// Check that the PERCENT value is between 0 and 100 /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46094Test() { TSql80Parser parser80 = new TSql80Parser(true); @@ -4461,8 +4461,8 @@ public void SQL46094Test() /// Check that the identifiers are less than 128 characters /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46095Test() { string longIdentifier = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; @@ -4480,8 +4480,8 @@ public void SQL46095Test() /// Check contained options are not specified on non-contained users /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46096Test() { ParserTestUtils.ErrorTest110("CREATE USER [BadUser] for login [login1] WITH password = 'PLACEHOLDER1'", @@ -4494,8 +4494,8 @@ public void SQL46096Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void TableHintAsParamTest() { // This should be ok @@ -4512,8 +4512,8 @@ public void TableHintAsParamTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateMessageTypeStatementErrorTest() { // CREATE MESSAGE TYPE m1 VALIDATION = VALID_XML @@ -4530,8 +4530,8 @@ public void CreateMessageTypeStatementErrorTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46098Test() { // Missing FILENAME option should cause an error... @@ -4574,8 +4574,8 @@ public void SQL46098Test() /// Check that frame bounds that are not supported by RANGE are not allowed /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46099Test() { ParserTestUtils.ErrorTest110("SELECT SUM(a) OVER (ORDER BY shuffled_id RANGE BETWEEN 1 FOLLOWING AND 1 PRECEDING) FROM table", @@ -4586,8 +4586,8 @@ public void SQL46099Test() /// Check that invalid frame specification inside Over clause is caught. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46100Test() { ParserTestUtils.ErrorTest110("SELECT id, AVG(f) OVER ( ORDER BY shuffled_id ROWS BETWEEN 1 FOLLOWING AND 1 PRECEDING) FROM table", @@ -4610,8 +4610,8 @@ public void SQL46100Test() /// Check the max_duration value of low priority lock wait option. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46101Test() { ParserTestUtils.ErrorTest120("ALTER INDEX idx1 ON t1 REBUILD WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 71583, ABORT_AFTER_WAIT = NONE)))", @@ -4626,8 +4626,8 @@ public void SQL46101Test() /// Check the max_duration value of low priority lock wait option. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SQL46102Test() { ParserTestUtils.ErrorTest120("ALTER INDEX idx1 ON t1 REBUILD WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0, ABORT_AFTER_WAIT = SELF)))", @@ -4640,8 +4640,8 @@ public void SQL46102Test() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void SecurityPolicyStatementErrorsTest() { // Three part names @@ -4770,8 +4770,8 @@ public void SecurityPolicyStatementErrorsTest() /// Negative tests for a table with REMOTE_DATA_ARCHIVE /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void RemoteDataArchiveTableNegativeTest() { // Create table with RDA @@ -4805,43 +4805,43 @@ public void RemoteDataArchiveTableNegativeTest() ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = ON (MIGRATION_STATE = ON))", new ParserErrorInfo(64, "SQL46010", "ON")); ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = ON (MIGRATION_STATE = DISABLE))", new ParserErrorInfo(64, "SQL46010", "DISABLE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(89, "SQL46010", "PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE ON, FILTER_PREDICATE = database.dbo.f1(c1)))", new ParserErrorInfo(70, "SQL46010", "ON")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE dbo.f1(c1)))", new ParserErrorInfo(99, "SQL46010", "dbo")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIIGRATION_STATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = NUL))", new ParserErrorInfo(82, "SQL46005", "MIGRATION_STATE", "FILTER_PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FIILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(82, "SQL46005", "FILTER_PREDICATE", "FIILTER_PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATIONSTATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIGRATIONSTATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTERPREDICATE = dbo.f1(c1)))", new ParserErrorInfo(82, "SQL46005", "FILTER_PREDICATE", "FILTERPREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_SSTATE = OUTBOUND, FILTERR_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIGRATION_SSTATE")); - - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = MigrationOutbound))", new ParserErrorInfo(65, "SQL46010", "MigrationOutbound")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = MigrationState))", new ParserErrorInfo(65, "SQL46010", "MigrationState")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OTBOUND))", new ParserErrorInfo(65, "SQL46010", "OTBOUND")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUT]BOUND))", new ParserErrorInfo(68, "SQL46010", "]")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = ))", new ParserErrorInfo(65, "SQL46010", ")")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OFF))", new ParserErrorInfo(65, "SQL46010", "OFF")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = ON))", new ParserErrorInfo(65, "SQL46010", "ON")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = DISABLE))", new ParserErrorInfo(65, "SQL46010", "DISABLE")); - - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(111, "SQL46010", "PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE ON, FILTER_PREDICATE = database.dbo.f1(c1)))", new ParserErrorInfo(92, "SQL46010", "ON")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE dbo.f1(c1)))", new ParserErrorInfo(121, "SQL46010", "dbo")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIIGRATION_STATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = NUL))", new ParserErrorInfo(104, "SQL46005", "MIGRATION_STATE", "FILTER_PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FIILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(104, "SQL46005", "FILTER_PREDICATE", "FIILTER_PREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATIONSTATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIGRATIONSTATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTERPREDICATE = dbo.f1(c1)))", new ParserErrorInfo(104, "SQL46005", "FILTER_PREDICATE", "FILTERPREDICATE")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_SSTATE = OUTBOUND, FILTERR_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIGRATION_SSTATE")); - - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = MigrationOutbound))", new ParserErrorInfo(87, "SQL46010", "MigrationOutbound")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = MigrationState))", new ParserErrorInfo(87, "SQL46010", "MigrationState")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OTBOUND))", new ParserErrorInfo(87, "SQL46010", "OTBOUND")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUT]BOUND))", new ParserErrorInfo(90, "SQL46010", "]")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = ))", new ParserErrorInfo(87, "SQL46010", ")")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OFF))", new ParserErrorInfo(87, "SQL46010", "OFF")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = ON))", new ParserErrorInfo(87, "SQL46010", "ON")); - ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = DISABLE))", new ParserErrorInfo(87, "SQL46010", "DISABLE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(89, "SQL46010", "PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE ON, FILTER_PREDICATE = database.dbo.f1(c1)))", new ParserErrorInfo(70, "SQL46010", "ON")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE dbo.f1(c1)))", new ParserErrorInfo(99, "SQL46010", "dbo")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIIGRATION_STATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = NUL))", new ParserErrorInfo(82, "SQL46005", "MIGRATION_STATE", "FILTER_PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FIILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(82, "SQL46005", "FILTER_PREDICATE", "FIILTER_PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATIONSTATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIGRATIONSTATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUTBOUND, FILTERPREDICATE = dbo.f1(c1)))", new ParserErrorInfo(82, "SQL46005", "FILTER_PREDICATE", "FILTERPREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_SSTATE = OUTBOUND, FILTERR_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(54, "SQL46005", "MIGRATION_STATE", "MIGRATION_SSTATE")); + + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = MigrationOutbound))", new ParserErrorInfo(65, "SQL46010", "MigrationOutbound")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = MigrationState))", new ParserErrorInfo(65, "SQL46010", "MigrationState")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OTBOUND))", new ParserErrorInfo(65, "SQL46010", "OTBOUND")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OUT]BOUND))", new ParserErrorInfo(68, "SQL46010", "]")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = ))", new ParserErrorInfo(65, "SQL46010", ")")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = OFF))", new ParserErrorInfo(65, "SQL46010", "OFF")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = ON))", new ParserErrorInfo(65, "SQL46010", "ON")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF (MIGRATION_STATE = DISABLE))", new ParserErrorInfo(65, "SQL46010", "DISABLE")); + + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(111, "SQL46010", "PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE ON, FILTER_PREDICATE = database.dbo.f1(c1)))", new ParserErrorInfo(92, "SQL46010", "ON")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE dbo.f1(c1)))", new ParserErrorInfo(121, "SQL46010", "dbo")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIIGRATION_STATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTER_PREDICATE = NUL))", new ParserErrorInfo(104, "SQL46005", "MIGRATION_STATE", "FILTER_PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FIILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(104, "SQL46005", "FILTER_PREDICATE", "FIILTER_PREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATIONSTATE = OUTBOUND, FILTER_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIGRATIONSTATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUTBOUND, FILTERPREDICATE = dbo.f1(c1)))", new ParserErrorInfo(104, "SQL46005", "FILTER_PREDICATE", "FILTERPREDICATE")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_SSTATE = OUTBOUND, FILTERR_PREDICATE = dbo.f1(c1)))", new ParserErrorInfo(76, "SQL46005", "MIGRATION_STATE", "MIGRATION_SSTATE")); + + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = MigrationOutbound))", new ParserErrorInfo(87, "SQL46010", "MigrationOutbound")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = MigrationState))", new ParserErrorInfo(87, "SQL46010", "MigrationState")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OTBOUND))", new ParserErrorInfo(87, "SQL46010", "OTBOUND")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OUT]BOUND))", new ParserErrorInfo(90, "SQL46010", "]")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = ))", new ParserErrorInfo(87, "SQL46010", ")")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = OFF))", new ParserErrorInfo(87, "SQL46010", "OFF")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = ON))", new ParserErrorInfo(87, "SQL46010", "ON")); + ParserTestUtils.ErrorTest130("ALTER TABLE T1 SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY (MIGRATION_STATE = DISABLE))", new ParserErrorInfo(87, "SQL46010", "DISABLE")); // Alter table with invalid/ mis-spelled RDA // @@ -4865,15 +4865,15 @@ public void RemoteDataArchiveTableNegativeTest() // Alter table remote_data_archive with mis-spelled option // ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OF (MIGRATION_STATE = PAUSED)", new ParserErrorInfo(49, "SQL46010", "OF")); - ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVER (MIGRATION_STATE = PAUSED)", new ParserErrorInfo(49, "SQL46005", "OFF_WITHOUT_DATA_RECOVERY", "OFF_WITHOUT_DATA_RECOVER")); + ParserTestUtils.ErrorTest130("alter table t_stretch SET (REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVER (MIGRATION_STATE = PAUSED)", new ParserErrorInfo(49, "SQL46005", "OFF_WITHOUT_DATA_RECOVERY", "OFF_WITHOUT_DATA_RECOVER")); } /// /// Negative tests for a database with REMOTE_DATA_ARCHIVE /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void RemoteDataArchiveDatabaseNegativeTest() { ParserTestUtils.ErrorTest130("ALTER database db_test WITH SET REMOTE_DATA_ARCHIVE= OFF (SERVER = N'Test')", new ParserErrorInfo(15, "SQL46010", "db_test")); @@ -4901,8 +4901,8 @@ public void RemoteDataArchiveDatabaseNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateColumnStoreIndexNegativeTest() { // cannot create clustered index with filter predicate @@ -4936,8 +4936,8 @@ public void CreateColumnStoreIndexNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateExternalDataSourceNegativeTest() { // Create external data source keyword typos @@ -4977,10 +4977,10 @@ public void CreateExternalDataSourceNegativeTest() ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = SHARD_MAP_MANAGER, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHRD_MAP_NAME = 'someShardMap')", new ParserErrorInfo(122, "SQL46010", "SHRD_MAP_NAME")); ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = SHARD_MAP_MANAGER, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME 'someShardMap')", new ParserErrorInfo(122, "SQL46010", "SHARD_MAP_NAME")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer' DATABASE_NAME = 'someDatabase')", new ParserErrorInfo(77, "SQL46010", "DATABASE_NAME")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAMES = 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAMES")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABSE_NAME = 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABSE_NAME")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAME")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer' DATABASE_NAME = 'someDatabase')", new ParserErrorInfo(77, "SQL46010", "DATABASE_NAME")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAMES = 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAMES")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABSE_NAME = 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABSE_NAME")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME 'someDatabase')", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAME")); // Missing required properties // @@ -4992,8 +4992,8 @@ public void CreateExternalDataSourceNegativeTest() ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = HADOP, LOCATION = 'protocol://ip_address:port', RESOURCE_MANAGER_LOCATION = 'ip_address:port', CREDENTIAL = cred1)", new ParserErrorInfo(46, "SQL46010", "HADOP")); ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = SHARD_MAP_MANGER, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = 'someDatabase')", new ParserErrorInfo(46, "SQL46010", "SHARD_MAP_MANGER")); ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = 'SHARD_MAP_MANAGER', LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = 'someShardMap', CREDENTIAL = someCred)", new ParserErrorInfo(46, "SQL46010", "'SHARD_MAP_MANAGER'")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDMBS, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase')", new ParserErrorInfo(46, "SQL46010", "RDMBS")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = 'RDBMS', LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', CREDENTIAL = someCred)", new ParserErrorInfo(46, "SQL46010", "'RDBMS'")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDMBS, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase')", new ParserErrorInfo(46, "SQL46010", "RDMBS")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = 'RDBMS', LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', CREDENTIAL = someCred)", new ParserErrorInfo(46, "SQL46010", "'RDBMS'")); // Create external data source with incorrect data source location value // @@ -5010,17 +5010,17 @@ public void CreateExternalDataSourceNegativeTest() ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = SHARD_MAP_MANAGER, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = someShardMap, CREDENTIAL = someCred)", new ParserErrorInfo(122, "SQL46010", "SHARD_MAP_NAME")); ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = SHARD_MAP_MANAGER, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = 'someShardMap', CREDENTIAL = 'someCred')", new ParserErrorInfo(155, "SQL46010", "CREDENTIAL")); - // Create external rdbms data source with various incorrect values - // - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = someServer, DATABASE_NAME = 'someDatabase', CREDENTIAL = someCred)", new ParserErrorInfo(64, "SQL46010", "someServer")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = someDatabase, CREDENTIAL = someCred)", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAME")); - ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', CREDENTIAL = 'someCred')", new ParserErrorInfo(110, "SQL46010", "CREDENTIAL")); + // Create external rdbms data source with various incorrect values + // + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = someServer, DATABASE_NAME = 'someDatabase', CREDENTIAL = someCred)", new ParserErrorInfo(64, "SQL46010", "someServer")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = someDatabase, CREDENTIAL = someCred)", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAME")); + ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', CREDENTIAL = 'someCred')", new ParserErrorInfo(110, "SQL46010", "CREDENTIAL")); } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterExternalDataSourceNegativeTest() { // Alter external data source keyword typos @@ -5078,8 +5078,8 @@ public void AlterExternalDataSourceNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DropExternalDataSourceNegativeTest() { // Drop external data source keyword typos @@ -5097,8 +5097,8 @@ public void DropExternalDataSourceNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateExternalFileFormatNegativeTest() { // Create external file format keyword typos @@ -5218,8 +5218,8 @@ public void CreateExternalFileFormatNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DropExternalFileFormatNegativeTest() { // Drop external file format keyword typos @@ -5237,8 +5237,8 @@ public void DropExternalFileFormatNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateExternalTableNegativeTest() { // Create external table keyword typos @@ -5375,8 +5375,8 @@ public void CreateExternalTableCtasStatementErrorTest() } [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DropExternalTableNegativeTest() { // Drop external table keyword typos @@ -5392,8 +5392,8 @@ public void DropExternalTableNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateUserFromExternalProviderNegativeTest() { // Drop external data source keyword typos @@ -5410,8 +5410,8 @@ public void CreateUserFromExternalProviderNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterTableAlterColumnOnlineTestsNegativeTest() { ParserTestUtils.ErrorTest130("ALTER TABLE t1 ALTER COLUMN c1 VARCHAR (20) WITH (ONLINE2 = ON);", @@ -5434,8 +5434,8 @@ public void AlterTableAlterColumnOnlineTestsNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest, Feature.AlwaysEncrypted)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest, Feature.AlwaysEncrypted)] public void AlwaysEncryptedNegativeTest() { @@ -5483,7 +5483,7 @@ DROP VALUE ALGORITHM = 'RSA_OAEP', ENCRYPTED_VALUE = 0x016E000001630075007200720065006E00740075007300650072002F006D0079002F0064006500650063006200660034006100340031003000380034006200350033003200360066003200630062006200350030003600380065003900620061003000320030003600610037003800310066001DDA6134C3B73A90D349C8905782DD819B428162CF5B051639BA46EC69A7C8C8F81591A92C395711493B25DCBCCC57836E5B9F17A0713E840721D098F3F8E023ABCDFE2F6D8CC4339FC8F88630ED9EBADA5CA8EEAFA84164C1095B12AE161EABC1DF778C07F07D413AF1ED900F578FC00894BEE705EAC60F4A5090BBE09885D2EFE1C915F7B4C581D9CE3FDAB78ACF4829F85752E9FC985DEB8773889EE4A1945BD554724803A6F5DC0A2CD5EFE001ABED8D61E8449E4FAA9E4DD392DA8D292ECC6EB149E843E395CDE0F98D04940A28C4B05F747149B34A0BAEC04FFF3E304C84AF1FF81225E615B5F94E334378A0A888EF88F4E79F66CB377E3C21964AACB5049C08435FE84EEEF39D20A665C17E04898914A85B3DE23D56575EBC682D154F4F15C37723E04974DB370180A9A579BC84F6BC9B5E7C223E5CBEE721E57EE07EFDCC0A3257BBEBF9ADFFB00DBF7EF682EC1C4C47451438F90B4CF8DA709940F72CFDC91C6EB4E37B4ED7E2385B1FF71B28A1D2669FBEB18EA89F9D391D2FDDEA0ED362E6A591AC64EF4AE31CA8766C259ECB77D01A7F5C36B8418F91C1BEADDD4491C80F0016B66421B4B788C55127135DA2FA625FB7FD195FB40D90A6C67328602ECAF3EC4F5894BFD84A99EB4753BE0D22E0D4DE6A0ADFEDC80EB1B556749B4A8AD00E73B329C95827AB91C0256347E85E3C5FD6726D0E1FE82C925D3DF4A9 );"; - ParserTestUtils.ErrorTest130(cekExtraParametersSyntax, new ParserErrorInfo(cekExtraParametersSyntax.IndexOf(@"CMK2,")+4, "SQL46010", ",")); + ParserTestUtils.ErrorTest130(cekExtraParametersSyntax, new ParserErrorInfo(cekExtraParametersSyntax.IndexOf(@"CMK2,") + 4, "SQL46010", ",")); // Drop column encryption key missing keyworkd // @@ -5528,8 +5528,8 @@ WITH VALUES [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void AlterDatabaseScopedCredentialNegativeTest() { @@ -5607,8 +5607,8 @@ public void AlterDatabaseScopedCredentialNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateDatabaseScopedCredentialNegativeTest() { @@ -5685,8 +5685,8 @@ public void CreateDatabaseScopedCredentialNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void DropDatabaseScopedCredentialNegativeTest() { @@ -5716,45 +5716,45 @@ public void DropDatabaseScopedCredentialNegativeTest() [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] - public void CreateMasterKeyNegativeTest() - { - // Keyword typos - ParserTestUtils.ErrorTest130("CREAT MASTER KEY", new ParserErrorInfo(6, "SQL46010", "MASTER")); - ParserTestUtils.ErrorTest130("CREATE MASTE KEY", new ParserErrorInfo(7, "SQL46010", "MASTE")); - ParserTestUtils.ErrorTest130("CREATE MASTER KY", new ParserErrorInfo(7, "SQL46010", "MASTER")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY BY PASSWD = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "BY")); + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void CreateMasterKeyNegativeTest() + { + // Keyword typos + ParserTestUtils.ErrorTest130("CREAT MASTER KEY", new ParserErrorInfo(6, "SQL46010", "MASTER")); + ParserTestUtils.ErrorTest130("CREATE MASTE KEY", new ParserErrorInfo(7, "SQL46010", "MASTE")); + ParserTestUtils.ErrorTest130("CREATE MASTER KY", new ParserErrorInfo(7, "SQL46010", "MASTER")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY BY PASSWD = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "BY")); - // Missing keyword - ParserTestUtils.ErrorTest130("CREATE KEY ENCRYPTION BY PASSWORD = N'Placeholder'", new ParserErrorInfo(0, "SQL46010", "CREATE"), new ParserErrorInfo(7, "SQL46010", "KEY")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "ENCRYPTION")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION PASSWORD = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "ENCRYPTION")); + // Missing keyword + ParserTestUtils.ErrorTest130("CREATE KEY ENCRYPTION BY PASSWORD = N'Placeholder'", new ParserErrorInfo(0, "SQL46010", "CREATE"), new ParserErrorInfo(7, "SQL46010", "KEY")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "ENCRYPTION")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION PASSWORD = N'Placeholder'", new ParserErrorInfo(18, "SQL46010", "ENCRYPTION")); - // Missing password + // Missing password // [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="No password in next line")] - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD = ", new ParserErrorInfo(43, "SQL46029", "=")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD = ", new ParserErrorInfo(43, "SQL46029", "=")); - // Missing equal sign, 2 equal signs - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD N'Placeholder'", new ParserErrorInfo(41, "SQL46010", "N'Placeholder'")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD == 'Placeholder'", new ParserErrorInfo(42, "SQL46010", "=")); + // Missing equal sign, 2 equal signs + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD N'Placeholder'", new ParserErrorInfo(41, "SQL46010", "N'Placeholder'")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD == 'Placeholder'", new ParserErrorInfo(42, "SQL46010", "=")); - // Improperly quoted password - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD N'Placeholder", new ParserErrorInfo(41, "SQL46030", "N'Placeholder")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD Placeholder'", new ParserErrorInfo(52, "SQL46030", "'")); + // Improperly quoted password + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD N'Placeholder", new ParserErrorInfo(41, "SQL46030", "N'Placeholder")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD Placeholder'", new ParserErrorInfo(52, "SQL46030", "'")); - // Extra stuff after statement - ParserTestUtils.ErrorTest130("CREATE MASTER KEY CREATE", new ParserErrorInfo(18, "SQL46010", "CREATE")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY foobar", new ParserErrorInfo(18, "SQL46010", "foobar")); - ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'Placeholder' KEY", new ParserErrorInfo(58, "SQL46010", "KEY")); - } + // Extra stuff after statement + ParserTestUtils.ErrorTest130("CREATE MASTER KEY CREATE", new ParserErrorInfo(18, "SQL46010", "CREATE")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY foobar", new ParserErrorInfo(18, "SQL46010", "foobar")); + ParserTestUtils.ErrorTest130("CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'Placeholder' KEY", new ParserErrorInfo(58, "SQL46010", "KEY")); + } /// /// Negative tests for CREATE OR ALTER statements /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void CreateOrAlterNegativeTest() { // CREATE OR ALTER FUNCTIONS @@ -5794,8 +5794,8 @@ public void CreateOrAlterNegativeTest() /// Trim built-in negative tests. /// [TestMethod] - [Priority(0)] - [SqlStudioTestCategory(Category.UnitTest)] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] public void TrimBuiltInNegativeTest() { ParserTestUtils.ErrorTest140("SELECT TRIM(' TestString ';", new ParserErrorInfo(26, "SQL46010", ";")); @@ -6104,7 +6104,7 @@ INNER JOIN WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT inserted.*, deleted.*;"; // Typo in the Match Clause. // - ParserTestUtils.ErrorTest150(query2, new ParserErrorInfo(query2.IndexOf("-Dog")+1, "SQL46010", "Dog")); + ParserTestUtils.ErrorTest150(query2, new ParserErrorInfo(query2.IndexOf("-Dog") + 1, "SQL46010", "Dog")); } [TestMethod] @@ -6563,9 +6563,9 @@ public void CopyCommandInvalidSyntaxTest() ParserTestUtils.ErrorTest140(invalidToSyntax, new ParserErrorInfo(10, "SQL46010", "FROM")); ParserTestUtils.ErrorTest150(invalidToSyntax, new ParserErrorInfo(10, "SQL46010", "FROM")); - ParserTestUtils.ErrorTest130(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,")+15, "SQL46010", ",")); - ParserTestUtils.ErrorTest140(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,")+15, "SQL46010", ",")); - ParserTestUtils.ErrorTest150(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,")+15, "SQL46010", ",")); + ParserTestUtils.ErrorTest130(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,") + 15, "SQL46010", ",")); + ParserTestUtils.ErrorTest140(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,") + 15, "SQL46010", ",")); + ParserTestUtils.ErrorTest150(invalidOptionSyntax, new ParserErrorInfo(invalidOptionSyntax.IndexOf(@"FIELDTERMINATOR,") + 15, "SQL46010", ",")); ParserTestUtils.ErrorTest130(invalidIdentityOptionSyntax, new ParserErrorInfo(1, "SQL46130", "IDENTITY_INSERT")); @@ -6686,7 +6686,7 @@ public void OpenRowset160_CosmosDb() OBJECT = 'y', CONNECTION = 'a', CONNECTION = 'b') with (a varchar(10)) as cols"; ParserTestUtils.ErrorTest160(multipleParameterDeclarationSynax, - new ParserErrorInfo(multipleParameterDeclarationSynax.IndexOf(@"CONNECTION = 'a', CONNECTION")+18, "SQL46049", "CONNECTION")); + new ParserErrorInfo(multipleParameterDeclarationSynax.IndexOf(@"CONNECTION = 'a', CONNECTION") + 18, "SQL46049", "CONNECTION")); // Not all parameters provided // @@ -6785,24 +6785,88 @@ public void OpenRowset160_WithClause() string emptyWithClauseSyntax = @"SELECT * FROM OPENROWSET ('a', 'b', [dbo].[tbl]) WITH () AS a;"; - ParserTestUtils.ErrorTest160(emptyWithClauseSyntax, new ParserErrorInfo(emptyWithClauseSyntax.IndexOf(@"() AS a")+1, "SQL46010", ")")); + ParserTestUtils.ErrorTest160(emptyWithClauseSyntax, new ParserErrorInfo(emptyWithClauseSyntax.IndexOf(@"() AS a") + 1, "SQL46010", ")")); // Invalid WITH clause // string invalidWithClauseSyntax = @"SELECT * FROM OPENROWSET ('a', 'b', c) WITH (A = 5) AS a;"; - ParserTestUtils.ErrorTest160(invalidWithClauseSyntax, new ParserErrorInfo(invalidWithClauseSyntax.IndexOf(@"(A = 5)")+3, "SQL46010", "=")); + ParserTestUtils.ErrorTest160(invalidWithClauseSyntax, new ParserErrorInfo(invalidWithClauseSyntax.IndexOf(@"(A = 5)") + 3, "SQL46010", "=")); string invalidWithClause2Syntax = @"SELECT * FROM OPENROWSET ('a', 'b', [mytable]) WITH (a) AS a;"; - ParserTestUtils.ErrorTest160(invalidWithClause2Syntax, new ParserErrorInfo(invalidWithClause2Syntax.IndexOf(@"(a)")+2, "SQL46010", ")")); + ParserTestUtils.ErrorTest160(invalidWithClause2Syntax, new ParserErrorInfo(invalidWithClause2Syntax.IndexOf(@"(a)") + 2, "SQL46010", ")")); string invalidWithClause3Syntax = @"SELECT * FROM OPENROWSET ('a', 'b', [ab cd]) WITH a;"; ParserTestUtils.ErrorTest160(invalidWithClause3Syntax, new ParserErrorInfo(invalidWithClause3Syntax.IndexOf(@"a;"), "SQL46010", "a")); } + + /// + /// Negative tests for Scalar Functions in Fabric DW. + /// + [TestMethod] + [Priority(0)] + [SqlStudioTestCategory(Category.UnitTest)] + public void ScalarFunctionNegativeTestsFabricDW() + { + string scalarFunctionSyntax = @"CREATE OR ALTER FUNCTION dbo.FormatPrice + ( + @amount AS DECIMAL(10,2) = 0.0 + ) + RETURNS VARCHAR(20) + WITH ENCRYPTION, SCHEMABINDING, RETURNS NULL ON NULL INPUT, INLINE = ON + AS + BEGIN + RETURN '$' + CAST(@amount AS VARCHAR) + END; + "; + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax, new ParserErrorInfo(330, "SQL46026", "ENCRYPTION")); + + string scalarFunctionSyntax2 = @"CREATE OR ALTER FUNCTION dbo.ConcatNames + ( + @first AS NVARCHAR(50), + @last AS NVARCHAR(50) + ) + RETURNS NVARCHAR(101) + WITH RETURNS NULL ON NULL INPUT, INLINE = OFF, EXECUTE AS CALLER + AS + BEGIN + RETURN @first + ' ' + @last + END;"; + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax2, new ParserErrorInfo(425, "SQL46010", "INLINE")); + + string scalarFunctionSyntax3 = @"CREATE OR ALTER FUNCTION dbo.CountProducts + ( + @ProductTable AS dbo.ProductType READONLY + ) + RETURNS INT + WITH SCHEMABINDING + AS + BEGIN + RETURN (SELECT COUNT(*) FROM @ProductTable) + END;"; + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax3, new ParserErrorInfo(172, "SQL46026", "READONLY")); + + string scalarFunctionSyntax4 = @"CREATE OR ALTER FUNCTION sales.TotalSalesForRegion + ( + @RegionId AS sys.INT NULL, + @SalesData AS sales.SalesTableType READONLY + ) + RETURNS MONEY + WITH RETURNS NULL ON NULL INPUT + AS + BEGIN + RETURN ( + SELECT SUM(Amount) + FROM @SalesData + WHERE RegionId = @RegionId + ) + END;"; + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax4, new ParserErrorInfo(171, "SQL46010", "NULL")); + } } } diff --git a/Test/SqlDom/TestScripts/ScalarFunctionIntTestsFabricDW.sql b/Test/SqlDom/TestScripts/ScalarFunctionIntTestsFabricDW.sql deleted file mode 100644 index d348a7e..0000000 --- a/Test/SqlDom/TestScripts/ScalarFunctionIntTestsFabricDW.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE FUNCTION dbo.ConvertInput -(@MyValueIn INT) -RETURNS DECIMAL (10, 2) -AS -BEGIN - DECLARE @MyValueOut AS INT; - SET @MyValueOut = CAST (@MyValueIn AS DECIMAL (10, 2)); - RETURN (@MyValueOut); -END -GO -SELECT dbo.ConvertInput(15) AS 'ConvertedValue'; \ No newline at end of file diff --git a/Test/SqlDom/TestScripts/ScalarFunctionTestsFabricDW.sql b/Test/SqlDom/TestScripts/ScalarFunctionTestsFabricDW.sql new file mode 100644 index 0000000..fed9aef --- /dev/null +++ b/Test/SqlDom/TestScripts/ScalarFunctionTestsFabricDW.sql @@ -0,0 +1,53 @@ +CREATE OR ALTER FUNCTION dbo.GetFullName +(@firstName NVARCHAR (50)='John', @lastName NVARCHAR (50)) +RETURNS NVARCHAR (101) +WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT +AS +BEGIN + RETURN @firstName + ' ' + @lastName; +END + + +GO +CREATE OR ALTER FUNCTION dbo.CalculateTotal +(@price DECIMAL (10, 2), @quantity INT=1) +RETURNS DECIMAL (10, 2) +WITH EXECUTE AS SELF, CALLED ON NULL INPUT +AS +BEGIN + RETURN @price * @quantity; +END + + +GO +CREATE OR ALTER FUNCTION sales.ComputeDiscount +(@amount FLOAT, @discount FLOAT) +RETURNS FLOAT +WITH RETURNS NULL ON NULL INPUT +AS +BEGIN + RETURN @amount - (@amount * @discount / 100); +END + + +GO +CREATE FUNCTION dbo.GetFullName +(@FirstName VARCHAR (50), @LastName VARCHAR (50)) +RETURNS VARCHAR (101) +AS +BEGIN + RETURN @FirstName + ' ' + @LastName; +END + +GO +CREATE FUNCTION dbo.ConvertInput +(@MyValueIn INT) +RETURNS DECIMAL (10, 2) +AS +BEGIN + DECLARE @MyValueOut AS INT; + SET @MyValueOut = CAST (@MyValueIn AS DECIMAL (10, 2)); + RETURN (@MyValueOut); +END +GO +SELECT dbo.ConvertInput(15) AS 'ConvertedValue'; \ No newline at end of file diff --git a/Test/SqlDom/TestScripts/ScalarFunctionVarCharTestsFabricDW.sql b/Test/SqlDom/TestScripts/ScalarFunctionVarCharTestsFabricDW.sql deleted file mode 100644 index 6c492a3..0000000 --- a/Test/SqlDom/TestScripts/ScalarFunctionVarCharTestsFabricDW.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE FUNCTION dbo.GetFullName -(@FirstName VARCHAR (50), @LastName VARCHAR (50)) -RETURNS VARCHAR (101) -AS -BEGIN - RETURN @FirstName + ' ' + @LastName; -END \ No newline at end of file From c9cc9da6e2879a295b96c966c4bd6439ae1bd44b Mon Sep 17 00:00:00 2001 From: Dhruv Relwani Date: Thu, 29 May 2025 19:19:11 +0000 Subject: [PATCH 3/6] Merged PR 1681031: Create/ Alter Table CLUSTER BY & CREATE EXTERNAL TABLE - TSqlFabricDW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pull request introduces a new table option for clustering columns during CREATE TABLE and ALTER TABLE statements only for Fabric DW. This is the specific syntax we aim to support: ``` CREATE TABLE {database_name.schema_name.table_name | schema_name.table_name | table_name } ( { column_name } [ ,…n] ) WITH (CLUSTER BY (column_name, [ ,…n])) ALTER TABLE {database_name.schema_name.table_name | schema_name.table_name | table_name } ADD (CLUSTER BY (column_name, [ ,…n])) ``` [Task 1639622](https://dev.azure.com/powerbi/AI/_workitems/edit/1639622/): ScriptDom - Create Table with Data Clustering support This PR also adds a test to verify that the Create External Table statement is supported in our new TSqlFabricDW parser with the following format: ``` CREATE EXTERNAL TABLE ( [ ,...n ] ) WITH ( LOCATION = '', FILE_FORMAT = ); ``` [Task 1639619](https://dev.azure.com/powerbi/AI/_workitems/edit/1639619/): ScriptDom - Create External Tables support ---- #### AI description (iteration 1) #### PR Classification This pull request implements a new feature by adding support for the CLUSTER BY clause in CREATE and ALTER TABLE statements for Fabric DW. #### PR Summary The changes extend the SQL parser, AST, and script generator to handle the new CLUSTER BY option and include tests to validate the syntax. - **`/SqlScriptDom/ScriptDom/SqlServer`**: Added generator implementations (`SqlScriptGeneratorVisitor.AlterTableAddClusterByStatement.cs` and `SqlScriptGeneratorVisitor.ClusterByTableOption.cs`) to output the CLUSTER BY clause. - **`/SqlScriptDom/Parser/TSql` & `/SqlScriptDom/Parser/TSql/Ast.xml`**: Updated grammar rules and AST definitions to recognize and parse the new CLUSTER BY syntax, including a new alter table statement alternative. - **`/Test/SqlDom`**: Introduced new test scripts and baselines (along with an update in `OnlyFabricDWSyntaxTests.cs`) to verify the functionality for both table creation and alteration using the CLUSTER BY clause. Related work items: #4235116 --- SqlScriptDom/Parser/TSql/Ast.xml | 9 ++++ SqlScriptDom/Parser/TSql/TSqlFabricDW.g | 28 ++++++++++ ...Visitor.AlterTableAddClusterByStatement.cs | 33 ++++++++++++ ...ptGeneratorVisitor.ClusterByTableOption.cs | 20 ++++++++ ...CreateAlterTableClusterByTestsFabricDW.sql | 38 ++++++++++++++ ...ateExternalTableStatementTestsFabricDW.sql | 51 +++++++++++++++++++ Test/SqlDom/OnlyFabricDWSyntaxTests.cs | 2 + ...CreateAlterTableClusterByTestsFabricDW.sql | 38 ++++++++++++++ ...ateExternalTableStatementTestsFabricDW.sql | 51 +++++++++++++++++++ 9 files changed, 270 insertions(+) create mode 100644 SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.AlterTableAddClusterByStatement.cs create mode 100644 SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.ClusterByTableOption.cs create mode 100644 Test/SqlDom/BaselinesFabricDW/CreateAlterTableClusterByTestsFabricDW.sql create mode 100644 Test/SqlDom/BaselinesFabricDW/CreateExternalTableStatementTestsFabricDW.sql create mode 100644 Test/SqlDom/TestScripts/CreateAlterTableClusterByTestsFabricDW.sql create mode 100644 Test/SqlDom/TestScripts/CreateExternalTableStatementTestsFabricDW.sql diff --git a/SqlScriptDom/Parser/TSql/Ast.xml b/SqlScriptDom/Parser/TSql/Ast.xml index 917a30e..d02bc3b 100644 --- a/SqlScriptDom/Parser/TSql/Ast.xml +++ b/SqlScriptDom/Parser/TSql/Ast.xml @@ -1459,6 +1459,10 @@ + + + + @@ -2709,6 +2713,11 @@ + + + + + diff --git a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g index d786a4c..0923abc 100644 --- a/SqlScriptDom/Parser/TSql/TSqlFabricDW.g +++ b/SqlScriptDom/Parser/TSql/TSqlFabricDW.g @@ -26837,6 +26837,9 @@ createTableOption returns [TableOption vResult] | {NextTokenMatches(CodeGenerationSupporter.Distribution)}? vResult = tableDistributionOption + | + {NextTokenMatches(CodeGenerationSupporter.Cluster)}? + vResult = clusterByTableOption | vResult = tableIndexOption | @@ -27063,6 +27066,15 @@ tableRoundRobinDistributionPolicy returns [TableRoundRobinDistributionPolicy vRe } ; +clusterByTableOption returns [ClusterByTableOption vResult = this.FragmentFactory.CreateFragment()] + : tCluster:Identifier By + { + Match(tCluster, CodeGenerationSupporter.Cluster); + UpdateTokenInfo(vResult, tCluster); + } + identifierColumnList[vResult, vResult.Columns] + ; + tableIndexOption returns [TableIndexOption vResult = FragmentFactory.CreateFragment()] { TableIndexType vTableIndexType; @@ -28000,6 +28012,7 @@ alterTableStatement returns [AlterTableStatement vResult = null] {NextTokenMatches(CodeGenerationSupporter.FileTableNamespace, 2)}? vResult=alterTableFileTableNamespaceStatement | vResult=alterTableSetStatement + | vResult=alterTableAddClusterByStatement ) { // Update position later, because instantiation is lazy @@ -28142,6 +28155,21 @@ alterTableSetStatement returns [AlterTableSetStatement vResult = FragmentFactory } ; +alterTableAddClusterByStatement returns [AlterTableAddClusterByStatement vResult = FragmentFactory.CreateFragment()] +{ + ClusterByTableOption vClusterByOption; +} + : tAdd:Add LeftParenthesis vClusterByOption = clusterByTableOption + { + vResult.ClusterByOption = vClusterByOption; + UpdateTokenInfo(vResult, tAdd); + } + tRParen:RightParenthesis + { + UpdateTokenInfo(vResult, tRParen); + } + ; + tableOption returns [TableOption vResult = null] : {NextTokenMatches(CodeGenerationSupporter.LockEscalation)}? diff --git a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.AlterTableAddClusterByStatement.cs b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.AlterTableAddClusterByStatement.cs new file mode 100644 index 0000000..b335635 --- /dev/null +++ b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.AlterTableAddClusterByStatement.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//------------------------------------------------------------------------------ +using Microsoft.SqlServer.TransactSql.ScriptDom; + +namespace Microsoft.SqlServer.TransactSql.ScriptDom.ScriptGenerator +{ + partial class SqlScriptGeneratorVisitor + { + public override void ExplicitVisit(AlterTableAddClusterByStatement node) + { + AlignmentPoint start = new AlignmentPoint(); + MarkAndPushAlignmentPoint(start); + + GenerateAlterTableHead(node); + + NewLineAndIndent(); + + GenerateKeyword(TSqlTokenType.Add); + GenerateSpace(); + if (node.ClusterByOption != null) + { + GenerateSymbol(TSqlTokenType.LeftParenthesis); + GenerateFragmentIfNotNull(node.ClusterByOption); + GenerateSymbol(TSqlTokenType.RightParenthesis); + } + + PopAlignmentPoint(); + } + } +} diff --git a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.ClusterByTableOption.cs b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.ClusterByTableOption.cs new file mode 100644 index 0000000..059ec08 --- /dev/null +++ b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.ClusterByTableOption.cs @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//------------------------------------------------------------------------------ +using Microsoft.SqlServer.TransactSql.ScriptDom; + +namespace Microsoft.SqlServer.TransactSql.ScriptDom.ScriptGenerator +{ + partial class SqlScriptGeneratorVisitor + { + public override void ExplicitVisit(ClusterByTableOption node) + { + GenerateIdentifier(CodeGenerationSupporter.Cluster); + GenerateSpaceAndKeyword(TSqlTokenType.By); + GenerateSpace(); + GenerateParenthesisedCommaSeparatedList(node.Columns); + } + } +} diff --git a/Test/SqlDom/BaselinesFabricDW/CreateAlterTableClusterByTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/CreateAlterTableClusterByTestsFabricDW.sql new file mode 100644 index 0000000..05f8e02 --- /dev/null +++ b/Test/SqlDom/BaselinesFabricDW/CreateAlterTableClusterByTestsFabricDW.sql @@ -0,0 +1,38 @@ +CREATE TABLE Customers ( + CustomerID INT , + Name NVARCHAR (100) +) +WITH (CLUSTER BY (CustomerID)); + + +GO +CREATE TABLE sales.Orders ( + OrderID INT , + CustomerID INT , + OrderDate DATE +) +WITH (CLUSTER BY (CustomerID, OrderDate), DISTRIBUTION = HASH(CustomerID)); + + +GO +CREATE TABLE Inventory ( + ProductID INT , + ProductName VARCHAR (255), + InStock BIT +) +WITH (CLUSTER BY (ProductID)); + + +GO +ALTER TABLE Customers + ADD (CLUSTER BY (CustomerID)); + + +GO +ALTER TABLE sales.Orders + ADD (CLUSTER BY (CustomerID, OrderDate)); + + +GO +ALTER TABLE Inventory + ADD (CLUSTER BY (ProductID)); \ No newline at end of file diff --git a/Test/SqlDom/BaselinesFabricDW/CreateExternalTableStatementTestsFabricDW.sql b/Test/SqlDom/BaselinesFabricDW/CreateExternalTableStatementTestsFabricDW.sql new file mode 100644 index 0000000..e2459a0 --- /dev/null +++ b/Test/SqlDom/BaselinesFabricDW/CreateExternalTableStatementTestsFabricDW.sql @@ -0,0 +1,51 @@ +CREATE EXTERNAL TABLE t1 ( + c1 INT, + c2 CHAR (16) COLLATE Latin1_General_BIN2 NOT NULL, + c3 DATE, + c4 DECIMAL (5, 2) NULL, + c5 VARCHAR (50) COLLATE Latin1_General_BIN2 NULL +) + WITH ( + DATA_SOURCE = eds1, + LOCATION = '/test/test.txt', + FILE_FORMAT = eff1, + TABLE_OPTIONS = N'{"READ_OPTIONS": +["ALLOW_INCONSISTENT_READS"] +}' + ); + +CREATE EXTERNAL TABLE t2 ( + c1 INT, + c2 CHAR (16) COLLATE Latin1_General_BIN2 NOT NULL, + c3 DATE, + c4 DECIMAL (5, 2) NULL, + c5 VARCHAR (50) COLLATE Latin1_General_BIN2 NULL +) + WITH ( + DATA_SOURCE = eds1, + LOCATION = '/test/test.txt', + FILE_FORMAT = eff1, + TABLE_OPTIONS = N'randomstring��?Ƕ�' + ); + +CREATE EXTERNAL TABLE finance.Transactions2024 ( + TransactionID BIGINT, + AccountNumber VARCHAR (20), + TransactionDate DATE, + Amount FLOAT +) + WITH ( + LOCATION = 'https://storage.blob.core.windows.net/data/transactions2024/', + FILE_FORMAT = AvroFormat + ); + +CREATE EXTERNAL TABLE analytics.WebEvents ( + EventID INT, + UserID INT, + EventTime DATETIME, + EventType NVARCHAR (50) +) + WITH ( + LOCATION = '/logs/web/events/', + FILE_FORMAT = JsonFormat + ); \ No newline at end of file diff --git a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs index 7f5c9fa..58537c4 100644 --- a/Test/SqlDom/OnlyFabricDWSyntaxTests.cs +++ b/Test/SqlDom/OnlyFabricDWSyntaxTests.cs @@ -12,6 +12,8 @@ public partial class SqlDomTests new ParserTestFabricDW("CloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), new ParserTestFabricDW("CreateProcedureCloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4), new ParserTestFabricDW("ScalarFunctionTestsFabricDW.sql", nErrors80: 3, nErrors90: 2, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0), + new ParserTestFabricDW("CreateAlterTableClusterByTestsFabricDW.sql", nErrors80: 6, nErrors90: 6, nErrors100: 6, nErrors110: 6, nErrors120: 6, nErrors130: 6, nErrors140: 6, nErrors150: 6, nErrors160: 6, nErrors170: 6), + new ParserTestFabricDW("CreateExternalTableStatementTestsFabricDW.sql", nErrors80: 2, nErrors90: 2, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 2, nErrors140: 2, nErrors150: 2, nErrors160: 0, nErrors170: 0), }; [TestMethod] diff --git a/Test/SqlDom/TestScripts/CreateAlterTableClusterByTestsFabricDW.sql b/Test/SqlDom/TestScripts/CreateAlterTableClusterByTestsFabricDW.sql new file mode 100644 index 0000000..05f8e02 --- /dev/null +++ b/Test/SqlDom/TestScripts/CreateAlterTableClusterByTestsFabricDW.sql @@ -0,0 +1,38 @@ +CREATE TABLE Customers ( + CustomerID INT , + Name NVARCHAR (100) +) +WITH (CLUSTER BY (CustomerID)); + + +GO +CREATE TABLE sales.Orders ( + OrderID INT , + CustomerID INT , + OrderDate DATE +) +WITH (CLUSTER BY (CustomerID, OrderDate), DISTRIBUTION = HASH(CustomerID)); + + +GO +CREATE TABLE Inventory ( + ProductID INT , + ProductName VARCHAR (255), + InStock BIT +) +WITH (CLUSTER BY (ProductID)); + + +GO +ALTER TABLE Customers + ADD (CLUSTER BY (CustomerID)); + + +GO +ALTER TABLE sales.Orders + ADD (CLUSTER BY (CustomerID, OrderDate)); + + +GO +ALTER TABLE Inventory + ADD (CLUSTER BY (ProductID)); \ No newline at end of file diff --git a/Test/SqlDom/TestScripts/CreateExternalTableStatementTestsFabricDW.sql b/Test/SqlDom/TestScripts/CreateExternalTableStatementTestsFabricDW.sql new file mode 100644 index 0000000..e2459a0 --- /dev/null +++ b/Test/SqlDom/TestScripts/CreateExternalTableStatementTestsFabricDW.sql @@ -0,0 +1,51 @@ +CREATE EXTERNAL TABLE t1 ( + c1 INT, + c2 CHAR (16) COLLATE Latin1_General_BIN2 NOT NULL, + c3 DATE, + c4 DECIMAL (5, 2) NULL, + c5 VARCHAR (50) COLLATE Latin1_General_BIN2 NULL +) + WITH ( + DATA_SOURCE = eds1, + LOCATION = '/test/test.txt', + FILE_FORMAT = eff1, + TABLE_OPTIONS = N'{"READ_OPTIONS": +["ALLOW_INCONSISTENT_READS"] +}' + ); + +CREATE EXTERNAL TABLE t2 ( + c1 INT, + c2 CHAR (16) COLLATE Latin1_General_BIN2 NOT NULL, + c3 DATE, + c4 DECIMAL (5, 2) NULL, + c5 VARCHAR (50) COLLATE Latin1_General_BIN2 NULL +) + WITH ( + DATA_SOURCE = eds1, + LOCATION = '/test/test.txt', + FILE_FORMAT = eff1, + TABLE_OPTIONS = N'randomstring��?Ƕ�' + ); + +CREATE EXTERNAL TABLE finance.Transactions2024 ( + TransactionID BIGINT, + AccountNumber VARCHAR (20), + TransactionDate DATE, + Amount FLOAT +) + WITH ( + LOCATION = 'https://storage.blob.core.windows.net/data/transactions2024/', + FILE_FORMAT = AvroFormat + ); + +CREATE EXTERNAL TABLE analytics.WebEvents ( + EventID INT, + UserID INT, + EventTime DATETIME, + EventType NVARCHAR (50) +) + WITH ( + LOCATION = '/logs/web/events/', + FILE_FORMAT = JsonFormat + ); \ No newline at end of file From 5470a4b1299f2b27bea88bc419c556240f89c8bd Mon Sep 17 00:00:00 2001 From: MerlinBot Date: Tue, 3 Jun 2025 23:10:05 +0000 Subject: [PATCH 4/6] Update .NET SDK to latest patch version --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index d460a4b..17e2f86 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.409", + "version": "8.0.410", "rollForward": "latestMajor" }, "msbuild-sdks": { From 8727aa0c76f95b24d638e4ce93585838bf87e46b Mon Sep 17 00:00:00 2001 From: Leila Lali Date: Fri, 6 Jun 2025 18:48:14 +0000 Subject: [PATCH 5/6] Merged PR 1697892: Adding release notes for 170.53.0 # Pull Request Template for ScriptDom ## Description Please provide a detailed description, include the link to the design specification or SQL feature document for the new TSQL syntaxes. Make sure to add links to the Github or DevDiv issue Before submitting your pull request, please ensure you have completed the following: ## Code Change - [ ] The [Common checklist](https://msdata.visualstudio.com/SQLToolsAndLibraries/_git/Common?path=/Templates/PR%20Checklist%20for%20SQLToolsAndLibraries.md&version=GBmain&_a=preview) has been reviewed and followed - [ ] Code changes are accompanied by appropriate unit tests - [ ] Identified and included SMEs needed to review code changes - [ ] Follow the [steps](https://msdata.visualstudio.com/SQLToolsAndLibraries/_wiki/wikis/SQLToolsAndLibraries.wiki/33838/Adding-or-Extending-TSql-support-in-Sql-Dom?anchor=make-the-changes-in) here to make changes in the code ## Testing - [ ] Follow the [steps](https://msdata.visualstudio.com/SQLToolsAndLibraries/_wiki/wikis/SQLToolsAndLibraries.wiki/33838/Adding-or-Extending-TSql-support-in-Sql-Dom?anchor=to-extend-the-tests-do-the-following%3A) here to add new tests for your feature ## Documentation - [ ] Update relevant documentation in the [wiki](https://dev.azure.com/msdata/SQLToolsAndLibraries/_wiki/wikis/SQLToolsAndLibraries.wiki) and the README.md file ## Additional Information Please provide any additional information that might be helpful for the reviewers --- .../170/{170.0.44.0.md => 170.44.0.md} | 2 +- release-notes/170/170.53.0.md | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) rename release-notes/170/{170.0.44.0.md => 170.44.0.md} (84%) create mode 100644 release-notes/170/170.53.0.md diff --git a/release-notes/170/170.0.44.0.md b/release-notes/170/170.44.0.md similarity index 84% rename from release-notes/170/170.0.44.0.md rename to release-notes/170/170.44.0.md index 8335231..d487dce 100644 --- a/release-notes/170/170.0.44.0.md +++ b/release-notes/170/170.44.0.md @@ -16,7 +16,7 @@ This update brings the below changes over the previous release: #### .NET Core ### New Features -* Adds a new Grammar File and Parser specifically targeting Fabric DW platform. +* Adds a new Grammar File and Parser specifically targeting Warehouse in Microsoft Fabric. ### Fixed diff --git a/release-notes/170/170.53.0.md b/release-notes/170/170.53.0.md new file mode 100644 index 0000000..c1789e5 --- /dev/null +++ b/release-notes/170/170.53.0.md @@ -0,0 +1,26 @@ +# Release Notes + +## Microsoft.SqlServer.TransactSql.ScriptDom 170.53.0 +This update brings the below changes over the previous release: + +### Target Platform Support + +* .NET Framework 4.7.2 (Windows x86, Windows x64) +* .NET 8 (Windows x86, Windows x64, Linux, macOS) +* .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS) + +### Dependencies +* Updates.NET SDK to latest patch version 8.0.410 + +#### .NET Framework +#### .NET Core + +### New Features +* Adds support for table cloning via 'CREATE TABLE AS CLONE' syntax in Warehouse in Microsoft Fabric. +* Adds supports for the new syntax of Scalar Function in Warehouse in Microsoft Fabric. +* Adds support for a new table option for clustering columns during CREATE TABLE and ALTER TABLE statements in Warehouse in Microsoft Fabric. + +### Fixed + +### Changes +### Known Issues From 5d2080a3087880f89f8b17499b2ca28380df13b8 Mon Sep 17 00:00:00 2001 From: Zi Chen <13544267+zijchen@users.noreply.github.com> Date: Fri, 6 Jun 2025 15:50:57 -0700 Subject: [PATCH 6/6] Use IndexOf instead of hardcoded code markers (#136) * Update TestUtilities.cs Signed-off-by: Zi Chen <13544267+zijchen@users.noreply.github.com> * Use IndexOf instead of hardcoded values --------- Signed-off-by: Zi Chen <13544267+zijchen@users.noreply.github.com> --- Test/SqlDom/ParserErrorsTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Test/SqlDom/ParserErrorsTests.cs b/Test/SqlDom/ParserErrorsTests.cs index dd9a9a4..7474efd 100644 --- a/Test/SqlDom/ParserErrorsTests.cs +++ b/Test/SqlDom/ParserErrorsTests.cs @@ -6824,7 +6824,7 @@ RETURNS VARCHAR(20) RETURN '$' + CAST(@amount AS VARCHAR) END; "; - ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax, new ParserErrorInfo(330, "SQL46026", "ENCRYPTION")); + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax, new ParserErrorInfo(scalarFunctionSyntax.IndexOf("ENCRYPTION"), "SQL46026", "ENCRYPTION")); string scalarFunctionSyntax2 = @"CREATE OR ALTER FUNCTION dbo.ConcatNames ( @@ -6837,7 +6837,7 @@ RETURNS NVARCHAR(101) BEGIN RETURN @first + ' ' + @last END;"; - ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax2, new ParserErrorInfo(425, "SQL46010", "INLINE")); + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax2, new ParserErrorInfo(scalarFunctionSyntax2.IndexOf("INLINE"), "SQL46010", "INLINE")); string scalarFunctionSyntax3 = @"CREATE OR ALTER FUNCTION dbo.CountProducts ( @@ -6849,7 +6849,7 @@ WITH SCHEMABINDING BEGIN RETURN (SELECT COUNT(*) FROM @ProductTable) END;"; - ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax3, new ParserErrorInfo(172, "SQL46026", "READONLY")); + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax3, new ParserErrorInfo(scalarFunctionSyntax3.IndexOf("READONLY"), "SQL46026", "READONLY")); string scalarFunctionSyntax4 = @"CREATE OR ALTER FUNCTION sales.TotalSalesForRegion ( @@ -6866,7 +6866,7 @@ FROM @SalesData WHERE RegionId = @RegionId ) END;"; - ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax4, new ParserErrorInfo(171, "SQL46010", "NULL")); + ParserTestUtils.ErrorTestFabricDW(scalarFunctionSyntax4, new ParserErrorInfo(scalarFunctionSyntax4.IndexOf("NULL"), "SQL46010", "NULL")); } } }