Skip to content

Commit d6fcf6d

Browse files
authored
Fix some missing parenthesization (#895)
1 parent 77a4b63 commit d6fcf6d

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

gel/_internal/_qb/_expressions.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,10 @@ def __edgeql_expr__(self, *, ctx: ScopeContext) -> str:
222222
steps.append(step)
223223
current = source
224224

225-
steps.append(edgeql(current, ctx=ctx))
225+
base = edgeql(current, ctx=ctx)
226+
if not isinstance(current, AtomicExpr):
227+
base = f"({base})"
228+
steps.append(base)
226229

227230
return "".join(reversed(steps))
228231

@@ -868,6 +871,10 @@ def _need_left_parens(
868871
) -> bool:
869872
if isinstance(lexpr, AtomicExpr):
870873
return False
874+
# FIXME?: This is true up until 7.0. Before 7.0 we usually need
875+
# to parenthesize statements, but afterward not.
876+
if isinstance(lexpr, Stmt):
877+
return True
871878
left_prec = lprec if lprec is not None else lexpr.precedence
872879
return _edgeql.need_left_parens(prod_prec, left_prec)
873880

@@ -879,6 +886,10 @@ def _need_right_parens(
879886
) -> bool:
880887
if isinstance(rexpr, AtomicExpr):
881888
return False
889+
# FIXME?: This is true up until 7.0. Before 7.0 we usually need
890+
# to parenthesize statements, but afterward not.
891+
if isinstance(rexpr, Stmt):
892+
return True
882893
right_prec = rprec if rprec is not None else rexpr.precedence
883894
return _edgeql.need_right_parens(prod_prec, right_prec)
884895

tests/test_qb.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,12 @@ def test_qb_filter_08(self):
323323
self.assertEqual(post.author.name, "Elsa")
324324
self.assertEqual(post.body, "*magic stuff*")
325325

326-
@tb.xfail
326+
@tb.skip_typecheck # FIXME: array equality busted
327327
def test_qb_filter_09(self):
328328
from models.orm import default, std
329329

330330
# Find GameSession with same players as the green group
331-
green = default.UserGroup.filter(name="green")
331+
green = default.UserGroup.select(users=True).filter(name="green")
332332
q = default.GameSession.select(
333333
"*",
334334
players=True,
@@ -337,27 +337,31 @@ def test_qb_filter_09(self):
337337
== std.array_agg(green.users.id)
338338
)
339339

340+
self.assertEqual(1, 2)
340341
res = self.client.get(q)
342+
green_res = self.client.get(green)
341343
self.assertEqual(res.num, 123)
342344
self.assertEqual(
343-
{u.id for u in res.players}, {u.id for u in green.users}
345+
{u.id for u in res.players},
346+
{u.id for u in green_res.users},
344347
)
345348

346-
@tb.xfail
347349
def test_qb_filter_10(self):
348350
from models.orm import default, std
349351

350352
# Find GameSession with same *number* of players as the green group
351-
green = default.UserGroup.filter(name="green")
353+
green = default.UserGroup.select(users=True).filter(name="green")
352354
q = default.GameSession.select(
353355
"*",
354356
players=True,
355357
).filter(lambda g: std.count(g.players) == std.count(green.users))
356358

357359
res = self.client.get(q)
360+
green_res = self.client.get(green)
358361
self.assertEqual(res.num, 123)
359362
self.assertEqual(
360-
{u.id for u in res.players}, {u.id for u in green.users}
363+
{u.id for u in res.players},
364+
{u.id for u in green_res.users},
361365
)
362366

363367
def test_qb_link_property_01(self):

0 commit comments

Comments
 (0)