diff options
Diffstat (limited to 'src/backend/utils/adt/like_support.c')
-rw-r--r-- | src/backend/utils/adt/like_support.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/src/backend/utils/adt/like_support.c b/src/backend/utils/adt/like_support.c index 8b15509a3bf..ee71ca89ffd 100644 --- a/src/backend/utils/adt/like_support.c +++ b/src/backend/utils/adt/like_support.c @@ -273,22 +273,6 @@ match_pattern_prefix(Node *leftop, patt = (Const *) rightop; /* - * Not supported if the expression collation is nondeterministic. The - * optimized equality or prefix tests use bytewise comparisons, which is - * not consistent with nondeterministic collations. The actual - * pattern-matching implementation functions will later error out that - * pattern-matching is not supported with nondeterministic collations. (We - * could also error out here, but by doing it later we get more precise - * error messages.) (It should be possible to support at least - * Pattern_Prefix_Exact, but no point as long as the actual - * pattern-matching implementations don't support it.) - * - * expr_coll is not set for a non-collation-aware data type such as bytea. - */ - if (expr_coll && !get_collation_isdeterministic(expr_coll)) - return NIL; - - /* * Try to extract a fixed prefix from the pattern. */ pstatus = pattern_fixed_prefix(patt, ptype, expr_coll, @@ -404,6 +388,8 @@ match_pattern_prefix(Node *leftop, { if (!op_in_opfamily(eqopr, opfamily)) return NIL; + if (indexcollation != expr_coll) + return NIL; expr = make_opclause(eqopr, BOOLOID, false, (Expr *) leftop, (Expr *) prefix, InvalidOid, indexcollation); @@ -412,6 +398,17 @@ match_pattern_prefix(Node *leftop, } /* + * Anything other than Pattern_Prefix_Exact is not supported if the + * expression collation is nondeterministic. The optimized equality or + * prefix tests use bytewise comparisons, which is not consistent with + * nondeterministic collations. + * + * expr_coll is not set for a non-collation-aware data type such as bytea. + */ + if (expr_coll && !get_collation_isdeterministic(expr_coll)) + return NIL; + + /* * Otherwise, we have a nonempty required prefix of the values. Some * opclasses support prefix checks directly, otherwise we'll try to * generate a range constraint. |