summaryrefslogtreecommitdiff
path: root/test/sql/test_compiler.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/sql/test_compiler.py')
-rw-r--r--test/sql/test_compiler.py196
1 files changed, 174 insertions, 22 deletions
diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py
index 7fd4e683b..ffabf9379 100644
--- a/test/sql/test_compiler.py
+++ b/test/sql/test_compiler.py
@@ -295,28 +295,164 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
"_offset",
)
- def test_limit_offset(self):
- for lim, offset, exp, params in [
- (
- 5,
- 10,
- "LIMIT :param_1 OFFSET :param_2",
- {"param_1": 5, "param_2": 10},
- ),
- (None, 10, "LIMIT -1 OFFSET :param_1", {"param_1": 10}),
- (5, None, "LIMIT :param_1", {"param_1": 5}),
- (
- 0,
- 0,
- "LIMIT :param_1 OFFSET :param_2",
- {"param_1": 0, "param_2": 0},
- ),
- ]:
- self.assert_compile(
- select(1).limit(lim).offset(offset),
- "SELECT 1 " + exp,
- checkparams=params,
- )
+ @testing.combinations(
+ (
+ 5,
+ 10,
+ "LIMIT :param_1 OFFSET :param_2",
+ {"param_1": 5, "param_2": 10},
+ ),
+ (None, 10, "LIMIT -1 OFFSET :param_1", {"param_1": 10}),
+ (5, None, "LIMIT :param_1", {"param_1": 5}),
+ (
+ 0,
+ 0,
+ "LIMIT :param_1 OFFSET :param_2",
+ {"param_1": 0, "param_2": 0},
+ ),
+ (
+ literal_column("Q"),
+ literal_column("Y"),
+ "LIMIT Q OFFSET Y",
+ {},
+ ),
+ (
+ column("Q"),
+ column("Y"),
+ 'LIMIT "Q" OFFSET "Y"',
+ {},
+ ),
+ )
+ def test_limit_offset(self, lim, offset, exp, params):
+ self.assert_compile(
+ select(1).limit(lim).offset(offset),
+ "SELECT 1 " + exp,
+ checkparams=params,
+ )
+
+ @testing.combinations(
+ (
+ 5,
+ 10,
+ {},
+ "OFFSET :param_1 ROWS FETCH FIRST :param_2 ROWS ONLY",
+ {"param_1": 10, "param_2": 5},
+ ),
+ (None, 10, {}, "LIMIT -1 OFFSET :param_1", {"param_1": 10}),
+ (
+ 5,
+ None,
+ {},
+ "FETCH FIRST :param_1 ROWS ONLY",
+ {"param_1": 5},
+ ),
+ (
+ 0,
+ 0,
+ {},
+ "OFFSET :param_1 ROWS FETCH FIRST :param_2 ROWS ONLY",
+ {"param_1": 0, "param_2": 0},
+ ),
+ (
+ 5,
+ 10,
+ {"percent": True},
+ "OFFSET :param_1 ROWS FETCH FIRST :param_2 PERCENT ROWS ONLY",
+ {"param_1": 10, "param_2": 5},
+ ),
+ (
+ 5,
+ 10,
+ {"percent": True, "with_ties": True},
+ "OFFSET :param_1 ROWS FETCH FIRST :param_2 PERCENT ROWS WITH TIES",
+ {"param_1": 10, "param_2": 5},
+ ),
+ (
+ 5,
+ 10,
+ {"with_ties": True},
+ "OFFSET :param_1 ROWS FETCH FIRST :param_2 ROWS WITH TIES",
+ {"param_1": 10, "param_2": 5},
+ ),
+ (
+ literal_column("Q"),
+ literal_column("Y"),
+ {},
+ "OFFSET Y ROWS FETCH FIRST Q ROWS ONLY",
+ {},
+ ),
+ (
+ column("Q"),
+ column("Y"),
+ {},
+ 'OFFSET "Y" ROWS FETCH FIRST "Q" ROWS ONLY',
+ {},
+ ),
+ (
+ bindparam("Q", 3),
+ bindparam("Y", 7),
+ {},
+ "OFFSET :Y ROWS FETCH FIRST :Q ROWS ONLY",
+ {"Q": 3, "Y": 7},
+ ),
+ (
+ literal_column("Q") + literal_column("Z"),
+ literal_column("Y") + literal_column("W"),
+ {},
+ "OFFSET Y + W ROWS FETCH FIRST Q + Z ROWS ONLY",
+ {},
+ ),
+ )
+ def test_fetch(self, fetch, offset, fetch_kw, exp, params):
+ self.assert_compile(
+ select(1).fetch(fetch, **fetch_kw).offset(offset),
+ "SELECT 1 " + exp,
+ checkparams=params,
+ )
+
+ def test_fetch_limit_offset_self_group(self):
+ self.assert_compile(
+ select(1).limit(1).self_group(),
+ "(SELECT 1 LIMIT :param_1)",
+ checkparams={"param_1": 1},
+ )
+ self.assert_compile(
+ select(1).offset(1).self_group(),
+ "(SELECT 1 LIMIT -1 OFFSET :param_1)",
+ checkparams={"param_1": 1},
+ )
+ self.assert_compile(
+ select(1).fetch(1).self_group(),
+ "(SELECT 1 FETCH FIRST :param_1 ROWS ONLY)",
+ checkparams={"param_1": 1},
+ )
+
+ def test_limit_fetch_interaction(self):
+ self.assert_compile(
+ select(1).limit(42).fetch(1),
+ "SELECT 1 FETCH FIRST :param_1 ROWS ONLY",
+ checkparams={"param_1": 1},
+ )
+ self.assert_compile(
+ select(1).fetch(42).limit(1),
+ "SELECT 1 LIMIT :param_1",
+ checkparams={"param_1": 1},
+ )
+ self.assert_compile(
+ select(1).limit(42).offset(7).fetch(1),
+ "SELECT 1 OFFSET :param_1 ROWS FETCH FIRST :param_2 ROWS ONLY",
+ checkparams={"param_1": 7, "param_2": 1},
+ )
+ self.assert_compile(
+ select(1).fetch(1).slice(2, 5),
+ "SELECT 1 LIMIT :param_1 OFFSET :param_2",
+ checkparams={"param_1": 3, "param_2": 2},
+ )
+ self.assert_compile(
+ select(1).slice(2, 5).fetch(1),
+ "SELECT 1 OFFSET :param_1 ROWS FETCH FIRST :param_2 ROWS ONLY",
+ checkparams={"param_1": 2, "param_2": 1},
+ )
def test_select_precol_compile_ordering(self):
s1 = (
@@ -3697,6 +3833,22 @@ class BindParameterTest(AssertsCompiledSQL, fixtures.TestBase):
literal_binds=True,
)
+ def test_fetch_offset_select_literal_binds(self):
+ stmt = select(1).fetch(5).offset(6)
+ self.assert_compile(
+ stmt,
+ "SELECT 1 OFFSET 6 ROWS FETCH FIRST 5 ROWS ONLY",
+ literal_binds=True,
+ )
+
+ def test_fetch_offset_compound_select_literal_binds(self):
+ stmt = select(1).union(select(2)).fetch(5).offset(6)
+ self.assert_compile(
+ stmt,
+ "SELECT 1 UNION SELECT 2 OFFSET 6 ROWS FETCH FIRST 5 ROWS ONLY",
+ literal_binds=True,
+ )
+
def test_multiple_col_binds(self):
self.assert_compile(
select(literal_column("*")).where(