On Fri, May 16, 2025 at 3:26 PM Richard Guo <guofengli...@gmail.com> wrote: > > On Fri, May 16, 2025 at 1:00 PM Alexander Lakhin <exclus...@gmail.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); >
we have used the USING expression in ATPrepAlterColumnType, ATColumnChangeRequiresRewrite. expanding it on ATPrepAlterColumnType seems to make more sense? @@ -14467,7 +14467,7 @@ ATPrepAlterColumnType(List **wqueue, */ newval = (NewColumnValue *) palloc0(sizeof(NewColumnValue)); newval->attnum = attnum; - newval->expr = (Expr *) transform; + newval->expr = (Expr *) expand_generated_columns_in_expr(transform, rel, 1); newval->is_generated = false;