Thread: strange behavior with C function and DEFAULT function parameters
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
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
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