summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-08-15 13:52:24 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-08-15 13:53:38 -0400
commite1129b2d3e21da8e7521211164418ebd23e46251 (patch)
tree4990d4b25ed9e8c55f21dc853a2c422fd6557332
parentb00b430e87512d721ad30c81fdcb35a5253dfc0a (diff)
downloadsqlalchemy-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.rst6
-rw-r--r--lib/sqlalchemy/testing/requirements.py19
-rw-r--r--lib/sqlalchemy/testing/suite/test_select.py6
-rw-r--r--test/requirements.py21
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."""