aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/spgist/spgutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/spgist/spgutils.c')
-rw-r--r--src/backend/access/spgist/spgutils.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 72aae02b450..675c80eb39b 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -743,27 +743,32 @@ 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)
+ /* 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 */
- pfree(nodeLabels);
return NULL;
}
- if (nullcount != 0)
- elog(ERROR, "some but not all node labels are null in SPGiST inner tuple");
- return nodeLabels;
+ 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;
+ }
}
/*