Ответ 1
(Я не эксперт в этом исходном коде. Вы были предупреждены.)
Источник находится в режиме онлайн здесь. Я пропустил имена файлов; вы можете выполнить поиск функции имена, чтобы найти их определения. Я оставил номера строк (обычно), потому что их легче вырезать и вставлять, а разные номера строк будут означать, что источник изменился.
Короче говоря, некоторые "пустоты" возвращаются, вероятно, пустые cstrings (пустые строки с нулевым завершением), а другие - нулевые указатели.
Вот те части источника, которые выглядят актуальными.
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 }
Мы также имеем
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
Так что для меня имеет смысл, что пользовательская функция, которая возвращается через PG_RETURN_VOID(), не будет тестировать эквивалентную той, которая возвращается через void_out() или void_send(). Я еще не знаю, почему это так, но я должен остановиться и поспать.