Virtual generated columns

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-04-29T08:23:53Z
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

Here is a patch set to implement virtual generated columns.

Some history first:  The original development of generated columns was 
discussed in [0].  It started with virtual columns, then added stored 
columns.  Before the release of PG12, it was decided that only stored 
columns were ready, so I cut out virtual columns, and stored generated 
columns shipped with PG12, which is where we are today.

Virtual generated columns are occasionally requested still, and it's a 
bit of unfinished business for me, too, so I started to resurrect it. 
What I did here first was to basically reverse interdiff the patches 
where I cut out virtual generated columns above (this was between 
patches v8 and v9 in [0]) and clean that up and make it work again.

One thing that I needed to decide was how to organize the tests for 
this.  The original patch series had both stored and virtual tests in 
the same test file src/test/regress/sql/generated.sql.  As that file has 
grown, I think it would have been a mess to weave another whole set of 
tests into that.  So instead I figured I'd make two separate test files

     src/test/regress/sql/generated_stored.sql (renamed from current)
     src/test/regress/sql/generated_virtual.sql

and kind of try to keep them aligned, similar to how the various 
collate* tests are handled.  So I put that renaming in as preparatory 
patches.  And there are also some other preparatory cleanup patches that 
I'm including.

The main feature patch (0005 here) generally works but has a number of 
open corner cases that need to be thought about and/or fixed, many of 
which are marked in the code or the tests.  I'll continue working on 
that.  But I wanted to see if I can get some feedback on the test 
structure, so I don't have to keep changing it around later.


[0]: 
https://www.postgresql.org/message-id/flat/b151f851-4019-bdb1-699e-ebab07d2f40a@2ndquadrant.com