(Ich bin kein Experte für diesen Quellcode. Sie wurden gewarnt.)
Die Quelle ist online hier . Ich habe die Dateinamen weggelassen; Sie können nach den Funktionsnamen suchen, um ihre Definitionen zu finden. Ich habe (normalerweise) die Zeilennummern beibehalten, weil es einfacher ist, sie auszuschneiden und einzufügen, und unterschiedliche Zeilennummern bedeuten, dass sich die Quelle geändert hat.
Kurz gesagt, einige "void"-Rückgaben sind wahrscheinlich leere cstrings (leere nullterminierte Strings) und andere sind Nullzeiger.
Hier sind die Teile der Quelle, die relevant erscheinen.
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 }
Wir haben auch
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
Daher macht es für mich Sinn, dass eine benutzerdefinierte Funktion, die über PG_RETURN_VOID() zurückkehrt, nicht äquivalent zu einer getestet wird, die über void_out() oder void_send() zurückkehrt. Ich weiß noch nicht, warum das so ist, aber ich muss aufhören und etwas schlafen.