Re: Wrong width of UNION statement

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Kenichiro Tanaka <kenichirotanakapg(at)gmail(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Wrong width of UNION statement
Date: 2020-06-01 15:04:52
Message-ID: 383756.1591023892@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Kenichiro Tanaka <kenichirotanakapg(at)gmail(dot)com> writes:
> I think table column width of UNION statement should be equal one of UNION ALL.

I don't buy that argument, because there could be type coercions involved,
so that the result width isn't necessarily equal to any one of the inputs.

Having said that, the example you give shows that we make use of
pg_statistic.stawidth values when estimating the width of immediate
relation outputs, but that data isn't available by the time we get to
a UNION output. So we fall back to get_typavgwidth, which in this
case is going to produce something involving the typmod times the
maximum encoding length. (I suppose you're using UTF8 encoding...)

There's room for improvement there, but this is all bound up in the legacy
mess that we have in prepunion.c. For example, because we don't have
RelOptInfo nodes associated with individual set-operation outputs, it's
difficult to figure out where we might store data about the widths of such
outputs. Nor could we easily access the data if we had it, since the
associated Vars don't have valid RTE indexes. So to my mind, that code
needs to be thrown away and rewritten, using actual relations to represent
the different setop results and Paths to represent possible computations.
In the meantime, it's hard to get excited about layering some additional
hacks on top of what's there now.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2020-06-01 15:36:44 Re: Compatible defaults for LEAD/LAG
Previous Message John Bachir 2020-06-01 14:49:25 Re: feature idea: use index when checking for NULLs before SET NOT NULL