Skip to content

Commit e062ae3

Browse files
kyleconroyclaude
andcommitted
Add DISTRIBUTION option support for CREATE EXTERNAL TABLE
- Add ExternalTableDistributionOption AST type - Add ExternalTableShardedDistributionPolicy for SHARDED(col) - Add ExternalTableRoundRobinDistributionPolicy for ROUND_ROBIN - Add ExternalTableReplicatedDistributionPolicy for REPLICATE - Add parsing and marshaling for all distribution policies Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 4013de1 commit e062ae3

3 files changed

Lines changed: 84 additions & 0 deletions

File tree

ast/external_statements.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,36 @@ type ExternalTableRejectTypeOption struct {
9595

9696
func (o *ExternalTableRejectTypeOption) externalTableOptionItem() {}
9797

98+
// ExternalTableDistributionPolicy is the interface for distribution policies
99+
type ExternalTableDistributionPolicy interface {
100+
externalTableDistributionPolicy()
101+
}
102+
103+
// ExternalTableDistributionOption represents a DISTRIBUTION option
104+
type ExternalTableDistributionOption struct {
105+
OptionKind string
106+
Value ExternalTableDistributionPolicy
107+
}
108+
109+
func (o *ExternalTableDistributionOption) externalTableOptionItem() {}
110+
111+
// ExternalTableShardedDistributionPolicy represents SHARDED distribution
112+
type ExternalTableShardedDistributionPolicy struct {
113+
ShardingColumn *Identifier
114+
}
115+
116+
func (p *ExternalTableShardedDistributionPolicy) externalTableDistributionPolicy() {}
117+
118+
// ExternalTableRoundRobinDistributionPolicy represents ROUND_ROBIN distribution
119+
type ExternalTableRoundRobinDistributionPolicy struct{}
120+
121+
func (p *ExternalTableRoundRobinDistributionPolicy) externalTableDistributionPolicy() {}
122+
123+
// ExternalTableReplicatedDistributionPolicy represents REPLICATE distribution
124+
type ExternalTableReplicatedDistributionPolicy struct{}
125+
126+
func (p *ExternalTableReplicatedDistributionPolicy) externalTableDistributionPolicy() {}
127+
98128
// ExternalTableOption represents a simple option for external table (legacy)
99129
type ExternalTableOption struct {
100130
OptionKind string

parser/marshal.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16697,6 +16697,8 @@ func externalTableOptionItemToJSON(opt ast.ExternalTableOptionItem) jsonNode {
1669716697
return externalTableLiteralOrIdentifierOptionToJSON(o)
1669816698
case *ast.ExternalTableRejectTypeOption:
1669916699
return externalTableRejectTypeOptionToJSON(o)
16700+
case *ast.ExternalTableDistributionOption:
16701+
return externalTableDistributionOptionToJSON(o)
1670016702
default:
1670116703
return jsonNode{}
1670216704
}
@@ -16710,6 +16712,34 @@ func externalTableRejectTypeOptionToJSON(opt *ast.ExternalTableRejectTypeOption)
1671016712
}
1671116713
}
1671216714

16715+
func externalTableDistributionOptionToJSON(opt *ast.ExternalTableDistributionOption) jsonNode {
16716+
node := jsonNode{
16717+
"$type": "ExternalTableDistributionOption",
16718+
"OptionKind": opt.OptionKind,
16719+
}
16720+
if opt.Value != nil {
16721+
switch v := opt.Value.(type) {
16722+
case *ast.ExternalTableShardedDistributionPolicy:
16723+
policyNode := jsonNode{
16724+
"$type": "ExternalTableShardedDistributionPolicy",
16725+
}
16726+
if v.ShardingColumn != nil {
16727+
policyNode["ShardingColumn"] = identifierToJSON(v.ShardingColumn)
16728+
}
16729+
node["Value"] = policyNode
16730+
case *ast.ExternalTableRoundRobinDistributionPolicy:
16731+
node["Value"] = jsonNode{
16732+
"$type": "ExternalTableRoundRobinDistributionPolicy",
16733+
}
16734+
case *ast.ExternalTableReplicatedDistributionPolicy:
16735+
node["Value"] = jsonNode{
16736+
"$type": "ExternalTableReplicatedDistributionPolicy",
16737+
}
16738+
}
16739+
}
16740+
return node
16741+
}
16742+
1671316743
func externalTableColumnDefinitionToJSON(col *ast.ExternalTableColumnDefinition) jsonNode {
1671416744
node := jsonNode{
1671516745
"$type": "ExternalTableColumnDefinition",

parser/parse_statements.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8567,6 +8567,30 @@ func (p *Parser) parseCreateExternalTableStatement() (*ast.CreateExternalTableSt
85678567
p.nextToken()
85688568
}
85698569
stmt.ExternalTableOptions = append(stmt.ExternalTableOptions, opt)
8570+
case "DISTRIBUTION":
8571+
// Parse DISTRIBUTION = SHARDED(col), ROUND_ROBIN, or REPLICATE
8572+
distVal := strings.ToUpper(p.curTok.Literal)
8573+
p.nextToken()
8574+
opt := &ast.ExternalTableDistributionOption{
8575+
OptionKind: "Distribution",
8576+
}
8577+
if distVal == "SHARDED" {
8578+
if p.curTok.Type == TokenLParen {
8579+
p.nextToken() // consume (
8580+
sharded := &ast.ExternalTableShardedDistributionPolicy{
8581+
ShardingColumn: p.parseIdentifier(),
8582+
}
8583+
if p.curTok.Type == TokenRParen {
8584+
p.nextToken() // consume )
8585+
}
8586+
opt.Value = sharded
8587+
}
8588+
} else if distVal == "ROUND_ROBIN" {
8589+
opt.Value = &ast.ExternalTableRoundRobinDistributionPolicy{}
8590+
} else if distVal == "REPLICATE" {
8591+
opt.Value = &ast.ExternalTableReplicatedDistributionPolicy{}
8592+
}
8593+
stmt.ExternalTableOptions = append(stmt.ExternalTableOptions, opt)
85708594
case "LOCATION", "FILE_FORMAT", "TABLE_OPTIONS":
85718595
opt := &ast.ExternalTableLiteralOrIdentifierOption{
85728596
Value: &ast.IdentifierOrValueExpression{},

0 commit comments

Comments
 (0)