��PostgreSQL����ե����2025��11��21�����š������å��������
¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

56.2. ��ĥ��

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()�λ��Ȥߤ�ȤäƤ��٤ƤΥ��ݡ��ȥ᥽�åɤ��Ϥ���ޤ���