Skip to content

Commit f91d0b0

Browse files
committed
Add method postfix when rewriting parameters for StartsWith/EndsWith/Contains
Fixes #2994
1 parent 8402038 commit f91d0b0

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Diagnostics.CodeAnalysis;
2+
using System.Globalization;
23
using System.Net;
34
using System.Runtime.CompilerServices;
45
using System.Text;
@@ -450,7 +451,8 @@ when patternParameter.Name.StartsWith(QueryCompilationContext.QueryParameterPref
450451
QueryCompilationContext.QueryContextParameter);
451452

452453
var escapedPatternParameter =
453-
_queryCompilationContext.RegisterRuntimeParameter(patternParameter.Name + "_rewritten", lambda);
454+
_queryCompilationContext.RegisterRuntimeParameter(
455+
$"{patternParameter.Name}_{methodType.ToString().ToLower(CultureInfo.InvariantCulture)}", lambda);
454456

455457
translation = _sqlExpressionFactory.Like(
456458
translatedInstance,

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ public void StartsWith_param_pattern()
4444
Assert.Equal(1, result.Id);
4545
AssertSql(
4646
"""
47-
@__param_0_rewritten='some%'
47+
@__param_0_startswith='some%'
4848
4949
SELECT s."Id", s."CaseInsensitiveText"
5050
FROM "SomeEntities" AS s
51-
WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\'
51+
WHERE s."CaseInsensitiveText" LIKE @__param_0_startswith ESCAPE '\'
5252
LIMIT 2
5353
""");
5454
}
@@ -98,11 +98,11 @@ public void EndsWith_param_pattern()
9898
Assert.Equal(1, result.Id);
9999
AssertSql(
100100
"""
101-
@__param_0_rewritten='%sometext'
101+
@__param_0_endswith='%sometext'
102102
103103
SELECT s."Id", s."CaseInsensitiveText"
104104
FROM "SomeEntities" AS s
105-
WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\'
105+
WHERE s."CaseInsensitiveText" LIKE @__param_0_endswith ESCAPE '\'
106106
LIMIT 2
107107
""");
108108
}
@@ -152,11 +152,11 @@ public void Contains_param_pattern()
152152
Assert.Equal(1, result.Id);
153153
AssertSql(
154154
"""
155-
@__param_0_rewritten='%ometex%'
155+
@__param_0_contains='%ometex%'
156156
157157
SELECT s."Id", s."CaseInsensitiveText"
158158
FROM "SomeEntities" AS s
159-
WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\'
159+
WHERE s."CaseInsensitiveText" LIKE @__param_0_contains ESCAPE '\'
160160
LIMIT 2
161161
""");
162162
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,33 @@ await AssertQuery(
3535
ss => ss.Set<FunkyCustomer>().Where(c => c.FirstName != null && c.FirstName.StartsWith(param)));
3636
}
3737

38+
[ConditionalTheory] // TODO: Remove, test was introduced upstream
39+
[MemberData(nameof(IsAsyncData))]
40+
public virtual async Task String_Contains_and_StartsWith_with_same_parameter(bool async)
41+
{
42+
var s = "B";
43+
44+
await AssertQuery(
45+
async,
46+
ss => ss.Set<FunkyCustomer>().Where(
47+
c => c.FirstName.Contains(s) || c.LastName.StartsWith(s)),
48+
ss => ss.Set<FunkyCustomer>().Where(
49+
c => c.FirstName.MaybeScalar(f => f.Contains(s)) == true || c.LastName.MaybeScalar(l => l.StartsWith(s)) == true));
50+
51+
AssertSql(
52+
"""
53+
@__s_0_contains='%B%'
54+
@__s_0_startswith='B%'
55+
56+
SELECT f."Id", f."FirstName", f."LastName", f."NullableBool"
57+
FROM "FunkyCustomers" AS f
58+
WHERE f."FirstName" LIKE @__s_0_contains ESCAPE '\' OR f."LastName" LIKE @__s_0_startswith ESCAPE '\'
59+
""");
60+
}
61+
62+
private void AssertSql(params string[] expected)
63+
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
64+
3865
public class FunkyDataQueryNpgsqlFixture : FunkyDataQueryFixtureBase
3966
{
4067
private FunkyDataData _expectedData;

0 commit comments

Comments
 (0)