1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Fix several DDL issues of generated columns versus inheritance

Several combinations of generated columns and inheritance in CREATE
TABLE were not handled correctly.  Specifically:

- Disallow a child column specifying a generation expression if the
  parent column is a generated column.  The child column definition
  must be unadorned and the parent column's generation expression will
  be copied.

- Prohibit a child column of a generated parent column specifying
  default values or identity.

- Allow a child column of a not-generated parent column specifying
  itself as a generated column.  This previously did not work, but it
  was possible to arrive at the state via other means (involving ALTER
  TABLE), so it seems sensible to support it.

Add tests for each case.  Also add documentation about the rules
involving generated columns and inheritance.

Discussion:
    https://www.postgresql.org/message-id/flat/15830.1575468847%40sss.pgh.pa.us
    https://www.postgresql.org/message-id/flat/2678bad1-048f-519a-ef24-b12962f41807%40enterprisedb.com
    https://www.postgresql.org/message-id/flat/CAJvUf_u4h0DxkCMCeEKAWCuzGUTnDP-G5iVmSwxLQSXn0_FWNQ%40mail.gmail.com
This commit is contained in:
Peter Eisentraut
2020-05-06 16:25:54 +02:00
parent 501e41dd3c
commit 086ffddf36
4 changed files with 146 additions and 7 deletions

View File

@ -324,6 +324,32 @@ CREATE TABLE people (
linkend="sql-createforeigntable"/> for details.
</para>
</listitem>
<listitem>
<para>For inheritance:</para>
<itemizedlist>
<listitem>
<para>
If a parent column is a generated column, a child column must also be
a generated column using the same expression. In the definition of
the child column, leave off the <literal>GENERATED</literal> clause,
as it will be copied from the parent.
</para>
</listitem>
<listitem>
<para>
In case of multiple inheritance, if one parent column is a generated
column, then all parent columns must be generated columns and with the
same expression.
</para>
</listitem>
<listitem>
<para>
If a parent column is not a generated column, a child column may be
defined to be a generated column or not.
</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</para>