Re: Virtual generated columns
От | jian he |
---|---|
Тема | Re: Virtual generated columns |
Дата | |
Msg-id | CACJufxH2v30vZuP8YNJOqrfoRigc8XU8Bu5rVz67z=OYCyNi8g@mail.gmail.com обсуждение исходный текст |
Ответ на | Virtual generated columns (Peter Eisentraut <peter@eisentraut.org>) |
Ответы |
Re: Virtual generated columns
|
Список | pgsql-hackers |
On Fri, May 16, 2025 at 3:26 PM Richard Guo <guofenglinux@gmail.com> wrote: > > On Fri, May 16, 2025 at 1:00 PM Alexander Lakhin <exclusion@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;
В списке pgsql-hackers по дате отправления: