neqjoinsel must now pass through collation to eqjoinsel.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jul 2020 23:40:44 +0000 (19:40 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jul 2020 23:41:03 +0000 (19:41 -0400)
Since commit 044c99bc5, eqjoinsel passes the passed-in collation
to any operators it invokes.  However, neqjoinsel failed to pass
on whatever collation it got, so that if we invoked a
collation-dependent operator via that code path, we'd get "could not
determine which collation to use for string comparison" or the like.

Per report from Justin Pryzby.  Back-patch to v12, like the previous
commit.

Discussion: https://postgr.es/m/20200721191606.GL5748@telsasoft.com

src/backend/utils/adt/selfuncs.c

index be08eb4814891e70d7a741420c9fb0013e386c0a..53d974125fd5332d4ce153b3d26cade48be220ad 100644 (file)
@@ -2775,6 +2775,7 @@ neqjoinsel(PG_FUNCTION_ARGS)
        List       *args = (List *) PG_GETARG_POINTER(2);
        JoinType        jointype = (JoinType) PG_GETARG_INT16(3);
        SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) PG_GETARG_POINTER(4);
+       Oid                     collation = PG_GET_COLLATION();
        float8          result;
 
        if (jointype == JOIN_SEMI || jointype == JOIN_ANTI)
@@ -2821,12 +2822,14 @@ neqjoinsel(PG_FUNCTION_ARGS)
 
                if (eqop)
                {
-                       result = DatumGetFloat8(DirectFunctionCall5(eqjoinsel,
-                                                                                                               PointerGetDatum(root),
-                                                                                                               ObjectIdGetDatum(eqop),
-                                                                                                               PointerGetDatum(args),
-                                                                                                               Int16GetDatum(jointype),
-                                                                                                               PointerGetDatum(sjinfo)));
+                       result =
+                               DatumGetFloat8(DirectFunctionCall5Coll(eqjoinsel,
+                                                                                                          collation,
+                                                                                                          PointerGetDatum(root),
+                                                                                                          ObjectIdGetDatum(eqop),
+                                                                                                          PointerGetDatum(args),
+                                                                                                          Int16GetDatum(jointype),
+                                                                                                          PointerGetDatum(sjinfo)));
                }
                else
                {