Re: Dumping/restoring fails on inherited generated column
Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
From: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
To: Masahiko Sawada <masahiko.sawada@2ndquadrant.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2020-05-06T14:29:31Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-several-DDL-issues-of-generated-columns-versus-i.patch (text/plain) patch 0001
On 2020-04-23 08:35, Masahiko Sawada wrote: > After investigating this issue, I think that current DDLs regarding > inherited tables and generated columns seem not to work fine. Right, there were a number of combinations that were not properly handled. The attached patch should fix them all. It's made against PG12 but also works on master. See contained commit message and documentation for details. (This does not touch the issues with pg_dump, but it helps clarify the cases that pg_dump needs to handle.) > 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); With my patch, this becomes an error. > 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 With my patch, this also becomes an error. > 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... This is allowed with my patch (which is basically an expanded version of your patch). -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Commits
-
Fix ALTER TABLE / INHERIT with generated columns
- 13ff139a2384 12.7 landed
- 64190d65f299 13.3 landed
- a970edbed306 14.0 landed
-
pg_dump: Fix dumping of inherited generated columns
- 1dd6baf78802 12.6 landed
- 1d3ce0223c6a 13.2 landed
- 0bf83648a52d 14.0 landed
-
Disallow ALTER TABLE ONLY / DROP EXPRESSION
- 539775981746 13.1 landed
- bf797a8d9768 14.0 landed
-
Fix several DDL issues of generated columns versus inheritance
- 086ffddf3656 13.0 cited