v10-0001-make-ALTER-TABLE-SET-EXPRESSION-an-no-op-if-n.no-cfbot
application/octet-stream
Filename: v10-0001-make-ALTER-TABLE-SET-EXPRESSION-an-no-op-if-n.no-cfbot
Type: application/octet-stream
Part: 0
Message:
Re: Virtual generated columns
From f685d2b6dd5dbc7a34234b6b3cdbd9f2aef1c29d Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Mon, 16 Dec 2024 20:22:16 +0800
Subject: [PATCH v10 1/1] make ALTER TABLE SET EXPRESSION an no-op if not
changed
if new and old generated expression is the same,
make ALTER TABLE ALTER COLUMN SET EXPRESSION a no-op.
---
src/backend/commands/tablecmds.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 28623672fa..effa3767e4 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8407,6 +8407,11 @@ ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName,
Expr *defval;
NewColumnValue *newval;
RawColumnDefault *rawEnt;
+ ParseState *pstate;
+ Node *expr;
+ Node *old_default;
+ TupleDesc tupdesc = RelationGetDescr(rel);
+ ParseNamespaceItem *nsitem;
tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName);
if (!HeapTupleIsValid(tuple))
@@ -8462,6 +8467,24 @@ ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName,
ReleaseSysCache(tuple);
+ old_default = TupleDescGetDefault(tupdesc, attnum);
+ pstate = make_parsestate(NULL);
+ pstate->p_sourcetext = NULL;
+ nsitem = addRangeTableEntryForRelation(pstate,
+ rel,
+ AccessShareLock,
+ NULL,
+ false,
+ true);
+ addNSItemToQuery(pstate, nsitem, true, true, true);
+ expr = cookDefault(pstate, newExpr,
+ attTup->atttypid, attTup->atttypmod,
+ NameStr(attTup->attname),
+ attTup->attgenerated);
+
+ if(equal(expr, old_default))
+ return InvalidObjectAddress;
+
if (rewrite)
{
/*
--
2.34.1