PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonctions PostgreSQL renvoyant void

(Je ne suis pas un expert de ce code source. Vous êtes prévenu.)

La source est en ligne ici . J'ai omis les noms de fichiers ; vous pouvez rechercher les noms de fonctions pour trouver leurs définitions. J'ai laissé les numéros de ligne (généralement) car il est plus facile de couper et coller, et des numéros de ligne différents signifieront que la source a changé.

L'histoire courte est que certains retours "vides" sont probablement des cstrings vides (chaînes vides terminées par null), et d'autres sont des pointeurs nuls.

Voici les parties de la source qui semblent pertinentes.

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 }

Nous avons aussi

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

Il est donc logique pour moi qu'une fonction définie par l'utilisateur qui retourne via PG_RETURN_VOID() ne soit pas équivalente à celle qui retourne via void_out() ou void_send(). Je ne sais pas encore pourquoi, mais je dois m'arrêter et dormir un peu.