(Saya bukan ahli dalam kode sumber ini. Anda telah diperingatkan.)
Sumbernya online di sini . Saya telah menghilangkan nama file; Anda dapat mencari nama fungsi untuk menemukan definisinya. Saya meninggalkan nomor baris (biasanya) karena lebih mudah untuk memotong dan menempel, dan nomor baris yang berbeda berarti sumbernya telah berubah.
Singkat cerita adalah bahwa beberapa pengembalian "void" mungkin adalah cstring kosong (string kosong yang diakhiri dengan nol), dan yang lainnya adalah pointer nol.
Berikut adalah bagian dari sumber yang terlihat relevan.
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 }
Kami juga memiliki
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
Jadi masuk akal bagi saya bahwa fungsi yang ditentukan pengguna yang kembali melalui PG_RETURN_VOID() tidak akan menguji setara dengan yang kembali melalui void_out() atau void_send(). Aku belum tahu kenapa, tapi aku harus berhenti dan tidur.