@@ -10747,10 +10747,75 @@ func (p *Parser) parseCreateIndexOptions() []ast.IndexOption {
1074710747 OptionState : p .capitalizeFirst (strings .ToLower (valueStr )),
1074810748 })
1074910749 case "ONLINE" :
10750- options = append ( options , & ast.OnlineIndexOption {
10750+ onlineOpt := & ast.OnlineIndexOption {
1075110751 OptionKind : "Online" ,
1075210752 OptionState : p .capitalizeFirst (strings .ToLower (valueStr )),
10753- })
10753+ }
10754+ // Check for optional (WAIT_AT_LOW_PRIORITY (...))
10755+ if valueStr == "ON" && p .curTok .Type == TokenLParen {
10756+ p .nextToken () // consume (
10757+ if strings .ToUpper (p .curTok .Literal ) == "WAIT_AT_LOW_PRIORITY" {
10758+ p .nextToken () // consume WAIT_AT_LOW_PRIORITY
10759+ lowPriorityOpt := & ast.OnlineIndexLowPriorityLockWaitOption {}
10760+ if p .curTok .Type == TokenLParen {
10761+ p .nextToken () // consume (
10762+ for p .curTok .Type != TokenRParen && p .curTok .Type != TokenEOF {
10763+ optName := strings .ToUpper (p .curTok .Literal )
10764+ if optName == "MAX_DURATION" {
10765+ p .nextToken () // consume MAX_DURATION
10766+ if p .curTok .Type == TokenEquals {
10767+ p .nextToken () // consume =
10768+ }
10769+ durVal , _ := p .parsePrimaryExpression ()
10770+ unit := "Minutes"
10771+ if strings .ToUpper (p .curTok .Literal ) == "MINUTES" {
10772+ p .nextToken ()
10773+ } else if strings .ToUpper (p .curTok .Literal ) == "SECONDS" {
10774+ unit = "Seconds"
10775+ p .nextToken ()
10776+ }
10777+ lowPriorityOpt .Options = append (lowPriorityOpt .Options , & ast.LowPriorityLockWaitMaxDurationOption {
10778+ MaxDuration : durVal ,
10779+ Unit : unit ,
10780+ OptionKind : "MaxDuration" ,
10781+ })
10782+ } else if optName == "ABORT_AFTER_WAIT" {
10783+ p .nextToken () // consume ABORT_AFTER_WAIT
10784+ if p .curTok .Type == TokenEquals {
10785+ p .nextToken () // consume =
10786+ }
10787+ abortType := "None"
10788+ switch strings .ToUpper (p .curTok .Literal ) {
10789+ case "NONE" :
10790+ abortType = "None"
10791+ case "SELF" :
10792+ abortType = "Self"
10793+ case "BLOCKERS" :
10794+ abortType = "Blockers"
10795+ }
10796+ p .nextToken ()
10797+ lowPriorityOpt .Options = append (lowPriorityOpt .Options , & ast.LowPriorityLockWaitAbortAfterWaitOption {
10798+ AbortAfterWait : abortType ,
10799+ OptionKind : "AbortAfterWait" ,
10800+ })
10801+ } else {
10802+ break
10803+ }
10804+ if p .curTok .Type == TokenComma {
10805+ p .nextToken ()
10806+ }
10807+ }
10808+ if p .curTok .Type == TokenRParen {
10809+ p .nextToken () // consume )
10810+ }
10811+ }
10812+ onlineOpt .LowPriorityLockWaitOption = lowPriorityOpt
10813+ }
10814+ if p .curTok .Type == TokenRParen {
10815+ p .nextToken () // consume )
10816+ }
10817+ }
10818+ options = append (options , onlineOpt )
1075410819 case "ALLOW_ROW_LOCKS" :
1075510820 options = append (options , & ast.IndexStateOption {
1075610821 OptionKind : "AllowRowLocks" ,
@@ -10829,6 +10894,48 @@ func (p *Parser) parseCreateIndexOptions() []ast.IndexOption {
1082910894 }
1083010895 }
1083110896 options = append (options , opt )
10897+ case "XML_COMPRESSION" :
10898+ // Parse XML_COMPRESSION = ON/OFF [ON PARTITIONS(range)]
10899+ isCompressed := "On"
10900+ if valueStr == "OFF" {
10901+ isCompressed = "Off"
10902+ }
10903+ opt := & ast.XmlCompressionOption {
10904+ IsCompressed : isCompressed ,
10905+ OptionKind : "XmlCompression" ,
10906+ }
10907+ // Check for optional ON PARTITIONS(range)
10908+ if p .curTok .Type == TokenOn {
10909+ p .nextToken () // consume ON
10910+ if strings .ToUpper (p .curTok .Literal ) == "PARTITIONS" {
10911+ p .nextToken () // consume PARTITIONS
10912+ if p .curTok .Type == TokenLParen {
10913+ p .nextToken () // consume (
10914+ for p .curTok .Type != TokenRParen && p .curTok .Type != TokenEOF {
10915+ partRange := & ast.CompressionPartitionRange {}
10916+ // Parse From value
10917+ partRange .From = & ast.IntegerLiteral {LiteralType : "Integer" , Value : p .curTok .Literal }
10918+ p .nextToken ()
10919+ // Check for TO keyword indicating a range
10920+ if strings .ToUpper (p .curTok .Literal ) == "TO" {
10921+ p .nextToken () // consume TO
10922+ partRange .To = & ast.IntegerLiteral {LiteralType : "Integer" , Value : p .curTok .Literal }
10923+ p .nextToken ()
10924+ }
10925+ opt .PartitionRanges = append (opt .PartitionRanges , partRange )
10926+ if p .curTok .Type == TokenComma {
10927+ p .nextToken ()
10928+ } else {
10929+ break
10930+ }
10931+ }
10932+ if p .curTok .Type == TokenRParen {
10933+ p .nextToken () // consume )
10934+ }
10935+ }
10936+ }
10937+ }
10938+ options = append (options , opt )
1083210939 default :
1083310940 // Generic handling for other options
1083410941 if valueStr == "ON" || valueStr == "OFF" {
0 commit comments