strange behavior with C function and DEFAULT function parameters

Started by Tomas Vondraabout 12 years ago3 messages
#1Tomas Vondra
tv@fuzzy.cz

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

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Tomas Vondra
tv@fuzzy.cz
In reply to: Tomas Vondra (#1)
Re: strange behavior with C function and DEFAULT function parameters

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

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Andrew Dunstan
andrew@dunslane.net
In reply to: Tomas Vondra (#1)
Re: strange behavior with C function and DEFAULT function parameters

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

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers