Обсуждение: strange behavior with C function and DEFAULT function parameters

Поиск
Список
Период
Сортировка

strange behavior with C function and DEFAULT function parameters

От
Tomas Vondra
Дата:
Hi,

I ran into some pretty strange behavior of C-language function and
default parameter values, both on 9.2 and 9.4devel. Consider for example
this trivial C function:
   Datum   show_bug(PG_FUNCTION_ARGS) {elog(WARNING, "called ;-)");PG_RETURN_VOID();   }

which is accessed using this definition:
   CREATE FUNCTION show_bug(a TEXT DEFAULT NULL)   RETURNS void   AS 'bug.so'   LANGUAGE C STRICT;

and let's try various calls:
   db=# SELECT show_bug('a');   WARNING: called ;-)    show_bug   ----------
    (1 row)

Seems ok. Now let's use the default value:
   db=# SELECT show_bug();    show_bug   ----------
    (1 row)
   db=# SELECT show_bug(NULL);    show_bug   ----------
    (1 row)

Well, seems quite strange to me - it seems as if the function is called,
but apparently it's not. I can't find anything relevant in the docs.

For comparison, a matching PL/pgSQL function:
   CREATE FUNCTION show_bug2(a TEXT DEFAULT NULL) RETURNS void AS $$   BEGIN       RAISE WARNING 'called ;-)';   END;
$$LANGUAGE plpgsql;
 

which behaves exactly as expected in all three cases:
   db=# SELECT show_bug('a');   WARNING: called ;-)    show_bug   ----------
    (1 row)
   db=# SELECT show_bug();   WARNING: called ;-)    show_bug   ----------
    (1 row)   db=# SELECT show_bug(NULL);   WARNING: called ;-)    show_bug   ----------
    (1 row)

So, what I'm doing wrong? Seems like a bug to me ...

regards
Tomas



Re: strange behavior with C function and DEFAULT function parameters

От
Tomas Vondra
Дата:
On 21.10.2013 02:38, Tomas Vondra wrote:
> Hi,
> 
> I ran into some pretty strange behavior of C-language function and
> default parameter values, both on 9.2 and 9.4devel. Consider for example
> this trivial C function:
> 
>     Datum
>     show_bug(PG_FUNCTION_ARGS) {
>     elog(WARNING, "called ;-)");
>     PG_RETURN_VOID();
>     }
> 
> which is accessed using this definition:
> 
>     CREATE FUNCTION show_bug(a TEXT DEFAULT NULL)
>     RETURNS void
>     AS 'bug.so'
>     LANGUAGE C STRICT;

Meh, never mind. About a second after submitting the message I've
noticed I defined the function STRICT, so it's actually absolutely
correct behavior.

Sorry for the noise.

Tomas



Re: strange behavior with C function and DEFAULT function parameters

От
Andrew Dunstan
Дата:
On 10/20/2013 08:38 PM, Tomas Vondra wrote:
> Hi,
>
> I ran into some pretty strange behavior of C-language function and
> default parameter values, both on 9.2 and 9.4devel. Consider for example
> this trivial C function:
>
>      Datum
>      show_bug(PG_FUNCTION_ARGS) {
>     elog(WARNING, "called ;-)");
>     PG_RETURN_VOID();
>      }
>
> which is accessed using this definition:
>
>      CREATE FUNCTION show_bug(a TEXT DEFAULT NULL)
>      RETURNS void
>      AS 'bug.so'
>      LANGUAGE C STRICT;
>
> and let's try various calls:
>
>      db=# SELECT show_bug('a');
>      WARNING: called ;-)
>       show_bug
>      ----------
>
>       (1 row)
>
> Seems ok. Now let's use the default value:
>
>      db=# SELECT show_bug();
>       show_bug
>      ----------
>
>       (1 row)
>
>      db=# SELECT show_bug(NULL);
>       show_bug
>      ----------
>
>       (1 row)
>
> Well, seems quite strange to me - it seems as if the function is called,
> but apparently it's not. I can't find anything relevant in the docs.
>
> For comparison, a matching PL/pgSQL function:
>
>      CREATE FUNCTION show_bug2(a TEXT DEFAULT NULL) RETURNS void AS $$
>      BEGIN
>          RAISE WARNING 'called ;-)';
>      END;
>      $$ LANGUAGE plpgsql;
>
> which behaves exactly as expected in all three cases:
>
>      db=# SELECT show_bug('a');
>      WARNING: called ;-)
>       show_bug
>      ----------
>
>       (1 row)
>
>      db=# SELECT show_bug();
>      WARNING: called ;-)
>       show_bug
>      ----------
>
>       (1 row)
>      db=# SELECT show_bug(NULL);
>      WARNING: called ;-)
>       show_bug
>      ----------
>
>       (1 row)
>
> So, what I'm doing wrong? Seems like a bug to me ...
>

It's not a bug, it's expected. STRICT functions are not called with NULL 
inputs - the result of the function is instead taken as NULL.

cheers

andrew