60.4. Implementation
This section covers implementation details and other tricks that are useful for implementers ofSP-GiST operator classes to know. Individual leaf tuples and inner tuples must fit on a single index page (8KB by default). Therefore, when indexing values of variable-length data types, long values can only be supported by methods such as radix trees, in which each level of the tree includes a prefix that is short enough to fit on a page, and the final leaf level includes a suffix also short enough to fit on a page. The operator class should set Likewise, it is the operator class's responsibility that inner tuples do not grow too large to fit on an index page; this limits the number of child nodes that can be used in one inner tuple, as well as the maximum size of a prefix value. Another limitation is that when an inner tuple's node points to a set of leaf tuples, those tuples must all be in the same index page. (This is a design decision to reduce seeking and save space in the links that chain such tuples together.) If the set of leaf tuples grows too large for a page, a split is performed and an intermediate inner tuple is inserted. For this to fix the problem, the new inner tuplemust divide the set of leaf values into more than one node group. If the operator class's Some tree algorithms use a fixed set of nodes for each inner tuple; for example, in a quad-tree there are always exactly four nodes corresponding to the four quadrants around the inner tuple's centroid point. In such a case the code typically works with the nodes by number, and there is no need for explicit node labels. To suppress node labels (and thereby save some space), the When working with an inner tuple having unlabeled nodes, it is an error for60.4.1. SP-GiST Limits
longValuesOK
to TRUE only if it is prepared to arrange for this to happen. Otherwise, theSP-GiST core will reject any request to index a value that is too large to fit on an index page.picksplit
function fails to do that, theSP-GiST core resorts to extraordinary measures described inSection 60.4.3.60.4.2. SP-GiST Without Node Labels
picksplit
function can return NULL for thenodeLabels
array. This will in turn result innodeLabels
being NULL during subsequent calls tochoose
andinner_consistent
. In principle, node labels could be used for some inner tuples and omitted for others in the same index.choose
to returnspgAddNode
, since the set of nodes is supposed to be fixed in such cases. Also, there is no provision for generating an unlabeled node inspgSplitTuple
actions, since it is expected that anspgAddNode
action will be needed as well.