Skip to content

Commit c884bd5

Browse files
authored
Support single-quoted table names (#199)
1 parent 341967c commit c884bd5

File tree

8 files changed

+101
-5
lines changed

8 files changed

+101
-5
lines changed

parser/ast.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,10 +1545,13 @@ func (i *Ident) End() Pos {
15451545
}
15461546

15471547
func (i *Ident) String() string {
1548-
if i.QuoteType == BackTicks {
1548+
switch i.QuoteType {
1549+
case BackTicks:
15491550
return "`" + i.Name + "`"
1550-
} else if i.QuoteType == DoubleQuote {
1551+
case DoubleQuote:
15511552
return `"` + i.Name + `"`
1553+
case SingleQuote:
1554+
return `'` + i.Name + `'`
15521555
}
15531556
return i.Name
15541557
}

parser/lexer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const (
5050
Unquoted = iota + 1
5151
DoubleQuote
5252
BackTicks
53+
SingleQuote
5354
)
5455

5556
type Pos int

parser/parser_common.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,38 @@ func (p *Parser) parseIdentOrStar() (*Ident, error) {
142142
}
143143
}
144144

145+
func (p *Parser) parseIdentOrString() (*Ident, error) {
146+
switch {
147+
case p.matchTokenKind(TokenKindIdent):
148+
return p.parseIdent()
149+
case p.matchTokenKind(TokenKindString):
150+
lastToken := p.last()
151+
_ = p.lexer.consumeToken()
152+
return &Ident{
153+
NamePos: lastToken.Pos,
154+
NameEnd: lastToken.End,
155+
Name: lastToken.String,
156+
QuoteType: SingleQuote, // Treat string literals as single-quoted identifiers
157+
}, nil
158+
default:
159+
return nil, fmt.Errorf("expected <ident> or <string>, but got %q", p.lastTokenKind())
160+
}
161+
}
162+
145163
func (p *Parser) tryParseDotIdent(_ Pos) (*Ident, error) {
146164
if p.tryConsumeTokenKind(TokenKindDot) == nil {
147165
return nil, nil // nolint
148166
}
149167
return p.parseIdent()
150168
}
151169

170+
func (p *Parser) tryParseDotIdentOrString(_ Pos) (*Ident, error) {
171+
if p.tryConsumeTokenKind(TokenKindDot) == nil {
172+
return nil, nil // nolint
173+
}
174+
return p.parseIdentOrString()
175+
}
176+
152177
func (p *Parser) parseUUID() (*UUID, error) {
153178
if err := p.expectKeyword(KeywordUuid); err != nil {
154179
return nil, err

parser/parser_query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func (p *Parser) parseJoinOp(_ Pos) []string {
230230

231231
func (p *Parser) parseJoinTableExpr(_ Pos) (Expr, error) {
232232
switch {
233-
case p.matchTokenKind(TokenKindIdent), p.matchTokenKind(TokenKindLParen):
233+
case p.matchTokenKind(TokenKindIdent), p.matchTokenKind(TokenKindString), p.matchTokenKind(TokenKindLParen):
234234
tableExpr, err := p.parseTableExpr(p.Pos())
235235
if err != nil {
236236
return nil, err

parser/parser_table.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,11 +331,11 @@ func (p *Parser) parseIdentOrFunction(_ Pos) (Expr, error) {
331331
}
332332

333333
func (p *Parser) parseTableIdentifier(_ Pos) (*TableIdentifier, error) {
334-
ident, err := p.parseIdent()
334+
ident, err := p.parseIdentOrString()
335335
if err != nil {
336336
return nil, err
337337
}
338-
dotIdent, err := p.tryParseDotIdent(p.Pos())
338+
dotIdent, err := p.tryParseDotIdentOrString(p.Pos())
339339
if err != nil {
340340
return nil, err
341341
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-- Origin SQL:
2+
SELECT * FROM 'test_table'
3+
4+
5+
-- Format SQL:
6+
SELECT * FROM 'test_table';
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
[
2+
{
3+
"SelectPos": 0,
4+
"StatementEnd": 25,
5+
"With": null,
6+
"Top": null,
7+
"HasDistinct": false,
8+
"DistinctOn": null,
9+
"SelectItems": [
10+
{
11+
"Expr": {
12+
"Name": "*",
13+
"QuoteType": 0,
14+
"NamePos": 7,
15+
"NameEnd": 7
16+
},
17+
"Modifiers": [],
18+
"Alias": null
19+
}
20+
],
21+
"From": {
22+
"FromPos": 9,
23+
"Expr": {
24+
"Table": {
25+
"TablePos": 15,
26+
"TableEnd": 25,
27+
"Alias": null,
28+
"Expr": {
29+
"Database": null,
30+
"Table": {
31+
"Name": "test_table",
32+
"QuoteType": 4,
33+
"NamePos": 15,
34+
"NameEnd": 25
35+
}
36+
},
37+
"HasFinal": false
38+
},
39+
"StatementEnd": 25,
40+
"SampleRatio": null,
41+
"HasFinal": false
42+
}
43+
},
44+
"ArrayJoin": null,
45+
"Window": null,
46+
"Prewhere": null,
47+
"Where": null,
48+
"GroupBy": null,
49+
"WithTotal": false,
50+
"Having": null,
51+
"OrderBy": null,
52+
"LimitBy": null,
53+
"Limit": null,
54+
"Settings": null,
55+
"Format": null,
56+
"UnionAll": null,
57+
"UnionDistinct": null,
58+
"Except": null
59+
}
60+
]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT * FROM 'test_table'

0 commit comments

Comments
 (0)