Re: psql: add \pset true/false

From: Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>
To: michael(dot)paquier(at)gmail(dot)com
Cc: Jim(dot)Nasby(at)bluetreble(dot)com, peter_e(at)gmx(dot)net, tgl(at)sss(dot)pgh(dot)pa(dot)us, marko(at)joh(dot)to, daniel(at)manitou-mail(dot)org, pgsql-hackers(at)postgresql(dot)org
Subject: Re: psql: add \pset true/false
Date: 2015-12-03 01:09:23
Message-ID: 20151203.100923.43833412.horiguchi.kyotaro@lab.ntt.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hello,

At Thu, 3 Dec 2015 09:24:35 +0900, Michael Paquier <michael(dot)paquier(at)gmail(dot)com> wrote in <CAB7nPqTTZXaiVj0_FWvp8hPLLD_yDa8cnS4iuy_HgSOgFz09HA(at)mail(dot)gmail(dot)com>
> On Thu, Dec 3, 2015 at 3:10 AM, Jim Nasby <Jim(dot)Nasby(at)bluetreble(dot)com> wrote:
> > On 11/15/15 7:37 PM, Peter Eisentraut wrote:
> > I was more thinking it would be nice to be able to temporarily
> > over-ride/wrap what an output function is doing. AFAIK that would allow this
> > to work everywhere (row(), copy, etc). I don't know of any remotely
> > practical way to do that, though.
>
> You can basically do that with a custom data type and at worse a
> custom GUC, no? It does not seem worth bothering the backend with an
> extra layer to manage the output of a data type.

How about plugins on psql side? Calling hooked function in
printQuery could do that on psql. Impact on psql itself is
minimized. (Of course code for loading is omitted in the below
but it would also small...)

> --- a/src/bin/psql/print.c
> @@ -3210,6 +3210,10 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *f
> else
> {
> cell = PQgetvalue(result, r, c);
> + if (outputplugin)
> + char *cell = outputplugin(cell, PQftype(result, c),
> + &mustfree);
> if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
> {
> cell = format_numeric_locale(cell);

One problem of this is who wants to do this must write a
program. But someone might write general purpose plugin.

=$ loadlib 'outputhook.so';
=$ select 't'::bool;
bool
------
X
(1 row)

=== outputhook.so
char *
outputhook(char *origcell, type, bool *mustfree)
{
char *retcell;

switch (type)
{
case BOOLOID:
retcell = (*origcell == 't' ? 'TRRRRUEEE' : "FAAALSE");
if (*mustfree) free(origcell);
*mustfree = false;
break;
default:
retcell = origcell;
break;
}
return retcell;
}
=====

regards,

--
Kyotaro Horiguchi
NTT Open Source Software Center

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Craig Ringer 2015-12-03 01:09:46 Re: Logical replication and multimaster
Previous Message Robert Haas 2015-12-03 01:03:56 Re: WIP: Covering + unique indexes.