hi.
rebased and refactored a lot.
In pg_partitioned_table.partattrs, value 0 indicates that the corresponding
partition key is an expression, non-0 means key is column reference.
For a virtual generated column, partattrs refers to the attribute number of the
virtual generated column, and the corresponding generation expression is stored
in partvirtualexprs. (see below demo).
Because of this, we need to double check all the occurrences of
RelationGetPartitionKey.
CREATE TABLE gtest_part_keyxx (f2 bigint, f3 bigint GENERATED ALWAYS
AS (f2 * 2) VIRTUAL) PARTITION BY RANGE (f3, f3, f2, f3, (f2+1));
SELECT pg_get_partkeydef('gtest_part_keyxx'::regclass);
pg_get_partkeydef
------------------------------------
RANGE (f3, f3, f2, f3, ((f2 + 1)))
(1 row)
SELECT partrelid::regclass, partnatts, partattrs FROM
pg_partitioned_table WHERE partrelid = ('gtest_part_keyxx'::regclass);
partrelid | partnatts | partattrs
------------------+-----------+-----------
gtest_part_keyxx | 5 | 2 2 1 2 0
(1 row)