Skip to content

Commit 60759d4

Browse files
authored
Support multiple WINDOW definitions; expand window function tests (#208)
1 parent 0b8b2e3 commit 60759d4

19 files changed

+4095
-186
lines changed

parser/ast.go

Lines changed: 103 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6658,42 +6658,82 @@ func (w *WindowExpr) Accept(visitor ASTVisitor) error {
66586658
return visitor.VisitWindowConditionExpr(w)
66596659
}
66606660

6661-
type WindowClause struct {
6662-
*WindowExpr
6661+
type WindowDefinition struct {
6662+
Name *Ident
6663+
AsPos Pos
6664+
Expr *WindowExpr
6665+
}
6666+
6667+
func (w *WindowDefinition) Pos() Pos {
6668+
if w == nil || w.Name == nil {
6669+
return 0
6670+
}
6671+
return w.Name.Pos()
6672+
}
6673+
6674+
func (w *WindowDefinition) End() Pos {
6675+
if w == nil || w.Expr == nil {
6676+
return 0
6677+
}
6678+
return w.Expr.End()
6679+
}
6680+
6681+
func (w *WindowDefinition) String() string {
6682+
var builder strings.Builder
6683+
builder.WriteString(w.Name.String())
6684+
builder.WriteString(" AS ")
6685+
builder.WriteString(w.Expr.String())
6686+
return builder.String()
6687+
}
66636688

6689+
type WindowClause struct {
66646690
WindowPos Pos
6665-
Name *Ident
6666-
AsPos Pos
6691+
EndPos Pos
6692+
Windows []*WindowDefinition
66676693
}
66686694

66696695
func (w *WindowClause) Pos() Pos {
66706696
return w.WindowPos
66716697
}
66726698

66736699
func (w *WindowClause) End() Pos {
6674-
return w.WindowExpr.End()
6700+
if w.EndPos != 0 {
6701+
return w.EndPos
6702+
}
6703+
if len(w.Windows) == 0 {
6704+
return w.WindowPos
6705+
}
6706+
return w.Windows[len(w.Windows)-1].End()
66756707
}
66766708

66776709
func (w *WindowClause) String() string {
66786710
var builder strings.Builder
66796711
builder.WriteString("WINDOW ")
6680-
builder.WriteString(w.Name.String())
6681-
builder.WriteString(" AS ")
6682-
builder.WriteString(w.WindowExpr.String())
6712+
for i, window := range w.Windows {
6713+
builder.WriteString(window.String())
6714+
if i != len(w.Windows)-1 {
6715+
builder.WriteString(", ")
6716+
}
6717+
}
66836718
return builder.String()
66846719
}
66856720

66866721
func (w *WindowClause) Accept(visitor ASTVisitor) error {
66876722
visitor.Enter(w)
66886723
defer visitor.Leave(w)
6689-
if w.WindowExpr != nil {
6690-
if err := w.WindowExpr.Accept(visitor); err != nil {
6691-
return err
6724+
for _, window := range w.Windows {
6725+
if window == nil {
6726+
continue
66926727
}
6693-
}
6694-
if w.Name != nil {
6695-
if err := w.Name.Accept(visitor); err != nil {
6696-
return err
6728+
if window.Name != nil {
6729+
if err := window.Name.Accept(visitor); err != nil {
6730+
return err
6731+
}
6732+
}
6733+
if window.Expr != nil {
6734+
if err := window.Expr.Accept(visitor); err != nil {
6735+
return err
6736+
}
66976737
}
66986738
}
66996739
return visitor.VisitWindowExpr(w)
@@ -6731,19 +6771,30 @@ func (f *WindowFrameClause) Accept(visitor ASTVisitor) error {
67316771
}
67326772

67336773
type WindowFrameExtendExpr struct {
6734-
Expr Expr
6774+
Expr Expr
6775+
Direction string
6776+
EndPos Pos
67356777
}
67366778

67376779
func (f *WindowFrameExtendExpr) Pos() Pos {
67386780
return f.Expr.Pos()
67396781
}
67406782

67416783
func (f *WindowFrameExtendExpr) End() Pos {
6784+
if f.EndPos != 0 {
6785+
return f.EndPos
6786+
}
67426787
return f.Expr.End()
67436788
}
67446789

67456790
func (f *WindowFrameExtendExpr) String() string {
6746-
return f.Expr.String()
6791+
var builder strings.Builder
6792+
builder.WriteString(f.Expr.String())
6793+
if f.Direction != "" {
6794+
builder.WriteByte(' ')
6795+
builder.WriteString(f.Direction)
6796+
}
6797+
return builder.String()
67476798
}
67486799

67496800
func (f *WindowFrameExtendExpr) Accept(visitor ASTVisitor) error {
@@ -6850,17 +6901,17 @@ func (f *WindowFrameUnbounded) Accept(visitor ASTVisitor) error {
68506901
}
68516902

68526903
type WindowFrameNumber struct {
6853-
Number *NumberLiteral
6854-
UnboundedEnd Pos
6855-
Direction string
6904+
Number *NumberLiteral
6905+
EndPos Pos
6906+
Direction string
68566907
}
68576908

68586909
func (f *WindowFrameNumber) Pos() Pos {
68596910
return f.Number.Pos()
68606911
}
68616912

68626913
func (f *WindowFrameNumber) End() Pos {
6863-
return f.UnboundedEnd
6914+
return f.EndPos
68646915
}
68656916

68666917
func (f *WindowFrameNumber) String() string {
@@ -6880,6 +6931,37 @@ func (f *WindowFrameNumber) Accept(visitor ASTVisitor) error {
68806931
return visitor.VisitWindowFrameNumber(f)
68816932
}
68826933

6934+
type WindowFrameParam struct {
6935+
Param *QueryParam
6936+
EndPos Pos
6937+
Direction string
6938+
}
6939+
6940+
func (f *WindowFrameParam) Pos() Pos {
6941+
return f.Param.Pos()
6942+
}
6943+
6944+
func (f *WindowFrameParam) End() Pos {
6945+
return f.EndPos
6946+
}
6947+
6948+
func (f *WindowFrameParam) String() string {
6949+
var builder strings.Builder
6950+
builder.WriteString(f.Param.String())
6951+
builder.WriteByte(' ')
6952+
builder.WriteString(f.Direction)
6953+
return builder.String()
6954+
}
6955+
6956+
func (f *WindowFrameParam) Accept(visitor ASTVisitor) error {
6957+
visitor.Enter(f)
6958+
defer visitor.Leave(f)
6959+
if err := f.Param.Accept(visitor); err != nil {
6960+
return err
6961+
}
6962+
return visitor.VisitWindowFrameParam(f)
6963+
}
6964+
68836965
type ArrayJoinClause struct {
68846966
ArrayPos Pos
68856967
Type string

parser/ast_visitor.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ type ASTVisitor interface {
148148
VisitWindowFrameCurrentRow(expr *WindowFrameCurrentRow) error
149149
VisitWindowFrameUnbounded(expr *WindowFrameUnbounded) error
150150
VisitWindowFrameNumber(expr *WindowFrameNumber) error
151+
VisitWindowFrameParam(expr *WindowFrameParam) error
151152
VisitArrayJoinExpr(expr *ArrayJoinClause) error
152153
VisitSelectQuery(expr *SelectQuery) error
153154
VisitSubQueryExpr(expr *SubQuery) error
@@ -1228,6 +1229,13 @@ func (v *DefaultASTVisitor) VisitWindowFrameNumber(expr *WindowFrameNumber) erro
12281229
return nil
12291230
}
12301231

1232+
func (v *DefaultASTVisitor) VisitWindowFrameParam(expr *WindowFrameParam) error {
1233+
if v.Visit != nil {
1234+
return v.Visit(expr)
1235+
}
1236+
return nil
1237+
}
1238+
12311239
func (v *DefaultASTVisitor) VisitArrayJoinExpr(expr *ArrayJoinClause) error {
12321240
if v.Visit != nil {
12331241
return v.Visit(expr)

0 commit comments

Comments
 (0)