Skip to content

Commit 0fdf784

Browse files
committed
Fix nullability for IndexOf (array_position) (#3477)
Fixes #3474 (cherry picked from commit 0212cae)
1 parent 6a34455 commit 0fdf784

File tree

4 files changed

+18
-7
lines changed

4 files changed

+18
-7
lines changed

src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlArrayMethodTranslator.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,10 @@ static bool IsMappedToNonArray(SqlExpression arrayOrList)
141141
"array_position",
142142
[array, item],
143143
nullable: true,
144-
TrueArrays[2],
144+
// array_position can return NULL even if both its arguments are non-nullable;
145+
// this is currently the way to express that (see
146+
// https://github.com/dotnet/efcore/pull/33814#issuecomment-2687857927).
147+
FalseArrays[2],
145148
arrayOrList.Type),
146149
_sqlExpressionFactory.Constant(1)),
147150
_sqlExpressionFactory.Constant(-1));
@@ -161,7 +164,10 @@ static bool IsMappedToNonArray(SqlExpression arrayOrList)
161164
"array_position",
162165
[array, item, startIndex],
163166
nullable: true,
164-
TrueArrays[3],
167+
// array_position can return NULL even if both its arguments are non-nullable;
168+
// this is currently the way to express that (see
169+
// https://github.com/dotnet/efcore/pull/33814#issuecomment-2687857927).
170+
FalseArrays[3],
165171
arrayOrList.Type),
166172
_sqlExpressionFactory.Constant(1)),
167173
_sqlExpressionFactory.Constant(-1));

src/EFCore.PG/Utilities/Util.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,10 @@ internal static class Statics
1515
[true, true, true, true, true, true, true, true]
1616
];
1717

18-
internal static readonly bool[][] FalseArrays = [[], [false], [false, false]];
18+
internal static readonly bool[][] FalseArrays = [
19+
[],
20+
[false],
21+
[false, false],
22+
[false, false, false]
23+
];
1924
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ await AssertQuery(
835835
"""
836836
SELECT s."Id", s."ArrayContainerEntityId", s."ArrayOfStringConvertedToDelimitedString", s."Byte", s."ByteArray", s."Bytea", s."EnumConvertedToInt", s."EnumConvertedToString", s."IList", s."IntArray", s."IntList", s."ListOfStringConvertedToDelimitedString", s."NonNullableText", s."NullableEnumConvertedToString", s."NullableEnumConvertedToStringWithNonNullableLambda", s."NullableIntArray", s."NullableIntList", s."NullableStringArray", s."NullableStringList", s."NullableText", s."StringArray", s."StringList", s."ValueConvertedArrayOfEnum", s."ValueConvertedListOfEnum", s."Varchar10", s."Varchar15"
837837
FROM "SomeEntities" AS s
838-
WHERE array_position(s."IntArray", 6) - 1 = 1
838+
WHERE COALESCE(array_position(s."IntArray", 6) - 1, -1) = 1
839839
""");
840840
}
841841

@@ -849,7 +849,7 @@ await AssertQuery(
849849
"""
850850
SELECT s."Id", s."ArrayContainerEntityId", s."ArrayOfStringConvertedToDelimitedString", s."Byte", s."ByteArray", s."Bytea", s."EnumConvertedToInt", s."EnumConvertedToString", s."IList", s."IntArray", s."IntList", s."ListOfStringConvertedToDelimitedString", s."NonNullableText", s."NullableEnumConvertedToString", s."NullableEnumConvertedToStringWithNonNullableLambda", s."NullableIntArray", s."NullableIntList", s."NullableStringArray", s."NullableStringList", s."NullableText", s."StringArray", s."StringList", s."ValueConvertedArrayOfEnum", s."ValueConvertedListOfEnum", s."Varchar10", s."Varchar15"
851851
FROM "SomeEntities" AS s
852-
WHERE array_position(s."IntArray", 6, 2) - 1 = 1
852+
WHERE COALESCE(array_position(s."IntArray", 6, 2) - 1, -1) = 1
853853
""");
854854
}
855855

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ await AssertQuery(
855855
"""
856856
SELECT s."Id", s."ArrayContainerEntityId", s."ArrayOfStringConvertedToDelimitedString", s."Byte", s."ByteArray", s."Bytea", s."EnumConvertedToInt", s."EnumConvertedToString", s."IList", s."IntArray", s."IntList", s."ListOfStringConvertedToDelimitedString", s."NonNullableText", s."NullableEnumConvertedToString", s."NullableEnumConvertedToStringWithNonNullableLambda", s."NullableIntArray", s."NullableIntList", s."NullableStringArray", s."NullableStringList", s."NullableText", s."StringArray", s."StringList", s."ValueConvertedArrayOfEnum", s."ValueConvertedListOfEnum", s."Varchar10", s."Varchar15"
857857
FROM "SomeEntities" AS s
858-
WHERE array_position(s."IntList", 6) - 1 = 1
858+
WHERE COALESCE(array_position(s."IntList", 6) - 1, -1) = 1
859859
""");
860860
}
861861

@@ -871,7 +871,7 @@ await AssertQuery(
871871
"""
872872
SELECT s."Id", s."ArrayContainerEntityId", s."ArrayOfStringConvertedToDelimitedString", s."Byte", s."ByteArray", s."Bytea", s."EnumConvertedToInt", s."EnumConvertedToString", s."IList", s."IntArray", s."IntList", s."ListOfStringConvertedToDelimitedString", s."NonNullableText", s."NullableEnumConvertedToString", s."NullableEnumConvertedToStringWithNonNullableLambda", s."NullableIntArray", s."NullableIntList", s."NullableStringArray", s."NullableStringList", s."NullableText", s."StringArray", s."StringList", s."ValueConvertedArrayOfEnum", s."ValueConvertedListOfEnum", s."Varchar10", s."Varchar15"
873873
FROM "SomeEntities" AS s
874-
WHERE array_position(s."IntList", 6, 2) - 1 = 1
874+
WHERE COALESCE(array_position(s."IntList", 6, 2) - 1, -1) = 1
875875
""");
876876
}
877877

0 commit comments

Comments
 (0)