Skip to content

Commit 91718f8

Browse files
authored
Fix positions of Window Clause and string generation (#173)
1 parent 21fc5f0 commit 91718f8

File tree

5 files changed

+151
-21
lines changed

5 files changed

+151
-21
lines changed

parser/ast.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5849,7 +5849,7 @@ func (w *WindowClause) String() string {
58495849
var builder strings.Builder
58505850
builder.WriteString("WINDOW ")
58515851
builder.WriteString(w.Name.String())
5852-
builder.WriteString(" ")
5852+
builder.WriteString(" AS ")
58535853
builder.WriteString(w.WindowExpr.String())
58545854
return builder.String()
58555855
}

parser/parser_query.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -864,13 +864,6 @@ func (p *Parser) parseSelectStmt(pos Pos) (*SelectQuery, error) { // nolint: fun
864864
if arrayJoin != nil {
865865
statementEnd = arrayJoin.End()
866866
}
867-
window, err := p.tryParseWindowClause(p.Pos())
868-
if err != nil {
869-
return nil, err
870-
}
871-
if window != nil {
872-
statementEnd = window.End()
873-
}
874867
prewhere, err := p.tryParsePrewhereClause(p.Pos())
875868
if err != nil {
876869
return nil, err
@@ -892,7 +885,6 @@ func (p *Parser) parseSelectStmt(pos Pos) (*SelectQuery, error) { // nolint: fun
892885
if groupBy != nil {
893886
statementEnd = groupBy.End()
894887
}
895-
896888
withTotal := false
897889
lastPos := p.Pos()
898890
if p.tryConsumeKeywords(KeywordWith) {
@@ -909,6 +901,13 @@ func (p *Parser) parseSelectStmt(pos Pos) (*SelectQuery, error) { // nolint: fun
909901
if having != nil {
910902
statementEnd = having.End()
911903
}
904+
window, err := p.tryParseWindowClause(p.Pos())
905+
if err != nil {
906+
return nil, err
907+
}
908+
if window != nil {
909+
statementEnd = window.End()
910+
}
912911
orderBy, err := p.tryParseOrderByClause(p.Pos())
913912
if err != nil {
914913
return nil, err

parser/testdata/query/format/select_with_window_function.sql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ SELECT aggregation_target AS aggregation_target,
77
latest_1 AS latest_1,
88
step_2 AS step_2,
99
min(latest_2) OVER (PARTITION BY aggregation_target
10-
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2
10+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2,
11+
min(latest_1) OVER w AS latest_1
1112
FROM t0
13+
WINDOW w AS (PARTITION BY aggregation_target
14+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING);
1215

1316
-- 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;
17+
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, min(latest_1) OVER w AS latest_1 FROM t0 WINDOW w AS ( PARTITION BY aggregation_target ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING);

parser/testdata/query/output/select_with_window_function.sql.golden.json

Lines changed: 133 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"SelectPos": 0,
4-
"StatementEnd": 348,
4+
"StatementEnd": 508,
55
"With": null,
66
"Top": null,
77
"HasDistinct": false,
@@ -222,33 +222,158 @@
222222
"NamePos": 332,
223223
"NameEnd": 340
224224
}
225+
},
226+
{
227+
"Expr": {
228+
"Function": {
229+
"Name": {
230+
"Name": "min",
231+
"QuoteType": 1,
232+
"NamePos": 346,
233+
"NameEnd": 349
234+
},
235+
"Params": {
236+
"LeftParenPos": 349,
237+
"RightParenPos": 358,
238+
"Items": {
239+
"ListPos": 350,
240+
"ListEnd": 358,
241+
"HasDistinct": false,
242+
"Items": [
243+
{
244+
"Expr": {
245+
"Name": "latest_1",
246+
"QuoteType": 1,
247+
"NamePos": 350,
248+
"NameEnd": 358
249+
},
250+
"Alias": null
251+
}
252+
]
253+
},
254+
"ColumnArgList": null
255+
}
256+
},
257+
"OverPos": 360,
258+
"OverExpr": {
259+
"Name": "w",
260+
"QuoteType": 1,
261+
"NamePos": 365,
262+
"NameEnd": 366
263+
}
264+
},
265+
"Modifiers": [],
266+
"Alias": {
267+
"Name": "latest_1",
268+
"QuoteType": 1,
269+
"NamePos": 370,
270+
"NameEnd": 378
271+
}
225272
}
226273
],
227274
"From": {
228-
"FromPos": 341,
275+
"FromPos": 379,
229276
"Expr": {
230277
"Table": {
231-
"TablePos": 346,
232-
"TableEnd": 348,
278+
"TablePos": 384,
279+
"TableEnd": 386,
233280
"Alias": null,
234281
"Expr": {
235282
"Database": null,
236283
"Table": {
237284
"Name": "t0",
238285
"QuoteType": 1,
239-
"NamePos": 346,
240-
"NameEnd": 348
286+
"NamePos": 384,
287+
"NameEnd": 386
241288
}
242289
},
243290
"HasFinal": false
244291
},
245-
"StatementEnd": 348,
292+
"StatementEnd": 386,
246293
"SampleRatio": null,
247294
"HasFinal": false
248295
}
249296
},
250297
"ArrayJoin": null,
251-
"Window": null,
298+
"Window": {
299+
"LeftParenPos": 399,
300+
"RightParenPos": 508,
301+
"PartitionBy": {
302+
"PartitionPos": 399,
303+
"Expr": {
304+
"ListPos": 413,
305+
"ListEnd": 431,
306+
"HasDistinct": false,
307+
"Items": [
308+
{
309+
"Expr": {
310+
"Name": "aggregation_target",
311+
"QuoteType": 1,
312+
"NamePos": 413,
313+
"NameEnd": 431
314+
},
315+
"Alias": null
316+
}
317+
]
318+
}
319+
},
320+
"OrderBy": {
321+
"OrderPos": 436,
322+
"ListEnd": 454,
323+
"Items": [
324+
{
325+
"OrderPos": 436,
326+
"Expr": {
327+
"Name": "timestamp",
328+
"QuoteType": 1,
329+
"NamePos": 445,
330+
"NameEnd": 454
331+
},
332+
"Alias": null,
333+
"Direction": "DESC"
334+
}
335+
]
336+
},
337+
"Frame": {
338+
"FramePos": 460,
339+
"Type": "ROWS",
340+
"Extend": {
341+
"Expr": null,
342+
"Between": {
343+
"FramePos": 473,
344+
"Type": "",
345+
"Extend": {
346+
"UnboundedPos": 473,
347+
"UnboundedEnd": 0,
348+
"Direction": "PRECEDING"
349+
}
350+
},
351+
"AndPos": 493,
352+
"And": {
353+
"FramePos": 497,
354+
"Type": "",
355+
"Extend": {
356+
"Number": {
357+
"NumPos": 497,
358+
"NumEnd": 498,
359+
"Literal": "0",
360+
"Base": 10
361+
},
362+
"UnboundedEnd": 508,
363+
"Direction": "PRECEDING"
364+
}
365+
}
366+
}
367+
},
368+
"WindowPos": 387,
369+
"Name": {
370+
"Name": "w",
371+
"QuoteType": 1,
372+
"NamePos": 394,
373+
"NameEnd": 395
374+
},
375+
"AsPos": 0
376+
},
252377
"Prewhere": null,
253378
"Where": null,
254379
"GroupBy": null,

parser/testdata/query/select_with_window_function.sql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ SELECT aggregation_target AS aggregation_target,
66
latest_1 AS latest_1,
77
step_2 AS step_2,
88
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
9+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) AS latest_2,
10+
min(latest_1) OVER w AS latest_1
11+
FROM t0
12+
WINDOW w AS (PARTITION BY aggregation_target
13+
ORDER BY timestamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING);

0 commit comments

Comments
 (0)