Re: Virtual generated columns

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: Dean Rasheed <dean.a.rasheed@gmail.com>
Cc: jian he <jian.universality@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-09-04T08:40:06Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Expand virtual generated columns for ALTER COLUMN TYPE

  2. Eliminate code duplication in replace_rte_variables callbacks

  3. Expand virtual generated columns in the planner

  4. Virtual generated columns

  5. Additional tests for stored generated columns

  6. Improve generated_stored test

  7. Fix handling of CREATE DOMAIN with GENERATED constraint syntax

  8. Add pg_constraint rows for not-null constraints

  9. Put generated_stored test objects in a schema

  10. Rename regress test generated to generated_stored

  11. Small code simplification

  12. Remove useless code

  13. Remove useless initializations

  14. doc: Clarify that pg_attrdef also stores generation expressions

  15. Clean out column-level pg_init_privs entries when dropping tables.

  16. Re-implement the ereport() macro using __VA_ARGS__.

Attachments

On 21.08.24 12:51, Dean Rasheed wrote:
> On Wed, 21 Aug 2024 at 08:00, Peter Eisentraut<peter@eisentraut.org>  wrote:
>> On 08.08.24 20:22, Dean Rasheed wrote:
>>> Looking at the rewriter changes, it occurred to me that it could
>>> perhaps be done more simply using ReplaceVarsFromTargetList() for each
>>> RTE with virtual generated columns. That function already has the
>>> required wholerow handling code, so there'd be less code duplication.
>> Hmm, I don't quite see how ReplaceVarsFromTargetList() could be used
>> here.  It does have the wholerow logic that we need somehow, but other
>> than that it seems to target something different?
>>
> Well what I was thinking was that (in fireRIRrules()'s final loop over
> relations in the rtable), if the relation had any virtual generated
> columns, you'd build a targetlist containing a TLE for each one,
> containing the generated expression. Then you could just call
> ReplaceVarsFromTargetList() to replace any Vars in the query with the
> corresponding generated expressions. That takes care of descending
> into subqueries, adjusting varlevelsup, and expanding wholerow Vars
> that might refer to the generated expression.
> 
> I also have half an eye on how this patch will interact with my patch
> to support RETURNING OLD/NEW values. If you use
> ReplaceVarsFromTargetList(), it should just do the right thing for
> RETURNING OLD/NEW generated expressions.

Here is an implementation of this.  It's much nicer!  It also appears to 
fix all the additional test cases that have been presented.  (I haven't 
integrated them into the patch set yet.)

I left the 0001 patch alone for now and put the new rewriting 
implementation into 0002.  (Unfortunately, the diff is kind of useless 
for visual inspection.)  Let me know if this matches what you had in 
mind, please.  Also, is this the right place in fireRIRrules()?