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
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. |