mirror of
https://github.com/postgres/postgres.git
synced 2026-07-06 08:16:07 -04:00
REPACK CONCURRENTLY: Initialize the range table more honestly
We were skipping a bunch of things that are mostly unnecessary for REPACK. However, one thing that seems would be better to pass closer to truth, is the updatedCols bitmapset in the range table entry for the repacked table. Cons up an RTE and install it into the EState. This only has an effect on btree indexes, because certain operations are optimized in the case of unchanged columns; and even then, correctnesss is not being compromised. The values we pass after this commit are not fully trustworthy either, because we simply say "all columns were updated" for all insert/updates, regardless of whether their values were actually modified or not. However, this way we err to the side of caution rather than to the opposite direction as we were originally doing. This could be refined in the future, but there's a trade-off: determining whether the column was in fact updated could be expensive. Author: Antonin Houska <ah@cybertec.at> Reviewed-by: Ewan Young <kdbase.hack@gmail.com> Backpatch-through: 19 Discussion: https://postgr.es/m/18222.1782126731@localhost
This commit is contained in:
parent
eef644e57c
commit
5ee9d7c299
1 changed files with 55 additions and 2 deletions
|
|
@ -63,6 +63,7 @@
|
|||
#include "libpq/pqmq.h"
|
||||
#include "miscadmin.h"
|
||||
#include "optimizer/optimizer.h"
|
||||
#include "parser/parse_relation.h"
|
||||
#include "pgstat.h"
|
||||
#include "replication/logicalrelation.h"
|
||||
#include "storage/bufmgr.h"
|
||||
|
|
@ -3019,8 +3020,60 @@ initialize_change_context(ChangeContext *chgcxt,
|
|||
/* Only initialize fields needed by ExecInsertIndexTuples(). */
|
||||
chgcxt->cc_estate = CreateExecutorState();
|
||||
|
||||
chgcxt->cc_rri = (ResultRelInfo *) palloc(sizeof(ResultRelInfo));
|
||||
InitResultRelInfo(chgcxt->cc_rri, relation, 0, 0, 0);
|
||||
/*
|
||||
* Set up a range table for the executor, containing our repacked table as
|
||||
* its only member.
|
||||
*/
|
||||
{
|
||||
RangeTblEntry *rte;
|
||||
TupleDesc desc = RelationGetDescr(relation);
|
||||
List *perminfos = NIL;
|
||||
Bitmapset *updatedCols = NULL;
|
||||
RTEPermissionInfo *perminfo;
|
||||
|
||||
/*
|
||||
* For our use, the RTE only needs to have perminfoindex initialized,
|
||||
* but there's no reason to not set the fields whose values we have at
|
||||
* hand.
|
||||
*/
|
||||
rte = makeNode(RangeTblEntry);
|
||||
rte->rtekind = RTE_RELATION;
|
||||
rte->relid = RelationGetRelid(relation);
|
||||
rte->relkind = RelationGetForm(relation)->relkind;
|
||||
/* Create the RTEPermissionInfo instance (and set ->perminfoindex). */
|
||||
addRTEPermissionInfo(&perminfos, rte);
|
||||
|
||||
/*
|
||||
* Initialize updatedCols to show that all columns are updated. This
|
||||
* is of course not necessarily true, and we cannot know this early;
|
||||
* but this is only used by ExecInsertIndexTuples to flag index
|
||||
* updates with no logical value changes, so if it's wrong, nothing
|
||||
* terribly bad happens. We may want to improve this someday though.
|
||||
*
|
||||
* Don't claim that dropped columns are changed though.
|
||||
*/
|
||||
for (int i = 0; i < desc->natts; i++)
|
||||
{
|
||||
CompactAttribute *attr = TupleDescCompactAttr(desc, i);
|
||||
|
||||
if (attr->attisdropped)
|
||||
continue;
|
||||
updatedCols = bms_add_member(updatedCols,
|
||||
i + 1 - FirstLowInvalidHeapAttributeNumber);
|
||||
}
|
||||
|
||||
/* install updatedCols in the right place */
|
||||
perminfo = getRTEPermissionInfo(perminfos, rte);
|
||||
perminfo->updatedCols = updatedCols;
|
||||
|
||||
/* finally we can initialize the range table proper */
|
||||
ExecInitRangeTable(chgcxt->cc_estate, list_make1(rte), perminfos,
|
||||
bms_make_singleton(1));
|
||||
}
|
||||
|
||||
/* Set up our ResultRelInfo to use for index updates */
|
||||
chgcxt->cc_rri = makeNode(ResultRelInfo);
|
||||
InitResultRelInfo(chgcxt->cc_rri, relation, 1, NULL, 0);
|
||||
ExecOpenIndices(chgcxt->cc_rri, false);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue