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
        {