Re: Virtual generated columns

From: Richard Guo <guofenglinux(at)gmail(dot)com>
To: Alexander Lakhin <exclusion(at)gmail(dot)com>
Cc: Peter Eisentraut <peter(at)eisentraut(dot)org>, Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>, jian he <jian(dot)universality(at)gmail(dot)com>, Zhang Mingli <zmlpostgres(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Virtual generated columns
Date: 2025-05-16 07:26:01
Message-ID: CAMbWs4-ow3ZCj=+07GBr6-umNQ6Bg-HkQAofyXDxZET1aJa63g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, May 16, 2025 at 1:00 PM Alexander Lakhin <exclusion(at)gmail(dot)com> wrote:
> I've discovered yet another way to trigger that error:
> create table vt (a int, b int generated always as (a * 2), c int);
> insert into vt values(1);
> alter table vt alter column c type bigint using b + c;
>
> ERROR: XX000: unexpected virtual generated column reference
> LOCATION: CheckVarSlotCompatibility, execExprInterp.c:2410

Thank you for the report. It seems that we fail to expand references
to virtual generated columns in the NewColumnValues expression when
altering tables. We might be able to fix it by:

@@ -6203,7 +6203,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
NewColumnValue *ex = lfirst(l);

/* expr already planned */
- ex->exprstate = ExecInitExpr((Expr *) ex->expr, NULL);
+ ex->exprstate = ExecInitExpr((Expr *)
expand_generated_columns_in_expr((Node *) ex->expr, oldrel, 1), NULL);

Thanks
Richard

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Xuneng Zhou 2025-05-16 07:58:01 Re: Add pg_buffercache_mark_dirty[_all] functions to the pg_buffercache
Previous Message Amit Kapila 2025-05-16 06:47:05 Re: Conflict detection for update_deleted in logical replication