Skip to content

Commit 8bea76f

Browse files
authored
Fix the expr might be empty in window frame cause (#127)
1 parent 62ed1c8 commit 8bea76f

File tree

5 files changed

+297
-4
lines changed

5 files changed

+297
-4
lines changed

parser/ast.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5199,7 +5199,10 @@ type BetweenClause struct {
51995199
}
52005200

52015201
func (f *BetweenClause) Pos() Pos {
5202-
return f.Expr.Pos()
5202+
if f.Expr != nil {
5203+
return f.Expr.Pos()
5204+
}
5205+
return f.Between.Pos()
52035206
}
52045207

52055208
func (f *BetweenClause) End() Pos {
@@ -5208,7 +5211,9 @@ func (f *BetweenClause) End() Pos {
52085211

52095212
func (f *BetweenClause) String() string {
52105213
var builder strings.Builder
5211-
builder.WriteString(f.Expr.String())
5214+
if f.Expr != nil {
5215+
builder.WriteString(f.Expr.String())
5216+
}
52125217
builder.WriteString(" BETWEEN ")
52135218
builder.WriteString(f.Between.String())
52145219
builder.WriteString(" AND ")
@@ -5266,7 +5271,7 @@ func (f *WindowFrameUnbounded) End() Pos {
52665271
}
52675272

52685273
func (f *WindowFrameUnbounded) String() string {
5269-
return f.Direction + " UNBOUNDED"
5274+
return "UNBOUNDED " + f.Direction
52705275
}
52715276

52725277
func (f *WindowFrameUnbounded) Accept(visitor ASTVisitor) error {

parser/parser_query.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ func (p *Parser) parseWindowFrameClause(pos Pos) (*WindowFrameClause, error) {
574574
return nil, err
575575
}
576576
expr = &BetweenClause{
577-
Expr: expr,
578577
Between: betweenWindowFrame,
579578
AndPos: andPos,
580579
And: andWindowFrame,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- Origin SQL:
2+
SELECT aggregation_target AS aggregation_target,
3+
timestamp AS timestamp,
4+
step_0 AS step_0,
5+
latest_0 AS latest_0,
6+
step_1 AS step_1,
7+
latest_1 AS latest_1,
8+
step_2 AS step_2,
9+
min(latest_2) OVER (PARTITION BY aggregation_target
10+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2
11+
FROM t0
12+
13+
-- Format SQL:
14+
SELECT aggregation_target AS aggregation_target, timestamp AS timestamp, step_0 AS step_0, latest_0 AS latest_0, step_1 AS step_1, latest_1 AS latest_1, step_2 AS step_2, min(latest_2) OVER ( PARTITION BY aggregation_target ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2 FROM t0;
Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
[
2+
{
3+
"SelectPos": 0,
4+
"StatementEnd": 348,
5+
"With": null,
6+
"Top": null,
7+
"SelectItems": [
8+
{
9+
"Expr": {
10+
"Name": "aggregation_target",
11+
"QuoteType": 1,
12+
"NamePos": 7,
13+
"NameEnd": 25
14+
},
15+
"Modifiers": [],
16+
"Alias": {
17+
"Name": "aggregation_target",
18+
"QuoteType": 1,
19+
"NamePos": 29,
20+
"NameEnd": 47
21+
}
22+
},
23+
{
24+
"Expr": {
25+
"Name": "timestamp",
26+
"QuoteType": 1,
27+
"NamePos": 53,
28+
"NameEnd": 62
29+
},
30+
"Modifiers": [],
31+
"Alias": {
32+
"Name": "timestamp",
33+
"QuoteType": 1,
34+
"NamePos": 66,
35+
"NameEnd": 75
36+
}
37+
},
38+
{
39+
"Expr": {
40+
"Name": "step_0",
41+
"QuoteType": 1,
42+
"NamePos": 81,
43+
"NameEnd": 87
44+
},
45+
"Modifiers": [],
46+
"Alias": {
47+
"Name": "step_0",
48+
"QuoteType": 1,
49+
"NamePos": 91,
50+
"NameEnd": 97
51+
}
52+
},
53+
{
54+
"Expr": {
55+
"Name": "latest_0",
56+
"QuoteType": 1,
57+
"NamePos": 103,
58+
"NameEnd": 111
59+
},
60+
"Modifiers": [],
61+
"Alias": {
62+
"Name": "latest_0",
63+
"QuoteType": 1,
64+
"NamePos": 115,
65+
"NameEnd": 123
66+
}
67+
},
68+
{
69+
"Expr": {
70+
"Name": "step_1",
71+
"QuoteType": 1,
72+
"NamePos": 129,
73+
"NameEnd": 135
74+
},
75+
"Modifiers": [],
76+
"Alias": {
77+
"Name": "step_1",
78+
"QuoteType": 1,
79+
"NamePos": 139,
80+
"NameEnd": 145
81+
}
82+
},
83+
{
84+
"Expr": {
85+
"Name": "latest_1",
86+
"QuoteType": 1,
87+
"NamePos": 151,
88+
"NameEnd": 159
89+
},
90+
"Modifiers": [],
91+
"Alias": {
92+
"Name": "latest_1",
93+
"QuoteType": 1,
94+
"NamePos": 163,
95+
"NameEnd": 171
96+
}
97+
},
98+
{
99+
"Expr": {
100+
"Name": "step_2",
101+
"QuoteType": 1,
102+
"NamePos": 177,
103+
"NameEnd": 183
104+
},
105+
"Modifiers": [],
106+
"Alias": {
107+
"Name": "step_2",
108+
"QuoteType": 1,
109+
"NamePos": 187,
110+
"NameEnd": 193
111+
}
112+
},
113+
{
114+
"Expr": {
115+
"Function": {
116+
"Name": {
117+
"Name": "min",
118+
"QuoteType": 1,
119+
"NamePos": 199,
120+
"NameEnd": 202
121+
},
122+
"Params": {
123+
"LeftParenPos": 202,
124+
"RightParenPos": 211,
125+
"Items": {
126+
"ListPos": 203,
127+
"ListEnd": 211,
128+
"HasDistinct": false,
129+
"Items": [
130+
{
131+
"Expr": {
132+
"Name": "latest_2",
133+
"QuoteType": 1,
134+
"NamePos": 203,
135+
"NameEnd": 211
136+
},
137+
"Alias": null
138+
}
139+
]
140+
},
141+
"ColumnArgList": null
142+
}
143+
},
144+
"OverPos": 213,
145+
"OverExpr": {
146+
"LeftParenPos": 218,
147+
"RightParenPos": 327,
148+
"PartitionBy": {
149+
"PartitionPos": 218,
150+
"Expr": {
151+
"ListPos": 232,
152+
"ListEnd": 250,
153+
"HasDistinct": false,
154+
"Items": [
155+
{
156+
"Expr": {
157+
"Name": "aggregation_target",
158+
"QuoteType": 1,
159+
"NamePos": 232,
160+
"NameEnd": 250
161+
},
162+
"Alias": null
163+
}
164+
]
165+
}
166+
},
167+
"OrderBy": {
168+
"OrderPos": 255,
169+
"ListEnd": 273,
170+
"Items": [
171+
{
172+
"OrderPos": 255,
173+
"Expr": {
174+
"Name": "timestamp",
175+
"QuoteType": 1,
176+
"NamePos": 264,
177+
"NameEnd": 273
178+
},
179+
"Alias": null,
180+
"Direction": "DESC"
181+
}
182+
]
183+
},
184+
"Frame": {
185+
"FramePos": 279,
186+
"Type": "ROWS",
187+
"Extend": {
188+
"Expr": null,
189+
"Between": {
190+
"FramePos": 292,
191+
"Type": "",
192+
"Extend": {
193+
"UnboundedPos": 292,
194+
"UnboundedEnd": 0,
195+
"Direction": "PRECEDING"
196+
}
197+
},
198+
"AndPos": 312,
199+
"And": {
200+
"FramePos": 316,
201+
"Type": "",
202+
"Extend": {
203+
"Number": {
204+
"NumPos": 316,
205+
"NumEnd": 317,
206+
"Literal": "0",
207+
"Base": 10
208+
},
209+
"UnboundedEnd": 327,
210+
"Direction": "PRECEDING"
211+
}
212+
}
213+
}
214+
}
215+
}
216+
},
217+
"Modifiers": [],
218+
"Alias": {
219+
"Name": "latest_2",
220+
"QuoteType": 1,
221+
"NamePos": 332,
222+
"NameEnd": 340
223+
}
224+
}
225+
],
226+
"From": {
227+
"FromPos": 341,
228+
"Expr": {
229+
"Table": {
230+
"TablePos": 346,
231+
"TableEnd": 348,
232+
"Alias": null,
233+
"Expr": {
234+
"Database": null,
235+
"Table": {
236+
"Name": "t0",
237+
"QuoteType": 1,
238+
"NamePos": 346,
239+
"NameEnd": 348
240+
}
241+
},
242+
"HasFinal": false
243+
},
244+
"StatementEnd": 348,
245+
"SampleRatio": null,
246+
"HasFinal": false
247+
}
248+
},
249+
"ArrayJoin": null,
250+
"Window": null,
251+
"Prewhere": null,
252+
"Where": null,
253+
"GroupBy": null,
254+
"WithTotal": false,
255+
"Having": null,
256+
"OrderBy": null,
257+
"LimitBy": null,
258+
"Limit": null,
259+
"Settings": null,
260+
"Format": null,
261+
"UnionAll": null,
262+
"UnionDistinct": null,
263+
"Except": null
264+
}
265+
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
SELECT aggregation_target AS aggregation_target,
2+
timestamp AS timestamp,
3+
step_0 AS step_0,
4+
latest_0 AS latest_0,
5+
step_1 AS step_1,
6+
latest_1 AS latest_1,
7+
step_2 AS step_2,
8+
min(latest_2) OVER (PARTITION BY aggregation_target
9+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2
10+
FROM t0

0 commit comments

Comments
 (0)