Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
postgres-lambda-diff
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jakob Huber
postgres-lambda-diff
Commits
9100f534
Commit
9100f534
authored
8 years ago
by
Tom Lane
Browse files
Options
Downloads
Patches
Plain Diff
Doc: improve 9.6 description of SP-GiST traverse values.
Sync relevant parts of commit
d2ddee63
back to 9.6 branch.
parent
216fd7fe
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
doc/src/sgml/spgist.sgml
+37
-28
37 additions, 28 deletions
doc/src/sgml/spgist.sgml
with
37 additions
and
28 deletions
doc/src/sgml/spgist.sgml
+
37
−
28
View file @
9100f534
...
@@ -114,7 +114,7 @@
...
@@ -114,7 +114,7 @@
</row>
</row>
<row>
<row>
<entry><literal>box_ops</></entry>
<entry><literal>box_ops</></entry>
<entry>
box
</entry>
<entry>
<type>box</>
</entry>
<entry>
<entry>
<literal><<</>
<literal><<</>
<literal>&<</>
<literal>&<</>
...
@@ -183,11 +183,14 @@
...
@@ -183,11 +183,14 @@
Inner tuples are more complex, since they are branching points in the
Inner tuples are more complex, since they are branching points in the
search tree. Each inner tuple contains a set of one or more
search tree. Each inner tuple contains a set of one or more
<firstterm>nodes</>, which represent groups of similar leaf values.
<firstterm>nodes</>, which represent groups of similar leaf values.
A node contains a downlink that leads
to
either another, lower-level inner
A node contains a downlink that leads either
to
another, lower-level inner
tuple, or a short list of leaf tuples that all lie on the same index page.
tuple, or
to
a short list of leaf tuples that all lie on the same index page.
Each node has a <firstterm>label</> that describes it; for example,
Each node
normally
has a <firstterm>label</> that describes it; for example,
in a radix tree the node label could be the next character of the string
in a radix tree the node label could be the next character of the string
value. Optionally, an inner tuple can have a <firstterm>prefix</> value
value. (Alternatively, an operator class can omit the node labels, if it
works with a fixed set of nodes for all inner tuples;
see <xref linkend="spgist-null-labels">.)
Optionally, an inner tuple can have a <firstterm>prefix</> value
that describes all its members. In a radix tree this could be the common
that describes all its members. In a radix tree this could be the common
prefix of the represented strings. The prefix value is not necessarily
prefix of the represented strings. The prefix value is not necessarily
really a prefix, but can be any data needed by the operator class;
really a prefix, but can be any data needed by the operator class;
...
@@ -202,7 +205,8 @@
...
@@ -202,7 +205,8 @@
tuple, so the <acronym>SP-GiST</acronym> core provides the possibility for
tuple, so the <acronym>SP-GiST</acronym> core provides the possibility for
operator classes to manage level counting while descending the tree.
operator classes to manage level counting while descending the tree.
There is also support for incrementally reconstructing the represented
There is also support for incrementally reconstructing the represented
value when that is needed.
value when that is needed, and for passing down additional data (called
<firstterm>traverse values</>) during a tree descent.
</para>
</para>
<note>
<note>
...
@@ -492,9 +496,8 @@ typedef struct spgPickSplitOut
...
@@ -492,9 +496,8 @@ typedef struct spgPickSplitOut
<structfield>prefixDatum</> to the prefix value.
<structfield>prefixDatum</> to the prefix value.
Set <structfield>nNodes</> to indicate the number of nodes that
Set <structfield>nNodes</> to indicate the number of nodes that
the new inner tuple will contain, and
the new inner tuple will contain, and
set <structfield>nodeLabels</> to an array of their label values.
set <structfield>nodeLabels</> to an array of their label values,
(If the nodes do not require labels, set <structfield>nodeLabels</>
or to NULL if node labels are not required.
to NULL; see <xref linkend="spgist-null-labels"> for details.)
Set <structfield>mapTuplesToNodes</> to an array that gives the index
Set <structfield>mapTuplesToNodes</> to an array that gives the index
(from zero) of the node that each leaf tuple should be assigned to.
(from zero) of the node that each leaf tuple should be assigned to.
Set <structfield>leafTupleDatums</> to an array of the values to
Set <structfield>leafTupleDatums</> to an array of the values to
...
@@ -561,7 +564,7 @@ typedef struct spgInnerConsistentIn
...
@@ -561,7 +564,7 @@ typedef struct spgInnerConsistentIn
Datum reconstructedValue; /* value reconstructed at parent */
Datum reconstructedValue; /* value reconstructed at parent */
void *traversalValue; /* opclass-specific traverse value */
void *traversalValue; /* opclass-specific traverse value */
MemoryContext traversalMemoryContext;
MemoryContext traversalMemoryContext;
/* put new traverse values here */
int level; /* current level (counting from zero) */
int level; /* current level (counting from zero) */
bool returnData; /* original data must be returned? */
bool returnData; /* original data must be returned? */
...
@@ -580,7 +583,6 @@ typedef struct spgInnerConsistentOut
...
@@ -580,7 +583,6 @@ typedef struct spgInnerConsistentOut
int *levelAdds; /* increment level by this much for each */
int *levelAdds; /* increment level by this much for each */
Datum *reconstructedValues; /* associated reconstructed values */
Datum *reconstructedValues; /* associated reconstructed values */
void **traversalValues; /* opclass-specific traverse values */
void **traversalValues; /* opclass-specific traverse values */
} spgInnerConsistentOut;
} spgInnerConsistentOut;
</programlisting>
</programlisting>
...
@@ -599,6 +601,11 @@ typedef struct spgInnerConsistentOut
...
@@ -599,6 +601,11 @@ typedef struct spgInnerConsistentOut
parent tuple; it is <literal>(Datum) 0</> at the root level or if the
parent tuple; it is <literal>(Datum) 0</> at the root level or if the
<function>inner_consistent</> function did not provide a value at the
<function>inner_consistent</> function did not provide a value at the
parent level.
parent level.
<structfield>traversalValue</> is a pointer to any traverse data
passed down from the previous call of <function>inner_consistent</>
on the parent index tuple, or NULL at the root level.
<structfield>traversalMemoryContext</> is the memory context in which
to store output traverse values (see below).
<structfield>level</> is the current inner tuple's level, starting at
<structfield>level</> is the current inner tuple's level, starting at
zero for the root level.
zero for the root level.
<structfield>returnData</> is <literal>true</> if reconstructed data is
<structfield>returnData</> is <literal>true</> if reconstructed data is
...
@@ -615,9 +622,6 @@ typedef struct spgInnerConsistentOut
...
@@ -615,9 +622,6 @@ typedef struct spgInnerConsistentOut
inner tuple, and
inner tuple, and
<structfield>nodeLabels</> is an array of their label values, or
<structfield>nodeLabels</> is an array of their label values, or
NULL if the nodes do not have labels.
NULL if the nodes do not have labels.
<structfield>traversalValue</> is a pointer to data that
<function>inner_consistent</> gets when called on child nodes from an
outer call of <function>inner_consistent</> on parent nodes.
</para>
</para>
<para>
<para>
...
@@ -633,17 +637,20 @@ typedef struct spgInnerConsistentOut
...
@@ -633,17 +637,20 @@ typedef struct spgInnerConsistentOut
<structfield>reconstructedValues</> to an array of the values
<structfield>reconstructedValues</> to an array of the values
reconstructed for each child node to be visited; otherwise, leave
reconstructed for each child node to be visited; otherwise, leave
<structfield>reconstructedValues</> as NULL.
<structfield>reconstructedValues</> as NULL.
If it is desired to pass down additional out-of-band information
(<quote>traverse values</>) to lower levels of the tree search,
set <structfield>traversalValues</> to an array of the appropriate
traverse values, one for each child node to be visited; otherwise,
leave <structfield>traversalValues</> as NULL.
Note that the <function>inner_consistent</> function is
Note that the <function>inner_consistent</> function is
responsible for palloc'ing the
responsible for palloc'ing the
<structfield>nodeNumbers</>, <structfield>levelAdds</> and
<structfield>nodeNumbers</>, <structfield>levelAdds</>,
<structfield>reconstructedValues</> arrays.
<structfield>reconstructedValues</>, and
Sometimes accumulating some information is needed, while
<structfield>traversalValues</> arrays in the current memory context.
descending from parent to child node was happened. In this case
However, any output traverse values pointed to by
<structfield>traversalValues</> array keeps pointers to
the <structfield>traversalValues</> array should be allocated
specific data you need to accumulate for every child node.
in <structfield>traversalMemoryContext</>.
Memory for <structfield>traversalValues</> should be allocated in
Each traverse value must be a single palloc'd chunk.
the default context, but each element of it should be allocated in
<structfield>traversalMemoryContext</>.
</para>
</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
...
@@ -700,6 +707,9 @@ typedef struct spgLeafConsistentOut
...
@@ -700,6 +707,9 @@ typedef struct spgLeafConsistentOut
parent tuple; it is <literal>(Datum) 0</> at the root level or if the
parent tuple; it is <literal>(Datum) 0</> at the root level or if the
<function>inner_consistent</> function did not provide a value at the
<function>inner_consistent</> function did not provide a value at the
parent level.
parent level.
<structfield>traversalValue</> is a pointer to any traverse data
passed down from the previous call of <function>inner_consistent</>
on the parent index tuple, or NULL at the root level.
<structfield>level</> is the current leaf tuple's level, starting at
<structfield>level</> is the current leaf tuple's level, starting at
zero for the root level.
zero for the root level.
<structfield>returnData</> is <literal>true</> if reconstructed data is
<structfield>returnData</> is <literal>true</> if reconstructed data is
...
@@ -859,11 +869,10 @@ typedef struct spgLeafConsistentOut
...
@@ -859,11 +869,10 @@ typedef struct spgLeafConsistentOut
<para>
<para>
The <productname>PostgreSQL</productname> source distribution includes
The <productname>PostgreSQL</productname> source distribution includes
several examples of index operator classes for
several examples of index operator classes for <acronym>SP-GiST</acronym>,
<acronym>SP-GiST</acronym>. The core system currently provides radix
as described in <xref linkend="spgist-builtin-opclasses-table">. Look
trees over text columns and two types of trees over points: quad-tree and
into <filename>src/backend/access/spgist/</>
k-d tree. Look into <filename>src/backend/access/spgist/</> to see the
and <filename>src/backend/utils/adt/</> to see the code.
code.
</para>
</para>
</sect1>
</sect1>
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment