Skip to content

Commit

Permalink
Fix wrongly parsed the Enum type with values (#109)
Browse files Browse the repository at this point in the history
  • Loading branch information
git-hulk authored Nov 29, 2024
1 parent 2e25715 commit 53b9eb6
Show file tree
Hide file tree
Showing 5 changed files with 507 additions and 5 deletions.
7 changes: 7 additions & 0 deletions parser/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -3693,6 +3693,7 @@ func (e *EnumValue) Accept(visitor ASTVisitor) error {
}

type EnumValueList struct {
Name *Ident
ListPos Pos
ListEnd Pos
Enums []EnumValue
Expand All @@ -3708,18 +3709,24 @@ func (e *EnumValueList) End() Pos {

func (e *EnumValueList) String() string {
var builder strings.Builder
builder.WriteString(e.Name.String())
builder.WriteByte('(')
for i, enum := range e.Enums {
if i > 0 {
builder.WriteString(", ")
}
builder.WriteString(enum.String())
}
builder.WriteByte(')')
return builder.String()
}

func (e *EnumValueList) Accept(visitor ASTVisitor) error {
visitor.enter(e)
defer visitor.leave(e)
if err := e.Name.Accept(visitor); err != nil {
return err
}
for i := range e.Enums {
if err := e.Enums[i].Accept(visitor); err != nil {
return err
Expand Down
8 changes: 3 additions & 5 deletions parser/parser_column.go
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ func (p *Parser) parseColumnType(_ Pos) (Expr, error) { // nolint:funlen
case p.matchTokenKind(TokenString):
if peekToken, err := p.lexer.peekToken(); err == nil && peekToken.Kind == opTypeEQ {
// enum values
return p.parseEnumExpr(p.Pos())
return p.parseEnumExpr(ident,p.Pos())
}
// like Datetime('Asia/Dubai')
return p.parseColumnTypeWithParams(ident, p.Pos())
Expand Down Expand Up @@ -815,8 +815,9 @@ func (p *Parser) parseComplexType(name *Ident, pos Pos) (Expr, error) {
}, nil
}

func (p *Parser) parseEnumExpr(pos Pos) (*EnumValueList, error) {
func (p *Parser) parseEnumExpr(name *Ident, pos Pos) (*EnumValueList, error) {
enumValueList := &EnumValueList{
Name: name,
ListPos: pos,
Enums: make([]EnumValue, 0),
}
Expand Down Expand Up @@ -948,9 +949,6 @@ func (p *Parser) tryParseCompressionCodecs(pos Pos) (*CompressionCodec, error) {
}

func (p *Parser) parseEnumValueExpr(pos Pos) (*EnumValue, error) {
if _, err := p.consumeTokenKind(TokenString); err != nil {
return nil, err
}
name, err := p.parseString(pos)
if err != nil {
return nil, err
Expand Down
10 changes: 10 additions & 0 deletions parser/testdata/ddl/create_table_with_enum_fields.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE TABLE t0 on cluster default_cluster
(
`method` Enum8('GET'=1 , 'POST'=2, 'HEAD'=3, 'PUT'=4,'PATCH'=5, 'DELETE'=6, 'CONNECT'=7, 'OPTIONS'=8, 'TRACE'=9) CODEC(ZSTD(1)),
`timestamp` DateTime64(3) CODEC(DoubleDelta, ZSTD)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}', '{replica}')
PARTITION BY toDate(timestamp)
ORDER BY (method,timestamp)
TTL toDate(timestamp) + toIntervalDay(3)
SETTINGS index_granularity = 8192;
14 changes: 14 additions & 0 deletions parser/testdata/ddl/format/create_table_with_enum_fields.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-- Origin SQL:
CREATE TABLE t0 on cluster default_cluster
(
`method` Enum8('GET'=1 , 'POST'=2, 'HEAD'=3, 'PUT'=4,'PATCH'=5, 'DELETE'=6, 'CONNECT'=7, 'OPTIONS'=8, 'TRACE'=9) CODEC(ZSTD(1)),
`timestamp` DateTime64(3) CODEC(DoubleDelta, ZSTD)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}', '{replica}')
PARTITION BY toDate(timestamp)
ORDER BY (method,timestamp)
TTL toDate(timestamp) + toIntervalDay(3)
SETTINGS index_granularity = 8192;

-- Format SQL:
CREATE TABLE t0 ON CLUSTER default_cluster (`method` Enum8('GET'=1, 'POST'=2, 'HEAD'=3, 'PUT'=4, 'PATCH'=5, 'DELETE'=6, 'CONNECT'=7, 'OPTIONS'=8, 'TRACE'=9) CODEC(ZSTD(1)), `timestamp` DateTime64(3) CODEC(DoubleDelta, ZSTD)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}', '{replica}') PARTITION BY toDate(timestamp) TTL toDate(timestamp) + toIntervalDay(3) SETTINGS index_granularity=8192 ORDER BY (method, timestamp);
Loading

0 comments on commit 53b9eb6

Please sign in to comment.