Skip to content

Commit 667ca5c

Browse files
committed
merge from main
2 parents 28c5564 + 003271e commit 667ca5c

22 files changed

+218
-35
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
* @barbaravaldez @dzsquared @zijchen @chlafreniere @llali
1+
* @dzsquared @zijchen @chlafreniere @llali @ssreerama @kburtram

SqlScriptDom/Parser/TSql/Ast.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,6 +2404,7 @@
24042404
<InheritedClass Name="AlterDatabaseStatement" />
24052405
<Member Name="Termination" Type="AlterDatabaseTermination" Summary="Optional termination options"/>
24062406
<Member Name="Options" Type="DatabaseOption" Collection="true" Summary="Options specified in this statement"/>
2407+
<Member Name="WithManualCutover" Type="bool" Summary="True if WITH MANUAL_CUTOVER is specified in the ALTER DATABASE MODIFY statement."/>
24072408
</Class>
24082409
<Class Name="DatabaseOption" Summary="Single option in ALTER DATABASE statement, SET case">
24092410
<Member Name="OptionKind" Type="DatabaseOptionKind" GenerateUpdatePositionInfoCall="false" Summary="The option kind."/>
@@ -2576,6 +2577,9 @@
25762577
<Member Name="MaxSize" Type="Literal" Summary="The maximum size."/>
25772578
<Member Name="Units" Type="MemoryUnit" GenerateUpdatePositionInfoCall="false" Summary="Measurement units for size. Only GB is valid."/>
25782579
</Class>
2580+
<Class Name="AlterDatabasePerformCutoverStatement" Base="AlterDatabaseStatement" Summary="Represents ALTER DATABASE ... PERFORM_CUTOVER statement for Azure.">
2581+
<InheritedClass Name="AlterDatabaseStatement"/>
2582+
</Class>
25792583
<Interface Name="ICollationSetter">
25802584
<Member Name="Collation" Type="Identifier" Summary="Collation identifier" />
25812585
</Interface>

SqlScriptDom/Parser/TSql/CodeGenerationSupporter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ internal static class CodeGenerationSupporter
564564
internal const string LSquareParen = "[";
565565
internal const string MaintainIndex = "MAINTAIN_INDEX";
566566
internal const string Manual = "MANUAL";
567+
internal const string ManualCutover = "MANUAL_CUTOVER";
567568
internal const string Mark = "MARK";
568569
internal const string MarkInUseForRemoval = "MARK_IN_USE_FOR_REMOVAL";
569570
internal const string Masked = "MASKED";
@@ -728,6 +729,7 @@ internal static class CodeGenerationSupporter
728729
internal const string Paused = "PAUSED";
729730
internal const string Percentage = "PERCENTAGE";
730731
internal const string PerCpu = "PER_CPU";
732+
internal const string PerformCutover = "PERFORM_CUTOVER";
731733
internal const string Period = "PERIOD";
732734
internal const string PermissionSet = "PERMISSION_SET";
733735
internal const string PerNode = "PER_NODE";

SqlScriptDom/Parser/TSql/DatabaseOptionKind.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ public enum DatabaseOptionKind
9595

9696
// T-SQL 150 On/Off options
9797
DataRetention = 67,
98-
Ledger = 68
98+
Ledger = 68,
99+
100+
ManualCutover = 69,
101+
PerformCutover = 70
99102
}
100103

101104
#pragma warning restore 1591

SqlScriptDom/Parser/TSql/DatabaseOptionKindHelper.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ private DatabaseOptionKindHelper()
3232

3333
// 140 Options
3434
AddOptionMapping(DatabaseOptionKind.AutomaticTuning, CodeGenerationSupporter.AutomaticTuning, SqlVersionFlags.TSql140AndAbove);
35+
36+
// 170 Options
37+
AddOptionMapping(DatabaseOptionKind.ManualCutover, CodeGenerationSupporter.ManualCutover, SqlVersionFlags.TSql170AndAbove);
38+
AddOptionMapping(DatabaseOptionKind.PerformCutover, CodeGenerationSupporter.PerformCutover, SqlVersionFlags.TSql170AndAbove);
3539
}
3640

3741
internal static readonly DatabaseOptionKindHelper Instance = new DatabaseOptionKindHelper();

SqlScriptDom/Parser/TSql/SqlVersionFlags.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ internal enum SqlVersionFlags
3535
TSql140AndAbove = TSql140 | TSql150 | TSql160 | TSqlFabricDW | TSql170,
3636
TSql150AndAbove = TSql150 | TSql160 | TSqlFabricDW | TSql170,
3737
TSql160AndAbove = TSql160 | TSqlFabricDW | TSql170,
38+
TSql170AndAbove = TSql170,
3839
TSqlFabricDWAndAbove = TSql160 | TSqlFabricDW | TSql170,
3940
TSqlUnder110 = TSql80 | TSql90 | TSql100,
4041
TSqlUnder120 = TSql80 | TSql90 | TSql100 | TSql110,

SqlScriptDom/Parser/TSql/TSql170.g

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2899,6 +2899,7 @@ alterDatabase [IToken tAlter] returns [AlterDatabaseStatement vResult = null]
28992899
| vResult = alterDbSet
29002900
| vResult = alterDbCollate
29012901
| vResult = alterDbRebuild // Undocumented - for PSS only
2902+
| vResult = alterDbPerformCutover
29022903
)
29032904
{
29042905
if(vUseCurrent)
@@ -3060,8 +3061,19 @@ alterDbModify returns [AlterDatabaseStatement vResult = null]
30603061
;
30613062

30623063
alterDbModifyAzureOptions returns [AlterDatabaseSetStatement vResult = FragmentFactory.CreateFragment<AlterDatabaseSetStatement>()]
3064+
{
3065+
bool hasManualCutover = false;
3066+
}
30633067
:
30643068
azureOptions[vResult, vResult.Options]
3069+
(
3070+
With tManualCutover:Identifier
3071+
{
3072+
Match(tManualCutover, CodeGenerationSupporter.ManualCutover);
3073+
hasManualCutover = true;
3074+
vResult.WithManualCutover = true;
3075+
}
3076+
)?
30653077
;
30663078

30673079
// MODIFY File syntax
@@ -3146,6 +3158,14 @@ toFilegroup returns [Identifier vResult]
31463158
}
31473159
;
31483160

3161+
alterDbPerformCutover returns [AlterDatabasePerformCutoverStatement vResult = FragmentFactory.CreateFragment<AlterDatabasePerformCutoverStatement>()]
3162+
: tPerformCutover:Identifier
3163+
{
3164+
Match(tPerformCutover, CodeGenerationSupporter.PerformCutover);
3165+
UpdateTokenInfo(vResult, tPerformCutover);
3166+
}
3167+
;
3168+
31493169
xactTermination returns [AlterDatabaseTermination vResult = FragmentFactory.CreateFragment<AlterDatabaseTermination>()]
31503170
{
31513171
Literal vInteger;

SqlScriptDom/Parser/TSql/TSqlFabricDW.g

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29587,33 +29587,10 @@ rowguidcolConstraint [ColumnDefinition vParent]
2958729587
;
2958829588

2958929589
identityConstraint [IndexAffectingStatement statementType] returns [IdentityOptions vResult = FragmentFactory.CreateFragment<IdentityOptions>()]
29590-
{
29591-
ScalarExpression vExpression;
29592-
bool vNotForReplication;
29593-
}
2959429590
: tIdentity:Identity
2959529591
{
2959629592
UpdateTokenInfo(vResult,tIdentity);
2959729593
}
29598-
(
29599-
(LeftParenthesis seedIncrement)=> // necessary because select statement can start with LeftParenthesis
29600-
LeftParenthesis vExpression=seedIncrement
29601-
{
29602-
vResult.IdentitySeed = vExpression;
29603-
}
29604-
Comma vExpression=seedIncrement
29605-
{
29606-
vResult.IdentityIncrement = vExpression;
29607-
}
29608-
tRParen:RightParenthesis
29609-
{
29610-
UpdateTokenInfo(vResult,tRParen);
29611-
}
29612-
)?
29613-
vNotForReplication = replicationClauseOpt[statementType, vResult]
29614-
{
29615-
vResult.IsIdentityNotForReplication = vNotForReplication;
29616-
}
2961729594
;
2961829595

2961929596
// Same as column_definition in SQL YACC grammar
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//------------------------------------------------------------------------------
2+
// <copyright file="SqlScriptGeneratorVisitor.AlterDbPerformCutoverStatement.cs" company="Microsoft">
3+
// Copyright (c) Microsoft Corporation. All rights reserved.
4+
// </copyright>
5+
//------------------------------------------------------------------------------
6+
using System;
7+
8+
using Microsoft.SqlServer.TransactSql.ScriptDom;
9+
10+
namespace Microsoft.SqlServer.TransactSql.ScriptDom.ScriptGenerator
11+
{
12+
partial class SqlScriptGeneratorVisitor
13+
{
14+
public override void ExplicitVisit(AlterDatabasePerformCutoverStatement node)
15+
{
16+
GenerateAlterDbStatementHead(node);
17+
18+
GenerateSpaceAndIdentifier(CodeGenerationSupporter.PerformCutover);
19+
}
20+
}
21+
}

SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.AlterDbSetStatement.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ public override void ExplicitVisit(AlterDatabaseSetStatement node)
1515

1616
NewLineAndIndent();
1717
bool azureOnlyOption = true;
18-
foreach(DatabaseOption option in node.Options)
18+
foreach (DatabaseOption option in node.Options)
1919
{
20-
if (option.OptionKind != DatabaseOptionKind.MaxSize && option.OptionKind != DatabaseOptionKind.Edition && option.OptionKind != DatabaseOptionKind.ServiceObjective)
20+
if (option.OptionKind != DatabaseOptionKind.MaxSize &&
21+
option.OptionKind != DatabaseOptionKind.Edition &&
22+
option.OptionKind != DatabaseOptionKind.ServiceObjective)
2123
{
2224
azureOnlyOption = false;
2325
break;
@@ -31,6 +33,13 @@ public override void ExplicitVisit(AlterDatabaseSetStatement node)
3133
MarkAndPushAlignmentPoint(items);
3234
GenerateParenthesisedCommaSeparatedList(node.Options, true);
3335
PopAlignmentPoint();
36+
37+
// Emit "WITH MANUAL_CUTOVER" if the statement includes the optional manual cutover clause
38+
if (node.WithManualCutover)
39+
{
40+
GenerateSpaceAndKeyword(TSqlTokenType.With);
41+
GenerateSpaceAndIdentifier(CodeGenerationSupporter.ManualCutover);
42+
}
3443
}
3544
else
3645
{

0 commit comments

Comments
 (0)