@@ -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
66696695func (w * WindowClause ) Pos () Pos {
66706696 return w .WindowPos
66716697}
66726698
66736699func (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
66776709func (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
66866721func (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
67336773type WindowFrameExtendExpr struct {
6734- Expr Expr
6774+ Expr Expr
6775+ Direction string
6776+ EndPos Pos
67356777}
67366778
67376779func (f * WindowFrameExtendExpr ) Pos () Pos {
67386780 return f .Expr .Pos ()
67396781}
67406782
67416783func (f * WindowFrameExtendExpr ) End () Pos {
6784+ if f .EndPos != 0 {
6785+ return f .EndPos
6786+ }
67426787 return f .Expr .End ()
67436788}
67446789
67456790func (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
67496800func (f * WindowFrameExtendExpr ) Accept (visitor ASTVisitor ) error {
@@ -6850,17 +6901,17 @@ func (f *WindowFrameUnbounded) Accept(visitor ASTVisitor) error {
68506901}
68516902
68526903type WindowFrameNumber struct {
6853- Number * NumberLiteral
6854- UnboundedEnd Pos
6855- Direction string
6904+ Number * NumberLiteral
6905+ EndPos Pos
6906+ Direction string
68566907}
68576908
68586909func (f * WindowFrameNumber ) Pos () Pos {
68596910 return f .Number .Pos ()
68606911}
68616912
68626913func (f * WindowFrameNumber ) End () Pos {
6863- return f .UnboundedEnd
6914+ return f .EndPos
68646915}
68656916
68666917func (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+
68836965type ArrayJoinClause struct {
68846966 ArrayPos Pos
68856967 Type string
0 commit comments