Skip to content

Commit 53b9eb6

Browse files
authored
Fix wrongly parsed the Enum type with values (#109)
1 parent 2e25715 commit 53b9eb6

5 files changed

+507
-5
lines changed

parser/ast.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3693,6 +3693,7 @@ func (e *EnumValue) Accept(visitor ASTVisitor) error {
36933693
}
36943694

36953695
type EnumValueList struct {
3696+
Name *Ident
36963697
ListPos Pos
36973698
ListEnd Pos
36983699
Enums []EnumValue
@@ -3708,18 +3709,24 @@ func (e *EnumValueList) End() Pos {
37083709

37093710
func (e *EnumValueList) String() string {
37103711
var builder strings.Builder
3712+
builder.WriteString(e.Name.String())
3713+
builder.WriteByte('(')
37113714
for i, enum := range e.Enums {
37123715
if i > 0 {
37133716
builder.WriteString(", ")
37143717
}
37153718
builder.WriteString(enum.String())
37163719
}
3720+
builder.WriteByte(')')
37173721
return builder.String()
37183722
}
37193723

37203724
func (e *EnumValueList) Accept(visitor ASTVisitor) error {
37213725
visitor.enter(e)
37223726
defer visitor.leave(e)
3727+
if err := e.Name.Accept(visitor); err != nil {
3728+
return err
3729+
}
37233730
for i := range e.Enums {
37243731
if err := e.Enums[i].Accept(visitor); err != nil {
37253732
return err

parser/parser_column.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ func (p *Parser) parseColumnType(_ Pos) (Expr, error) { // nolint:funlen
767767
case p.matchTokenKind(TokenString):
768768
if peekToken, err := p.lexer.peekToken(); err == nil && peekToken.Kind == opTypeEQ {
769769
// enum values
770-
return p.parseEnumExpr(p.Pos())
770+
return p.parseEnumExpr(ident,p.Pos())
771771
}
772772
// like Datetime('Asia/Dubai')
773773
return p.parseColumnTypeWithParams(ident, p.Pos())
@@ -815,8 +815,9 @@ func (p *Parser) parseComplexType(name *Ident, pos Pos) (Expr, error) {
815815
}, nil
816816
}
817817

818-
func (p *Parser) parseEnumExpr(pos Pos) (*EnumValueList, error) {
818+
func (p *Parser) parseEnumExpr(name *Ident, pos Pos) (*EnumValueList, error) {
819819
enumValueList := &EnumValueList{
820+
Name: name,
820821
ListPos: pos,
821822
Enums: make([]EnumValue, 0),
822823
}
@@ -948,9 +949,6 @@ func (p *Parser) tryParseCompressionCodecs(pos Pos) (*CompressionCodec, error) {
948949
}
949950

950951
func (p *Parser) parseEnumValueExpr(pos Pos) (*EnumValue, error) {
951-
if _, err := p.consumeTokenKind(TokenString); err != nil {
952-
return nil, err
953-
}
954952
name, err := p.parseString(pos)
955953
if err != nil {
956954
return nil, err
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE TABLE t0 on cluster default_cluster
2+
(
3+
`method` Enum8('GET'=1 , 'POST'=2, 'HEAD'=3, 'PUT'=4,'PATCH'=5, 'DELETE'=6, 'CONNECT'=7, 'OPTIONS'=8, 'TRACE'=9) CODEC(ZSTD(1)),
4+
`timestamp` DateTime64(3) CODEC(DoubleDelta, ZSTD)
5+
)
6+
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}', '{replica}')
7+
PARTITION BY toDate(timestamp)
8+
ORDER BY (method,timestamp)
9+
TTL toDate(timestamp) + toIntervalDay(3)
10+
SETTINGS index_granularity = 8192;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- Origin SQL:
2+
CREATE TABLE t0 on cluster default_cluster
3+
(
4+
`method` Enum8('GET'=1 , 'POST'=2, 'HEAD'=3, 'PUT'=4,'PATCH'=5, 'DELETE'=6, 'CONNECT'=7, 'OPTIONS'=8, 'TRACE'=9) CODEC(ZSTD(1)),
5+
`timestamp` DateTime64(3) CODEC(DoubleDelta, ZSTD)
6+
)
7+
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}', '{replica}')
8+
PARTITION BY toDate(timestamp)
9+
ORDER BY (method,timestamp)
10+
TTL toDate(timestamp) + toIntervalDay(3)
11+
SETTINGS index_granularity = 8192;
12+
13+
-- Format SQL:
14+
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);

0 commit comments

Comments
 (0)