On 29.04.24 20:54, Corey Huinker wrote:
      -- generation expression must be immutable
    -CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision
    GENERATED ALWAYS AS (random()) STORED);
    +CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision
    GENERATED ALWAYS AS (random()) VIRTUAL);

Does a VIRTUAL generated column have to be immutable? I can see where the STORED one has to be, but consider the following:

    CREATE TABLE foo (
    created_at timestamptz DEFAULT CURRENT_TIMESTAMP,
    row_age interval GENERATED ALWAYS AS CURRENT_TIMESTAMP - created_at
    );

I have been hesitant about this, but I'm now leaning toward that we could allow this.

      -- can't have generated column that is a child of normal column
      CREATE TABLE gtest_normal (a int, b int);
    -CREATE TABLE gtest_normal_child (a int, b int GENERATED ALWAYS AS
    (a * 2) STORED) INHERITS (gtest_normal);  -- error
    +CREATE TABLE gtest_normal_child (a int, b int GENERATED ALWAYS AS
    (a * 2) VIRTUAL) INHERITS (gtest_normal);  -- error

This is the barrier to the partitioning reorganization scheme I described above. Is there any hard rule why a child table couldn't have a generated column matching the parent's regular column? I can see where it might prevent indexing that column on the parent table, but is there some other dealbreaker or is this just a "it doesn't work yet" situation?

We had a quite a difficult time getting the inheritance business of stored generated columns working correctly. I'm sticking to the well-trodden path here. We can possibly expand this if someone wants to work out the details.

One last thing to keep in mind is that there are two special case expressions in the spec:

    GENERATED ALWAYS AS ROW START
    GENERATED ALWAYS AS ROW END

and we'll need to be able to fit those into the catalog. I'll start another thread for that unless you prefer I keep it here.

I think this is a separate feature.



Reply via email to