Skip to content

Commit 36277e8

Browse files
committed
Implemented support for table aliases with star (SELECT t.* FROM table t) syntax
1 parent d3a7403 commit 36277e8

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

lib/logsql/select_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ func TestToLogsQLSuccess(t *testing.T) {
156156
sql: "SELECT 'hello' FROM logs",
157157
expected: "* | format \"hello\" as literal_hello | fields literal_hello",
158158
},
159+
{
160+
name: "select qualified star",
161+
sql: "SELECT l.* FROM logs l",
162+
expected: "*",
163+
},
159164
{
160165
name: "in list",
161166
sql: "SELECT * FROM logs WHERE service IN ('api', 'worker')",

lib/sql/parser/parser.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,19 @@ type Parser struct {
2121
l *lexer.Lexer
2222
errors []error
2323

24-
curToken token.Token
25-
peekToken token.Token
24+
curToken token.Token
25+
peekToken token.Token
26+
peekToken2 token.Token
2627

2728
depth int // Current recursion depth
2829
}
2930

3031
// New returns a parser over the provided lexer.
3132
func New(l *lexer.Lexer) *Parser {
3233
p := &Parser{l: l, errors: make([]error, 0)}
33-
p.nextToken()
34+
p.curToken = token.Token{}
35+
p.peekToken = p.l.NextToken()
36+
p.peekToken2 = p.l.NextToken()
3437
p.nextToken()
3538
return p
3639
}
@@ -47,11 +50,13 @@ func (p *Parser) addError(pos token.Position, format string, args ...interface{}
4750

4851
func (p *Parser) nextToken() {
4952
p.curToken = p.peekToken
50-
p.peekToken = p.l.NextToken()
53+
p.peekToken = p.peekToken2
54+
p.peekToken2 = p.l.NextToken()
5155
}
5256

53-
func (p *Parser) curTokenIs(t token.Type) bool { return p.curToken.Type == t }
54-
func (p *Parser) peekTokenIs(t token.Type) bool { return p.peekToken.Type == t }
57+
func (p *Parser) curTokenIs(t token.Type) bool { return p.curToken.Type == t }
58+
func (p *Parser) peekTokenIs(t token.Type) bool { return p.peekToken.Type == t }
59+
func (p *Parser) peekPeekTokenIs(t token.Type) bool { return p.peekToken2.Type == t }
5560

5661
func (p *Parser) expectPeek(t token.Type) bool {
5762
if p.peekTokenIs(t) {
@@ -655,6 +660,9 @@ func (p *Parser) parseIdentifier() *ast.Identifier {
655660
func (p *Parser) parseQualifiedName() *ast.Identifier {
656661
parts := []string{p.curToken.Literal}
657662
for p.peekTokenIs(token.DOT) {
663+
if p.peekPeekTokenIs(token.STAR) {
664+
break
665+
}
658666
p.nextToken()
659667
if !p.expectPeek(token.IDENT) {
660668
return &ast.Identifier{Parts: parts}

0 commit comments

Comments
 (0)