sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL-funktioner returnerer void

(Jeg er ikke ekspert i denne kildekode. Du er blevet advaret.)

Kilden er online her . Jeg har udeladt filnavnene; du kan søge efter funktionsnavnene for at finde deres definitioner. Jeg forlod linjenumrene (normalt), fordi det er nemmere at klippe og indsætte, og forskellige linjenumre vil betyde, at kilden er ændret.

Den korte historie er, at nogle "ugyldige" returneringer sandsynligvis er tomme cstrings (tomme null-terminerede strenge), og andre er null pointers.

Her er de dele af kilden, der ser relevante ud.

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 }

Vi har også

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

Så det giver mening for mig, at en brugerdefineret funktion, der returnerer gennem PG_RETURN_VOID() ikke ville teste svarende til en, der returnerer gennem void_out() eller void_send(). Jeg ved endnu ikke hvorfor det er sådan, men jeg er nødt til at stoppe op og sove lidt.




  1. Sådan tilføjes paginering i php

  2. hvordan man bruger korrekt if-sætning postgresql

  3. Skift modellens tabelnavn runtime

  4. SQL SUM() for begyndere