Skip to content

Commit 675fd43

Browse files
authored
Refactor parseExpr to allow to use the priority precedence (#102)
1 parent c1f72b5 commit 675fd43

File tree

63 files changed

+3500
-2494
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+3500
-2494
lines changed

parser/ast.go

Lines changed: 114 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ type SelectItem struct {
2828
Expr Expr
2929
// Please refer: https://clickhouse.com/docs/en/sql-reference/statements/select#select-modifiers
3030
Modifiers []*FunctionExpr
31+
Alias *Ident
3132
}
3233

3334
func (s *SelectItem) Pos() Pos {
3435
return s.Expr.Pos()
3536
}
3637

3738
func (s *SelectItem) End() Pos {
39+
if s.Alias != nil {
40+
return s.Alias.End()
41+
}
3842
if len(s.Modifiers) > 0 {
3943
return s.Modifiers[len(s.Modifiers)-1].End()
4044
}
@@ -48,6 +52,10 @@ func (s *SelectItem) String() string {
4852
builder.WriteByte(' ')
4953
builder.WriteString(modifier.String())
5054
}
55+
if s.Alias != nil {
56+
builder.WriteString(" AS ")
57+
builder.WriteString(s.Alias.String())
58+
}
5159
return builder.String()
5260
}
5361

@@ -62,6 +70,11 @@ func (s *SelectItem) Accept(visitor ASTVisitor) error {
6270
return err
6371
}
6472
}
73+
if s.Alias != nil {
74+
if err := s.Alias.Accept(visitor); err != nil {
75+
return err
76+
}
77+
}
6578
return visitor.VisitSelectItem(s)
6679
}
6780

@@ -552,7 +565,7 @@ type AlterTableAddColumn struct {
552565
AddPos Pos
553566
StatementEnd Pos
554567

555-
Column *ColumnExpr
568+
Column *ColumnDef
556569
IfNotExists bool
557570
After *NestedIdentifier
558571
}
@@ -1190,7 +1203,7 @@ type AlterTableModifyColumn struct {
11901203
StatementEnd Pos
11911204

11921205
IfExists bool
1193-
Column *ColumnExpr
1206+
Column *ColumnDef
11941207
RemovePropertyType *RemovePropertyType
11951208
}
11961209

@@ -1306,7 +1319,7 @@ type TableIndex struct {
13061319
IndexPos Pos
13071320

13081321
Name *NestedIdentifier
1309-
ColumnExpr Expr
1322+
ColumnExpr *ColumnExpr
13101323
ColumnType Expr
13111324
Granularity *NumberLiteral
13121325
}
@@ -1324,9 +1337,9 @@ func (a *TableIndex) String() string {
13241337
builder.WriteString("INDEX")
13251338
builder.WriteByte(' ')
13261339
builder.WriteString(a.Name.String())
1327-
// a.ColumnExpr = *Ident --- e.g. INDEX idx column TYPE ...
1328-
// a.ColumnExpr = *ParamExprList --- e.g. INDEX idx(column) TYPE ...
1329-
if _, ok := a.ColumnExpr.(*Ident); ok {
1340+
// a.ColumnDef = *Ident --- e.g. INDEX idx column TYPE ...
1341+
// a.ColumnDef = *ParamExprList --- e.g. INDEX idx(column) TYPE ...
1342+
if _, ok := a.ColumnExpr.Expr.(*Ident); ok {
13301343
builder.WriteByte(' ')
13311344
}
13321345
builder.WriteString(a.ColumnExpr.String())
@@ -1475,7 +1488,7 @@ type CreateTable struct {
14751488
OnCluster *ClusterClause
14761489
TableSchema *TableSchemaClause
14771490
Engine *EngineExpr
1478-
SubQuery *SubQueryClause
1491+
SubQuery *SubQuery
14791492
HasTemporary bool
14801493
}
14811494

@@ -1518,6 +1531,7 @@ func (c *CreateTable) String() string {
15181531
builder.WriteString(c.Engine.String())
15191532
}
15201533
if c.SubQuery != nil {
1534+
builder.WriteString(" AS ")
15211535
builder.WriteString(c.SubQuery.String())
15221536
}
15231537
return builder.String()
@@ -1562,7 +1576,7 @@ type CreateMaterializedView struct {
15621576
OnCluster *ClusterClause
15631577
Engine *EngineExpr
15641578
Destination *DestinationClause
1565-
SubQuery *SubQueryClause
1579+
SubQuery *SubQuery
15661580
Populate bool
15671581
}
15681582

@@ -1604,6 +1618,7 @@ func (c *CreateMaterializedView) String() string {
16041618
builder.WriteString(" POPULATE ")
16051619
}
16061620
if c.SubQuery != nil {
1621+
builder.WriteString(" AS ")
16071622
builder.WriteString(c.SubQuery.String())
16081623
}
16091624
return builder.String()
@@ -1651,7 +1666,7 @@ type CreateView struct {
16511666
UUID *UUID
16521667
OnCluster *ClusterClause
16531668
TableSchema *TableSchemaClause
1654-
SubQuery *SubQueryClause
1669+
SubQuery *SubQuery
16551670
}
16561671

16571672
func (c *CreateView) Pos() Pos {
@@ -1689,6 +1704,7 @@ func (c *CreateView) String() string {
16891704
}
16901705

16911706
if c.SubQuery != nil {
1707+
builder.WriteString(" AS ")
16921708
builder.WriteString(c.SubQuery.String())
16931709
}
16941710
return builder.String()
@@ -2697,6 +2713,7 @@ func (t *TTLClause) Accept(visitor ASTVisitor) error {
26972713
type OrderExpr struct {
26982714
OrderPos Pos
26992715
Expr Expr
2716+
Alias *Ident
27002717
Direction OrderDirection
27012718
}
27022719

@@ -2705,12 +2722,19 @@ func (o *OrderExpr) Pos() Pos {
27052722
}
27062723

27072724
func (o *OrderExpr) End() Pos {
2725+
if o.Alias != nil {
2726+
return o.Alias.End()
2727+
}
27082728
return o.Expr.End()
27092729
}
27102730

27112731
func (o *OrderExpr) String() string {
27122732
var builder strings.Builder
27132733
builder.WriteString(o.Expr.String())
2734+
if o.Alias != nil {
2735+
builder.WriteString(" AS ")
2736+
builder.WriteString(o.Alias.String())
2737+
}
27142738
if o.Direction != OrderDirectionNone {
27152739
builder.WriteByte(' ')
27162740
builder.WriteString(string(o.Direction))
@@ -2724,6 +2748,11 @@ func (o *OrderExpr) Accept(visitor ASTVisitor) error {
27242748
if err := o.Expr.Accept(visitor); err != nil {
27252749
return err
27262750
}
2751+
if o.Alias != nil {
2752+
if err := o.Alias.Accept(visitor); err != nil {
2753+
return err
2754+
}
2755+
}
27272756
return visitor.VisitOrderByExpr(o)
27282757
}
27292758

@@ -3099,6 +3128,46 @@ func (w *WindowFunctionExpr) Accept(visitor ASTVisitor) error {
30993128
}
31003129

31013130
type ColumnExpr struct {
3131+
Expr Expr
3132+
Alias *Ident
3133+
}
3134+
3135+
func (c *ColumnExpr) Pos() Pos {
3136+
return c.Expr.Pos()
3137+
}
3138+
3139+
func (c *ColumnExpr) End() Pos {
3140+
if c.Alias != nil {
3141+
return c.Alias.NameEnd
3142+
}
3143+
return c.Expr.End()
3144+
}
3145+
3146+
func (c *ColumnExpr) String() string {
3147+
var builder strings.Builder
3148+
builder.WriteString(c.Expr.String())
3149+
if c.Alias != nil {
3150+
builder.WriteString(" AS ")
3151+
builder.WriteString(c.Alias.String())
3152+
}
3153+
return builder.String()
3154+
}
3155+
3156+
func (c *ColumnExpr) Accept(visitor ASTVisitor) error {
3157+
visitor.enter(c)
3158+
defer visitor.leave(c)
3159+
if err := c.Expr.Accept(visitor); err != nil {
3160+
return err
3161+
}
3162+
if c.Alias != nil {
3163+
if err := c.Alias.Accept(visitor); err != nil {
3164+
return err
3165+
}
3166+
}
3167+
return visitor.VisitColumnExpr(c)
3168+
}
3169+
3170+
type ColumnDef struct {
31023171
NamePos Pos
31033172
ColumnEnd Pos
31043173
Name *NestedIdentifier
@@ -3117,15 +3186,15 @@ type ColumnExpr struct {
31173186
CompressionCodec *Ident
31183187
}
31193188

3120-
func (c *ColumnExpr) Pos() Pos {
3189+
func (c *ColumnDef) Pos() Pos {
31213190
return c.Name.Pos()
31223191
}
31233192

3124-
func (c *ColumnExpr) End() Pos {
3193+
func (c *ColumnDef) End() Pos {
31253194
return c.ColumnEnd
31263195
}
31273196

3128-
func (c *ColumnExpr) String() string {
3197+
func (c *ColumnDef) String() string {
31293198
var builder strings.Builder
31303199
builder.WriteString(c.Name.String())
31313200
if c.Type != nil {
@@ -3164,7 +3233,7 @@ func (c *ColumnExpr) String() string {
31643233
return builder.String()
31653234
}
31663235

3167-
func (c *ColumnExpr) Accept(visitor ASTVisitor) error {
3236+
func (c *ColumnDef) Accept(visitor ASTVisitor) error {
31683237
visitor.enter(c)
31693238
defer visitor.leave(c)
31703239
if err := c.Name.Accept(visitor); err != nil {
@@ -3215,7 +3284,7 @@ func (c *ColumnExpr) Accept(visitor ASTVisitor) error {
32153284
return err
32163285
}
32173286
}
3218-
return visitor.VisitColumn(c)
3287+
return visitor.VisitColumnDef(c)
32193288
}
32203289

32213290
type ScalarTypeExpr struct {
@@ -4113,7 +4182,7 @@ type CreateLiveView struct {
41134182
Destination *DestinationClause
41144183
TableSchema *TableSchemaClause
41154184
WithTimeout *WithTimeoutClause
4116-
SubQuery *SubQueryClause
4185+
SubQuery *SubQuery
41174186
}
41184187

41194188
func (c *CreateLiveView) Type() string {
@@ -4157,6 +4226,7 @@ func (c *CreateLiveView) String() string {
41574226
}
41584227

41594228
if c.SubQuery != nil {
4229+
builder.WriteString(" AS ")
41604230
builder.WriteString(c.SubQuery.String())
41614231
}
41624232

@@ -4942,31 +5012,32 @@ func (f *WindowFrameExtendExpr) Accept(visitor ASTVisitor) error {
49425012
return visitor.VisitWindowFrameExtendExpr(f)
49435013
}
49445014

4945-
type WindowFrameRangeClause struct {
4946-
BetweenPos Pos
4947-
Between Expr
4948-
AndPos Pos
4949-
And Expr
5015+
type BetweenClause struct {
5016+
Expr Expr
5017+
Between Expr
5018+
AndPos Pos
5019+
And Expr
49505020
}
49515021

4952-
func (f *WindowFrameRangeClause) Pos() Pos {
4953-
return f.BetweenPos
5022+
func (f *BetweenClause) Pos() Pos {
5023+
return f.Expr.Pos()
49545024
}
49555025

4956-
func (f *WindowFrameRangeClause) End() Pos {
5026+
func (f *BetweenClause) End() Pos {
49575027
return f.And.End()
49585028
}
49595029

4960-
func (f *WindowFrameRangeClause) String() string {
5030+
func (f *BetweenClause) String() string {
49615031
var builder strings.Builder
4962-
builder.WriteString("BETWEEN ")
5032+
builder.WriteString(f.Expr.String())
5033+
builder.WriteString(" BETWEEN ")
49635034
builder.WriteString(f.Between.String())
49645035
builder.WriteString(" AND ")
49655036
builder.WriteString(f.And.String())
49665037
return builder.String()
49675038
}
49685039

4969-
func (f *WindowFrameRangeClause) Accept(visitor ASTVisitor) error {
5040+
func (f *BetweenClause) Accept(visitor ASTVisitor) error {
49705041
visitor.enter(f)
49715042
defer visitor.leave(f)
49725043
if err := f.Between.Accept(visitor); err != nil {
@@ -4975,7 +5046,7 @@ func (f *WindowFrameRangeClause) Accept(visitor ASTVisitor) error {
49755046
if err := f.And.Accept(visitor); err != nil {
49765047
return err
49775048
}
4978-
return visitor.VisitWindowFrameRangeExpr(f)
5049+
return visitor.VisitBetweenClause(f)
49795050
}
49805051

49815052
type WindowFrameCurrentRow struct {
@@ -5298,28 +5369,31 @@ func (s *SelectQuery) Accept(visitor ASTVisitor) error {
52985369
return visitor.VisitSelectQuery(s)
52995370
}
53005371

5301-
type SubQueryClause struct {
5302-
AsPos Pos
5303-
Select *SelectQuery
5372+
type SubQuery struct {
5373+
HasParen bool
5374+
Select *SelectQuery
53045375
}
53055376

5306-
func (s *SubQueryClause) Pos() Pos {
5307-
return s.AsPos
5377+
func (s *SubQuery) Pos() Pos {
5378+
return s.Select.Pos()
53085379
}
53095380

5310-
func (s *SubQueryClause) End() Pos {
5381+
func (s *SubQuery) End() Pos {
53115382
return s.Select.End()
53125383
}
53135384

5314-
func (s *SubQueryClause) String() string {
5315-
var builder strings.Builder
5316-
builder.WriteString(" AS (")
5317-
builder.WriteString(s.Select.String())
5318-
builder.WriteString(")")
5319-
return builder.String()
5385+
func (s *SubQuery) String() string {
5386+
if s.HasParen {
5387+
var builder strings.Builder
5388+
builder.WriteString("(")
5389+
builder.WriteString(s.Select.String())
5390+
builder.WriteString(")")
5391+
return builder.String()
5392+
}
5393+
return s.Select.String()
53205394
}
53215395

5322-
func (s *SubQueryClause) Accept(visitor ASTVisitor) error {
5396+
func (s *SubQuery) Accept(visitor ASTVisitor) error {
53235397
visitor.enter(s)
53245398
defer visitor.leave(s)
53255399
if s.Select != nil {

0 commit comments

Comments
 (0)