Re: function with different return type depending on parameter?

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: James Harper <james(dot)harper(at)bendigoit(dot)com(dot)au>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: function with different return type depending on parameter?
Date: 2014-02-12 16:35:41
Message-ID: CAHyXU0z4cnEpNezrRAy5iJiJ=MUK4znReC8PH36cgXcmNgLB1w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Feb 12, 2014 at 9:24 AM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> James Harper <james(dot)harper(at)bendigoit(dot)com(dot)au> writes:
>> is it possible to have a function that can return a different type
>> depending on the parameters?
>
> The data type of any expression (including a function call) has to be
> determinable at parse time, so no you can't just randomly return a
> run-time-determined data type.
>
> However, have you looked at the "polymorphic functions" feature?
> You can declare a function as returning the same data type that
> one of its inputs has. This seems to cover most of the cases
> that are useful in practice.
>
> http://www.postgresql.org/docs/9.3/static/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC
> http://www.postgresql.org/docs/9.3/static/xfunc-sql.html#AEN52916

You can also define a function to return 'text', which by virtue of
every other type being able to be casted to/from text, can be used as
a kind of variant. This technique is pretty dubious mostly, but can
occasionally be used to work around problematic situations.

There's also hstore for dealing with record-variant situations (this
is especially useful in, say, auditing triggers), and it's emerging
strong contender: json. All of the text variant approaches though
simply defer the type resolution to some later point, which can lead
to performance and logical consistency issues if you're not careful.

merlin

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Leonardo M. Ramé 2014-02-12 17:41:19 pg_restore issue
Previous Message Peter Eisentraut 2014-02-12 16:09:48 Re: pgsql and asciidoc output