diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-08-15 13:52:24 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-08-15 13:53:38 -0400 |
commit | e1129b2d3e21da8e7521211164418ebd23e46251 (patch) | |
tree | 4990d4b25ed9e8c55f21dc853a2c422fd6557332 | |
parent | b00b430e87512d721ad30c81fdcb35a5253dfc0a (diff) | |
download | sqlalchemy-e1129b2d3e21da8e7521211164418ebd23e46251.tar.gz |
- make these failure cases more specific to catch Oracle.
Would be nice to fix Oracle here
-rw-r--r-- | doc/build/changelog/migration_11.rst | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/testing/requirements.py | 19 | ||||
-rw-r--r-- | lib/sqlalchemy/testing/suite/test_select.py | 6 | ||||
-rw-r--r-- | test/requirements.py | 21 |
4 files changed, 43 insertions, 9 deletions
diff --git a/doc/build/changelog/migration_11.rst b/doc/build/changelog/migration_11.rst index 6ce0d031c..727b82015 100644 --- a/doc/build/changelog/migration_11.rst +++ b/doc/build/changelog/migration_11.rst @@ -96,13 +96,15 @@ SQLAlchemy Core looks like:: Previously, the above construct would not produce parenthesization for the inner SELECT statements, producing a query that fails on all backends. -The above formats will **continue to fail on SQLite**. +The above formats will **continue to fail on SQLite**; additionally, the format +that includes ORDER BY but no LIMIT/SELECT will **continue to fail on Oracle**. This is not a backwards-incompatible change, because the queries fail without the parentheses as well; with the fix, the queries at least work on all other databases. In all cases, in order to produce a UNION of limited SELECT statements that -also works on SQLite, the subqueries must be a SELECT of an ALIAS:: +also works on SQLite and in all cases on Oracle, the +subqueries must be a SELECT of an ALIAS:: stmt1 = select([table1.c.x]).order_by(table1.c.y).limit(1).alias().select() stmt2 = select([table2.c.x]).order_by(table2.c.y).limit(2).alias().select() diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 8b02f3e40..15bfad831 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -111,8 +111,9 @@ class SuiteRequirements(Requirements): return exclusions.open() @property - def parens_in_union_contained_select(self): - """Target database must support parenthesized SELECT in UNION. + def parens_in_union_contained_select_w_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when LIMIT/OFFSET is specifically present. E.g. (SELECT ...) UNION (SELECT ..) @@ -122,6 +123,20 @@ class SuiteRequirements(Requirements): return exclusions.open() @property + def parens_in_union_contained_select_wo_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when OFFSET/LIMIT is specifically not present. + + E.g. (SELECT ... LIMIT ..) UNION (SELECT .. OFFSET ..) + + This is known to fail on SQLite. It also fails on Oracle + because without LIMIT/OFFSET, there is currently no step that + creates an additional subquery. + + """ + return exclusions.open() + + @property def boolean_col_expressions(self): """Target database must support boolean expressions as columns""" diff --git a/lib/sqlalchemy/testing/suite/test_select.py b/lib/sqlalchemy/testing/suite/test_select.py index 0bcd35fd2..e7de356b8 100644 --- a/lib/sqlalchemy/testing/suite/test_select.py +++ b/lib/sqlalchemy/testing/suite/test_select.py @@ -242,7 +242,7 @@ class CompoundSelectTest(fixtures.TablesTest): [(2, 2, 3), (3, 3, 4)] ) - @testing.requires.parens_in_union_contained_select + @testing.requires.parens_in_union_contained_select_w_limit_offset def test_limit_offset_selectable_in_unions(self): table = self.tables.some_table s1 = select([table]).where(table.c.id == 2).\ @@ -256,7 +256,7 @@ class CompoundSelectTest(fixtures.TablesTest): [(2, 2, 3), (3, 3, 4)] ) - @testing.requires.parens_in_union_contained_select + @testing.requires.parens_in_union_contained_select_wo_limit_offset def test_order_by_selectable_in_unions(self): table = self.tables.some_table s1 = select([table]).where(table.c.id == 2).\ @@ -283,7 +283,7 @@ class CompoundSelectTest(fixtures.TablesTest): [(2, 2, 3), (3, 3, 4)] ) - @testing.requires.parens_in_union_contained_select + @testing.requires.parens_in_union_contained_select_w_limit_offset def test_limit_offset_in_unions_from_alias(self): table = self.tables.some_table s1 = select([table]).where(table.c.id == 2).\ diff --git a/test/requirements.py b/test/requirements.py index 939af4db1..fc8a3afd9 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -362,15 +362,32 @@ class DefaultRequirements(SuiteRequirements): ], 'no support for EXCEPT') @property - def parens_in_union_contained_select(self): - """Target database must support parenthesized SELECT in UNION. + def parens_in_union_contained_select_w_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when LIMIT/OFFSET is specifically present. E.g. (SELECT ...) UNION (SELECT ..) + This is known to fail on SQLite. + """ return fails_if('sqlite') @property + def parens_in_union_contained_select_wo_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when OFFSET/LIMIT is specifically not present. + + E.g. (SELECT ... LIMIT ..) UNION (SELECT .. OFFSET ..) + + This is known to fail on SQLite. It also fails on Oracle + because without LIMIT/OFFSET, there is currently no step that + creates an additional subquery. + + """ + return fails_if('sqlite', 'oracle') + + @property def offset(self): """Target database must support some method of adding OFFSET or equivalent to a result set.""" |