Re: support ALTER COLUMN SET EXPRESSION over virtual generated column with check constraint

Matheus Alcantara <matheusssilv97@gmail.com>

From: Matheus Alcantara <matheusssilv97@gmail.com>
To: jian he <jian.universality@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-01-16T16:07:25Z
Lists: pgsql-hackers
On 16/01/26 08:31, jian he wrote:
> On Thu, Jan 15, 2026 at 11:29 PM Matheus Alcantara
> <matheusssilv97@gmail.com> wrote:
>>
>> +       /*
>> +        * Find everything that depends on the column (constraints, indexes, etc),
>> +        * and record enough information to let us recreate the objects after
>> +        * rewrite.
>> +        */
>> +       RememberAllDependentForRebuilding(tab, AT_SetExpression, rel, attnum, colName);
>> +
>> Perhaps this comments should be updated since we are now collecting
>> these dependencies for virtual generated columns too that it not require
>> a table rewrite.
>>
>> ---
> 
> I guess we can change it as:
> 
>      /*
>       * Find everything that depends on the column (constraints, indexes, etc),
>       * and record enough information to let us recreate the objects.
>       */
>      RememberAllDependentForRebuilding(tab, AT_SetExpression, rel,
> attnum, colName);
> 
It looks good.

>>
>> I think that it would be good to update the SET EXPRESSION AS
>> documentation on doc/src/sgml/ref/alter_table.sgml to mention that for
>> virtual columns the table is not rewritten but a full table scan may
>> still be needed if the column has check constraints.
>>
> 
> In doc/src/sgml/ref/alter_table.sgml, I intended to change it as follows:
> 
>     <varlistentry id="sql-altertable-desc-set-expression">
>      <term><literal>SET EXPRESSION AS</literal></term>
>      <listitem>
>       <para>
>        This form replaces the expression of a generated column.  Existing data
>        in a stored generated column is rewritten and all the future changes
>        will apply the new generation expression.
> +      Virtual generated columns do not require a table rewrite.
> +      However if the column is part of a <literal>CHECK</literal> constraint
> +      expression, the constraint will be rebuilt, requiring a table scan to
> +      ensure that existing rows meet the constraint.
>       </para>

Sounds good.


--
Matheus Alcantara
EDB: https://www.enterprisedb.com



Commits

  1. Allow ALTER COLUMN SET EXPRESSION on virtual columns with CHECK constraints