sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-functies retourneren void

(Ik ben geen expert in deze broncode. Je bent gewaarschuwd.)

De bron is online hier . Ik heb de bestandsnamen weggelaten; u kunt zoeken naar de functienamen om hun definities te vinden. Ik heb de regelnummers (meestal) gelaten omdat het gemakkelijker is om te knippen en plakken, en verschillende regelnummers betekenen dat de bron is gewijzigd.

Het korte verhaal is dat sommige "ongeldige" resultaten waarschijnlijk lege cstrings zijn (lege null-terminated strings), en andere zijn null-pointers.

Dit zijn de delen van de bron die er relevant uitzien.

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 }

We hebben ook

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

Het is dus logisch voor mij dat een door de gebruiker gedefinieerde functie die terugkeert via PG_RETURN_VOID() niet equivalent zou zijn aan een functie die terugkeert via void_out() of void_send(). Ik weet nog niet waarom dat is, maar ik moet stoppen en gaan slapen.




  1. Ik moet postcodes opslaan in een database. Hoe groot moet de kolom zijn?

  2. Vind min en max voor subsets van opeenvolgende rijen - hiaten en eilanden

  3. java.lang.OutOfMemoryError:[geheugen uitgeput] tijdens het lezen van gegevens van Sqlite Android

  4. MySQL Tinybit(1)-kolom door een weergave