Re: Dumping/restoring fails on inherited generated column - Mailing list pgsql-hackers
| From | Masahiko Sawada |
|---|---|
| Subject | Re: Dumping/restoring fails on inherited generated column |
| Date | |
| Msg-id | CA+fd4k4cHKUmEyHiPHx0QL3T-DXAP8O1CP-hUvo1WX6RwNC=tA@mail.gmail.com Whole thread Raw |
| In response to | Re: Dumping/restoring fails on inherited generated column (Peter Eisentraut <peter.eisentraut@2ndquadrant.com>) |
| Responses |
Re: Dumping/restoring fails on inherited generated column
|
| List | pgsql-hackers |
I arrived at this thread while investigating the same issue recently
reported[1].
On Fri, 7 Feb 2020 at 04:36, Peter Eisentraut
<peter.eisentraut@2ndquadrant.com> wrote:
>
> On 2020-02-03 20:32, Tom Lane wrote:
> > Things are evidently also going wrong for "gtest1_1". In that case
> > the generated property is inherited from the parent gtest1, so we
> > shouldn't be emitting anything ... how come the patch fails to
> > make it do that?
>
> This is fixed by the attached new patch. It needed an additional check
> in flagInhAttrs().
>
> > This is showing us at least two distinct problems. Now as for
> > "gtest30_1", what we have is that in the parent table "gtest30", column b
> > exists but it has no default; the generated property is only added
> > at the child table gtest30_1. So we need to emit ALTER COLUMN SET
> > GENERATED ALWAYS for gtest30_1.b. HEAD is already doing the wrong
> > thing there (it's emitting the expression, but as a plain default
> > not GENERATED). And this patch makes it emit nothing, even worse.
> > I think the key point here is that "attislocal" refers to whether the
> > column itself is locally defined, not to whether its default is.
>
> This is a bit of a mess. Let me explain my thinking on generated
> columns versus inheritance.
>
> If a parent table has a generated column, then any inherited column must
> also be generated and use the same expression. (Otherwise querying the
> parent table would produce results that are inconsistent with the
> generation expression if the rows come from the child table.)
After investigating this issue, I think that current DDLs regarding
inherited tables and generated columns seem not to work fine.
We can make an inherited table have the same column having a different
generation expression as follows:
=# create table p1 (a int, b int generated always as (a + 1) stored);
=# create table c1 (a int, b int generated always as (a + 2) stored)
inherits(p1);
But the column on the inherited table has a default value, the column
will be generation expression with a const value:
=# create table p2 (a int, b int generated always as (a + 1) stored);
=# create table c2 (a int, b int default 10) inherits(p2);
=# \d c2
Table "public.c2"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------------------------------
a | integer | | |
b | integer | | | generated always as (10) stored
Inherits: p2
Also, CREATE TABLE doesn't support to create a generated column on
inherited table, which is the same name but is a normal column on the
parent table, as follows:
=# create table p3 (a int, b int);
=# create table c3 (a int, b int generated always as (a + 2) stored)
inherits(p3);
ERROR: cannot use column reference in DEFAULT expression
LINE 1: ...reate table c3 (a int, b int generated always as (a + 2) sto...
Aside from the error message seems not correct, it's actually possible
that we can have only the inherited table's column have a generation
expression by:
=# create table p4 (a int, b int);
=# create table c4 (a int);
=# alter table c4 add column b int generated always as (a * 3) stored;
=# alter table c4 inherit p4;
Because of this behavior, pg_dump generates a query for the table c4
that cannot be restored.
I think we can fix these issues with the attached patch but it seems
better discussing the desired behavior first.
Regards,
[1] https://www.postgresql.org/message-id/2678bad1-048f-519a-ef24-b12962f41807@enterprisedb.com
--
Masahiko Sawada http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachment
pgsql-hackers by date: