(Jeg er ikke ekspert i denne kildekode. Du er blevet advaret.)
Kilden er online her . Jeg har udeladt filnavnene; du kan søge efter funktionsnavnene for at finde deres definitioner. Jeg forlod linjenumrene (normalt), fordi det er nemmere at klippe og indsætte, og forskellige linjenumre vil betyde, at kilden er ændret.
Den korte historie er, at nogle "ugyldige" returneringer sandsynligvis er tomme cstrings (tomme null-terminerede strenge), og andre er null pointers.
Her er de dele af kilden, der ser relevante ud.
00228 /*
00229 * void_out - output routine for pseudo-type VOID.
00230 *
00231 * We allow this so that "SELECT function_returning_void(...)" works.
00232 */
00233 Datum
00234 void_out(PG_FUNCTION_ARGS)
00235 {
00236 PG_RETURN_CSTRING(pstrdup(""));
00237 }
00251 /*
00252 * void_send - binary output routine for pseudo-type VOID.
00253 *
00254 * We allow this so that "SELECT function_returning_void(...)" works
00255 * even when binary output is requested.
00256 */
00257 Datum
00258 void_send(PG_FUNCTION_ARGS)
00259 {
00260 StringInfoData buf;
00261
00262 /* send an empty string */
00263 pq_begintypsend(&buf);
00264 PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
00265 }
Vi har også
00285 /* To return a NULL do this: */
00286 #define PG_RETURN_NULL() \
00287 do { fcinfo->isnull = true; return (Datum) 0; } while (0)
00288
00289 /* A few internal functions return void (which is not the same as NULL!) */
00290 #define PG_RETURN_VOID() return (Datum) 0
Så det giver mening for mig, at en brugerdefineret funktion, der returnerer gennem PG_RETURN_VOID() ikke ville teste svarende til en, der returnerer gennem void_out() eller void_send(). Jeg ved endnu ikke hvorfor det er sådan, men jeg er nødt til at stoppe op og sove lidt.