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

Reply via email to