(Tôi không phải là chuyên gia về mã nguồn này. Bạn đã được cảnh báo.)
Nguồn trực tuyến tại đây . Tôi đã bỏ qua các tên tệp; bạn có thể tìm kiếm các tên hàm để tìm định nghĩa của chúng. Tôi để lại số dòng (thường là) vì dễ cắt và dán hơn, và các số dòng khác nhau có nghĩa là nguồn đã thay đổi.
Câu chuyện ngắn là một số kết quả trả về "void" có thể là chuỗi rỗng (chuỗi rỗng có kết thúc bằng rỗng) và một số khác là con trỏ rỗng.
Dưới đây là các phần của nguồn có vẻ phù hợp.
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 }
Chúng tôi cũng có
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
Vì vậy, tôi hiểu rằng một hàm do người dùng định nghĩa trả về thông qua PG_RETURN_VOID () sẽ không kiểm tra tương đương với một hàm trả về thông qua void_out () hoặc void_send (). Tôi vẫn chưa biết tại sao lại như vậy, nhưng tôi phải dừng lại và đi ngủ một chút.