Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions parser/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -4512,11 +4512,13 @@ func (c *CompressionCodec) String() string {
builder.WriteByte(',')
builder.WriteByte(' ')
}
builder.WriteString(c.Name.String())
if c.Level != nil {
builder.WriteByte('(')
builder.WriteString(c.Level.String())
builder.WriteByte(')')
if c.Name != nil {
builder.WriteString(c.Name.String())
if c.Level != nil {
builder.WriteByte('(')
builder.WriteString(c.Level.String())
builder.WriteByte(')')
}
}
builder.WriteByte(')')
return builder.String()
Expand All @@ -4525,16 +4527,20 @@ func (c *CompressionCodec) String() string {
func (c *CompressionCodec) Accept(visitor ASTVisitor) error {
visitor.Enter(c)
defer visitor.Leave(c)
if err := c.Type.Accept(visitor); err != nil {
return err
if c.Type != nil {
if err := c.Type.Accept(visitor); err != nil {
return err
}
}
if c.TypeLevel != nil {
if err := c.TypeLevel.Accept(visitor); err != nil {
return err
}
}
if err := c.Name.Accept(visitor); err != nil {
return err
if c.Name != nil {
if err := c.Name.Accept(visitor); err != nil {
return err
}
}
if c.Level != nil {
if err := c.Level.Accept(visitor); err != nil {
Expand Down
50 changes: 37 additions & 13 deletions parser/parser_column.go
Original file line number Diff line number Diff line change
Expand Up @@ -1126,39 +1126,48 @@ func (p *Parser) tryParseCompressionCodecs(pos Pos) (*CompressionCodec, error) {
}

// parse codec name
name, err := p.parseIdent()
codecType, err := p.parseIdent()
if err != nil {
return nil, err
}
// parse DELTA if CODEC(Delta, ZSTD(1))
// or CODEC(Delta(9), ZSTD(1)) or CODEC(T64, ZSTD(1))
var codecType *Ident
var name *Ident
var typeLevel *NumberLiteral
switch strings.ToUpper(name.Name) {
switch strings.ToUpper(codecType.Name) {
case "DELTA", "DOUBLEDELTA", "T64", "GORILLA":
codecType = name
// try parse delta level
typeLevel, err = p.tryParseCompressionLevel(p.Pos())
if err != nil {
return nil, err
}
// consume comma
if err := p.expectTokenKind(TokenKindComma); err != nil {
return nil, err

if p.matchTokenKind(TokenKindComma) {
if err := p.expectTokenKind(TokenKindComma); err != nil {
return nil, err
}
name, err = p.parseIdent()
if err != nil {
return nil, err
}
}
name, err = p.parseIdent()
case "ZSTD", "LZ4HC", "LH4":
// For compression codecs, try to parse level
typeLevel, err = p.tryParseCompressionLevel(p.Pos())
if err != nil {
return nil, err
}
}

var level *NumberLiteral
// TODO: check if the codec name is valid
switch strings.ToUpper(name.Name) {
case "ZSTD", "LZ4HC", "LH4":
level, err = p.tryParseCompressionLevel(p.Pos())
if err != nil {
return nil, err
if name != nil {
switch strings.ToUpper(name.Name) {
case "ZSTD", "LZ4HC", "LH4":
level, err = p.tryParseCompressionLevel(p.Pos())
if err != nil {
return nil, err
}
}
}

Expand All @@ -1167,6 +1176,21 @@ func (p *Parser) tryParseCompressionCodecs(pos Pos) (*CompressionCodec, error) {
return nil, err
}

// If there's only one codec (no second name), store it in Name field instead of Type
// This handles cases like CODEC(DoubleDelta) or CODEC(ZSTD(1))
if name == nil {
return &CompressionCodec{
CodecPos: pos,
RightParenPos: rightParenPos,
Type: nil,
TypeLevel: nil,
Name: codecType,
Level: typeLevel,
}, nil
}

// Two codecs: Type is the preprocessing codec, Name is the compression codec
// e.g., CODEC(DoubleDelta, ZSTD(1))
return &CompressionCodec{
CodecPos: pos,
RightParenPos: rightParenPos,
Expand Down
3 changes: 3 additions & 0 deletions parser/testdata/ddl/create_table_codec_no_args.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CREATE TABLE shark_attacks (
timestamp DateTime CODEC(DoubleDelta),
);
7 changes: 7 additions & 0 deletions parser/testdata/ddl/format/create_table_codec_no_args.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Origin SQL:
CREATE TABLE shark_attacks (
timestamp DateTime CODEC(DoubleDelta),
);

-- Format SQL:
CREATE TABLE shark_attacks (timestamp DateTime CODEC(DoubleDelta));
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
[
{
"CreatePos": 0,
"StatementEnd": 0,
"OrReplace": false,
"Name": {
"Database": null,
"Table": {
"Name": "shark_attacks",
"QuoteType": 1,
"NamePos": 13,
"NameEnd": 26
}
},
"IfNotExists": false,
"UUID": null,
"OnCluster": null,
"TableSchema": {
"SchemaPos": 27,
"SchemaEnd": 72,
"Columns": [
{
"NamePos": 33,
"ColumnEnd": 70,
"Name": {
"Ident": {
"Name": "timestamp",
"QuoteType": 1,
"NamePos": 33,
"NameEnd": 42
},
"DotIdent": null
},
"Type": {
"Name": {
"Name": "DateTime",
"QuoteType": 1,
"NamePos": 43,
"NameEnd": 51
}
},
"NotNull": null,
"Nullable": null,
"DefaultExpr": null,
"MaterializedExpr": null,
"AliasExpr": null,
"Codec": {
"CodecPos": 52,
"RightParenPos": 70,
"Type": null,
"TypeLevel": null,
"Name": {
"Name": "DoubleDelta",
"QuoteType": 1,
"NamePos": 58,
"NameEnd": 69
},
"Level": null
},
"TTL": null,
"Comment": null,
"CompressionCodec": null
}
],
"AliasTable": null,
"TableFunction": null
},
"Engine": null,
"SubQuery": null,
"HasTemporary": false,
"Comment": null
}
]