Skip to content

Commit 036e3cf

Browse files
authored
Fix column index style wasn't supported in query (#119)
1 parent 2757feb commit 036e3cf

File tree

7 files changed

+148
-9
lines changed

7 files changed

+148
-9
lines changed

parser/ast.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,15 @@ func (p *BinaryOperation) Accept(visitor ASTVisitor) error {
188188
}
189189

190190
type IndexOperation struct {
191-
LeftExpr Expr
191+
Object Expr
192192
Operation TokenKind
193193
Index Expr
194194
}
195195

196196
func (i *IndexOperation) Accept(visitor ASTVisitor) error {
197197
visitor.enter(i)
198198
defer visitor.leave(i)
199-
if err := i.LeftExpr.Accept(visitor); err != nil {
199+
if err := i.Object.Accept(visitor); err != nil {
200200
return err
201201
}
202202
if err := i.Index.Accept(visitor); err != nil {
@@ -206,7 +206,7 @@ func (i *IndexOperation) Accept(visitor ASTVisitor) error {
206206
}
207207

208208
func (i *IndexOperation) Pos() Pos {
209-
return i.LeftExpr.Pos()
209+
return i.Object.Pos()
210210
}
211211

212212
func (i *IndexOperation) End() Pos {
@@ -215,7 +215,7 @@ func (i *IndexOperation) End() Pos {
215215

216216
func (i *IndexOperation) String() string {
217217
var builder strings.Builder
218-
builder.WriteString(i.LeftExpr.String())
218+
builder.WriteString(i.Object.String())
219219
builder.WriteString(string(i.Operation))
220220
builder.WriteString(i.Index.String())
221221
return builder.String()

parser/parser_column.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func (p *Parser) getNextPrecedence() int {
4141
return PrecedenceIs
4242
case p.matchKeyword(KeywordNot):
4343
return PrecedenceNot
44+
case p.matchTokenKind(TokenKindDot):
45+
return PrecedenceDot
4446
case p.matchTokenKind(TokenKindDash):
4547
return PrecedenceDoubleColon
4648
case p.matchTokenKind(TokenKindSingleEQ), p.matchTokenKind(TokenKindLT), p.matchTokenKind(TokenKindLE),
@@ -155,7 +157,7 @@ func (p *Parser) parseInfix(expr Expr, precedence int) (Expr, error) {
155157
return nil, err
156158
}
157159
return &IndexOperation{
158-
LeftExpr: expr,
160+
Object: expr,
159161
Operation: TokenKindDot,
160162
Index: rightExpr,
161163
}, nil

parser/parser_table.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,19 @@ func (p *Parser) parseIdentOrFunction(_ Pos) (Expr, error) {
254254
Ident: ident,
255255
DotIdent: nextIdent,
256256
}, nil
257+
case p.matchTokenKind(TokenKindInt):
258+
i, err := p.parseNumber(p.Pos())
259+
if err != nil {
260+
return nil, err
261+
}
262+
return &IndexOperation{
263+
Object: ident,
264+
Operation: TokenKindDot,
265+
Index: i,
266+
}, nil
267+
default:
268+
return nil, fmt.Errorf("expected IDENT, NUMBER or *, but got %q", p.lastTokenKind())
257269
}
258-
259270
}
260271
return ident, nil
261272
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- Origin SQL:
2+
SELECT foo, bar.1, foo.2 FROM foo ARRAY JOIN m as bar
3+
4+
-- Format SQL:
5+
SELECT foo, bar.1, foo.2 FROM foo ARRAY JOIN m AS bar;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"SelectItems": [
88
{
99
"Expr": {
10-
"LeftExpr": {
10+
"Object": {
1111
"Name": {
1212
"Name": "tuple",
1313
"QuoteType": 1,
@@ -291,7 +291,7 @@
291291
},
292292
{
293293
"Expr": {
294-
"LeftExpr": {
294+
"Object": {
295295
"LeftParenPos": 161,
296296
"RightParenPos": 257,
297297
"Items": {
@@ -485,7 +485,7 @@
485485
},
486486
{
487487
"Expr": {
488-
"LeftExpr": {
488+
"Object": {
489489
"Name": {
490490
"Name": "tuple",
491491
"QuoteType": 1,
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
[
2+
{
3+
"SelectPos": 0,
4+
"StatementEnd": 53,
5+
"With": null,
6+
"Top": null,
7+
"SelectItems": [
8+
{
9+
"Expr": {
10+
"Name": "foo",
11+
"QuoteType": 1,
12+
"NamePos": 7,
13+
"NameEnd": 10
14+
},
15+
"Modifiers": [],
16+
"Alias": null
17+
},
18+
{
19+
"Expr": {
20+
"Object": {
21+
"Name": "bar",
22+
"QuoteType": 1,
23+
"NamePos": 12,
24+
"NameEnd": 15
25+
},
26+
"Operation": ".",
27+
"Index": {
28+
"NumPos": 16,
29+
"NumEnd": 17,
30+
"Literal": "1",
31+
"Base": 10
32+
}
33+
},
34+
"Modifiers": [],
35+
"Alias": null
36+
},
37+
{
38+
"Expr": {
39+
"Object": {
40+
"Name": "foo",
41+
"QuoteType": 1,
42+
"NamePos": 19,
43+
"NameEnd": 22
44+
},
45+
"Operation": ".",
46+
"Index": {
47+
"NumPos": 23,
48+
"NumEnd": 24,
49+
"Literal": "2",
50+
"Base": 10
51+
}
52+
},
53+
"Modifiers": [],
54+
"Alias": null
55+
}
56+
],
57+
"From": {
58+
"FromPos": 25,
59+
"Expr": {
60+
"Table": {
61+
"TablePos": 30,
62+
"TableEnd": 33,
63+
"Alias": null,
64+
"Expr": {
65+
"Database": null,
66+
"Table": {
67+
"Name": "foo",
68+
"QuoteType": 1,
69+
"NamePos": 30,
70+
"NameEnd": 33
71+
}
72+
},
73+
"HasFinal": false
74+
},
75+
"StatementEnd": 33,
76+
"SampleRatio": null,
77+
"HasFinal": false
78+
}
79+
},
80+
"ArrayJoin": {
81+
"ArrayPos": 34,
82+
"Type": "",
83+
"Expr": {
84+
"ListPos": 45,
85+
"ListEnd": 53,
86+
"HasDistinct": false,
87+
"Items": [
88+
{
89+
"Expr": {
90+
"Name": "m",
91+
"QuoteType": 1,
92+
"NamePos": 45,
93+
"NameEnd": 46
94+
},
95+
"Alias": {
96+
"Name": "bar",
97+
"QuoteType": 1,
98+
"NamePos": 50,
99+
"NameEnd": 53
100+
}
101+
}
102+
]
103+
}
104+
},
105+
"Window": null,
106+
"Prewhere": null,
107+
"Where": null,
108+
"GroupBy": null,
109+
"WithTotal": false,
110+
"Having": null,
111+
"OrderBy": null,
112+
"LimitBy": null,
113+
"Limit": null,
114+
"Settings": null,
115+
"Format": null,
116+
"UnionAll": null,
117+
"UnionDistinct": null,
118+
"Except": null
119+
}
120+
]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT foo, bar.1, foo.2 FROM foo ARRAY JOIN m as bar

0 commit comments

Comments
 (0)