| PostgreSQL 9.3.2ʸ�� | ||||
|---|---|---|---|---|
| 前のページ | 上に戻る | 第 56章SP-GiST����ǥå��� | 次のページ | |
SP-GiST�Ϲ��٤���ݲ����줿���ե����������ޤ�������������åɤγ�ȯ�Ԥ�����Υǡ��������ѤΥ�åɤ�����ȯ����ɬ�פ�����ޤ��� SP-GiST�Υ����ϸ�ΨŪ�ʥǥ������ޥåԥ��ڹ�¤��õ����ô�����ޤ��� �ޤ���Ʊ���¹�����ȥ������Ϥ�ô�����ޤ���
SP-GiST�Υĥ�Υ�ե��ץ�ϡ�����ǥå������դ���줿���Ʊ���ǡ��������ͤ�ޤ�Ǥ��ޤ��� �롼�ȥ�٥�ˤ����ե��ץ�ϡ�ɬ������ǥå������դ���줿���Υǡ������ͤ�ޤ�Ǥ��ޤ�������겼�Υ�٥�Υ�ե��ץ�ϡ��������ʤɡ����̤��줿ɽ�������ޤ�Ǥ��ʤ������Τ�ޤ��� ���ξ�硢�黻�ҥ��饹�Υ��ݡ��ȴؿ������������ץ���ե�٥�ޤǤ��ɤ�ʤ��齸�������ȤäƸ����ͤ�ƹ��ۤǤ���ɬ�פ�����ޤ���
�������ץ�ϡ�õ���ڤ�ʬ�����Ȥʤ뤿�ᡢ��ä�ʣ���Ǥ��� ���줾����������ץ��1�İʾ���Ρ����ν����ޤ�Ǥ��ꡢ�Ρ��ɤ�����Υ���ͤΥ��롼�פ�ɽ�����ޤ��� �Ρ��ɤϲ������Υ��ޤ�Ǥ��ꡢ����ϲ��Υ�٥���̤��������ץ��ؤ��������뤤�Ϥ��٤�Ʊ������ǥå����ڡ�����˺ܤäƤ����ե��ץ��û���ꥹ�Ȥ�ؤ��Ƥ��ޤ��� ���줾��ΥΡ��ɤϡ�����Ҥ���label����äƤ��ޤ��� �㤨�С�����ڤǤϡ��Ρ��ɤΥ�٥��ʸ������ͤμ���ʸ���ˤ��뤳�Ȥ��Ǥ��ޤ��� ��ά��ǽ�Ǥ������������ץ�Ϥ��Τ��٤ƤΥ��С��Ҥ�����Ƭ�����ͤ���Ĥ��Ȥ��Ǥ��ޤ��� ����ڤǤϡ������ɽ�������ʸ����˶��̤���Ƭ���Ȥ��뤳�Ȥ��Ǥ��ޤ��� ��Ƭ�����ͤϡ�ɬ��������������Ƭ���Ǥ���ɬ�פϤʤ����黻�ҥ��饹��ɬ�פȤ���Ǥ�դ��ͤ��ɤ��Ǥ��� �㤨�л�ʬ�ڤǤϡ������濴�����ݻ�����4�Ĥξݸ¤���������Ū��¬��褦�ˤǤ��ޤ��� ��������ȡ���ʬ�ڤ��������ץ�Ϥ����濴���μ���ξݸ¤��б�����4�ĤΥΡ��ɤ�ޤळ�Ȥˤʤ�Ǥ��礦��
�ڹ�¤�Υ��르�ꥺ��ˤϡ����ߤΥ��ץ�Υ�٥�(����)���ΤäƤ��뤳�Ȥ�ɬ�פʤ�Τ�����ޤ��������ǡ�SP-GiST�Υ����ϡ��黻�ҥ��饹���ڹ�¤�ɤäƲ�����Ȥ��˥�٥���δ������ǽ�ˤ��Ƥ��ޤ��� �ޤ���ɬ�פǤ���С�ɽ��������ͤ�û�Ū�˺ƹ��ۤ��뤳�Ȥ⥵�ݡ��Ȥ��Ƥ��ޤ���
注意: SP-GiST�Υ����Υ����ɤ�null����ȥ�ˤĤ��Ƥ��б����Ƥ��ޤ��� SP-GiST�Υ���ǥå����ϥ���ǥå�����null�Υ���ȥ�ˤĤ��Ƥ��Ǽ���ޤ���������ϥ���ǥå����α黻�ҥ��饹�Υ����ɤ���ϱ�����Ƥ���Τǡ�null�Υ���ǥå�������ȥ�両����郎�黻�ҥ��饹�Υ�åɤ��Ϥ���뤳�ȤϤ���ޤ��� (SP-GiST�α黻�Ҥϸ��ʤʤΤ�NULL�ͤˤĤ����������֤����ȤϤǤ��ʤ������ꤵ��Ƥ��ޤ���) ���äơ������ǤϤ���ʾ塢NULL�ˤĤ��Ƶ������ޤ���
SP-GiST�Υ���ǥå����黻�ҥ��饹�����ʤ���Фʤ�ʤ��桼�������åɤ�5�Ĥ���ޤ���
5�ĤΥ�åɤϤ������2�Ĥ�internal������Ȥꡢ1���ܤΰ����ϥ��ݡ��ȥ�åɤ������ͤ�ޤ�C�ι�¤�ΤؤΥݥ���2���ܤΰ����Ͻ����ͤ��֤����C�ι�¤�ΤؤΥݥ��Ȥ��������˽��äƤ��ޤ���
��åɤΤ���4�Ĥϡ����η�̤����٤ƽ��Ϲ�¤�Τ���ˤ���Τǡ�ñ��void���֤��ޤ�����leaf_consistent�ϡ������boolean�η�̤��֤��ޤ���
��åɤϡ��������Ϲ�¤�ΤΤɤΥե�����ɤ��ѹ����ƤϤ����ޤ���
�ɤ�ʾ��Ǥ⡢���Ϲ�¤�Τϥ桼�������åɤ�ƤӽФ����˥����˽��������ޤ���
5�ĤΥ桼�������åɤϰʲ��ΤȤ���Ǥ���
config��Ƭ���ȥΡ��ɥ�٥�Υǡ������Υǡ�����OID��ޤᡢ����ǥå����μ����˴ؤ�����Ū������֤��ޤ���
�ؿ���SQL����ϰʲ��Τ褦�ˤʤ�ޤ���
CREATE FUNCTION my_config(internal, internal) RETURNS void ...
1���ܤΰ�����C��spgConfigIn��¤�ΤؤΥݥ��ǡ��ؿ������ϥǡ�����ޤߤޤ��� 2���ܤΰ�����C��spgConfigOut��¤�ΤؤΥݥ��ǡ��ؿ�����̤Υǡ���������ޤ���
typedef struct spgConfigIn
{
Oid attType; /* Data type to be indexed */
} spgConfigIn;
typedef struct spgConfigOut
{
Oid prefixType; /* Data type of inner-tuple prefixes */
Oid labelType; /* Data type of inner-tuple node labels */
bool canReturnData; /* Opclass can reconstruct original data */
bool longValuesOK; /* Opclass can cope with values > 1 page */
} spgConfigOut;attType��¿�ͤΥ���ǥå����黻�ҥ��饹�ݡ��Ȥ��뤿����Ϥ���ޤ��� �̾�θ���ǡ������α黻�ҥ��饹�Ǥϡ�����Ͼ��Ʊ���ͤ���äƤ���Τ�̵��Ǥ��ޤ���
��Ƭ����Ȥ�ʤ��黻�ҥ��饹�Ǥϡ�prefixType��VOIDOID�����ꤹ�뤳�Ȥ��Ǥ��ޤ��� Ʊ�ͤˡ��Ρ��ɥ�٥��Ȥ�ʤ��黻�ҥ��饹�Ǥϡ�labelType��VOIDOID�����ꤹ�뤳�Ȥ��Ǥ��ޤ��� �黻�ҥ��饹������������Ƥ�������ǥå������ͤ�ƹ��ۤǤ���Ȥ��ϡ�canReturnData��true�ˤ��ޤ��� attType������Ĺ�ǡ��黻�ҥ��饹���������դ��η����֤��ˤ�ä�Ĺ���ͤ�ʬ��Ǥ���Ȥ��ˤΤߡ�longValuesOK��true�ˤ��ޤ�(項56.3.1����)��
choose�������ץ�˿������ͤ���������Ȥ��Υ�åɤ����ޤ���
�ؿ���SQL����ϰʲ��Τ褦�ˤʤ�ޤ���
CREATE FUNCTION my_choose(internal, internal) RETURNS void ...
1���ܤΰ�����C��spgChooseIn��¤�ΤؤΥݥ��ǡ��ؿ������ϥǡ�����ޤߤޤ��� 2���ܤΰ�����C��spgChooseOut��¤�ΤؤΥݥ��ǡ��ؿ�����̤Υǡ���������ޤ���
typedef struct spgChooseIn
{
Datum datum; /* original datum to be indexed */
Datum leafDatum; /* current datum to be stored at leaf */
int level; /* current level (counting from zero) */
/* Data from current inner tuple */
bool allTheSame; /* tuple is marked all-the-same? */
bool hasPrefix; /* tuple has a prefix? */
Datum prefixDatum; /* if so, the prefix value */
int nNodes; /* number of nodes in the inner tuple */
Datum *nodeLabels; /* node label values (NULL if none) */
} spgChooseIn;
typedef enum spgChooseResultType
{
spgMatchNode = 1, /* descend into existing node */
spgAddNode, /* add a node to the inner tuple */
spgSplitTuple /* split inner tuple (change its prefix) */
} spgChooseResultType;
typedef struct spgChooseOut
{
spgChooseResultType resultType; /* action code, see above */
union
{
struct /* results for spgMatchNode */
{
int nodeN; /* descend to this node (index from 0) */
int levelAdd; /* increment level by this much */
Datum restDatum; /* new leaf datum */
} matchNode;
struct /* results for spgAddNode */
{
Datum nodeLabel; /* new node's label */
int nodeN; /* where to insert it (index from 0) */
} addNode;
struct /* results for spgSplitTuple */
{
/* Info to form new inner tuple with one node */
bool prefixHasPrefix; /* tuple should have a prefix? */
Datum prefixPrefixDatum; /* if so, its value */
Datum nodeLabel; /* node's label */
/* Info to form new lower-level inner tuple with all old nodes */
bool postfixHasPrefix; /* tuple should have a prefix? */
Datum postfixPrefixDatum; /* if so, its value */
} splitTuple;
} result;
} spgChooseOut;
datum�ϥ���ǥå�������������븵�Υǡ����Ǥ���
leafDatum�Ϻǽ��datum��Ʊ���Ǥ�����choose���뤤��picksplit��åɤ�������ѹ�����ȡ��ĥ�Τ���㤤��٥���ѹ�����뤳�Ȥ�����ޤ���
������õ������դΥڡ�������ã�����Ȥ���leafDatum�θ����ͤ�������������������ե��ץ�˳�Ǽ������ͤȤʤ�ޤ���
level�ϡ��롼�ȥ�٥��0�Ȥ��ơ����ߤ��������ץ�Υ�٥���ޤ���
���ߤ��������ץ뤬ʣ����Ʊ���ʥΡ��ɤ�ޤ�Ȥ��ư����դ����Ƥ���Ȥ���allTheSame��true�ˤ��ޤ�(項56.3.3����)��
���ߤ��������ץ뤬��Ƭ����ޤ�Ȥ���hasPrefix��true�ˤ��ޤ���
���ΤȤ���prefixDatum�������ͤˤʤ�ޤ���
nNodes���������ץ뤬�ޤ�ҥΡ��ɤο��ǡ�nodeLabels�Ϥ����Υ�٥��ͤ������뤤�ϥ�٥뤬�ʤ����NULL�ˤʤ�ޤ���
choose�ؿ��ϡ��������ͤ���¸�λҥΡ��ɤ�1�Ĥȥޥå����뤫���������ҥΡ��ɤ��ɲä���ɬ�פ����뤫�����뤤�Ͽ������ͤ����ץ����Ƭ����Ŭ�礷�ʤ��Τ��������ץ��ʬ�䤷�Ƥ�����¤Τʤ���Ƭ�����������ɬ�פ����뤫������ꤹ�뤳�Ȥ��Ǥ��ޤ���
�������ͤ���¸�λҥΡ��ɤ�1�Ĥ˥ޥå������Ȥ��ϡ�resultType��spgMatchNode�˥��åȤ��ޤ��� nodeN�ϥΡ��ɤ�������Τ��ΥΡ��ɤ��ֹ�(0����)�˥��åȤ��ޤ��� levelAdd�ϡ����ΥΡ��ɤɤäƲ�����Ȥ���������level����ʬ�˥��åȤ��ޤ������뤤�ϱ黻�ҥ��饹����٥��ȤäƤ��ʤ����0�Τޤޤˤ��ޤ��� restDatum�ϡ��黻�ҥ��饹���ǡ������٥뤫�鼡�Υ�٥���ѹ����ʤ��ΤǤ���С�datum�����������åȤ��ޤ��������Ǥʤ���С����Υ�٥��leafDatum�Ȥ��ƻȤ��뽤�����줿�ͤ˥��åȤ��ޤ���
�������ҥΡ��ɤ��ɲä��ʤ���Фʤ�ʤ��Ȥ��ϡ�resultType��spgAddNode�˥��åȤ��ޤ���
nodeLabel�ϡ��������Ρ��ɤǻȤ����٥�˥��åȤ���nodeN�ϥΡ��ɤ�������������������ΥΡ��ɤ��ֹ�(0����)�˥��åȤ��ޤ���
�Ρ��ɤ��ɲä�����ǡ�choose�ؿ��������줿�������ץ��ȤäƺƤӸƤӽФ��ޤ��������ΤȤ��ϡ�spgMatchNode�Ȥ�����̤ˤʤ�Ϥ��Ǥ���
�������ͤ����ץ����Ƭ����Ŭ�礷�ʤ��Ȥ��ϡ�resultType��spgSplitTuple�˥��åȤ��ޤ���
���Υ��������ϡ����٤Ƥδ�¸�ΥΡ��ɤ�����̤��������ץ�˰�ư������������̤��������ץ�˥����ñ��ΥΡ��ɤ���Ŀ��������ץ�Ǵ�¸�Υ��ץ���ִ����ޤ���
prefixHasPrefix�Ͽ�������̤Υ��ץ뤬��Ƭ������Ĥ��ɤ����������ľ��ˤ�prefixPrefixDatum����Ƭ�����ͤ˥��åȤ��ޤ���
����ǥå������ɲä���뿷�����ͤ��������뤿�ᡢ��������Ƭ�����ͤϸ��Τ�Τ������¤δˤ���ΤˤʤäƤ���ɬ�פ����ꡢ�ޤ�������Ƭ�����Ĺ���Ϥʤ�ޤ���
nodeLabel�ϡ���������̤��������ץ��ؤ������Ρ��ɤǻȤ����٥�˥��åȤ��ޤ���
postfixHasPrefix�ϡ���������̤Υ��ץ뤬��Ƭ������Ĥ��ɤ����������ĤȤ��ˤ�postfixPrefixDatum����Ƭ�����ͤ˥��åȤ��ޤ���
��������̤˰�ư�������ץ�ΥΡ��ɤΥ�٥���ѹ����뵡��⡢�ҤΥ���ǥå����Υ���ȥ���ѹ����뵡��⤢��ޤ��顢�����2�Ĥ���Ƭ�����ɲäΥ�٥���Ȥ߹�碌�ϡ�������Ƭ����Ʊ����̣�����ɬ�פ�����ޤ���
�Ρ��ɤ�ʬ�䤵�줿��ǡ�choose���ִ������������ץ��ȤäƺƤӸƤӽФ��ޤ���
���θƤӽФ��ϡ��̾��spgAddNode�Ȥ�����̤ˤʤ�ޤ����Ȥ����Τϡ�ʬ��Υ��ƥåפ��ɲä��줿�Ρ��ɤΥ�٥�϶��餯�������ͤȥޥå����ʤ�����Ǥ���
���äơ����θ塢3���ܤθƤӽФ��Ǥ�ä�spgMatchNode���֤ꡢ��ե�٥�˲�������������ǽ�Ȥʤ�ޤ���
picksplit��ե��ץ�ν�����Ф����������������ץ��ɤ���äƺ�뤫����ꤷ�ޤ���
�ؿ���SQL����ϰʲ��Τ褦�ˤʤ�ޤ���
CREATE FUNCTION my_picksplit(internal, internal) RETURNS void ...
1���ܤΰ�����C��spgPickSplitIn��¤�ΤؤΥݥ��ǡ��ؿ������ϥǡ�����ޤߤޤ��� 2���ܤΰ�����C��spgPickSplitOut��¤�ΤؤΥݥ��ǡ��ؿ�����̤Υǡ���������ޤ���
typedef struct spgPickSplitIn
{
int nTuples; /* number of leaf tuples */
Datum *datums; /* their datums (array of length nTuples) */
int level; /* current level (counting from zero) */
} spgPickSplitIn;
typedef struct spgPickSplitOut
{
bool hasPrefix; /* new inner tuple should have a prefix? */
Datum prefixDatum; /* if so, its value */
int nNodes; /* number of nodes for new inner tuple */
Datum *nodeLabels; /* their labels (or NULL for no labels) */
int *mapTuplesToNodes; /* node index for each leaf tuple */
Datum *leafTupleDatums; /* datum to store in each new leaf tuple */
} spgPickSplitOut;nTuples�����Ϥ�����ե��ץ�θĿ��Ǥ��� datums�ϥǡ������ͤ�����Ǥ��� level�Ϥ��٤ƤΥ�ե��ץ�θ��ߤΥ�٥�ǡ����줬�������������ץ�Υ�٥�ˤʤ�ޤ���
hasPrefix�Ͽ������������ץ뤬��Ƭ������Ĥ��ɤ����������ľ���prefixDatum����Ƭ�����ͤ˥��åȤ��ޤ���
nNodes�Ͽ������������ץ뤬�ޤ�Ρ��ɤο�����nodeLabels�Ϥ��Υ�٥��ͤ�����˥��åȤ��ޤ���
(�Ρ��ɤ���٥��ɬ�פȤ��ʤ��Ȥ��ϡ�nodeLabels��NULL�˥��åȤ��ޤ����ܺ٤�項56.3.2�Ȥ��Ƥ���������)
mapTuplesToNodes�ϡ����줾��Υ�ե��ץ뤬������Ƥ���Ρ��ɤ��ֹ�(0����)������˥��åȤ��ޤ���
leafTupleDatums�Ͽ�������ե��ץ�˳�Ǽ������ͤ�����˥��åȤ��ޤ�(�黻�ҥ��饹���ǡ������٥뤫�鼡�Υ�٥���ѹ����ʤ���Ф��������Ϥ�datums��Ʊ���ˤʤ�ޤ�)��
picksplit�ؿ��ϡ�nodeLabels��mapTuplesToNodes��leafTupleDatums������ˤĤ���palloc���ʤ���Фʤ�ʤ����Ȥ����դ��Ƥ���������
2�İʾ�Υ�ե��ץ��Ϳ������硢picksplit�ؿ��Ϥ�����2�İʾ�ΥΡ��ɤ�ʬ�ह���ͽ�ۤ���ޤ��������Ǥʤ���С���ե��ץ��ʣ���Υڡ����ˤޤ����ä�ʬ�䤹��Ȥ������������ε�ˤ���Ū��¸��Ǥ��ʤ�����Ǥ���
���äơ�picksplit�����٤ƤΥ�ե��ץ��Ʊ���Ρ��ɤ��֤����Ȥˤʤä����ˤϡ�SP-GiST�Υ����Υ����ɤ����η����ʤ�����������ץ�����������������ʣ����Ʊ��Υ�٥뤬�դ���줿�Ρ��ɤˡ���ե��ץ뤬̵��٤˳�����Ƥ��ޤ���
���Τ褦�ʥ��ץ�ϡ����Τ��Ȥ�ȯ���������Ȥ��������뤿�ᡢallTheSame�Ȱ����Ĥ����ޤ���
choose�ؿ���inner_consistent�ؿ��ϡ��������������ץ�ˤĤ��ơ�Ŭ�ڤ����դƼ�갷��ʤ���Фʤ�ޤ���
�ܺ٤ʾ����項56.3.3�Ȥ��Ƥ���������
config�ؿ���longValuesOK��true�˥��åȤ���1�ڡ��������礭�������ͤ�Ϳ������ˤΤߡ�picksplit��1�Ĥ����Υ�ե��ץ��Ŭ�ѤǤ��ޤ���
���ξ������ν��פ����ϡ���Ƭ����Ϥ����ơ������������û����եǡ������ͤ��������뤳�ȤǤ���
���θƽФϡ�1�ڡ����˼��ޤ�û���Υ�եǡ��������������ޤǷ����֤���ޤ���
�ܺ٤ʾ����項56.3.1�Ȥ��Ƥ���������
inner_consistent�ĥ��õ���Ǥ��ɤ�٤��Ρ���(��)�ν�����֤��ޤ���
�ؿ���SQL����ϰʲ��Τ褦�ˤʤ�ޤ���
CREATE FUNCTION my_inner_consistent(internal, internal) RETURNS void ...
1���ܤΰ�����C��spgInnerConsistentIn��¤�ΤؤΥݥ��ǡ��ؿ������ϥǡ�����ޤߤޤ��� 2���ܤΰ�����C��spgInnerConsistentOut��¤�ΤؤΥݥ��ǡ��ؿ�����̤Υǡ���������ޤ���
typedef struct spgInnerConsistentIn
{
ScanKey scankeys; /* array of operators and comparison values */
int nkeys; /* length of array */
Datum reconstructedValue; /* value reconstructed at parent */
int level; /* current level (counting from zero) */
bool returnData; /* original data must be returned? */
/* Data from current inner tuple */
bool allTheSame; /* tuple is marked all-the-same? */
bool hasPrefix; /* tuple has a prefix? */
Datum prefixDatum; /* if so, the prefix value */
int nNodes; /* number of nodes in the inner tuple */
Datum *nodeLabels; /* node label values (NULL if none) */
} spgInnerConsistentIn;
typedef struct spgInnerConsistentOut
{
int nNodes; /* number of child nodes to be visited */
int *nodeNumbers; /* their indexes in the node array */
int *levelAdds; /* increment level by this much for each */
Datum *reconstructedValues; /* associated reconstructed values */
} spgInnerConsistentOut;
����scankeys��Ĺ����nkeys�ǡ�����ǥå��������ξ��Ҥ��ޤ���
ʣ���ξ���AND�Ƿ�礵��ޤ����Ĥޤꡢ���Τ��٤Ƥ�����������ǥå�������ȥ�Τߤ��оݤȤʤ�ޤ���
(nkeys��0�ʤ�С����٤ƤΥ���ȥ꤬�����������������Ȥˤʤ롢�Ȥ������Ȥ����դ��Ƥ���������)
�̾consistent�ؿ��Ǥϡ�����Τ��줾��Υ���ȥ��sk_strategy�����sk_argument�ե�����ɤΤߤ�����Ȥʤ�ޤ��������Υե�����ɤˤϤ��줾�쥤��ǥå����դ���ǽ�ʱ黻�Ҥ�����ͤ�����ޤ���
�ʤ�������ͤ�NULL���ɤ������ǧ���뤿���sk_flags������ɬ�פϤ���ޤ��ʤ��ʤ�SP-GiST�Υ����Υ����ɤ����Τ褦�ʾ���������뤫��Ǥ���
reconstructedValue�Ͽƥ��ץ�Τ���˺ƹ��ۤ��줿�ͤǡ��롼�ȥ�٥�ξ�硢���뤤�Ͽƥ�٥��inner_consistent�ؿ����ͤ��֤��ʤ��ä�����(Datum) 0�Ȥʤ�ޤ���
level�ϸ��ߤ��������ץ�Υ�٥�롼�ȥ�٥��0�Ȥ��ƿ�������ΤǤ���
returnData�ϡ������䤤��碌�Ǻƹ��ۤ��줿�ǡ�����ɬ�פʾ���true�Ȥʤ�ޤ����������config�ؿ���canReturnData���ǧ�������ˤΤߡ������ʤ�ޤ���
allTheSame�ϡ����ߤ��������ץ��"all-the-same"�ΰ����դ��Ƥ������true�ˤʤ�ޤ������ξ�硢���٤ƤΥΡ��ɤ�(��٥뤬�����)Ʊ����٥����äƤ��ޤ����顢���Τ��٤Ƥ��䤤��碌�˥ޥå����뤫���������ޥå����ʤ����Τ����줫�ˤʤ�ޤ�(項56.3.3����)��
hasPrefix�ϸ��ߤ��������ץ뤬��Ƭ������äƤ������true�Ȥʤꡢ���ΤȤ�prefixDatum�������ͤȤʤ�ޤ���
nNodes���������ץ뤬�ޤ�ҥΡ��ɤο��Ǥ���nodeLabels�Ϥ����Υ�٥��ͤ�����ǡ��Ρ��ɤ˥�٥뤬�ʤ��Ȥ���NULL�ˤʤ�ޤ���
nNodes��õ����ˬ���ɬ�פΤ���ҥΡ��ɤο��˥��åȤ���ʤ���Фʤ�ޤ��ޤ���nodeNumbers�Ϥ������ֹ������˥��åȤ���ʤ���Фʤ�ޤ���
�黻�ҥ��饹����٥��ƻ뤷�Ƥ���Ȥ��ϡ����줾��ΥΡ��ɤؤȲ��ä�ˬ���Ȥ���ɬ�פʥ�٥����ʬ�������levelAdds�˥��åȤ��ޤ���
(������ʬ�Ϥ��٤ƤΥΡ��ɤˤĤ���Ʊ���ˤʤ뤳�Ȥ�¿���Ǥ�����ɬ�����⤽���ʤ�Ȥϸ¤�ʤ��Τ����Ȥ��ޤ���)
�ͤκƹ��ۤ�ɬ�פʤȤ��ˤϡ�ˬ��뤽�줾��λҥΡ��ɤˤĤ��ƺƹ��ۤ��줿�ͤ������reconstructedValues�˥��åȤ��ޤ����ƹ��ۤ�ɬ�פǤʤ���С�reconstructedValues��NULL�Τޤޤˤ��ޤ���
inner_consistent�ؿ��ϡ�nodeNumbers��levelAdds��reconstructedValues������ˤĤ���palloc���ʤ���Фʤ�ʤ����Ȥ����դ��Ƥ���������
leaf_consistent��ե��ץ뤬�䤤��碌����������硢true���֤��ޤ���
�ؿ���SQL����ϰʲ��Τ褦�ˤʤ�ޤ���
CREATE FUNCTION my_leaf_consistent(internal, internal) RETURNS bool ...
1���ܤΰ�����C��spgLeafConsistentIn��¤�ΤؤΥݥ��ǡ��ؿ������ϥǡ�����ޤߤޤ��� 2���ܤΰ�����C��spgLeafConsistentOut��¤�ΤؤΥݥ��ǡ��ؿ�����̤Υǡ���������ޤ���
typedef struct spgLeafConsistentIn
{
ScanKey scankeys; /* array of operators and comparison values */
int nkeys; /* length of array */
Datum reconstructedValue; /* value reconstructed at parent */
int level; /* current level (counting from zero) */
bool returnData; /* original data must be returned? */
Datum leafDatum; /* datum in leaf tuple */
} spgLeafConsistentIn;
typedef struct spgLeafConsistentOut
{
Datum leafValue; /* reconstructed original data, if any */
bool recheck; /* set true if operator must be rechecked */
} spgLeafConsistentOut;
����scankeys��Ĺ����nkeys�ǡ�����ǥå���õ���ξ��Ҥ��ޤ���
ʣ���ξ���AND�Ƿ�礵��ޤ����Ĥޤꡢ���Τ��٤Ƥ�����������ǥå�������ȥ�Τߤ��оݤȤʤ�ޤ���
(nkeys��0�ʤ�С����٤ƤΥ���ȥ꤬�����������������Ȥˤʤ롢�Ȥ������Ȥ����դ��Ƥ���������)
�̾consistent�ؿ��Ǥϡ�����Τ��줾��Υ���ȥ��sk_strategy�����sk_argument�ե�����ɤΤߤ�����Ȥʤ�ޤ��������Υե�����ɤˤϤ��줾�쥤��ǥå����դ���ǽ�ʱ黻�Ҥ�����ͤ�����ޤ���
�ʤ�������ͤ�NULL���ɤ������ǧ���뤿���sk_flags������ɬ�פϤ���ޤ��ʤ��ʤ�SP-GiST�Υ����Υ����ɤ����Τ褦�ʾ���������뤫��Ǥ���
reconstructedValue�Ͽƥ��ץ�Τ���˺ƹ��ۤ��줿�ͤǡ��롼�ȥ�٥�ξ�硢���뤤�Ͽƥ�٥��inner_consistent�ؿ����ͤ��֤��ʤ��ä�����(Datum) 0�Ȥʤ�ޤ���
level�ϸ��ߤΥ�ե��ץ�Υ�٥�롼�ȥ�٥��0�Ȥ��ƿ�������ΤǤ���
returnData�ϡ������䤤��碌�Ǻƹ��ۤ��줿�ǡ�����ɬ�פʾ���true�Ȥʤ�ޤ����������config�ؿ���canReturnData���ǧ�������ˤΤߡ������ʤ�ޤ���
leafDatum�ϸ��ߤΥ�ե��ץ�˳�Ǽ����Ƥ��븰���ͤǤ���
���δؿ��ϡ���ե��ץ뤬�䤤��碌�˥ޥå������true���֤����ޥå����ʤ����false���֤��ޤ��� true�ξ�硢returnData��true�Ǥ���С�leafValue�ϡ����Υ�ե��ץ�˥���ǥå����դ����뤿��˸������줿�ͤ˥��åȤ���ʤ���Фʤ�ޤ��� �ޤ����ޥå����뤫�ɤ������Գμ¤ǡ��ޥå����뤫�γ�ǧ�Τ���˼ºݤΥҡ��ץ��ץ�˱黻�Ҥ��Ŭ�Ѥ��ʤ���Фʤ�ʤ��Ȥ��ϡ�recheck��true�˥��åȤ���뤳�Ȥ�����ޤ���
SP-GiST�Τ��٤ƤΥ��ݡ��ȥ�åɤϡ��̾��û����ͭ���ʥ��ꥳ��ƥ�������ǸƤӽФ���ޤ����Ĥޤꡢ���줾��Υ��ץ�ˤĤ��ƽ����������CurrentMemoryContext�ϥꥻ�åȤ���ޤ���
�������äơ�palloc������Τ��٤ƤˤĤ���pfree���뤳�Ȥˤ����뤳�ȤϤ��ޤ���פǤϤ���ޤ���
(config��åɤ��㳰�ǡ�����������褦�ˤ���ɬ�פ�����ޤ���
���������̾��config��åɤϡ��ѥ����Ȥ����Ϥ��줿��¤�Τ��������������ʳ������⤹��ɬ�פ�����ޤ���)
����ǥå����դ����줿�ȹ��ǽ�ʥǡ������ξ�硢����ǥå����ξȹ�ϡ�ɸ��Ū��PG_GET_COLLATION()�λ��Ȥߤ�ȤäƤ��٤ƤΥ��ݡ��ȥ�åɤ��Ϥ���ޤ���