From: | Simon Riggs <simon(at)2ndquadrant(dot)com> |
---|---|
To: | Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: generated columns |
Date: | 2017-09-13 02:04:05 |
Message-ID: | CANP8+j+w0vgBXcG+o33HZcLFT0H+8D9aKT6YM7GAWUK3A8XvtA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 31 August 2017 at 05:16, Peter Eisentraut
<peter(dot)eisentraut(at)2ndquadrant(dot)com> wrote:
> Here is another attempt to implement generated columns. This is a
> well-known SQL-standard feature, also available for instance in DB2,
> MySQL, Oracle. A quick example:
>
> CREATE TABLE t1 (
> ...,
> height_cm numeric,
> height_in numeric GENERATED ALWAYS AS (height_cm * 2.54)
> );
Cool
> - pg_dump produces a warning about a dependency loop when dumping these.
> Will need to be fixed at some point, but it doesn't prevent anything
> from working right now.
>
> Open design issues:
>
> - COPY behavior: Currently, generated columns are automatically omitted
> if there is no column list, and prohibited if specified explicitly.
> When stored generated columns are implemented, they could be copied out.
> Some user options might be possible here.
If the values are generated immutably there would be no value in
including them in a dump. If you did dump them then they couldn't be
reloaded without error, so again, no point in dumping them.
COPY (SELECT...) already allows you options to include or exclude any
columns you wish, so I don't see the need for special handling here.
IMHO, COPY TO would exclude generated columns of either kind, ensuring
that the reload would just work.
> - Catalog storage: I store the generation expression in pg_attrdef, like
> a default. For the most part, this works well. It is not clear,
> however, what pg_attribute.atthasdef should say. Half the code thinks
> that atthasdef means "there is something in pg_attrdef", the other half
> thinks "column has a DEFAULT expression". Currently, I'm going with the
> former interpretation, because that is wired in quite deeply and things
> start to crash if you violate it, but then code that wants to know
> whether a column has a traditional DEFAULT expression needs to check
> atthasdef && !attgenerated or something like that.
>
> Missing/future functionality:
>
> - STORED variant
For me, this option would be the main feature. Presumably if STORED
then we wouldn't need the functions to be immutable, making it easier
to have columns like last_update_timestamp or last_update_username
etc..
I think an option to decide whether the default is STORED or VIRTUAL
would be useful.
> - various ALTER TABLE variants
Adding a column with GENERATED STORED would always be a full table rewrite.
Hmm, I wonder if its worth having a mixed mode: stored for new rows,
only virtual for existing rows; that way we could add GENERATED
columns easily.
> - index support (and related constraint support)
Presumably you can't index a VIRTUAL column. Or at least I don't think
its worth spending time trying to make it work.
> These can be added later once the basics are nailed down.
I imagine that if a column is generated then it is not possible to
have column level INSERT | UPDATE | DELETE privs on it. The generation
happens automatically as part of the write action if stored, or not
until select for virtual. It should be possible to have column level
SELECT privs.
--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2017-09-13 02:19:56 | Re: no test coverage for ALTER FOREIGN DATA WRAPPER name HANDLER ... |
Previous Message | Kyotaro HORIGUCHI | 2017-09-13 02:03:32 | Re: Patches that don't apply or don't compile: 2017-09-12 |