PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Funktionen geben void zurück

(Ich bin kein Experte für diesen Quellcode. Sie wurden gewarnt.)

Die Quelle ist online hier . Ich habe die Dateinamen weggelassen; Sie können nach den Funktionsnamen suchen, um ihre Definitionen zu finden. Ich habe (normalerweise) die Zeilennummern beibehalten, weil es einfacher ist, sie auszuschneiden und einzufügen, und unterschiedliche Zeilennummern bedeuten, dass sich die Quelle geändert hat.

Kurz gesagt, einige "void"-Rückgaben sind wahrscheinlich leere cstrings (leere nullterminierte Strings) und andere sind Nullzeiger.

Hier sind die Teile der Quelle, die relevant erscheinen.

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 }

Wir haben auch

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

Daher macht es für mich Sinn, dass eine benutzerdefinierte Funktion, die über PG_RETURN_VOID() zurückkehrt, nicht äquivalent zu einer getestet wird, die über void_out() oder void_send() zurückkehrt. Ich weiß noch nicht, warum das so ist, aber ich muss aufhören und etwas schlafen.