Skip to content

Commit 06f1e25

Browse files
authored
Add WITH FILL Support in ORDER BY (#211)
1 parent e1db778 commit 06f1e25

File tree

50 files changed

+2153
-109
lines changed

Some content is hidden

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

50 files changed

+2153
-109
lines changed

parser/ast.go

Lines changed: 186 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3636,18 +3636,98 @@ func (t *TTLClause) Accept(visitor ASTVisitor) error {
36363636
return visitor.VisitTTLExprList(t)
36373637
}
36383638

3639+
type Fill struct {
3640+
FillPos Pos
3641+
From Expr // optional
3642+
To Expr // optional
3643+
Step Expr // optional
3644+
Staleness Expr // optional
3645+
}
3646+
3647+
func (f *Fill) Pos() Pos {
3648+
return f.FillPos
3649+
}
3650+
3651+
func (f *Fill) End() Pos {
3652+
if f.Staleness != nil {
3653+
return f.Staleness.End()
3654+
}
3655+
if f.Step != nil {
3656+
return f.Step.End()
3657+
}
3658+
if f.To != nil {
3659+
return f.To.End()
3660+
}
3661+
if f.From != nil {
3662+
return f.From.End()
3663+
}
3664+
return f.FillPos + Pos(len("FILL"))
3665+
}
3666+
3667+
func (f *Fill) String() string {
3668+
var builder strings.Builder
3669+
builder.WriteString("WITH FILL")
3670+
if f.From != nil {
3671+
builder.WriteString(" FROM ")
3672+
builder.WriteString(f.From.String())
3673+
}
3674+
if f.To != nil {
3675+
builder.WriteString(" TO ")
3676+
builder.WriteString(f.To.String())
3677+
}
3678+
if f.Step != nil {
3679+
builder.WriteString(" STEP ")
3680+
builder.WriteString(f.Step.String())
3681+
}
3682+
if f.Staleness != nil {
3683+
builder.WriteString(" STALENESS ")
3684+
builder.WriteString(f.Staleness.String())
3685+
}
3686+
return builder.String()
3687+
}
3688+
3689+
func (f *Fill) Accept(visitor ASTVisitor) error {
3690+
visitor.Enter(f)
3691+
defer visitor.Leave(f)
3692+
if f.From != nil {
3693+
if err := f.From.Accept(visitor); err != nil {
3694+
return err
3695+
}
3696+
}
3697+
if f.To != nil {
3698+
if err := f.To.Accept(visitor); err != nil {
3699+
return err
3700+
}
3701+
}
3702+
if f.Step != nil {
3703+
if err := f.Step.Accept(visitor); err != nil {
3704+
return err
3705+
}
3706+
}
3707+
if f.Staleness != nil {
3708+
if err := f.Staleness.Accept(visitor); err != nil {
3709+
return err
3710+
}
3711+
}
3712+
return visitor.VisitFill(f)
3713+
}
3714+
36393715
type OrderExpr struct {
36403716
OrderPos Pos
36413717
Expr Expr
36423718
Alias *Ident
36433719
Direction OrderDirection
3720+
Fill *Fill // optional WITH FILL clause
36443721
}
36453722

36463723
func (o *OrderExpr) Pos() Pos {
36473724
return o.OrderPos
36483725
}
36493726

36503727
func (o *OrderExpr) End() Pos {
3728+
if o.Fill != nil {
3729+
return o.Fill.End()
3730+
}
36513731
if o.Alias != nil {
36523732
return o.Alias.End()
36533733
}
@@ -3665,6 +3745,10 @@ func (o *OrderExpr) String() string {
36653745
builder.WriteByte(' ')
36663746
builder.WriteString(string(o.Direction))
36673747
}
3748+
if o.Fill != nil {
3749+
builder.WriteByte(' ')
3750+
builder.WriteString(o.Fill.String())
3751+
}
36683752
return builder.String()
36693753
}
36703754

@@ -3679,20 +3763,110 @@ func (o *OrderExpr) Accept(visitor ASTVisitor) error {
36793763
return err
36803764
}
36813765
}
3766+
if o.Fill != nil {
3767+
if err := o.Fill.Accept(visitor); err != nil {
3768+
return err
3769+
}
3770+
}
36823771
return visitor.VisitOrderByExpr(o)
36833772
}
36843773

3774+
type InterpolateItem struct {
3775+
Column *Ident
3776+
Expr Expr // optional AS expression
3777+
}
3778+
3779+
func (i *InterpolateItem) Pos() Pos {
3780+
return i.Column.Pos()
3781+
}
3782+
3783+
func (i *InterpolateItem) End() Pos {
3784+
if i.Expr != nil {
3785+
return i.Expr.End()
3786+
}
3787+
return i.Column.End()
3788+
}
3789+
3790+
func (i *InterpolateItem) String() string {
3791+
var builder strings.Builder
3792+
builder.WriteString(i.Column.String())
3793+
if i.Expr != nil {
3794+
builder.WriteString(" AS ")
3795+
builder.WriteString(i.Expr.String())
3796+
}
3797+
return builder.String()
3798+
}
3799+
3800+
func (i *InterpolateItem) Accept(visitor ASTVisitor) error {
3801+
visitor.Enter(i)
3802+
defer visitor.Leave(i)
3803+
if err := i.Column.Accept(visitor); err != nil {
3804+
return err
3805+
}
3806+
if i.Expr != nil {
3807+
if err := i.Expr.Accept(visitor); err != nil {
3808+
return err
3809+
}
3810+
}
3811+
return visitor.VisitInterpolateItem(i)
3812+
}
3813+
3814+
type InterpolateClause struct {
3815+
InterpolatePos Pos
3816+
ListEnd Pos
3817+
Items []*InterpolateItem // can be nil for INTERPOLATE without columns
3818+
}
3819+
3820+
func (i *InterpolateClause) Pos() Pos {
3821+
return i.InterpolatePos
3822+
}
3823+
3824+
func (i *InterpolateClause) End() Pos {
3825+
return i.ListEnd
3826+
}
3827+
3828+
func (i *InterpolateClause) String() string {
3829+
var builder strings.Builder
3830+
builder.WriteString("INTERPOLATE")
3831+
if len(i.Items) > 0 {
3832+
builder.WriteString(" (")
3833+
for idx, item := range i.Items {
3834+
builder.WriteString(item.String())
3835+
if idx != len(i.Items)-1 {
3836+
builder.WriteString(", ")
3837+
}
3838+
}
3839+
builder.WriteByte(')')
3840+
}
3841+
return builder.String()
3842+
}
3843+
3844+
func (i *InterpolateClause) Accept(visitor ASTVisitor) error {
3845+
visitor.Enter(i)
3846+
defer visitor.Leave(i)
3847+
for _, item := range i.Items {
3848+
if err := item.Accept(visitor); err != nil {
3849+
return err
3850+
}
3851+
}
3852+
return visitor.VisitInterpolateClause(i)
3853+
}
3854+
36853855
type OrderByClause struct {
3686-
OrderPos Pos
3687-
ListEnd Pos
3688-
Items []Expr
3856+
OrderPos Pos
3857+
ListEnd Pos
3858+
Items []Expr
3859+
Interpolate *InterpolateClause // optional INTERPOLATE clause
36893860
}
36903861

36913862
func (o *OrderByClause) Pos() Pos {
36923863
return o.OrderPos
36933864
}
36943865

36953866
func (o *OrderByClause) End() Pos {
3867+
if o.Interpolate != nil {
3868+
return o.Interpolate.End()
3869+
}
36963870
return o.ListEnd
36973871
}
36983872

@@ -3706,6 +3880,10 @@ func (o *OrderByClause) String() string {
37063880
builder.WriteByte(' ')
37073881
}
37083882
}
3883+
if o.Interpolate != nil {
3884+
builder.WriteByte(' ')
3885+
builder.WriteString(o.Interpolate.String())
3886+
}
37093887
return builder.String()
37103888
}
37113889

@@ -3717,6 +3895,11 @@ func (o *OrderByClause) Accept(visitor ASTVisitor) error {
37173895
return err
37183896
}
37193897
}
3898+
if o.Interpolate != nil {
3899+
if err := o.Interpolate.Accept(visitor); err != nil {
3900+
return err
3901+
}
3902+
}
37203903
return visitor.VisitOrderByListExpr(o)
37213904
}
37223905

parser/ast_visitor.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ type ASTVisitor interface {
7878
VisitRefreshExpr(expr *RefreshExpr) error
7979
VisitOrderByExpr(expr *OrderExpr) error
8080
VisitOrderByListExpr(expr *OrderByClause) error
81+
VisitFill(expr *Fill) error
82+
VisitInterpolateItem(expr *InterpolateItem) error
83+
VisitInterpolateClause(expr *InterpolateClause) error
8184
VisitSettingsExpr(expr *SettingExpr) error
8285
VisitSettingsExprList(expr *SettingsClause) error
8386
VisitParamExprList(expr *ParamExprList) error
@@ -746,6 +749,27 @@ func (v *DefaultASTVisitor) VisitOrderByListExpr(expr *OrderByClause) error {
746749
return nil
747750
}
748751

752+
func (v *DefaultASTVisitor) VisitFill(expr *Fill) error {
753+
if v.Visit != nil {
754+
return v.Visit(expr)
755+
}
756+
return nil
757+
}
758+
759+
func (v *DefaultASTVisitor) VisitInterpolateItem(expr *InterpolateItem) error {
760+
if v.Visit != nil {
761+
return v.Visit(expr)
762+
}
763+
return nil
764+
}
765+
766+
func (v *DefaultASTVisitor) VisitInterpolateClause(expr *InterpolateClause) error {
767+
if v.Visit != nil {
768+
return v.Visit(expr)
769+
}
770+
return nil
771+
}
772+
749773
func (v *DefaultASTVisitor) VisitSettingsExpr(expr *SettingExpr) error {
750774
if v.Visit != nil {
751775
return v.Visit(expr)

parser/keyword.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const (
7878
KeywordFalse = "FALSE"
7979
KeywordFetches = "FETCHES"
8080
KeywordFileSystem = "FILESYSTEM"
81+
KeywordFill = "FILL"
8182
KeywordFinal = "FINAL"
8283
KeywordFirst = "FIRST"
8384
KeywordFlush = "FLUSH"
@@ -110,6 +111,7 @@ const (
110111
KeywordInner = "INNER"
111112
KeywordInsert = "INSERT"
112113
KeywordInterval = "INTERVAL"
114+
KeywordInterpolate = "INTERPOLATE"
113115
KeywordInto = "INTO"
114116
KeywordIp = "IP"
115117
KeywordIs = "IS"
@@ -205,6 +207,8 @@ const (
205207
KeywordSkip = "SKIP"
206208
KeywordSource = "SOURCE"
207209
KeywordStart = "START"
210+
KeywordStaleness = "STALENESS"
211+
KeywordStep = "STEP"
208212
KeywordStop = "STOP"
209213
KeywordSubstring = "SUBSTRING"
210214
KeywordSync = "SYNC"
@@ -328,6 +332,7 @@ var keywords = NewSet(
328332
KeywordFalse,
329333
KeywordFetches,
330334
KeywordFileSystem,
335+
KeywordFill,
331336
KeywordFinal,
332337
KeywordFirst,
333338
KeywordFlush,
@@ -360,6 +365,7 @@ var keywords = NewSet(
360365
KeywordInner,
361366
KeywordInsert,
362367
KeywordInterval,
368+
KeywordInterpolate,
363369
KeywordInto,
364370
KeywordIp,
365371
KeywordIs,
@@ -455,6 +461,8 @@ var keywords = NewSet(
455461
KeywordSkip,
456462
KeywordSource,
457463
KeywordStart,
464+
KeywordStaleness,
465+
KeywordStep,
458466
KeywordStop,
459467
KeywordSubstring,
460468
KeywordSync,

0 commit comments

Comments
 (0)