Skip to content

Commit be3b2d7

Browse files
committed
Handle wildcards in identifiers.
1 parent 3bbc941 commit be3b2d7

4 files changed

Lines changed: 32 additions & 2 deletions

File tree

sqlparse/engine/grouping.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ def group_case(tlist):
102102
def group_identifier(tlist):
103103
def _consume_cycle(tl, i):
104104
x = itertools.cycle((lambda y: y.match(T.Punctuation, '.'),
105-
lambda y: y.ttype in (T.String.Symbol, T.Name)))
105+
lambda y: y.ttype in (T.String.Symbol,
106+
T.Name,
107+
T.Wildcard)))
106108
for t in tl.tokens[i:]:
107109
if x.next()(t):
108110
yield t

sqlparse/sql.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,18 @@ def get_name(self):
320320

321321
def get_real_name(self):
322322
"""Returns the real name (object name) of this identifier."""
323-
return self.token_next_by_type(0, T.Name).value
323+
# a.b
324+
dot = self.token_next_match(0, T.Punctuation, '.')
325+
if dot is None:
326+
return self.token_next_by_type(0, T.Name).value
327+
else:
328+
return self.token_next_by_type(self.token_index(dot),
329+
(T.Name, T.Wildcard)).value
330+
331+
def is_wildcard(self):
332+
"""Return ``True`` if this identifier contains a wildcard."""
333+
token = self.token_next_by_type(0, T.Wildcard)
334+
return token is not None
324335

325336
def get_typecast(self):
326337
"""Returns the typecast or ``None`` of this object as a string."""

tests/test_format.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ def test_identifier_list(self):
134134
'from table1,',
135135
' table2',
136136
'where 1 = 2']))
137+
s = 'select a.*, b.id from a, b'
138+
self.ndiffAssertEqual(f(s), '\n'.join(['select a.*,',
139+
' b.id',
140+
'from a,',
141+
' b']))
137142

138143
def test_case(self):
139144
f = lambda sql: sqlparse.format(sql, reindent=True)

tests/test_grouping.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ def test_identifiers(self):
4343
self.ndiffAssertEqual(s, parsed.to_unicode())
4444
self.assert_(isinstance(parsed.tokens[-1].tokens[3], Identifier))
4545

46+
def test_identifier_wildcard(self):
47+
p = sqlparse.parse('a.*, b.id')[0]
48+
self.assert_(isinstance(p.tokens[0], IdentifierList))
49+
self.assert_(isinstance(p.tokens[0].tokens[0], Identifier))
50+
self.assert_(isinstance(p.tokens[0].tokens[-1], Identifier))
51+
52+
def test_identifier_name_wildcard(self):
53+
p = sqlparse.parse('a.*')[0]
54+
t = p.tokens[0]
55+
self.assertEqual(t.get_name(), '*')
56+
self.assertEqual(t.is_wildcard(), True)
57+
4658
def test_where(self):
4759
s = 'select * from foo where bar = 1 order by id desc'
4860
p = sqlparse.parse(s)[0]

0 commit comments

Comments
 (0)