diff --git a/pkg/sql/sem/tree/eval.go b/pkg/sql/sem/tree/eval.go index f61b7d4d8985..5b42059fc708 100644 --- a/pkg/sql/sem/tree/eval.go +++ b/pkg/sql/sem/tree/eval.go @@ -2330,6 +2330,9 @@ func MatchLikeEscape( } func matchLike(ctx *EvalContext, left, right Datum, caseInsensitive bool) (Datum, error) { + if left == DNull || right == DNull { + return DNull, nil + } s, pattern := string(MustBeDString(left)), string(MustBeDString(right)) if len(s) == 0 { // An empty string only matches with an empty pattern or a pattern diff --git a/pkg/sql/sem/tree/testdata/eval/any_some_all b/pkg/sql/sem/tree/testdata/eval/any_some_all index 791f947a1dbb..bc34e72bd1a1 100644 --- a/pkg/sql/sem/tree/testdata/eval/any_some_all +++ b/pkg/sql/sem/tree/testdata/eval/any_some_all @@ -25,6 +25,21 @@ eval ---- false +eval +'foo' LIKE ANY ARRAY[] +---- +false + +eval +'foo' LIKE ANY (ARRAY['bar', 'baz']) +---- +false + +eval +'foo' LIKE ANY (ARRAY['foo', 'bar', 'baz']) +---- +true + eval 1+1 = SOME (ARRAY[1, 3, 4]) ---- @@ -50,6 +65,21 @@ eval ---- true +eval +'foo' LIKE ALL ARRAY[] +---- +true + +eval +'foo' LIKE ALL (ARRAY['foo', 'bar', 'baz']) +---- +false + +eval +'foo' LIKE ALL (ARRAY['foo', 'foo']) +---- +true + eval 1 = ANY (ARRAY[1, 2, NULL]) ---- @@ -87,6 +117,11 @@ eval ---- NULL +eval +'foo' LIKE ANY(NULL::string[]) +---- +NULL + eval NULL::int = ANY(NULL::int[]) ---- @@ -102,6 +137,11 @@ NULL::int = ALL(NULL::int[]) ---- NULL +eval +NULL::string LIKE ANY(NULL::string[]) +---- +NULL + # A null LHS has different behavior if the array is empty or not eval NULL::int = ANY(ARRAY[1,2]) @@ -133,6 +173,21 @@ NULL::int = ALL(ARRAY[]:::int[]) ---- true +eval +NULL::string LIKE ANY(ARRAY[]:::string[]) +---- +false + +eval +NULL::string LIKE SOME(ARRAY[]:::string[]) +---- +false + +eval +NULL::string LIKE ALL(ARRAY[]:::string[]) +---- +true + eval 1 = ALL (ARRAY[1, 2, NULL]) ---- @@ -232,3 +287,19 @@ eval 'aaa' NOT ILIKE ANY (ARRAY['%A%', '%A%']) ---- false + +# Regression test for #40841 -- make sure LIKE can handle nulls. +eval +NULL::string LIKE ANY(ARRAY['bar', 'baz']) +---- +NULL + +eval +NULL::string ILIKE ANY(ARRAY['bar%', 'baz']) +---- +NULL + +eval +NULL::string LIKE ANY(ARRAY['bar', NULL]) +---- +NULL