Skip to content

Commit 855cfe9

Browse files
committed
Add REMOTE_DATA_ARCHIVE database option parsing
Implements parsing for ALTER DATABASE ... SET REMOTE_DATA_ARCHIVE with: - ON/OFF state and optional settings - SERVER, CREDENTIAL, and FEDERATED_SERVICE_ACCOUNT settings
1 parent 89e0207 commit 855cfe9

5 files changed

Lines changed: 176 additions & 2 deletions

File tree

ast/alter_database_set_statement.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,46 @@ type DatabaseConfigurationClearOption struct {
192192
}
193193

194194
func (d *DatabaseConfigurationClearOption) node() {}
195+
196+
// RemoteDataArchiveDatabaseOption represents REMOTE_DATA_ARCHIVE database option
197+
type RemoteDataArchiveDatabaseOption struct {
198+
OptionKind string // "RemoteDataArchive"
199+
OptionState string // "On", "Off", "NotSet"
200+
Settings []RemoteDataArchiveDbSetting // Settings like SERVER, CREDENTIAL, FEDERATED_SERVICE_ACCOUNT
201+
}
202+
203+
func (r *RemoteDataArchiveDatabaseOption) node() {}
204+
func (r *RemoteDataArchiveDatabaseOption) databaseOption() {}
205+
206+
// RemoteDataArchiveDbSetting is an interface for Remote Data Archive settings
207+
type RemoteDataArchiveDbSetting interface {
208+
Node
209+
remoteDataArchiveDbSetting()
210+
}
211+
212+
// RemoteDataArchiveDbServerSetting represents the SERVER setting
213+
type RemoteDataArchiveDbServerSetting struct {
214+
SettingKind string // "Server"
215+
Server ScalarExpression // The server string literal
216+
}
217+
218+
func (r *RemoteDataArchiveDbServerSetting) node() {}
219+
func (r *RemoteDataArchiveDbServerSetting) remoteDataArchiveDbSetting() {}
220+
221+
// RemoteDataArchiveDbCredentialSetting represents the CREDENTIAL setting
222+
type RemoteDataArchiveDbCredentialSetting struct {
223+
SettingKind string // "Credential"
224+
Credential *Identifier // The credential name
225+
}
226+
227+
func (r *RemoteDataArchiveDbCredentialSetting) node() {}
228+
func (r *RemoteDataArchiveDbCredentialSetting) remoteDataArchiveDbSetting() {}
229+
230+
// RemoteDataArchiveDbFederatedServiceAccountSetting represents the FEDERATED_SERVICE_ACCOUNT setting
231+
type RemoteDataArchiveDbFederatedServiceAccountSetting struct {
232+
SettingKind string // "FederatedServiceAccount"
233+
IsOn bool // true for ON, false for OFF
234+
}
235+
236+
func (r *RemoteDataArchiveDbFederatedServiceAccountSetting) node() {}
237+
func (r *RemoteDataArchiveDbFederatedServiceAccountSetting) remoteDataArchiveDbSetting() {}

parser/marshal.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,11 +987,56 @@ func databaseOptionToJSON(opt ast.DatabaseOption) jsonNode {
987987
node["OptionKind"] = o.OptionKind
988988
}
989989
return node
990+
case *ast.RemoteDataArchiveDatabaseOption:
991+
node := jsonNode{
992+
"$type": "RemoteDataArchiveDatabaseOption",
993+
"OptionState": o.OptionState,
994+
"OptionKind": o.OptionKind,
995+
}
996+
if len(o.Settings) > 0 {
997+
settings := make([]jsonNode, len(o.Settings))
998+
for i, setting := range o.Settings {
999+
settings[i] = remoteDataArchiveDbSettingToJSON(setting)
1000+
}
1001+
node["Settings"] = settings
1002+
}
1003+
return node
9901004
default:
9911005
return jsonNode{"$type": "UnknownDatabaseOption"}
9921006
}
9931007
}
9941008

1009+
func remoteDataArchiveDbSettingToJSON(setting ast.RemoteDataArchiveDbSetting) jsonNode {
1010+
switch s := setting.(type) {
1011+
case *ast.RemoteDataArchiveDbServerSetting:
1012+
node := jsonNode{
1013+
"$type": "RemoteDataArchiveDbServerSetting",
1014+
"SettingKind": s.SettingKind,
1015+
}
1016+
if s.Server != nil {
1017+
node["Server"] = scalarExpressionToJSON(s.Server)
1018+
}
1019+
return node
1020+
case *ast.RemoteDataArchiveDbCredentialSetting:
1021+
node := jsonNode{
1022+
"$type": "RemoteDataArchiveDbCredentialSetting",
1023+
"SettingKind": s.SettingKind,
1024+
}
1025+
if s.Credential != nil {
1026+
node["Credential"] = identifierToJSON(s.Credential)
1027+
}
1028+
return node
1029+
case *ast.RemoteDataArchiveDbFederatedServiceAccountSetting:
1030+
return jsonNode{
1031+
"$type": "RemoteDataArchiveDbFederatedServiceAccountSetting",
1032+
"IsOn": s.IsOn,
1033+
"SettingKind": s.SettingKind,
1034+
}
1035+
default:
1036+
return jsonNode{"$type": "UnknownRemoteDataArchiveDbSetting"}
1037+
}
1038+
}
1039+
9951040
func indexDefinitionToJSON(idx *ast.IndexDefinition) jsonNode {
9961041
node := jsonNode{
9971042
"$type": "IndexDefinition",

parser/parse_ddl.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,6 +1885,12 @@ func (p *Parser) parseAlterDatabaseSetStatement(dbName *ast.Identifier) (*ast.Al
18851885
}
18861886
}
18871887
stmt.Options = append(stmt.Options, opt)
1888+
case "REMOTE_DATA_ARCHIVE":
1889+
rdaOpt, err := p.parseRemoteDataArchiveOption()
1890+
if err != nil {
1891+
return nil, err
1892+
}
1893+
stmt.Options = append(stmt.Options, rdaOpt)
18881894
default:
18891895
// Handle generic options with = syntax (e.g., OPTIMIZED_LOCKING = ON)
18901896
if p.curTok.Type == TokenEquals {
@@ -1933,6 +1939,86 @@ func (p *Parser) parseAlterDatabaseSetStatement(dbName *ast.Identifier) (*ast.Al
19331939
return stmt, nil
19341940
}
19351941

1942+
// parseRemoteDataArchiveOption parses REMOTE_DATA_ARCHIVE option
1943+
// Forms:
1944+
// - REMOTE_DATA_ARCHIVE = ON (options...)
1945+
// - REMOTE_DATA_ARCHIVE = OFF
1946+
// - REMOTE_DATA_ARCHIVE (options...) -- OptionState is "NotSet"
1947+
func (p *Parser) parseRemoteDataArchiveOption() (*ast.RemoteDataArchiveDatabaseOption, error) {
1948+
opt := &ast.RemoteDataArchiveDatabaseOption{
1949+
OptionKind: "RemoteDataArchive",
1950+
OptionState: "NotSet",
1951+
}
1952+
1953+
// Check for = ON/OFF or just (
1954+
if p.curTok.Type == TokenEquals {
1955+
p.nextToken() // consume =
1956+
stateVal := strings.ToUpper(p.curTok.Literal)
1957+
opt.OptionState = capitalizeFirst(stateVal)
1958+
p.nextToken() // consume ON/OFF
1959+
}
1960+
1961+
// Parse settings if we have (
1962+
if p.curTok.Type == TokenLParen {
1963+
p.nextToken() // consume (
1964+
for {
1965+
settingName := strings.ToUpper(p.curTok.Literal)
1966+
p.nextToken() // consume setting name
1967+
1968+
if p.curTok.Type != TokenEquals {
1969+
return nil, fmt.Errorf("expected = after %s, got %s", settingName, p.curTok.Literal)
1970+
}
1971+
p.nextToken() // consume =
1972+
1973+
switch settingName {
1974+
case "SERVER":
1975+
// Parse string literal
1976+
server, err := p.parseScalarExpression()
1977+
if err != nil {
1978+
return nil, err
1979+
}
1980+
setting := &ast.RemoteDataArchiveDbServerSetting{
1981+
SettingKind: "Server",
1982+
Server: server,
1983+
}
1984+
opt.Settings = append(opt.Settings, setting)
1985+
case "CREDENTIAL":
1986+
// Parse identifier (may be bracketed)
1987+
cred := p.parseIdentifier()
1988+
setting := &ast.RemoteDataArchiveDbCredentialSetting{
1989+
SettingKind: "Credential",
1990+
Credential: cred,
1991+
}
1992+
opt.Settings = append(opt.Settings, setting)
1993+
case "FEDERATED_SERVICE_ACCOUNT":
1994+
// Parse ON/OFF
1995+
isOn := strings.ToUpper(p.curTok.Literal) == "ON"
1996+
p.nextToken()
1997+
setting := &ast.RemoteDataArchiveDbFederatedServiceAccountSetting{
1998+
SettingKind: "FederatedServiceAccount",
1999+
IsOn: isOn,
2000+
}
2001+
opt.Settings = append(opt.Settings, setting)
2002+
default:
2003+
return nil, fmt.Errorf("unknown REMOTE_DATA_ARCHIVE setting: %s", settingName)
2004+
}
2005+
2006+
if p.curTok.Type == TokenComma {
2007+
p.nextToken()
2008+
} else {
2009+
break
2010+
}
2011+
}
2012+
2013+
if p.curTok.Type != TokenRParen {
2014+
return nil, fmt.Errorf("expected ) after REMOTE_DATA_ARCHIVE settings, got %s", p.curTok.Literal)
2015+
}
2016+
p.nextToken() // consume )
2017+
}
2018+
2019+
return opt, nil
2020+
}
2021+
19362022
func (p *Parser) parseAlterDatabaseAddStatement(dbName *ast.Identifier) (ast.Statement, error) {
19372023
// Consume ADD
19382024
p.nextToken()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)