Skip to content
Open
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
5 changes: 5 additions & 0 deletions sqlparse/lexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ def get_tokens(self, text, encoding=None):

if not m:
continue
elif action is tokens.Name and m.group().upper() == 'SELECT':
# The function-name lookahead runs before keyword lookup.
# SELECT followed immediately by "(" is still a DML
# keyword, not a function name (see issue #775).
yield tokens.Keyword.DML, m.group()
elif isinstance(action, tokens._TokenType):
yield action, m.group()
elif action is keywords.PROCESS_AS_KEYWORD:
Expand Down
13 changes: 13 additions & 0 deletions tests/test_issue775.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import sqlparse

from sqlparse import sql
from sqlparse import tokens as T


def test_select_followed_by_parenthesis_without_space():
statement = sqlparse.parse('select(select 1)')[0]

assert statement.get_type() == 'SELECT'
assert statement.tokens[0].ttype is T.Keyword.DML
assert statement.tokens[0].value == 'select'
assert isinstance(statement.tokens[1], sql.Parenthesis)