details: https://code.tryton.org/python-sql/commit/05c585f43f17
branch: default
user: Cédric Krier <[email protected]>
date: Wed Dec 24 10:37:11 2025 +0100
description:
Remove the parentheses around the unary and binary operators
Closes #98
diffstat:
CHANGELOG | 1 +
README.rst | 28 ++++----
sql/operators.py | 32 ++++----
sql/tests/test_aggregate.py | 8 +-
sql/tests/test_combining_query.py | 2 +-
sql/tests/test_conditionals.py | 6 +-
sql/tests/test_delete.py | 8 +-
sql/tests/test_functions.py | 6 +-
sql/tests/test_insert.py | 8 +-
sql/tests/test_join.py | 4 +-
sql/tests/test_lateral.py | 2 +-
sql/tests/test_merge.py | 24 +++---
sql/tests/test_operators.py | 125 ++++++++++++++++++-------------------
sql/tests/test_order.py | 6 +-
sql/tests/test_select.py | 52 +++++++-------
sql/tests/test_update.py | 12 +-
sql/tests/test_with.py | 6 +-
17 files changed, 165 insertions(+), 165 deletions(-)
diffs (1218 lines):
diff -r b1dfdb4a20c5 -r 05c585f43f17 CHANGELOG
--- a/CHANGELOG Wed Dec 24 12:01:06 2025 +0100
+++ b/CHANGELOG Wed Dec 24 10:37:11 2025 +0100
@@ -1,3 +1,4 @@
+* Remove the parentheses around the unary and binary operators
* Use the ordinal number as aliases for GROUP BY
* Check the coherence of the aliases of GROUP BY and ORDER BY expressions
* Do not use parameter for EXTRACT field
diff -r b1dfdb4a20c5 -r 05c585f43f17 README.rst
--- a/README.rst Wed Dec 24 12:01:06 2025 +0100
+++ b/README.rst Wed Dec 24 10:37:11 2025 +0100
@@ -39,14 +39,14 @@
>>> select.where = user.name == 'foo'
>>> tuple(select)
- ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE ("a"."name" = %s)',
('foo',))
+ ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE "a"."name" = %s',
('foo',))
>>> select.where = (user.name == 'foo') & (user.active == True)
>>> tuple(select)
- ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE (("a"."name" = %s)
AND ("a"."active" = %s))', ('foo', True))
+ ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE ("a"."name" = %s)
AND ("a"."active" = %s)', ('foo', True))
>>> select.where = user.name == user.login
>>> tuple(select)
- ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE ("a"."name" =
"a"."login")', ())
+ ('SELECT "a"."id", "a"."name" FROM "user" AS "a" WHERE "a"."name" =
"a"."login"', ())
Select with join::
@@ -54,7 +54,7 @@
>>> join.condition = join.right.user == user.id
>>> select = join.select(user.name, join.right.group)
>>> tuple(select)
- ('SELECT "a"."name", "b"."group" FROM "user" AS "a" INNER JOIN
"user_group" AS "b" ON ("b"."user" = "a"."id")', ())
+ ('SELECT "a"."name", "b"."group" FROM "user" AS "a" INNER JOIN
"user_group" AS "b" ON "b"."user" = "a"."id"', ())
Select with multiple joins::
@@ -93,9 +93,9 @@
... where=user_group.active == True)
>>> user = Table('user')
>>> tuple(user.select(user.id, where=user.id.in_(subselect)))
- ('SELECT "a"."id" FROM "user" AS "a" WHERE ("a"."id" IN (SELECT "b"."user"
FROM "user_group" AS "b" WHERE ("b"."active" = %s)))', (True,))
+ ('SELECT "a"."id" FROM "user" AS "a" WHERE "a"."id" IN (SELECT "b"."user"
FROM "user_group" AS "b" WHERE "b"."active" = %s)', (True,))
>>> tuple(subselect.select(subselect.user))
- ('SELECT "a"."user" FROM (SELECT "b"."user" FROM "user_group" AS "b" WHERE
("b"."active" = %s)) AS "a"', (True,))
+ ('SELECT "a"."user" FROM (SELECT "b"."user" FROM "user_group" AS "b" WHERE
"b"."active" = %s) AS "a"', (True,))
Select on other schema::
@@ -129,20 +129,20 @@
>>> tuple(user.update(columns=[user.active], values=[True]))
('UPDATE "user" AS "a" SET "active" = %s', (True,))
>>> tuple(invoice.update(columns=[invoice.total], values=[invoice.amount +
invoice.tax]))
- ('UPDATE "invoice" AS "a" SET "total" = ("a"."amount" + "a"."tax")', ())
+ ('UPDATE "invoice" AS "a" SET "total" = "a"."amount" + "a"."tax"', ())
Update query with where condition::
>>> tuple(user.update(columns=[user.active], values=[True],
... where=user.active == False))
- ('UPDATE "user" AS "a" SET "active" = %s WHERE ("a"."active" = %s)',
(True, False))
+ ('UPDATE "user" AS "a" SET "active" = %s WHERE "a"."active" = %s', (True,
False))
Update query with from list::
>>> group = Table('user_group')
>>> tuple(user.update(columns=[user.active], values=[group.active],
... from_=[group], where=user.id == group.user))
- ('UPDATE "user" AS "b" SET "active" = "a"."active" FROM "user_group" AS
"a" WHERE ("b"."id" = "a"."user")', ())
+ ('UPDATE "user" AS "b" SET "active" = "a"."active" FROM "user_group" AS
"a" WHERE "b"."id" = "a"."user"', ())
Delete query::
@@ -152,13 +152,13 @@
Delete query with where condition::
>>> tuple(user.delete(where=user.name == 'foo'))
- ('DELETE FROM "user" WHERE ("name" = %s)', ('foo',))
+ ('DELETE FROM "user" WHERE "name" = %s', ('foo',))
Delete query with sub-query::
>>> tuple(user.delete(
... where=user.id.in_(user_group.select(user_group.user))))
- ('DELETE FROM "user" WHERE ("id" IN (SELECT "a"."user" FROM "user_group"
AS "a"))', ())
+ ('DELETE FROM "user" WHERE "id" IN (SELECT "a"."user" FROM "user_group" AS
"a")', ())
Flavors::
@@ -185,7 +185,7 @@
('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS
ONLY', (20, 10))
>>> Flavor.set(Flavor(limitstyle='rownum'))
>>> tuple(select)
- ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM
"user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30,
20))
+ ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM
"user" AS "c") AS "b" WHERE ROWNUM <= %s) AS "a" WHERE "rnum" > %s', (30, 20))
qmark style::
@@ -193,7 +193,7 @@
>>> select = user.select()
>>> select.where = user.name == 'foo'
>>> tuple(select)
- ('SELECT * FROM "user" AS "a" WHERE ("a"."name" = ?)', ('foo',))
+ ('SELECT * FROM "user" AS "a" WHERE "a"."name" = ?', ('foo',))
numeric style::
@@ -201,4 +201,4 @@
>>> select = user.select()
>>> select.where = user.name == 'foo'
>>> format2numeric(*select)
- ('SELECT * FROM "user" AS "a" WHERE ("a"."name" = :0)', ('foo',))
+ ('SELECT * FROM "user" AS "a" WHERE "a"."name" = :0', ('foo',))
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/operators.py
--- a/sql/operators.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/operators.py Wed Dec 24 10:37:11 2025 +0100
@@ -48,9 +48,10 @@
def _format(self, operand, param=None):
if param is None:
param = Flavor.get().param
- if isinstance(operand, Expression):
+ if (isinstance(operand, Expression)
+ and not isinstance(operand, Operator)):
return str(operand)
- elif isinstance(operand, (Select, CombiningQuery)):
+ elif isinstance(operand, (Expression, Select, CombiningQuery)):
return '(%s)' % operand
elif isinstance(operand, (list, tuple)):
return '(' + ', '.join(self._format(o, param)
@@ -88,7 +89,7 @@
return (self.operand,)
def __str__(self):
- return '(%s %s)' % (self._operator, self._format(self.operand))
+ return '%s %s' % (self._operator, self._format(self.operand))
class BinaryOperator(Operator):
@@ -105,7 +106,7 @@
def __str__(self):
left, right = self._operands
- return '(%s %s %s)' % (self._format(left), self._operator,
+ return '%s %s %s' % (self._format(left), self._operator,
self._format(right))
def __invert__(self):
@@ -121,8 +122,7 @@
return self
def __str__(self):
- return '(' + (' %s ' % self._operator).join(
- map(self._format, self)) + ')'
+ return (' %s ' % self._operator).join(map(self._format, self))
class And(NaryOperator):
@@ -184,9 +184,9 @@
def __str__(self):
if self.left is Null:
- return '(%s IS NULL)' % self.right
+ return '%s IS NULL' % self.right
elif self.right is Null:
- return '(%s IS NULL)' % self.left
+ return '%s IS NULL' % self.left
return super(Equal, self).__str__()
@@ -196,9 +196,9 @@
def __str__(self):
if self.left is Null:
- return '(%s IS NOT NULL)' % self.right
+ return '%s IS NOT NULL' % self.right
elif self.right is Null:
- return '(%s IS NOT NULL)' % self.left
+ return '%s IS NOT NULL' % self.left
return super(Equal, self).__str__()
@@ -220,7 +220,7 @@
operator = self._operator
if self.symmetric:
operator += ' SYMMETRIC'
- return '(%s %s %s AND %s)' % (
+ return '%s %s %s AND %s' % (
self._format(self.operand), operator,
self._format(self.left), self._format(self.right))
@@ -259,12 +259,12 @@
def __str__(self):
if self.right is None:
- return '(%s %s UNKNOWN)' % (
+ return '%s %s UNKNOWN' % (
self._format(self.left), self._operator)
elif self.right is True:
- return '(%s %s TRUE)' % (self._format(self.left), self._operator)
+ return '%s %s TRUE' % (self._format(self.left), self._operator)
elif self.right is False:
- return '(%s %s FALSE)' % (self._format(self.left), self._operator)
+ return '%s %s FALSE' % (self._format(self.left), self._operator)
class IsNot(Is):
@@ -395,11 +395,11 @@
def __str__(self):
left, right = self._operands
if self.escape or Flavor().get().escape_empty:
- return '(%s %s %s ESCAPE %s)' % (
+ return '%s %s %s ESCAPE %s' % (
self._format(left), self._operator, self._format(right),
self._format(self.escape or ''))
else:
- return '(%s %s %s)' % (
+ return '%s %s %s' % (
self._format(left), self._operator, self._format(right))
def __invert__(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_aggregate.py
--- a/sql/tests/test_aggregate.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_aggregate.py Wed Dec 24 10:37:11 2025 +0100
@@ -38,7 +38,7 @@
self.assertEqual(str(avg), 'AVG("c")')
avg = Avg(self.table.a + self.table.b)
- self.assertEqual(str(avg), 'AVG(("a" + "b"))')
+ self.assertEqual(str(avg), 'AVG("a" + "b")')
def test_count_without_expression(self):
count = Count()
@@ -67,7 +67,7 @@
try:
avg = Avg(self.table.a + 1, filter_=self.table.a > 0)
self.assertEqual(
- str(avg), 'AVG(("a" + %s)) FILTER (WHERE ("a" > %s))')
+ str(avg), 'AVG("a" + %s) FILTER (WHERE "a" > %s)')
self.assertEqual(avg.params, (1, 0))
finally:
Flavor.set(Flavor())
@@ -75,13 +75,13 @@
def test_filter_case(self):
avg = Avg(self.table.a + 1, filter_=self.table.a > 0)
self.assertEqual(
- str(avg), 'AVG(CASE WHEN ("a" > %s) THEN ("a" + %s) END)')
+ str(avg), 'AVG(CASE WHEN "a" > %s THEN "a" + %s END)')
self.assertEqual(avg.params, (0, 1))
def test_filter_case_count_star(self):
count = Count(Literal('*'), filter_=self.table.a > 0)
self.assertEqual(
- str(count), 'COUNT(CASE WHEN ("a" > %s) THEN %s END)')
+ str(count), 'COUNT(CASE WHEN "a" > %s THEN %s END)')
self.assertEqual(count.params, (0, 1))
def test_window(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_combining_query.py
--- a/sql/tests/test_combining_query.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_combining_query.py Wed Dec 24 10:37:11 2025 +0100
@@ -33,7 +33,7 @@
self.assertEqual(str(query),
'WITH "a" AS ('
- 'SELECT "b"."id" FROM "t" AS "b" WHERE ("b"."id" = %s)) '
+ 'SELECT "b"."id" FROM "t" AS "b" WHERE "b"."id" = %s) '
'SELECT * FROM "t1" AS "c" UNION SELECT * FROM "t2" AS "d"')
self.assertEqual(tuple(query.params), (1,))
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_conditionals.py
--- a/sql/tests/test_conditionals.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_conditionals.py Wed Dec 24 10:37:11 2025 +0100
@@ -36,9 +36,9 @@
where=self.table.c2 == 'foo'))
self.assertEqual(str(case),
'CASE WHEN '
- '(SELECT "a"."bool" FROM "t" AS "a" WHERE ("a"."c2" = %s)) '
+ '(SELECT "a"."bool" FROM "t" AS "a" WHERE "a"."c2" = %s) '
'THEN "c1" '
- 'ELSE (SELECT "a"."c1" FROM "t" AS "a" WHERE ("a"."c2" = %s)) END')
+ 'ELSE (SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c2" = %s) END')
self.assertEqual(case.params, ('bar', 'foo'))
def test_coalesce(self):
@@ -52,7 +52,7 @@
self.table.c2)
self.assertEqual(str(coalesce),
'COALESCE('
- '(SELECT "a"."c1" FROM "t" AS "a" WHERE ("a"."c2" = %s)), "c2")')
+ '(SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c2" = %s), "c2")')
self.assertEqual(coalesce.params, ('bar',))
def test_nullif(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_delete.py
--- a/sql/tests/test_delete.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_delete.py Wed Dec 24 10:37:11 2025 +0100
@@ -15,7 +15,7 @@
def test_delete2(self):
query = self.table.delete(where=(self.table.c == 'foo'))
- self.assertEqual(str(query), 'DELETE FROM "t" WHERE ("c" = %s)')
+ self.assertEqual(str(query), 'DELETE FROM "t" WHERE "c" = %s')
self.assertEqual(query.params, ('foo',))
def test_delete3(self):
@@ -23,8 +23,8 @@
t2 = Table('t2')
query = t1.delete(where=(t1.c.in_(t2.select(t2.c))))
self.assertEqual(str(query),
- 'DELETE FROM "t1" WHERE ("c" IN ('
- 'SELECT "a"."c" FROM "t2" AS "a"))')
+ 'DELETE FROM "t1" WHERE "c" IN ('
+ 'SELECT "a"."c" FROM "t2" AS "a")')
self.assertEqual(query.params, ())
def test_delete_invalid_table(self):
@@ -61,5 +61,5 @@
self.assertEqual(str(query),
'WITH "a" AS (SELECT "b"."c1" FROM "t1" AS "b") '
'DELETE FROM "t" WHERE '
- '("c2" IN (SELECT "a"."c3" FROM "a" AS "a"))')
+ '"c2" IN (SELECT "a"."c3" FROM "a" AS "a")')
self.assertEqual(query.params, ())
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_functions.py
--- a/sql/tests/test_functions.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_functions.py Wed Dec 24 10:37:11 2025 +0100
@@ -70,7 +70,7 @@
abs_ = Abs(self.table.select(self.table.c1,
where=self.table.c2 == 'foo'))
self.assertEqual(str(abs_),
- 'ABS((SELECT "a"."c1" FROM "t" AS "a" WHERE ("a"."c2" = %s)))')
+ 'ABS((SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c2" = %s))')
self.assertEqual(abs_.params, ('foo',))
def test_overlay(self):
@@ -110,7 +110,7 @@
self.table.select(self.table.tz, where=self.table.c1 == 'foo'))
self.assertEqual(str(time_zone),
'"c1" AT TIME ZONE '
- '(SELECT "a"."tz" FROM "t" AS "a" WHERE ("a"."c1" = %s))')
+ '(SELECT "a"."tz" FROM "t" AS "a" WHERE "a"."c1" = %s)')
self.assertEqual(time_zone.params, ('foo',))
def test_at_time_zone_mapping(self):
@@ -192,7 +192,7 @@
with AliasManager():
self.assertEqual(str(function),
- 'RANK("a"."c") FILTER (WHERE ("a"."c" > %s)) OVER ()')
+ 'RANK("a"."c") FILTER (WHERE "a"."c" > %s) OVER ()')
self.assertEqual(function.params, (0,))
def test_invalid_filter(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_insert.py
--- a/sql/tests/test_insert.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_insert.py Wed Dec 24 10:37:11 2025 +0100
@@ -73,7 +73,7 @@
self.assertEqual(str(query),
'INSERT INTO "t1" AS "b" ("c") VALUES (%s) '
'RETURNING (SELECT "a"."c" FROM "t2" AS "a" '
- 'WHERE (("a"."c1" = "b"."c") AND ("a"."c2" = %s)))')
+ 'WHERE ("a"."c1" = "b"."c") AND ("a"."c2" = %s))')
self.assertEqual(tuple(query.params), ('foo', 'bar'))
def test_insert_invalid_returning(self):
@@ -160,7 +160,7 @@
self.assertEqual(str(query),
'INSERT INTO "t" AS "a" ("c1") VALUES (%s) '
- 'ON CONFLICT ("c1") WHERE ("a"."c2" = %s) DO NOTHING')
+ 'ON CONFLICT ("c1") WHERE "a"."c2" = %s DO NOTHING')
self.assertEqual(tuple(query.params), ('foo', 'bar'))
def test_upsert_update(self):
@@ -188,7 +188,7 @@
self.assertEqual(str(query),
'INSERT INTO "t" AS "a" ("c1") VALUES (%s) '
'ON CONFLICT DO UPDATE SET "c1" = (%s) '
- 'WHERE ("a"."c2" = %s)')
+ 'WHERE "a"."c2" = %s')
self.assertEqual(tuple(query.params), ('baz', 'foo', 'bar'))
def test_upsert_update_subquery(self):
@@ -218,7 +218,7 @@
self.assertEqual(str(query),
'INSERT INTO "t" AS "a" ("c1") VALUES (%s) '
- 'ON CONFLICT DO UPDATE SET "c1" = (("EXCLUDED"."c1" + %s))')
+ 'ON CONFLICT DO UPDATE SET "c1" = ("EXCLUDED"."c1" + %s)')
self.assertEqual(tuple(query.params), (1, 2))
def test_conflict_invalid_table(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_join.py
--- a/sql/tests/test_join.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_join.py Wed Dec 24 10:37:11 2025 +0100
@@ -18,7 +18,7 @@
join.condition = t1.c == t2.c
with AliasManager():
self.assertEqual(str(join),
- '"t1" AS "a" INNER JOIN "t2" AS "b" ON ("a"."c" = "b"."c")')
+ '"t1" AS "a" INNER JOIN "t2" AS "b" ON "a"."c" = "b"."c"')
def test_join_invalid_left(self):
with self.assertRaises(ValueError):
@@ -45,7 +45,7 @@
with AliasManager():
self.assertEqual(str(join),
'"t1" AS "a" INNER JOIN (SELECT * FROM "t2" AS "c") AS "b" '
- 'ON ("a"."c" = "b"."c")')
+ 'ON "a"."c" = "b"."c"')
self.assertEqual(tuple(join.params), ())
def test_join_function(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_lateral.py
--- a/sql/tests/test_lateral.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_lateral.py Wed Dec 24 10:37:11 2025 +0100
@@ -16,7 +16,7 @@
self.assertEqual(str(query),
'SELECT * FROM "t1" AS "a", LATERAL '
- '(SELECT * FROM "t2" AS "c" WHERE ("c"."id" = "a"."t2")) AS "b"')
+ '(SELECT * FROM "t2" AS "c" WHERE "c"."id" = "a"."t2") AS "b"')
self.assertEqual(tuple(query.params), ())
def test_lateral_function(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_merge.py
--- a/sql/tests/test_merge.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_merge.py Wed Dec 24 10:37:11 2025 +0100
@@ -18,7 +18,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN MATCHED THEN DO NOTHING')
self.assertEqual(query.params, ())
@@ -46,7 +46,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON (("a"."c1" = "b"."c2") AND ("a"."c3" = %s)) '
+ 'ON ("a"."c1" = "b"."c2") AND ("a"."c3" = %s) '
'WHEN MATCHED THEN DO NOTHING')
self.assertEqual(query.params, (42,))
@@ -58,9 +58,9 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN MATCHED '
- 'AND (("b"."c3" = %s) AND ("a"."c4" = "b"."c5")) '
+ 'AND ("b"."c3" = %s) AND ("a"."c4" = "b"."c5") '
'THEN DO NOTHING')
self.assertEqual(query.params, (42,))
@@ -73,9 +73,9 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN MATCHED THEN '
- 'UPDATE SET "c1" = ("a"."c1" + "b"."c2"), "c2" = %s')
+ 'UPDATE SET "c1" = "a"."c1" + "b"."c2", "c2" = %s')
self.assertEqual(query.params, (42,))
def test_matched_delete(self):
@@ -84,7 +84,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN MATCHED THEN DELETE')
self.assertEqual(query.params, ())
@@ -94,7 +94,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN NOT MATCHED THEN DO NOTHING')
self.assertEqual(query.params, ())
@@ -107,7 +107,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN NOT MATCHED THEN '
'INSERT ("c1", "c2") VALUES ("b"."c3", "b"."c4")')
self.assertEqual(query.params, ())
@@ -119,7 +119,7 @@
self.assertEqual(
str(query),
'MERGE INTO "t" AS "a" USING "s" AS "b" '
- 'ON ("a"."c1" = "b"."c2") '
+ 'ON "a"."c1" = "b"."c2" '
'WHEN NOT MATCHED THEN '
'INSERT ("c1", "c2") DEFAULT VALUES')
self.assertEqual(query.params, ())
@@ -141,9 +141,9 @@
source, self.target.c1 == source.c2, Matched(), with_=[w])
self.assertEqual(
str(query),
- 'WITH "a" AS (SELECT * FROM "t1" AS "d" WHERE ("d"."c2" = %s)) '
+ 'WITH "a" AS (SELECT * FROM "t1" AS "d" WHERE "d"."c2" = %s) '
'MERGE INTO "t" AS "b" '
'USING (SELECT * FROM "a" AS "a") AS "c" '
- 'ON ("b"."c1" = "c"."c2") '
+ 'ON "b"."c1" = "c"."c2" '
'WHEN MATCHED THEN DO NOTHING')
self.assertEqual(query.params, (42,))
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_operators.py
--- a/sql/tests/test_operators.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_operators.py Wed Dec 24 10:37:11 2025 +0100
@@ -25,34 +25,34 @@
def test_and(self):
for and_ in [And((self.table.c1, self.table.c2)),
self.table.c1 & self.table.c2]:
- self.assertEqual(str(and_), '("c1" AND "c2")')
+ self.assertEqual(str(and_), '"c1" AND "c2"')
self.assertEqual(and_.params, ())
and_ = And((Literal(True), self.table.c2))
- self.assertEqual(str(and_), '(%s AND "c2")')
+ self.assertEqual(str(and_), '%s AND "c2"')
self.assertEqual(and_.params, (True,))
and_ = And((Literal(True), 'foo'))
- self.assertEqual(str(and_), '(%s AND %s)')
+ self.assertEqual(str(and_), '%s AND %s')
self.assertEqual(and_.params, (True, 'foo'))
def test_operator_operators(self):
and_ = And((Literal(True), self.table.c1))
and2 = and_ & And((Literal(True), self.table.c2))
- self.assertEqual(str(and2), '((%s AND "c1") AND %s AND "c2")')
+ self.assertEqual(str(and2), '(%s AND "c1") AND %s AND "c2"')
self.assertEqual(and2.params, (True, True))
and3 = and_ & Literal(True)
- self.assertEqual(str(and3), '((%s AND "c1") AND %s)')
+ self.assertEqual(str(and3), '(%s AND "c1") AND %s')
self.assertEqual(and3.params, (True, True))
or_ = Or((Literal(True), self.table.c1))
or2 = or_ | Or((Literal(True), self.table.c2))
- self.assertEqual(str(or2), '((%s OR "c1") OR %s OR "c2")')
+ self.assertEqual(str(or2), '(%s OR "c1") OR %s OR "c2"')
self.assertEqual(or2.params, (True, True))
or3 = or_ | Literal(True)
- self.assertEqual(str(or3), '((%s OR "c1") OR %s)')
+ self.assertEqual(str(or3), '(%s OR "c1") OR %s')
self.assertEqual(or3.params, (True, True))
def test_operator_compat_column(self):
@@ -63,152 +63,152 @@
def test_or(self):
for or_ in [Or((self.table.c1, self.table.c2)),
self.table.c1 | self.table.c2]:
- self.assertEqual(str(or_), '("c1" OR "c2")')
+ self.assertEqual(str(or_), '"c1" OR "c2"')
self.assertEqual(or_.params, ())
def test_not(self):
for not_ in [Not(self.table.c), ~self.table.c]:
- self.assertEqual(str(not_), '(NOT "c")')
+ self.assertEqual(str(not_), 'NOT "c"')
self.assertEqual(not_.params, ())
not_ = Not(Literal(False))
- self.assertEqual(str(not_), '(NOT %s)')
+ self.assertEqual(str(not_), 'NOT %s')
self.assertEqual(not_.params, (False,))
def test_neg(self):
for neg in [Neg(self.table.c1), -self.table.c1]:
- self.assertEqual(str(neg), '(- "c1")')
+ self.assertEqual(str(neg), '- "c1"')
self.assertEqual(neg.params, ())
def test_pos(self):
for pos in [Pos(self.table.c1), +self.table.c1]:
- self.assertEqual(str(pos), '(+ "c1")')
+ self.assertEqual(str(pos), '+ "c1"')
self.assertEqual(pos.params, ())
def test_less(self):
for less in [Less(self.table.c1, self.table.c2),
self.table.c1 < self.table.c2,
~GreaterEqual(self.table.c1, self.table.c2)]:
- self.assertEqual(str(less), '("c1" < "c2")')
+ self.assertEqual(str(less), '"c1" < "c2"')
self.assertEqual(less.params, ())
less = Less(Literal(0), self.table.c2)
- self.assertEqual(str(less), '(%s < "c2")')
+ self.assertEqual(str(less), '%s < "c2"')
self.assertEqual(less.params, (0,))
def test_greater(self):
for greater in [Greater(self.table.c1, self.table.c2),
self.table.c1 > self.table.c2,
~LessEqual(self.table.c1, self.table.c2)]:
- self.assertEqual(str(greater), '("c1" > "c2")')
+ self.assertEqual(str(greater), '"c1" > "c2"')
self.assertEqual(greater.params, ())
def test_less_equal(self):
for less in [LessEqual(self.table.c1, self.table.c2),
self.table.c1 <= self.table.c2,
~Greater(self.table.c1, self.table.c2)]:
- self.assertEqual(str(less), '("c1" <= "c2")')
+ self.assertEqual(str(less), '"c1" <= "c2"')
self.assertEqual(less.params, ())
def test_greater_equal(self):
for greater in [GreaterEqual(self.table.c1, self.table.c2),
self.table.c1 >= self.table.c2,
~Less(self.table.c1, self.table.c2)]:
- self.assertEqual(str(greater), '("c1" >= "c2")')
+ self.assertEqual(str(greater), '"c1" >= "c2"')
self.assertEqual(greater.params, ())
def test_equal(self):
for equal in [Equal(self.table.c1, self.table.c2),
self.table.c1 == self.table.c2,
~NotEqual(self.table.c1, self.table.c2)]:
- self.assertEqual(str(equal), '("c1" = "c2")')
+ self.assertEqual(str(equal), '"c1" = "c2"')
self.assertEqual(equal.params, ())
equal = Equal(Literal('foo'), Literal('bar'))
- self.assertEqual(str(equal), '(%s = %s)')
+ self.assertEqual(str(equal), '%s = %s')
self.assertEqual(equal.params, ('foo', 'bar'))
equal = Equal(self.table.c1, Null)
- self.assertEqual(str(equal), '("c1" IS NULL)')
+ self.assertEqual(str(equal), '"c1" IS NULL')
self.assertEqual(equal.params, ())
equal = Equal(Literal('test'), Null)
- self.assertEqual(str(equal), '(%s IS NULL)')
+ self.assertEqual(str(equal), '%s IS NULL')
self.assertEqual(equal.params, ('test',))
equal = Equal(Null, self.table.c1)
- self.assertEqual(str(equal), '("c1" IS NULL)')
+ self.assertEqual(str(equal), '"c1" IS NULL')
self.assertEqual(equal.params, ())
equal = Equal(Null, Literal('test'))
- self.assertEqual(str(equal), '(%s IS NULL)')
+ self.assertEqual(str(equal), '%s IS NULL')
self.assertEqual(equal.params, ('test',))
def test_not_equal(self):
for equal in [NotEqual(self.table.c1, self.table.c2),
self.table.c1 != self.table.c2,
~Equal(self.table.c1, self.table.c2)]:
- self.assertEqual(str(equal), '("c1" != "c2")')
+ self.assertEqual(str(equal), '"c1" != "c2"')
self.assertEqual(equal.params, ())
equal = NotEqual(self.table.c1, Null)
- self.assertEqual(str(equal), '("c1" IS NOT NULL)')
+ self.assertEqual(str(equal), '"c1" IS NOT NULL')
self.assertEqual(equal.params, ())
equal = NotEqual(Null, self.table.c1)
- self.assertEqual(str(equal), '("c1" IS NOT NULL)')
+ self.assertEqual(str(equal), '"c1" IS NOT NULL')
self.assertEqual(equal.params, ())
def test_between(self):
for between in [Between(self.table.c1, 1, 2),
~NotBetween(self.table.c1, 1, 2)]:
- self.assertEqual(str(between), '("c1" BETWEEN %s AND %s)')
+ self.assertEqual(str(between), '"c1" BETWEEN %s AND %s')
self.assertEqual(between.params, (1, 2))
between = Between(
self.table.c1, self.table.c2, self.table.c3, symmetric=True)
self.assertEqual(
- str(between), '("c1" BETWEEN SYMMETRIC "c2" AND "c3")')
+ str(between), '"c1" BETWEEN SYMMETRIC "c2" AND "c3"')
self.assertEqual(between.params, ())
def test_not_between(self):
for between in [NotBetween(self.table.c1, 1, 2),
~Between(self.table.c1, 1, 2)]:
- self.assertEqual(str(between), '("c1" NOT BETWEEN %s AND %s)')
+ self.assertEqual(str(between), '"c1" NOT BETWEEN %s AND %s')
self.assertEqual(between.params, (1, 2))
between = NotBetween(
self.table.c1, self.table.c2, self.table.c3, symmetric=True)
self.assertEqual(
- str(between), '("c1" NOT BETWEEN SYMMETRIC "c2" AND "c3")')
+ str(between), '"c1" NOT BETWEEN SYMMETRIC "c2" AND "c3"')
self.assertEqual(between.params, ())
def test_is_distinct(self):
for distinct in [IsDistinct(self.table.c1, self.table.c2),
~IsNotDistinct(self.table.c1, self.table.c2)]:
- self.assertEqual(str(distinct), '("c1" IS DISTINCT FROM "c2")')
+ self.assertEqual(str(distinct), '"c1" IS DISTINCT FROM "c2"')
self.assertEqual(distinct.params, ())
def test_is_not_distinct(self):
for distinct in [IsNotDistinct(self.table.c1, self.table.c2),
~IsDistinct(self.table.c1, self.table.c2)]:
- self.assertEqual(str(distinct), '("c1" IS NOT DISTINCT FROM "c2")')
+ self.assertEqual(str(distinct), '"c1" IS NOT DISTINCT FROM "c2"')
self.assertEqual(distinct.params, ())
def test_is(self):
for is_ in [Is(self.table.c1, None),
~IsNot(self.table.c1, None)]:
- self.assertEqual(str(is_), '("c1" IS UNKNOWN)')
+ self.assertEqual(str(is_), '"c1" IS UNKNOWN')
self.assertEqual(is_.params, ())
for is_ in [Is(self.table.c1, True),
~IsNot(self.table.c1, True)]:
- self.assertEqual(str(is_), '("c1" IS TRUE)')
+ self.assertEqual(str(is_), '"c1" IS TRUE')
self.assertEqual(is_.params, ())
for is_ in [Is(self.table.c1, False),
~IsNot(self.table.c1, False)]:
- self.assertEqual(str(is_), '("c1" IS FALSE)')
+ self.assertEqual(str(is_), '"c1" IS FALSE')
self.assertEqual(is_.params, ())
def test_is_invalid_right(self):
@@ -218,41 +218,41 @@
def test_is_not(self):
for is_ in [IsNot(self.table.c1, None),
~Is(self.table.c1, None)]:
- self.assertEqual(str(is_), '("c1" IS NOT UNKNOWN)')
+ self.assertEqual(str(is_), '"c1" IS NOT UNKNOWN')
self.assertEqual(is_.params, ())
for is_ in [IsNot(self.table.c1, True),
~Is(self.table.c1, True)]:
- self.assertEqual(str(is_), '("c1" IS NOT TRUE)')
+ self.assertEqual(str(is_), '"c1" IS NOT TRUE')
self.assertEqual(is_.params, ())
for is_ in [IsNot(self.table.c1, False),
~Is(self.table.c1, False)]:
- self.assertEqual(str(is_), '("c1" IS NOT FALSE)')
+ self.assertEqual(str(is_), '"c1" IS NOT FALSE')
self.assertEqual(is_.params, ())
def test_sub(self):
for sub in [Sub(self.table.c1, self.table.c2),
self.table.c1 - self.table.c2]:
- self.assertEqual(str(sub), '("c1" - "c2")')
+ self.assertEqual(str(sub), '"c1" - "c2"')
self.assertEqual(sub.params, ())
def test_mul(self):
for mul in [Mul(self.table.c1, self.table.c2),
self.table.c1 * self.table.c2]:
- self.assertEqual(str(mul), '("c1" * "c2")')
+ self.assertEqual(str(mul), '"c1" * "c2"')
self.assertEqual(mul.params, ())
def test_div(self):
for div in [Div(self.table.c1, self.table.c2),
self.table.c1 / self.table.c2]:
- self.assertEqual(str(div), '("c1" / "c2")')
+ self.assertEqual(str(div), '"c1" / "c2"')
self.assertEqual(div.params, ())
def test_mod(self):
for mod in [Mod(self.table.c1, self.table.c2),
self.table.c1 % self.table.c2]:
- self.assertEqual(str(mod), '("c1" %% "c2")')
+ self.assertEqual(str(mod), '"c1" %% "c2"')
self.assertEqual(mod.params, ())
def test_mod_paramstyle(self):
@@ -260,7 +260,7 @@
Flavor.set(flavor)
try:
mod = Mod(self.table.c1, self.table.c2)
- self.assertEqual(str(mod), '("c1" %% "c2")')
+ self.assertEqual(str(mod), '"c1" %% "c2"')
self.assertEqual(mod.params, ())
finally:
Flavor.set(Flavor())
@@ -269,7 +269,7 @@
Flavor.set(flavor)
try:
mod = Mod(self.table.c1, self.table.c2)
- self.assertEqual(str(mod), '("c1" % "c2")')
+ self.assertEqual(str(mod), '"c1" % "c2"')
self.assertEqual(mod.params, ())
finally:
Flavor.set(Flavor())
@@ -277,24 +277,24 @@
def test_pow(self):
for pow_ in [Pow(self.table.c1, self.table.c2),
self.table.c1 ** self.table.c2]:
- self.assertEqual(str(pow_), '("c1" ^ "c2")')
+ self.assertEqual(str(pow_), '"c1" ^ "c2"')
self.assertEqual(pow_.params, ())
def test_abs(self):
for abs_ in [Abs(self.table.c1), abs(self.table.c1)]:
- self.assertEqual(str(abs_), '(@ "c1")')
+ self.assertEqual(str(abs_), '@ "c1"')
self.assertEqual(abs_.params, ())
def test_lshift(self):
for lshift in [LShift(self.table.c1, 2),
self.table.c1 << 2]:
- self.assertEqual(str(lshift), '("c1" << %s)')
+ self.assertEqual(str(lshift), '"c1" << %s')
self.assertEqual(lshift.params, (2,))
def test_rshift(self):
for rshift in [RShift(self.table.c1, 2),
self.table.c1 >> 2]:
- self.assertEqual(str(rshift), '("c1" >> %s)')
+ self.assertEqual(str(rshift), '"c1" >> %s')
self.assertEqual(rshift.params, (2,))
def test_like(self):
@@ -302,12 +302,12 @@
self.table.c1.like('foo'),
~NotLike(self.table.c1, 'foo'),
~~Like(self.table.c1, 'foo')]:
- self.assertEqual(str(like), '("c1" LIKE %s)')
+ self.assertEqual(str(like), '"c1" LIKE %s')
self.assertEqual(like.params, ('foo',))
def test_like_escape(self):
like = Like(self.table.c1, 'foo', escape='$')
- self.assertEqual(str(like), '("c1" LIKE %s ESCAPE %s)')
+ self.assertEqual(str(like), '"c1" LIKE %s ESCAPE %s')
self.assertEqual(like.params, ('foo', '$'))
def test_like_escape_empty_false(self):
@@ -315,7 +315,7 @@
Flavor.set(flavor)
try:
like = Like(self.table.c1, 'foo')
- self.assertEqual(str(like), '("c1" LIKE %s)')
+ self.assertEqual(str(like), '"c1" LIKE %s')
self.assertEqual(like.params, ('foo',))
finally:
Flavor.set(Flavor())
@@ -325,7 +325,7 @@
Flavor.set(flavor)
try:
like = Like(self.table.c1, 'foo')
- self.assertEqual(str(like), '("c1" LIKE %s ESCAPE %s)')
+ self.assertEqual(str(like), '"c1" LIKE %s ESCAPE %s')
self.assertEqual(like.params, ('foo', ''))
finally:
Flavor.set(Flavor())
@@ -341,7 +341,7 @@
for like in [ILike(self.table.c1, 'foo'),
self.table.c1.ilike('foo'),
~NotILike(self.table.c1, 'foo')]:
- self.assertEqual(str(like), '("c1" ILIKE %s)')
+ self.assertEqual(str(like), '"c1" ILIKE %s')
self.assertEqual(like.params, ('foo',))
finally:
Flavor.set(Flavor())
@@ -351,7 +351,7 @@
try:
like = ILike(self.table.c1, 'foo')
self.assertEqual(
- str(like), '(UPPER("c1") LIKE UPPER(%s))')
+ str(like), 'UPPER("c1") LIKE UPPER(%s)')
self.assertEqual(like.params, ('foo',))
finally:
Flavor.set(Flavor())
@@ -362,7 +362,7 @@
try:
for like in [NotILike(self.table.c1, 'foo'),
~self.table.c1.ilike('foo')]:
- self.assertEqual(str(like), '("c1" NOT ILIKE %s)')
+ self.assertEqual(str(like), '"c1" NOT ILIKE %s')
self.assertEqual(like.params, ('foo',))
finally:
Flavor.set(Flavor())
@@ -372,7 +372,7 @@
try:
like = NotILike(self.table.c1, 'foo')
self.assertEqual(
- str(like), '(UPPER("c1") NOT LIKE UPPER(%s))')
+ str(like), 'UPPER("c1") NOT LIKE UPPER(%s)')
self.assertEqual(like.params, ('foo',))
finally:
Flavor.set(Flavor())
@@ -381,32 +381,31 @@
for in_ in [In(self.table.c1, [self.table.c2, 1, Null]),
~NotIn(self.table.c1, [self.table.c2, 1, Null]),
~~In(self.table.c1, [self.table.c2, 1, Null])]:
- self.assertEqual(str(in_), '("c1" IN ("c2", %s, %s))')
+ self.assertEqual(str(in_), '"c1" IN ("c2", %s, %s)')
self.assertEqual(in_.params, (1, None))
t2 = Table('t2')
in_ = In(self.table.c1, t2.select(t2.c2))
self.assertEqual(str(in_),
- '("c1" IN (SELECT "a"."c2" FROM "t2" AS "a"))')
+ '"c1" IN (SELECT "a"."c2" FROM "t2" AS "a")')
self.assertEqual(in_.params, ())
in_ = In(self.table.c1, t2.select(t2.c2) | t2.select(t2.c3))
self.assertEqual(str(in_),
- '("c1" IN (SELECT "a"."c2" FROM "t2" AS "a" '
- 'UNION SELECT "a"."c3" FROM "t2" AS "a"))')
+ '"c1" IN (SELECT "a"."c2" FROM "t2" AS "a" '
+ 'UNION SELECT "a"."c3" FROM "t2" AS "a")')
self.assertEqual(in_.params, ())
in_ = In(self.table.c1, array('l', list(range(10))))
self.assertEqual(str(in_),
- '("c1" IN (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s))')
+ '"c1" IN (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)')
self.assertEqual(in_.params, tuple(range(10)))
def test_exists(self):
exists = Exists(self.table.select(self.table.c1,
where=self.table.c1 == 1))
self.assertEqual(str(exists),
- '(EXISTS (SELECT "a"."c1" FROM "t" AS "a" '
- 'WHERE ("a"."c1" = %s)))')
+ 'EXISTS (SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c1" = %s)')
self.assertEqual(exists.params, (1,))
def test_floordiv(self):
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_order.py
--- a/sql/tests/test_order.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_order.py Wed Dec 24 10:37:11 2025 +0100
@@ -36,17 +36,17 @@
exp = NullsFirst(self.column)
self.assertEqual(str(exp),
- 'CASE WHEN ("c" IS NULL) THEN %s ELSE %s END ASC, "c"')
+ 'CASE WHEN "c" IS NULL THEN %s ELSE %s END ASC, "c"')
self.assertEqual(exp.params, (0, 1))
exp = NullsFirst(Desc(self.column))
self.assertEqual(str(exp),
- 'CASE WHEN ("c" IS NULL) THEN %s ELSE %s END ASC, "c" DESC')
+ 'CASE WHEN "c" IS NULL THEN %s ELSE %s END ASC, "c" DESC')
self.assertEqual(exp.params, (0, 1))
exp = NullsLast(Literal(2))
self.assertEqual(str(exp),
- 'CASE WHEN (%s IS NULL) THEN %s ELSE %s END ASC, %s')
+ 'CASE WHEN %s IS NULL THEN %s ELSE %s END ASC, %s')
self.assertEqual(exp.params, (2, 1, 0, 2))
finally:
Flavor.set(Flavor())
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_select.py
--- a/sql/tests/test_select.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_select.py Wed Dec 24 10:37:11 2025 +0100
@@ -31,7 +31,7 @@
def test_select3(self):
query = self.table.select(where=(self.table.c == 'foo'))
self.assertEqual(str(query),
- 'SELECT * FROM "t" AS "a" WHERE ("a"."c" = %s)')
+ 'SELECT * FROM "t" AS "a" WHERE "a"."c" = %s')
self.assertEqual(tuple(query.params), ('foo',))
def test_select_iter(self):
@@ -110,7 +110,7 @@
'SELECT * FROM "t2" AS "c") AS "a"')
query1.where = self.table.c == 'foo'
self.assertEqual(str(union),
- 'SELECT * FROM "t" AS "a" WHERE ("a"."c" = %s) UNION ALL '
+ 'SELECT * FROM "t" AS "a" WHERE "a"."c" = %s UNION ALL '
'SELECT * FROM "t2" AS "b"')
self.assertEqual(tuple(union.params), ('foo',))
@@ -279,7 +279,7 @@
having=(Min(col2) > 3))
self.assertEqual(str(query),
'SELECT "a"."col1", MIN("a"."col2") FROM "t" AS "a" '
- 'HAVING (MIN("a"."col2") > %s)')
+ 'HAVING MIN("a"."col2") > %s')
self.assertEqual(tuple(query.params), (3,))
def test_select_invalid_having(self):
@@ -383,8 +383,8 @@
'SELECT "a".* FROM ('
'SELECT "b".*, ROWNUM AS "rnum" FROM ('
'SELECT * FROM "t" AS "c") AS "b" '
- 'WHERE (ROWNUM <= %s)) AS "a" '
- 'WHERE ("rnum" > %s)')
+ 'WHERE ROWNUM <= %s) AS "a" '
+ 'WHERE "rnum" > %s')
self.assertEqual(tuple(query.params), (60, 10))
query = self.table.select(
@@ -395,8 +395,8 @@
'SELECT "b"."col1", "b"."col2", ROWNUM AS "rnum" FROM ('
'SELECT "c"."c1" AS "col1", "c"."c2" AS "col2" '
'FROM "t" AS "c") AS "b" '
- 'WHERE (ROWNUM <= %s)) AS "a" '
- 'WHERE ("rnum" > %s)')
+ 'WHERE ROWNUM <= %s) AS "a" '
+ 'WHERE "rnum" > %s')
self.assertEqual(tuple(query.params), (60, 10))
subquery = query.select(query.col1, query.col2)
@@ -407,8 +407,8 @@
'FROM ('
'SELECT "c"."c1" AS "col1", "c"."c2" AS "col2" '
'FROM "t" AS "c") AS "a" '
- 'WHERE (ROWNUM <= %s)) AS "b" '
- 'WHERE ("rnum" > %s)) AS "a"')
+ 'WHERE ROWNUM <= %s) AS "b" '
+ 'WHERE "rnum" > %s) AS "a"')
# XXX alias of query is reused but not a problem
# as it is hidden in subquery
self.assertEqual(tuple(query.params), (60, 10))
@@ -419,15 +419,15 @@
'SELECT "a".* FROM ('
'SELECT "b".*, ROWNUM AS "rnum" FROM ('
'SELECT * FROM "t" AS "c" ORDER BY "c"."c") AS "b" '
- 'WHERE (ROWNUM <= %s)) AS "a" '
- 'WHERE ("rnum" > %s)')
+ 'WHERE ROWNUM <= %s) AS "a" '
+ 'WHERE "rnum" > %s')
self.assertEqual(tuple(query.params), (60, 10))
query = self.table.select(limit=50)
self.assertEqual(str(query),
'SELECT "a".* FROM ('
'SELECT * FROM "t" AS "b") AS "a" '
- 'WHERE (ROWNUM <= %s)')
+ 'WHERE ROWNUM <= %s')
self.assertEqual(tuple(query.params), (50,))
query = self.table.select(offset=10)
@@ -435,7 +435,7 @@
'SELECT "a".* FROM ('
'SELECT "b".*, ROWNUM AS "rnum" FROM ('
'SELECT * FROM "t" AS "c") AS "b") AS "a" '
- 'WHERE ("rnum" > %s)')
+ 'WHERE "rnum" > %s')
self.assertEqual(tuple(query.params), (10,))
query = self.table.select(self.table.c.as_('col'),
@@ -445,9 +445,9 @@
'SELECT "a"."col" FROM ('
'SELECT "b"."col", ROWNUM AS "rnum" FROM ('
'SELECT "c"."c" AS "col" FROM "t" AS "c" '
- 'WHERE ("c"."c" >= %s)) AS "b" '
- 'WHERE (ROWNUM <= %s)) AS "a" '
- 'WHERE ("rnum" > %s)')
+ 'WHERE "c"."c" >= %s) AS "b" '
+ 'WHERE ROWNUM <= %s) AS "a" '
+ 'WHERE "rnum" > %s')
self.assertEqual(tuple(query.params), (20, 60, 10))
finally:
Flavor.set(Flavor())
@@ -499,7 +499,7 @@
Rank(filter_=self.table.c1 > 0, window=window),
Min(self.table.c1, window=window))
self.assertEqual(str(query),
- 'SELECT RANK() FILTER (WHERE ("a"."c1" > %s)) OVER "b", '
+ 'SELECT RANK() FILTER (WHERE "a"."c1" > %s) OVER "b", '
'MIN("a"."c1") OVER "b" FROM "t" AS "a" '
'WINDOW "b" AS (PARTITION BY "a"."c1")')
self.assertEqual(tuple(query.params), (0,))
@@ -517,8 +517,8 @@
Max(self.table.c1, window=window)
/ Min(self.table.c1, window=window))
self.assertEqual(str(query),
- 'SELECT (MAX("a"."c1") OVER (PARTITION BY "a"."c2") '
- '/ MIN("a"."c1") OVER (PARTITION BY "a"."c2")) '
+ 'SELECT MAX("a"."c1") OVER (PARTITION BY "a"."c2") '
+ '/ MIN("a"."c1") OVER (PARTITION BY "a"."c2") '
'FROM "t" AS "a"')
self.assertEqual(tuple(query.params), ())
@@ -527,8 +527,8 @@
Max(self.table.c1, window=window)
/ Min(self.table.c1, window=window))
self.assertEqual(str(query),
- 'SELECT (MAX("a"."c1") OVER (PARTITION BY %s) '
- '/ MIN("a"."c1") OVER (PARTITION BY %s)) '
+ 'SELECT MAX("a"."c1") OVER (PARTITION BY %s) '
+ '/ MIN("a"."c1") OVER (PARTITION BY %s) '
'FROM "t" AS "a"')
self.assertEqual(tuple(query.params), (1, 1))
@@ -539,8 +539,8 @@
/ Min(self.table.c1, window=window2),
windows=[window1])
self.assertEqual(str(query),
- 'SELECT (MAX("a"."c1") OVER "b" '
- '/ MIN("a"."c1") OVER (PARTITION BY %s)) '
+ 'SELECT MAX("a"."c1") OVER "b" '
+ '/ MIN("a"."c1") OVER (PARTITION BY %s) '
'FROM "t" AS "a" '
'WINDOW "b" AS (PARTITION BY "a"."c2")')
self.assertEqual(tuple(query.params), (1,))
@@ -572,10 +572,10 @@
order_by=[Literal(8)])
self.assertEqual(
str(query),
- 'WITH "c" AS (SELECT "a"."c" FROM "t" AS "a" WHERE ("a"."c" > %s))'
+ 'WITH "c" AS (SELECT "a"."c" FROM "t" AS "a" WHERE "a"."c" > %s)'
' SELECT %s, MIN("a"."c") OVER "b" '
- 'FROM SELECT * FROM "t" AS "a" WHERE ("a"."c" > %s) '
- 'WHERE ("a"."c" > %s) '
+ 'FROM SELECT * FROM "t" AS "a" WHERE "a"."c" > %s '
+ 'WHERE "a"."c" > %s '
'GROUP BY %s '
'HAVING %s '
'WINDOW "b" AS (PARTITION BY %s) '
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_update.py
--- a/sql/tests/test_update.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_update.py Wed Dec 24 10:37:11 2025 +0100
@@ -15,7 +15,7 @@
query.where = (self.table.b == Literal(True))
self.assertEqual(str(query),
- 'UPDATE "t" AS "a" SET "c" = %s WHERE ("a"."b" = %s)')
+ 'UPDATE "t" AS "a" SET "c" = %s WHERE "a"."b" = %s')
self.assertEqual(query.params, ('foo', True))
def test_update2(self):
@@ -24,7 +24,7 @@
query = t1.update([t1.c], ['foo'], from_=[t2], where=(t1.c == t2.c))
self.assertEqual(str(query),
'UPDATE "t1" AS "b" SET "c" = %s FROM "t2" AS "a" '
- 'WHERE ("b"."c" = "a"."c")')
+ 'WHERE "b"."c" = "a"."c"')
self.assertEqual(query.params, ('foo',))
def test_update_invalid_values(self):
@@ -43,7 +43,7 @@
for query in [query_list, query_nolist]:
self.assertEqual(str(query),
'UPDATE "t1" AS "b" SET "c" = ('
- 'SELECT "a"."c" FROM "t2" AS "a" WHERE ("a"."i" = "b"."i"))')
+ 'SELECT "a"."c" FROM "t2" AS "a" WHERE "a"."i" = "b"."i")')
self.assertEqual(query.params, ())
def test_update_returning(self):
@@ -62,7 +62,7 @@
self.assertEqual(str(query),
'UPDATE "t1" AS "b" SET "c" = %s '
'RETURNING (SELECT "a"."c" FROM "t2" AS "a" '
- 'WHERE (("a"."c1" = "b"."c") AND ("a"."c2" = %s)))')
+ 'WHERE ("a"."c1" = "b"."c") AND ("a"."c2" = %s))')
self.assertEqual(query.params, ('foo', 'bar'))
def test_with(self):
@@ -76,7 +76,7 @@
self.assertEqual(str(query),
'WITH "a" AS (SELECT "b"."c1" FROM "t1" AS "b") '
'UPDATE "t" AS "c" SET "c2" = (SELECT "a"."c3" FROM "a" AS "a" '
- 'WHERE ("a"."c4" = %s))')
+ 'WHERE "a"."c4" = %s)')
self.assertEqual(query.params, (2,))
def test_schema(self):
@@ -95,5 +95,5 @@
self.assertEqual(str(query),
'UPDATE "default"."t1" AS "b" SET "c1" = ('
'SELECT "a"."c" FROM "default"."t2" AS "a" '
- 'WHERE ("a"."i" = "b"."i"))')
+ 'WHERE "a"."i" = "b"."i")')
self.assertEqual(query.params, ())
diff -r b1dfdb4a20c5 -r 05c585f43f17 sql/tests/test_with.py
--- a/sql/tests/test_with.py Wed Dec 24 12:01:06 2025 +0100
+++ b/sql/tests/test_with.py Wed Dec 24 10:37:11 2025 +0100
@@ -15,7 +15,7 @@
self.assertEqual(simple.statement(),
'"a" AS ('
- 'SELECT "b"."id" FROM "t" AS "b" WHERE ("b"."id" = %s)'
+ 'SELECT "b"."id" FROM "t" AS "b" WHERE "b"."id" = %s'
')')
self.assertEqual(simple.statement_params(), (1,))
@@ -40,7 +40,7 @@
wq = WithQuery(with_=[simple, second])
self.assertEqual(wq._with_str(),
'WITH "a" AS ('
- 'SELECT "b"."id" FROM "t" AS "b" WHERE ("b"."id" = %s)'
+ 'SELECT "b"."id" FROM "t" AS "b" WHERE "b"."id" = %s'
'), "c" AS ('
'SELECT * FROM "a" AS "a"'
') ')
@@ -59,7 +59,7 @@
'WITH RECURSIVE "a" ("n") AS ('
'VALUES (%s) '
'UNION ALL '
- 'SELECT ("a"."n" + %s) FROM "a" AS "a" WHERE ("a"."n" < %s)'
+ 'SELECT "a"."n" + %s FROM "a" AS "a" WHERE "a"."n" < %s'
') SELECT * FROM "a" AS "a"')
self.assertEqual(tuple(q.params), (1, 1, 100))