Skip to content

Commit bab35a7

Browse files
committed
Always add parentheses around PgUnknownBinaryExpression (#3073)
Fixes #3072 (cherry picked from commit 35f0fd5)
1 parent bbcdde6 commit bab35a7

File tree

2 files changed

+36
-17
lines changed

2 files changed

+36
-17
lines changed

src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1401,7 +1401,7 @@ protected override bool RequiresParentheses(SqlExpression outerExpression, SqlEx
14011401

14021402
// If both operators have the same precedence, add parentheses unless they're the same operator, and
14031403
// that operator is associative (e.g. a + b + c)
1404-
0 => outerExpression is not PgBinaryExpression outerBinary
1404+
_ => outerExpression is not PgBinaryExpression outerBinary
14051405
|| outerBinary.OperatorType != innerBinary.OperatorType
14061406
|| !isOuterAssociative
14071407
// Arithmetic operators on floating points aren't associative, because of rounding errors.
@@ -1416,6 +1416,9 @@ protected override bool RequiresParentheses(SqlExpression outerExpression, SqlEx
14161416
return true;
14171417
}
14181418

1419+
case PgUnknownBinaryExpression:
1420+
return true;
1421+
14191422
default:
14201423
return base.RequiresParentheses(outerExpression, innerExpression);
14211424
}

test/EFCore.PG.FunctionalTests/Query/TrigramsQueryNpgsqlTest.cs

+32-16
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public TrigramsQueryNpgsqlTest(TrigramsQueryNpgsqlFixture fixture, ITestOutputHe
2727
public void TrigramsShow()
2828
{
2929
using var context = CreateContext();
30-
var _ = context.TrigramsTestEntities
30+
_ = context.TrigramsTestEntities
3131
.Select(x => EF.Functions.TrigramsShow(x.Text))
3232
.ToArray();
3333

@@ -38,7 +38,7 @@ public void TrigramsShow()
3838
public void TrigramsSimilarity()
3939
{
4040
using var context = CreateContext();
41-
var _ = context.TrigramsTestEntities
41+
_ = context.TrigramsTestEntities
4242
.Select(x => EF.Functions.TrigramsSimilarity(x.Text, "target"))
4343
.ToArray();
4444

@@ -49,7 +49,7 @@ public void TrigramsSimilarity()
4949
public void TrigramsWordSimilarity()
5050
{
5151
using var context = CreateContext();
52-
var _ = context.TrigramsTestEntities
52+
_ = context.TrigramsTestEntities
5353
.Select(x => EF.Functions.TrigramsWordSimilarity(x.Text, "target"))
5454
.ToArray();
5555

@@ -61,7 +61,7 @@ public void TrigramsWordSimilarity()
6161
public void TrigramsStrictWordSimilarity()
6262
{
6363
using var context = CreateContext();
64-
var _ = context.TrigramsTestEntities
64+
_ = context.TrigramsTestEntities
6565
.Select(x => EF.Functions.TrigramsStrictWordSimilarity(x.Text, "target"))
6666
.ToArray();
6767

@@ -72,7 +72,7 @@ public void TrigramsStrictWordSimilarity()
7272
public void TrigramsAreSimilar()
7373
{
7474
using var context = CreateContext();
75-
var _ = context.TrigramsTestEntities
75+
_ = context.TrigramsTestEntities
7676
.Select(x => EF.Functions.TrigramsAreSimilar(x.Text, "target"))
7777
.ToArray();
7878

@@ -83,7 +83,7 @@ public void TrigramsAreSimilar()
8383
public void TrigramsAreWordSimilar()
8484
{
8585
using var context = CreateContext();
86-
var _ = context.TrigramsTestEntities
86+
_ = context.TrigramsTestEntities
8787
.Select(x => EF.Functions.TrigramsAreWordSimilar(x.Text, "target"))
8888
.ToArray();
8989

@@ -94,7 +94,7 @@ public void TrigramsAreWordSimilar()
9494
public void TrigramsAreNotWordSimilar()
9595
{
9696
using var context = CreateContext();
97-
var _ = context.TrigramsTestEntities
97+
_ = context.TrigramsTestEntities
9898
.Select(x => EF.Functions.TrigramsAreNotWordSimilar(x.Text, "target"))
9999
.ToArray();
100100

@@ -106,7 +106,7 @@ public void TrigramsAreNotWordSimilar()
106106
public void TrigramsAreStrictWordSimilar()
107107
{
108108
using var context = CreateContext();
109-
var _ = context.TrigramsTestEntities
109+
_ = context.TrigramsTestEntities
110110
.Select(x => EF.Functions.TrigramsAreStrictWordSimilar(x.Text, "target"))
111111
.ToArray();
112112

@@ -118,7 +118,7 @@ public void TrigramsAreStrictWordSimilar()
118118
public void TrigramsAreNotStrictWordSimilar()
119119
{
120120
using var context = CreateContext();
121-
var _ = context.TrigramsTestEntities
121+
_ = context.TrigramsTestEntities
122122
.Select(x => EF.Functions.TrigramsAreNotStrictWordSimilar(x.Text, "target"))
123123
.ToArray();
124124

@@ -129,7 +129,7 @@ public void TrigramsAreNotStrictWordSimilar()
129129
public void TrigramsSimilarityDistance()
130130
{
131131
using var context = CreateContext();
132-
var _ = context.TrigramsTestEntities
132+
_ = context.TrigramsTestEntities
133133
.Select(x => EF.Functions.TrigramsSimilarityDistance(x.Text, "target"))
134134
.ToArray();
135135

@@ -140,7 +140,7 @@ public void TrigramsSimilarityDistance()
140140
public void TrigramsWordSimilarityDistance()
141141
{
142142
using var context = CreateContext();
143-
var _ = context.TrigramsTestEntities
143+
_ = context.TrigramsTestEntities
144144
.Select(x => EF.Functions.TrigramsWordSimilarityDistance(x.Text, "target"))
145145
.ToArray();
146146

@@ -151,7 +151,7 @@ public void TrigramsWordSimilarityDistance()
151151
public void TrigramsWordSimilarityDistanceInverted()
152152
{
153153
using var context = CreateContext();
154-
var _ = context.TrigramsTestEntities
154+
_ = context.TrigramsTestEntities
155155
.Select(x => EF.Functions.TrigramsWordSimilarityDistanceInverted(x.Text, "target"))
156156
.ToArray();
157157

@@ -163,7 +163,7 @@ public void TrigramsWordSimilarityDistanceInverted()
163163
public void TrigramsStrictWordSimilarityDistance()
164164
{
165165
using var context = CreateContext();
166-
var _ = context.TrigramsTestEntities
166+
_ = context.TrigramsTestEntities
167167
.Select(x => EF.Functions.TrigramsStrictWordSimilarityDistance(x.Text, "target"))
168168
.ToArray();
169169

@@ -175,18 +175,18 @@ public void TrigramsStrictWordSimilarityDistance()
175175
public void TrigramsStrictWordSimilarityDistanceInverted()
176176
{
177177
using var context = CreateContext();
178-
var _ = context.TrigramsTestEntities
178+
_ = context.TrigramsTestEntities
179179
.Select(x => EF.Functions.TrigramsStrictWordSimilarityDistanceInverted(x.Text, "target"))
180180
.ToArray();
181181

182182
AssertContainsSql(@"t.""Text"" <->>> 'target'");
183183
}
184184

185185
[Fact] // #1659
186-
public void Operator_precedence()
186+
public void Concatenation_operator_precedence()
187187
{
188188
using var context = CreateContext();
189-
var _ = context.TrigramsTestEntities
189+
_ = context.TrigramsTestEntities
190190
.Where(e => EF.Functions.TrigramsAreSimilar(e.Text + " " + e.Text, "query"))
191191
.ToArray();
192192

@@ -198,6 +198,22 @@ public void Operator_precedence()
198198
""");
199199
}
200200

201+
[Fact] // #3072
202+
public void PgUnknownBinary_operator_precedence()
203+
{
204+
using var context = CreateContext();
205+
_ = context.TrigramsTestEntities
206+
.Where(e => 1 - EF.Functions.TrigramsSimilarityDistance(e.Text, "query") > 8)
207+
.ToArray();
208+
209+
AssertSql(
210+
"""
211+
SELECT t."Id", t."Text"
212+
FROM "TrigramsTestEntities" AS t
213+
WHERE 1 - (t."Text" <-> 'query') > 8
214+
""");
215+
}
216+
201217
#endregion
202218

203219
#region Fixtures

0 commit comments

Comments
 (0)