summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Albrecht <albrecht.andi@gmail.com>2011-07-23 22:56:09 +0200
committerAndi Albrecht <albrecht.andi@gmail.com>2011-07-23 22:56:09 +0200
commitdea76adfa5b3c25dd34d7c820410e21364e16d12 (patch)
tree01b94994f59e26b48b1ed075473b42423b99e52f
parentd1956f27183c96f092a70a37e172f2fd045932a7 (diff)
downloadsqlparse-dea76adfa5b3c25dd34d7c820410e21364e16d12.tar.gz
Make sure that identifier lists in subselects with alias are grouped correctly.
-rw-r--r--CHANGES4
-rw-r--r--sqlparse/engine/grouping.py2
-rw-r--r--tests/test_regressions.py32
3 files changed, 36 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 16b0d11..1297634 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5,7 +5,9 @@ Bug Fixes
* Improve parsing of floats (thanks to Kris).
* When formatting a statement a space before LIMIT was removed (issue35).
* Fix strip_comments flag (issue38, reported by ooberm...@gmail.com).
- * Avoid parsing names as keywords (issue39, reported by djo...@taket.org).
+ * Avoid parsing names as keywords (issue39, reported by djo...@taket.org).
+ * Make sure identifier lists in subselects are grouped (issue40,
+ reported by djo...@taket.org).
Release 0.1.2 (Nov 23, 2010)
diff --git a/sqlparse/engine/grouping.py b/sqlparse/engine/grouping.py
index d233772..552a79f 100644
--- a/sqlparse/engine/grouping.py
+++ b/sqlparse/engine/grouping.py
@@ -170,7 +170,7 @@ def group_identifier(tlist):
def group_identifier_list(tlist):
[group_identifier_list(sgroup) for sgroup in tlist.get_sublists()
- if not isinstance(sgroup, (sql.Identifier, sql.IdentifierList))]
+ if not isinstance(sgroup, sql.IdentifierList)]
idx = 0
# Allowed list items
fend1_funcs = [lambda t: isinstance(t, sql.Identifier),
diff --git a/tests/test_regressions.py b/tests/test_regressions.py
index 10c5608..edc039f 100644
--- a/tests/test_regressions.py
+++ b/tests/test_regressions.py
@@ -56,3 +56,35 @@ class RegressionTests(TestCaseBase):
self.assertEqual(idt.tokens[0].match(T.Name, 'user'), True)
self.assertEqual(idt.tokens[1].match(T.Punctuation, '.'), True)
self.assertEqual(idt.tokens[2].match(T.Name, 'id'), True)
+
+ def test_issue40(self):
+ # make sure identifier lists in subselects are grouped
+ p = sqlparse.parse(('SELECT id, name FROM '
+ '(SELECT id, name FROM bar) as foo'))[0]
+ self.assertEqual(len(p.tokens), 7)
+ self.assertEqual(p.tokens[2].__class__, sql.IdentifierList)
+ self.assertEqual(p.tokens[-1].__class__, sql.Identifier)
+ self.assertEqual(p.tokens[-1].get_name(), u'foo')
+ sp = p.tokens[-1].tokens[0]
+ self.assertEqual(sp.tokens[3].__class__, sql.IdentifierList)
+ # make sure that formatting works as expected
+ self.ndiffAssertEqual(
+ sqlparse.format(('SELECT id, name FROM '
+ '(SELECT id, name FROM bar)'),
+ reindent=True),
+ ('SELECT id,\n'
+ ' name\n'
+ 'FROM\n'
+ ' (SELECT id,\n'
+ ' name\n'
+ ' FROM bar)'))
+ self.ndiffAssertEqual(
+ sqlparse.format(('SELECT id, name FROM '
+ '(SELECT id, name FROM bar) as foo'),
+ reindent=True),
+ ('SELECT id,\n'
+ ' name\n'
+ 'FROM\n'
+ ' (SELECT id,\n'
+ ' name\n'
+ ' FROM bar) as foo'))