Skip to content

Commit 8402038

Browse files
authored
Fix operator precedence of AT TIME ZONE (#2987)
Fixes #2980
1 parent 060b9c6 commit 8402038

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,7 @@ protected override bool TryGetOperatorInfo(SqlExpression expression, out int pre
14851485
PgBinaryExpression => (1000, false),
14861486

14871487
CollateExpression => (1000, false),
1488-
AtTimeZoneExpression => (1000, false),
1488+
AtTimeZoneExpression => (1100, false),
14891489
InExpression => (900, false),
14901490
PgJsonTraversalExpression => (1000, false),
14911491
PgArrayIndexExpression => (1500, false),

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

+35
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,41 @@ LIMIT 2
125125
""");
126126
}
127127

128+
[ConditionalFact]
129+
public virtual async Task AtTimeZone_and_addition()
130+
{
131+
var contextFactory = await InitializeAsync<OperatorsContext>(
132+
seed: context =>
133+
{
134+
context.Set<OperatorEntityDateTime>().AddRange(
135+
new OperatorEntityDateTime { Id = 1, Value = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
136+
new OperatorEntityDateTime { Id = 2, Value = new DateTime(2020, 2, 1, 0, 0, 0, DateTimeKind.Utc) });
137+
context.SaveChanges();
138+
},
139+
onModelCreating: modelBuilder => modelBuilder.Entity<OperatorEntityDateTime>().Property(x => x.Id).ValueGeneratedNever());
140+
141+
await using var context = contextFactory.CreateContext();
142+
143+
var result = await context.Set<OperatorEntityDateTime>()
144+
.Where(b => new DateOnly(2020, 1, 15) > DateOnly.FromDateTime(b.Value.AddDays(1)))
145+
.SingleAsync();
146+
147+
Assert.Equal(1, result.Id);
148+
149+
AssertSql(
150+
"""
151+
SELECT o."Id", o."Value"
152+
FROM "OperatorEntityDateTime" AS o
153+
WHERE DATE '2020-01-15' > CAST((o."Value" + INTERVAL '1 days') AT TIME ZONE 'UTC' AS date)
154+
LIMIT 2
155+
""");
156+
}
157+
158+
public class OperatorEntityDateTime : OperatorEntityBase
159+
{
160+
public DateTime Value { get; set; }
161+
}
162+
128163
protected override void Seed(OperatorsContext ctx)
129164
{
130165
ctx.Set<OperatorEntityString>().AddRange(ExpectedData.OperatorEntitiesString);

0 commit comments

Comments
 (0)