Skip to content

Commit 358ad4b

Browse files
committed
Fix parsing of names containing special chars (fixes 291).
1 parent 7dd1ff9 commit 358ad4b

3 files changed

Lines changed: 17 additions & 2 deletions

File tree

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Development Version
44
Bug Fixes
55

66
* Fix parsing of incomplete AS (issue284, by vmuriart).
7+
* Fix parsing of Oracle names containing dollars (issue291).
78

89

910
Internal Changes

sqlparse/keywords.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def is_keyword(value):
3939

4040
(r'\?', tokens.Name.Placeholder),
4141
(r'%(\(\w+\))?s', tokens.Name.Placeholder),
42-
(r'[$:?]\w+', tokens.Name.Placeholder),
42+
(r'(?<!\w)[$:?]\w+', tokens.Name.Placeholder),
4343

4444
# FIXME(andi): VALUES shouldn't be listed here
4545
# see https://github.com/andialbrecht/sqlparse/pull/64
@@ -76,7 +76,7 @@ def is_keyword(value):
7676
(r'CREATE(\s+OR\s+REPLACE)?\b', tokens.Keyword.DDL),
7777
(r'DOUBLE\s+PRECISION\b', tokens.Name.Builtin),
7878

79-
(r'[_A-Z]\w*', is_keyword),
79+
(r'[_A-Z][_$#\w]*', is_keyword),
8080

8181
(r'[;:()\[\],\.]', tokens.Punctuation),
8282
(r'[<>=~!]+', tokens.Operator.Comparison),

tests/test_tokenize.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,17 @@ def test_parse_endifloop(s):
163163
p = sqlparse.parse(s)[0]
164164
assert len(p.tokens) == 1
165165
assert p.tokens[0].ttype is T.Keyword
166+
167+
168+
@pytest.mark.parametrize('s', [
169+
'foo',
170+
'Foo',
171+
'FOO',
172+
'v$name', # issue291
173+
])
174+
def test_parse_identifiers(s):
175+
p = sqlparse.parse(s)[0]
176+
assert len(p.tokens) == 1
177+
token = p.tokens[0]
178+
assert str(token) == s
179+
assert isinstance(token, sql.Identifier)

0 commit comments

Comments
 (0)