Skip to content

Commit 08cf1a0

Browse files
committed
Fix nullability for IndexOf (array_position) (#3477)
Fixes #3474 (cherry picked from commit 0212cae)
1 parent 83b5f63 commit 08cf1a0

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
@@ -856,7 +856,7 @@ await AssertQuery(
856856
"""
857857
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"
858858
FROM "SomeEntities" AS s
859-
WHERE array_position(s."IntList", 6) - 1 = 1
859+
WHERE COALESCE(array_position(s."IntList", 6) - 1, -1) = 1
860860
""");
861861
}
862862

@@ -872,7 +872,7 @@ await AssertQuery(
872872
"""
873873
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"
874874
FROM "SomeEntities" AS s
875-
WHERE array_position(s."IntList", 6, 2) - 1 = 1
875+
WHERE COALESCE(array_position(s."IntList", 6, 2) - 1, -1) = 1
876876
""");
877877
}
878878

0 commit comments

Comments
 (0)