strange behavior with C function and DEFAULT function parameters - Mailing list pgsql-hackers

From Tomas Vondra
Subject strange behavior with C function and DEFAULT function parameters
Date
Msg-id 5264776F.3010708@fuzzy.cz
Whole thread Raw
Responses Re: strange behavior with C function and DEFAULT function parameters  (Tomas Vondra <tv@fuzzy.cz>)
Re: strange behavior with C function and DEFAULT function parameters  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
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



pgsql-hackers by date:

Previous
From: Noah Misch
Date:
Subject: Re: proposal: lob conversion functionality
Next
From: Tomas Vondra
Date:
Subject: Re: strange behavior with C function and DEFAULT function parameters