Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions parser/parser_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -486,16 +486,22 @@ func (p *Parser) parseTableExpr(pos Pos) (*TableExpr, error) {
return nil, err
}
// it's a table name
if tableIdentifier.Database != nil || !p.matchTokenKind(TokenKindLParen) { // database.table
if !p.matchTokenKind(TokenKindLParen) { // database.table
expr = tableIdentifier
} else {
// table function expr
tableArgs, err := p.parseTableArgList(p.Pos())
if err != nil {
return nil, err
}
// A parameterized view is called like a table function and can
// be qualified with its database: db.view(name = value).
var name Expr = tableIdentifier.Table
if tableIdentifier.Database != nil {
name = tableIdentifier
}
expr = &TableFunctionExpr{
Name: tableIdentifier.Table,
Name: name,
Args: tableArgs,
}
}
Expand Down
5 changes: 5 additions & 0 deletions parser/parser_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,11 @@ func (p *Parser) parseTableArgPrimaryExpr(pos Pos) (Expr, error) {
case p.matchTokenKind(TokenKindInt), p.matchTokenKind(TokenKindFloat),
p.matchTokenKind(TokenKindString), p.matchKeyword(KeywordNull):
return p.parseLiteral(p.Pos())
case p.matchTokenKind(TokenKindLBracket):
return p.parseArrayParams(p.Pos())
case p.matchTokenKind(TokenKindLBrace):
// a query parameter such as {id:UInt64}
return p.parseQueryParam(p.Pos())
default:
return nil, fmt.Errorf("unexpected token: %q, expected <Name>, <literal>", p.currentTokenString())
}
Expand Down
6 changes: 6 additions & 0 deletions parser/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,12 @@ func TestParser_InvalidSyntax(t *testing.T) {
// a leading SEMI or ANTI takes LEFT or RIGHT only
"SELECT * FROM t1 ANTI INNER JOIN t2 ON t1.a = t2.a",
"SELECT * FROM t1 ANTI ANY LEFT JOIN t2 ON t1.a = t2.a",
// arguments of a parameterized view call
"SELECT * FROM db.v(a = {x})", // query parameter without a type
"SELECT * FROM db.v(a = {'k': 1})", // not a query parameter
"SELECT * FROM db.v(a = [1, )", // unterminated array
"SELECT * FROM db.v(a = 1)(b = 2)", // a call takes one argument list
"SELECT * FROM db.t (SELECT 1)", // a subquery cannot follow a table name
}
for _, sql := range invalidSQLs {
parser := NewParser(sql)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- Origin SQL:
SELECT id
FROM db.v(min_id = {min_id:UInt64}, ids = [{id:UInt64}], since = toDateTime64({since:String}, 3)) AS a
INNER JOIN `db.v`(min_id = 1, ids = [1, 2], since = now()) AS b ON a.id = b.id


-- Beautify SQL:
SELECT
id
FROM
db.v(min_id={min_id: UInt64}, ids=[{id: UInt64}], since=toDateTime64({since: String}, 3)) AS a
INNER JOIN
`db.v`(min_id=1, ids=[1, 2], since=now()) AS b ON a.id = b.id;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- Origin SQL:
SELECT id
FROM db.v(min_id = {min_id:UInt64}, ids = [{id:UInt64}], since = toDateTime64({since:String}, 3)) AS a
INNER JOIN `db.v`(min_id = 1, ids = [1, 2], since = now()) AS b ON a.id = b.id


-- Format SQL:
SELECT id FROM db.v(min_id={min_id: UInt64}, ids=[{id: UInt64}], since=toDateTime64({since: String}, 3)) AS a INNER JOIN `db.v`(min_id=1, ids=[1, 2], since=now()) AS b ON a.id = b.id;
Loading
Loading