spgdoinsert-optimizations-1.patch
text/x-diff
Filename: spgdoinsert-optimizations-1.patch
Type: text/x-diff
Part: 0
Message:
SP-GiST micro-optimizations
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
| File | + | − |
|---|---|---|
| src/backend/access/spgist/spgdoinsert.c | 10 | 0 |
| src/backend/access/spgist/spgutils.c | 19 | 0 |
*** a/src/backend/access/spgist/spgdoinsert.c
--- b/src/backend/access/spgist/spgdoinsert.c
***************
*** 826,832 **** doPickSplit(Relation index, SpGistState *state,
heapPtrs[in.nTuples] = newLeafTuple->heapPtr;
in.nTuples++;
! memset(&out, 0, sizeof(out));
if (!isNulls)
{
--- 826,832 ----
heapPtrs[in.nTuples] = newLeafTuple->heapPtr;
in.nTuples++;
! MemSet(&out, 0, sizeof(out));
if (!isNulls)
{
***************
*** 1861,1866 **** spgdoinsert(Relation index, SpGistState *state,
--- 1861,1874 ----
int leafSize;
SPPageDesc current,
parent;
+ FmgrInfo *procinfo = NULL;
+
+ /*
+ * Look up FmgrInfo of the user-defined choose function once, to save
+ * cycles in the loop below.
+ */
+ if (!isnull)
+ procinfo = index_getprocinfo(index, 1, SPGIST_CHOOSE_PROC);
/*
* Since we don't use index_form_tuple in this AM, we have to make sure
***************
*** 2007,2013 **** spgdoinsert(Relation index, SpGistState *state,
SpGistInnerTuple innerTuple;
spgChooseIn in;
spgChooseOut out;
- FmgrInfo *procinfo;
/*
* spgAddNode and spgSplitTuple cases will loop back to here to
--- 2015,2020 ----
***************
*** 2030,2041 **** spgdoinsert(Relation index, SpGistState *state,
in.nNodes = innerTuple->nNodes;
in.nodeLabels = spgExtractNodeLabels(state, innerTuple);
! memset(&out, 0, sizeof(out));
if (!isnull)
{
/* use user-defined choose method */
- procinfo = index_getprocinfo(index, 1, SPGIST_CHOOSE_PROC);
FunctionCall2Coll(procinfo,
index->rd_indcollation[0],
PointerGetDatum(&in),
--- 2037,2047 ----
in.nNodes = innerTuple->nNodes;
in.nodeLabels = spgExtractNodeLabels(state, innerTuple);
! MemSet(&out, 0, sizeof(out));
if (!isnull)
{
/* use user-defined choose method */
FunctionCall2Coll(procinfo,
index->rd_indcollation[0],
PointerGetDatum(&in),
*** a/src/backend/access/spgist/spgutils.c
--- b/src/backend/access/spgist/spgutils.c
***************
*** 743,769 **** Datum *
spgExtractNodeLabels(SpGistState *state, SpGistInnerTuple innerTuple)
{
Datum *nodeLabels;
- int nullcount = 0;
int i;
SpGistNodeTuple node;
! nodeLabels = (Datum *) palloc(sizeof(Datum) * innerTuple->nNodes);
! SGITITERATE(innerTuple, i, node)
! {
! if (IndexTupleHasNulls(node))
! nullcount++;
! else
! nodeLabels[i] = SGNTDATUM(node, state);
! }
! if (nullcount == innerTuple->nNodes)
{
/* They're all null, so just return NULL */
- pfree(nodeLabels);
return NULL;
}
! if (nullcount != 0)
! elog(ERROR, "some but not all node labels are null in SPGiST inner tuple");
! return nodeLabels;
}
/*
--- 743,774 ----
spgExtractNodeLabels(SpGistState *state, SpGistInnerTuple innerTuple)
{
Datum *nodeLabels;
int i;
SpGistNodeTuple node;
! /* Either all the labels must be NULL, or none. */
! node = SGITNODEPTR(innerTuple);
! if (IndexTupleHasNulls(node))
{
+ SGITITERATE(innerTuple, i, node)
+ {
+ if (!IndexTupleHasNulls(node))
+ elog(ERROR, "some but not all node labels are null in SPGiST inner tuple");
+ }
/* They're all null, so just return NULL */
return NULL;
}
! else
! {
! nodeLabels = (Datum *) palloc(sizeof(Datum) * innerTuple->nNodes);
! SGITITERATE(innerTuple, i, node)
! {
! if (IndexTupleHasNulls(node))
! elog(ERROR, "some but not all node labels are null in SPGiST inner tuple");
! nodeLabels[i] = SGNTDATUM(node, state);
! }
! return nodeLabels;
! }
}
/*