이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

65.3. 확장 성

SP-Gist높은 수준의 추상화와 인터페이스를 제공하므로 액세스 방법 개발자는 주어진 데이터 유형에 특정한 메소드 만 구현해야합니다. 그만큼SP-GistCore는 효율적인 디스크 매핑 및 트리 구조 검색을 담당합니다. 또한 동시성 및 로깅 고려 사항을 처리합니다.

leaf tuples ofSP-Gist트리에는 인덱스 열과 동일한 데이터 유형의 값이 포함되어 있습니다. 루트 레벨의 잎 토토 꽁 머니은 항상 원래 인덱스 데이터 값을 포함하지만, 낮은 레벨의 잎 토토 꽁 머니은 접미사와 같은 압축 된 표현 만 포함 할 수 있습니다. 이 경우 운영자 클래스 지원 기능은 잎 수준에 도달하기 위해 통과 된 내부 토토 꽁 머니에서 축적 된 정보를 사용하여 원래 값을 재구성 할 수 있어야합니다..

내부 토토 꽁 머니은 검색 트리의 분기 지점이기 때문에 더 복잡합니다. 각 내부 토토 꽁 머니에는 하나 이상의 세트가 포함됩니다노드, 유사한 잎 값의 그룹을 나타냅니다. 노드에는 다운 링크가 포함되어 있으며 다른 수준의 하단 내부 튜플 또는 동일한 인덱스 페이지에있는 짧은 잎 튜플 목록으로 연결됩니다. 각 노드에는 일반적으로레이블그것을 설명합니다. 예를 들어, Radix 트리에서 노드 레이블은 문자열 값의 다음 문자 일 수 있습니다. (또는 모든 내부 튜플에 대한 고정 노드 세트에서 작동하는 경우 연산자 클래스는 노드 레이블을 생략 할 수 있습니다. 참조섹션 65.4.2.) 선택적으로, 내부 토토 꽁 머니은 a를 가질 수 있습니다.prefix모든 회원을 설명하는 값. radix 트리에서 이것은 표현 된 문자열의 일반적인 접두사 일 수 있습니다. 접두사 값은 반드시 접두사 일 필요는 없지만 운영자 클래스가 필요한 데이터 일 수 있습니다. 예를 들어, 쿼드 트리에서는 4 개의 사분면이 측정되는 중심점을 저장할 수 있습니다. 그런 다음 쿼드 트리 내부 튜플에는이 중심점 주변의 사분면에 해당하는 4 개의 노드가 포함됩니다.

일부 트리 알고리즘은 현재 튜플의 레벨 (또는 깊이)에 대한 지식이 필요하므로SP-GistCore는 운영자 클래스가 트리를 내려 가면서 레벨 계산을 관리 할 가능성을 제공합니다. 필요할 때 대표 값을 점진적으로 재구성하고 추가 데이터를 전달하기위한 지원도 있습니다 (호출트래버스 값) 나무 하강 중.

note

SP-Gist핵심 코드는 NULL 항목을 처리합니다. 하지만SP-Gist인덱스 인덱스 열에 nulls에 대한 저장 항목이 있습니다. 이는 인덱스 운영자 클래스 코드에서 숨겨져 있습니다. 널 인덱스 항목 또는 검색 조건은 운영자 클래스 메소드에 전달되지 않습니다. (SP-Gist운영자는 엄격하고 널 값에 대해 성공할 수 없습니다.) 따라서 널 값은 여기에서 더 자세히 설명하지 않습니다.

인덱스 운영자가 클래스하는 5 가지 사용자 정의 방법이 있습니다SP-Gist제공해야하며 하나는 선택 사항입니다. 다섯 가지 의무적 방법 모두 두 가지를 받아들이는 협약을 따릅니다내부인수, 첫 번째는 지원 방법에 대한 입력 값을 포함하는 C 구조물에 대한 포인터이며, 두 번째 인수는 출력 값을 배치 해야하는 C 구조물에 대한 포인터입니다. 의무적 인 방법 중 네 가지가 반환void, 모든 결과가 출력 구조물에 나타나기 때문에; 하지만Leaf_consistent추가로 반환부울결과. 방법은 입력 스트러크의 필드를 수정해서는 안됩니다. 모든 경우에, 출력 구조는 사용자 정의 메소드를 호출하기 전에 0으로 초기화됩니다. 선택적 여섯 번째 방법압축Datum이 유일한 인수로 인덱싱되는 것을 허용하고 잎 토토 꽁 머니에서 물리적 저장에 적합한 값을 반환합니다..

5 가지 필수 사용자 정의 방법은 다음과 같습니다.

config

접두사 및 노드 레이블 데이터 유형의 데이터 유형 OID를 포함하여 인덱스 구현에 대한 정적 정보를 반환합니다.

theSQL함수 선언은 다음과 같아야합니다.

함수 생성 my_config (내부, 내부) 반환 void ...

첫 번째 인수는 a에 대한 포인터입니다.SPGCONFIGINc 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.SPGCONFIGOUTC 구조물, 함수가 결과 데이터로 채워야합니다.

typedef struct spgconfigin

    Oid Atttype;        / * 색인화 할 데이터 유형 */
 spgconfigin;

typedef struct spgconfigout

    OID PREFIXTYPE;     / * 내부 튜플 접두사의 데이터 유형 */
    OID LABELTYPE;      / * 내부 튜플 노드 레이블의 데이터 유형 */
    Oid LeafType;       / * 잎 튜플 값의 데이터 유형 */
    BOOL CANRETURNDATA;  / * opclass는 원본 데이터를 재구성 할 수 있습니다 */
    BOOL LONGVALUESOK;   / * opclass는 값에 대처할 수 있습니다 1 페이지 */
 spgconfigout;

atttype13831_14004

접두사를 사용하지 않는 운영자 클래스의 경우PrefixType로 설정할 수 있습니다voidoid. 마찬가지로 노드 레이블을 사용하지 않는 운영자 클래스의 경우labelType로 설정할 수 있습니다voidoid. CanreturnData운영자 클래스가 원래 보관 된 인덱스 값을 재구성 할 수있는 경우 true를 설정해야합니다.LongValuesok만 맞아야합니다.atttype길이가 변하고 연산자 클래스는 반복 된 접미사를 통해 긴 값을 분할 할 수 있습니다 (참조섹션 65.4.1).

LeafType일반적으로atttype. 후진 호환성의 이유로, 방법config떠날 수LeafType초기화되지 않은; 그것은 설정과 같은 효과를 줄 것입니다LeafType동일atttype. 언제atttypeLeafType다르고 선택적 방법compress제공되어야합니다. 방법compress|atttypetoLeafType. 참고 : 두 가지 일관된 기능 모두Scankeys변환없이 변경되지 않았습니다압축.

선택

내부 튜플에 새 값을 삽입하는 방법을 선택합니다.

theSQL함수 선언은 다음과 같아야합니다.

함수 생성 my_choose (내부, 내부) 반환 void ...

첫 번째 인수는 A에 대한 포인터입니다.Spgchooseinc 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.spgchooseoutC 구조물, 함수가 결과 데이터로 채워야합니다.

typedef struct spgchoosein

    데이텀 데이텀;          / * 색인화 될 원본 데이텀 */
    데이텀 리프 듀다;      / * 잎에 저장 될 전류 데이텀 */
    int 레벨;          / * 현재 레벨 (0에서 계산) */

    / * 현재 내부 튜플의 데이터 */
    BOOL ALLTHESAME;     /* 튜플은 모든 것이 표시되어 있습니까? */
    BOOL HASPREFIX;      /* 튜플에는 접두사가 있습니까? */
    Datum Prefixdatum;    / * 그렇다면 접두사 값 */
    int nnodes;         / * 내부 튜플의 노드 수 */
    Datum *Nodelabels;     / * 노드 레이블 값 (null이 없음) */
 spgchoosein;

typedef enum spgchooseresulttype

    spgmatchnode = 1, / * 기존 노드로 내려갑니다 * /
    spgaddnode, / * 내부 튜플에 노드를 추가하십시오 * /
    spgsplittuple / * 분할 내부 튜플 (접두사 변경) * /
 spgchooseresulttype;

typedef struct spgchooseout

    spgchooseresulttype resulttype;     / * 액션 코드, 위 참조 */
    노동 조합

        spgmatchnode * /struct / * 결과 * /

            int noden;      / *이 노드로 내려갑니다 (0에서 index) */
            int levelAdd;   / *이 정도의 증분 레벨 */
            데이텀리스트 덤;  / * 새로운 잎 기준 */
         matchNode;
        spgaddnode * /struct / * 결과 * /

            데이텀 노 델라벨;  / * 새 노드 레이블 */
            int noden;      / * 삽입 할 위치 (0에서 색인) */
         addnode;
        spgsplittuple에 대한 struct / * 결과 * /

            / * 한 어린이 튜플과 함께 새로운 상위 수준의 내부 튜플을 형성하는 정보 */
            부울 접두사 hasprefix;    /* 튜플은 접두사가 있어야합니까? */
            Datum PrefixprefixDatum;  / * 그렇다면 그 가치 */
            int prefixnnodes;       / * 노드 수 */
            데이텀 *접두사 노드 라벨;   /* 라벨 (또는 null에 대한 라벨
                                             * 라벨 없음) */
            int childnoden;         / * 어떤 노드가 자식 튜플을 얻는 지 */

            / * 모든 오래된 노드와 함께 새로운 하위 수준 내부 튜플을 형성하는 정보 */
            bool postfixhasprefix;   /* 튜플은 접두사가 있어야합니까? */
            Datum postfixprefixdatum; / * 그렇다면 그 가치 */
         splittuple;
               결과;
 spgchooseout;

Datum원래의 데이텀입니다.SPGCONFIGIN.atttype인덱스에 삽입 될 유형.Leafdatum의 값은입니다.SPGCONFIGOUT.LeafType유형은 처음에 메소드의 결과입니다압축적용Datumcompress제공됩니다.Datum그렇지 않으면.Leafdatum이면 트리의 낮은 수준에서 변경할 수 있습니다선택또는picksplit메소드 변경. 삽입 검색이 리프 페이지에 도달하면 현재 값Leafdatum새로 생성 된 잎 토토 꽁 머니에 저장 될 것입니다.레벨는 루트 레벨의 경우 0에서 시작하는 현재 내부 튜플 레벨입니다.Allthesame전류 내부 튜플이 여러 동등한 노드를 포함하는 것으로 표시되면 참조 (참조섹션 65.4.3).hasprefix전류 내부 튜플에 접두사가 포함되어 있으면 참입니다. 그렇다면,PrefixDatum값입니다.nnodes내부 튜플에 포함 된 자식 노드의 수는입니다.Nodelabels라벨이없는 경우 레이블 값의 배열이거나 널

the선택함수는 새 값이 기존 하위 노드 중 하나와 일치하거나 새 하위 노드가 추가되어야한다는 것을 결정할 수 있거나 새 값이 튜플 접두사와 일치하지 않으므로 내부 튜플을 분할하여 덜 제한적인 접두사를 생성해야합니다..

새 값이 기존 자식 노드 중 하나와 일치하는 경우resulttypetoSPGMATCHNODE. 세트Noden노드 어레이의 해당 노드의 인덱스 (제로)까지. 세트levelAdd증분으로레벨해당 노드를 통해 내림차순으로 인해 발생하거나 연산자 클래스가 레벨을 사용하지 않으면 0으로 남겨 둡니다. 세트RestDatum동등한Leafdatum운영자 클래스가 한 레벨에서 다음 레벨로 데이트를 수정하지 않거나 그렇지 않으면 사용될 수정 된 값으로 설정하여Leafdatum다음 단계에서.

새 하위 노드를 추가 해야하는 경우resultTypetoSPGADDNODE. 세트Nodelabel새 노드에 사용될 레이블로Noden노드 어레이에 노드를 삽입 할 인덱스 (0에서)로. 노드가 추가 된 후선택함수는 수정 된 내부 튜플로 다시 호출됩니다. 그 전화는를 초래해야합니다.SPGMATCHNODE결과.

새 값이 토토 꽁 머니 접두사와 일치하지 않는 경우resultTypetospgsplittuple. 이 동작은 기존의 모든 노드를 새로운 하위 레벨 내부 튜플로 이동시키고 기존 내부 튜플을 새로운 하단 내부 튜플을 가리키는 단일 다운 링크를 갖는 튜플로 대체합니다. 세트prefixhasprefix새 상단 토토 꽁 머니에 접두사가 있어야하는지 여부를 나타내려면prefixprefixDatum접두사 값으로. 이 새로운 접두사 값은 색인화 할 새 값을 수락하기 위해 원본보다 충분히 덜 제한적이어야합니다. 세트prefixnnodes새 튜플에 필요한 노드 수로PrefixNodelabels라벨을 보유한 Palloc'd 어레이에 또는 노드 레이블이 필요하지 않은 경우 NULL로. 새로운 상부 튜플의 총 크기는 교체하는 튜플의 총 크기에 지나지 않아야합니다. 이것은 새로운 접두사와 새로운 라벨의 길이를 제한합니다. 세트Childnoden새로운 하위 레벨 내부 튜플로 다운 링크하는 노드의 인덱스 (0에서). 세트postfixhasprefix새로운 하위 레벨 내부 튜플에 접두사가 있어야하는지 여부를 나타내려면PostFixPrefixDatum접두사 값으로. 이 두 접두사와 다운 링크 노드의 레이블 (있는 경우)의 조합은 원래의 접두사와 동일한 의미를 가져야합니다. 원래의 접두사와 동일한 의미가 있어야합니다. 왜냐하면 새 하위 수준 튜플로 이동하는 노드 레이블을 변경하거나 하위 인덱스 항목을 변경할 수있는 기회가 없기 때문입니다. 노드가 분할 된 후선택함수는 교체 내부 튜플로 다시 호출됩니다. 그 전화는 반환 할 수 있습니다Spgaddnode결과, 적절한 노드가 생성되지 않은 경우spgsplittuple행동. 결국선택반환해야합니다SPGMATCHNODE삽입이 다음 단계로 내려 가도록합니다.

picksplit

잎 튜플 세트에 새 내부 튜플을 만드는 방법 결정.

theSQL함수 선언은 다음과 같아야합니다.

함수 만들기 my_picksplit (내부, 내부) 반환 void ...

첫 번째 인수는 A에 대한 포인터입니다.SPGPICKSPLITINc 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.SPGPICKSPLITOUTC 구조물, 결과 데이터가 결과 데이터로 채워야합니다.

typedef struct spgpicksplitin

    int ntuples;        / * 잎 튜플 수 */
    데이텀 *데이텀;         / * 그들의 데이텀 (길이의 배열 ntuples) */
    int 레벨;          / * 현재 레벨 (0에서 계산) */
 spgpicksplitin;

typedef struct spgpicksplitout

    BOOL HASPREFIX;      /* 새로운 내부 튜플이 접두사가 있어야합니까? */
    Datum Prefixdatum;    / * 그렇다면 그 가치 */

    int nnodes;         / * 새 내부 튜플에 대한 노드 수 */
    Datum *Nodelabels;     / * 레이블 (또는 레이블 없음) */

    int *maptuplestonodes;   / * 각 잎에 대한 노드 인덱스 */
    데이텀 *리프트 수스 룸;    / * 각각의 새로운 잎 튜플에 보관할 데이 텀 */
 spgpicksplitout;

ntuples제공된 잎 토토 꽁 머니의 수입니다.Datums|SPGCONFIGOUT.LeafType타입.레벨모든 잎 튜플이 공유하는 현재 레벨이며, 이는 새로운 내부 튜플의 레벨이 될 것입니다.

SEThasprefix새 내부 튜플에 접두사가 있어야하는지 여부를 나타내려면PrefixDatum접두사 값으로. 세트nnodes새로운 내부 튜플이 포함 할 노드 수를 나타내고 설정Nodelabels라벨 값 배열 또는 노드 레이블이 필요하지 않은 경우 NULL로. 세트Maptuplestonodes각 리프 튜플을 할당 해야하는 노드의 인덱스 (0에서)를 제공하는 배열로. 세트Leaftupledatums새로운 잎 튜플에 저장 될 값의 배열로 (이들은 입력과 동일합니다Datums운영자 클래스가 한 레벨에서 다음 레벨에서 다음 레벨로 데이트를 수정하지 않으면).picksplit함수는 palloc'ing the에 책임이 있습니다.Nodelabels, MaptuplestonodesandLeaftupledatums배열.

둘 이상의 잎 토토 꽁 머니이 제공되면picksplit함수는 둘 이상의 노드로 분류됩니다. 그렇지 않으면 잎 튜플을 여러 페이지에 걸쳐 분할 할 수 없습니다. 이는이 작업의 궁극적 인 목적입니다. 따라서이면picksplit함수는 모든 리프 튜플을 동일한 노드에 배치하게됩니다. 코어 SP-Gist 코드는 해당 결정을 무시하고 잎 튜플이 무작위로 동일한 여러 개의 표지 된 노드에 지정되는 내부 튜플을 생성합니다. 그러한 튜플은 표시되어 있습니다Allthesame이것이 일어났다는 것을 의미합니다. 그만큼선택andInner_consistent기능은 그러한 내부 튜플에 적합한주의를 기울여야합니다. 보다섹션 65.4.3자세한 내용은

picksplit단일 잎 튜플에만 적용 할 수 있습니다.config함수 세트LongValuesoktrue로, PAT보다 큰 입력 값이 제공되었습니다. 이 경우 작업의 점은 접두사를 벗기고 새롭고 짧은 잎 기준 값을 생성하는 것입니다. 페이지에 맞을 정도로 짧은 잎 기준이 생성 될 때까지 호출이 반복됩니다. 보다섹션 65.4.1자세한 내용은

Inner_consistent

트리 검색 중에 따라야 할 노드 세트 (브랜치) 세트를 반환합니다.

theSQL함수 선언은 다음과 같아야합니다.

함수 만들기 my_inner_consistent (내부, 내부) 반환 void ...

첫 번째 인수는 A에 대한 포인터입니다.SpginnerConsistentinC struct, 함수에 대한 입력 데이터를 포함합니다. 두 번째 인수는 A에 대한 포인터입니다.SpginnerConsistentOutC 구조물, 결과 데이터가 채우아야합니다.

typedef struct spginnerconsistentin

    스캔 키 스캔 키;       / * 운영자 배열 및 비교 값 */
    int nkeys;          / * 배열 길이 */

    Datum ReconstructedValue;     / * 부모에게 재구성 된 값 */
    void *traversalvalue; / * opclass 별 트래버스 값 */
    MemoryContext TraversAlmemoryContext;   / * 여기에 새로운 트래버스 값을 넣어 */
    int 레벨;          / * 현재 레벨 (0에서 계산) */
    bool returndata;     /* 원본 데이터를 반환해야합니까? */

    / * 현재 내부 튜플의 데이터 */
    BOOL ALLTHESAME;     /* 튜플은 모든 것이 표시되어 있습니까? */
    BOOL HASPREFIX;      /* 튜플에는 접두사가 있습니까? */
    Datum Prefixdatum;    / * 그렇다면 접두사 값 */
    int nnodes;         / * 내부 튜플의 노드 수 */
    Datum *Nodelabels;     / * 노드 레이블 값 (null이 없음) */
 SpginnerConsistentin;

typedef struct spginnerconsistentout

    int nnodes;         / * 방문 할 어린이 노드 수 */
    int *nodenumbers;    / * 노드 어레이의 인덱스 */
    int *levelAdds;      / * 각 */에 대한 이거 화수율
    Datum *재구성 Values;    / * 관련 재구성 값 */
    void ** TraversalValues;        / * opclass 별 트래버스 값 */
 spginnerConsistEntOut;

배열Scankeys, 길이nkeys, 인덱스 검색 조건을 설명합니다. 이러한 조건은 결합되며 - 모든 것을 만족시키는 인덱스 항목 만 흥미 롭습니다. (nkeys= 0은 모든 인덱스 항목이 쿼리를 만족 시킨다는 것을 의미합니다.) 일반적으로 일관된 함수는에만 관심이 있습니다.sk_strategysk_argument각 배열 항목의 필드는 각각 색인 가능한 연산자와 비교 값을 제공합니다. 특히 확인할 필요가 없습니다sk_flagsSP-Gist 핵심 코드가 그러한 조건을 필터링하기 때문에 비교 값이 null인지 확인하려면재구성 value부모 튜플에 대해 재구성 된 값입니다. 그것은(Datum) 0루트 레벨에서 또는Inner_consistent함수는 부모 수준에서 값을 제공하지 않았습니다.재구성 value항상SPGCONFIGOUT.LeafType타입.TraversalValue이전 호출에서 전달 된 트래버스 데이터에 대한 포인터입니다.Inner_consistent부모 색인 튜플에서 또는 루트 레벨의 널.TraversalMemoryContext출력 트래버스 값을 저장하는 메모리 컨텍스트 (아래 참조).레벨는 루트 레벨에서 0에서 시작하는 현재 튜플 레벨입니다.returnDataistrue이 쿼리에 재구성 된 데이터가 필요한 경우; 이것은만큼 그렇게 될 것입니다config기능 주장CanreturnData. Allthesame현재 내부 튜플이 표시되면 참입니다All-The-Same; 이 경우 모든 노드는 동일한 레이블 (있는 경우)을 가지므로 쿼리와 일치하거나 전혀 일치합니다 (참조섹션 65.4.3).hasprefix전류 내부 튜플에 접두사가 포함 된 경우 참입니다. 그렇다면,PrefixDatum그 가치입니다.nnodes내부 튜플에 포함 된 자식 노드의 수는Nodelabels노드에 레이블이없는 경우 레이블 값의 배열이거나 NULL입니다.

nnodes검색에서 방문 해야하는 자식 노드 수로 설정해야합니다.Nodenumbers인덱스 배열로 설정해야합니다. 운영자 클래스가 레벨을 추적하는 경우levelAdds방문 할 각 노드로 내려갈 때 필요한 레벨 증분 배열로. (종종 이러한 증분은 모든 노드에서 동일하지만 반드시 그렇지는 않기 때문에 배열이 사용됩니다.) 값 재구성이 필요한 경우재구성값의 배열로SPGCONFIGOUT.LeafType방문 할 각 어린이 노드에 대해 재구성 된 유형; 그렇지 않으면 떠나재구성null로. 추가 대역 밖 정보를 전달하는 것이 바람직한 경우 (트래버스 값) 트리 검색의 낮은 레벨에서 설정TraversalValues적절한 트래버스 값의 배열로, 각 자식 노드에 대해 하나는 방문 할; 그렇지 않으면 떠나TraversalValuesnull로.Inner_consistent함수는 Palloc'ing the에 책임이 있습니다.Nodenumbers, levelAdds, 재구성TraversalValues현재 메모리 컨텍스트의 배열. 그러나, 출력 트래버스 값은TraversalValues배열을 할당해야합니다TraversalMemoryContext. 각 트래버스 값은 단일 palloc'd 청크 여야합니다.

Leaf_consistent

리프 튜플이 쿼리를 만족시키는 경우 true를 반환합니다.

theSQL함수 선언은 다음과 같아야합니다 :

함수 만들기 my_leaf_consistent (내부, 내부) 반환 bool ...

첫 번째 인수는 a에 대한 포인터입니다.spleafconsistentinc 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.spleafconsistentoutC 구조물, 함수가 결과 데이터로 채워야합니다.

typedef struct spleafconsistentin

    스캔 키 스캔 키;       / * 운영자 배열 및 비교 값 */
    int nkeys;          / * 배열 길이 */

    Datum ReconstructedValue;     / * 부모에게 재구성 된 값 */
    void *traversalvalue; / * opclass 별 트래버스 값 */
    int 레벨;          / * 현재 레벨 (0에서 계산) */
    bool returndata;     /* 원본 데이터를 반환해야합니까? */

    데이텀 리프 듀다;      / * 잎 튜플의 데이텀 */
 spgleafconsistentin;

typedef struct spgleafconsistentout

    데이텀 리프 값;      / * 재구성 된 원본 데이터 */
    부울 재건;        / * 운영자를 다시 확인 해야하는 경우 true 설정 */
 spleafconsistentout;

배열Scankeys, 길이nkeys, 인덱스 검색 조건을 설명합니다. 이러한 조건은 결합되며 - 모두를 만족시키는 인덱스 항목 만 쿼리를 만족시킵니다. (nkeys= 0은 모든 인덱스 항목이 쿼리를 만족 시킨다는 것을 의미합니다.) 일반적으로 일관된 함수는에만 관심이 있습니다.sk_strategysk_argument각 배열 항목의 필드는 각각 색인 가능한 연산자와 비교 값을 제공합니다. 특히 확인할 필요가 없습니다sk_flagsSP-Gist 핵심 코드가 그러한 조건을 필터링하기 때문에 비교 값이 null인지 확인하려면재구성 value부모 튜플에 대해 재구성 된 값입니다. 그것은(Datum) 0루트 레벨에서 또는Inner_consistent함수는 부모 수준에서 값을 제공하지 않았습니다.Reconstructionvalue항상SPGCONFIGOUT.LeafType타입.TraversalValue이전 호출에서 전달 된 트래버스 데이터에 대한 포인터입니다.Inner_consistent부모 색인 튜플에서 또는 루트 레벨의 널.레벨는 루트 레벨에서 0에서 시작하는 현재 잎 튜플 레벨입니다.returnDataistrue이 쿼리에 재구성 된 데이터가 필요한 경우; 이것은만큼 그렇게 될 것입니다config기능 주장CanreturnData. Leafdatum의 핵심 값입니다.SPGCONFIGOUT.LeafType현재 잎 튜플에 저장되었습니다.

함수가 반환해야합니다true리프 토토 꽁 머니이 쿼리와 일치하는 경우거짓그렇지 않은 경우. 에서TrueCASE, ifreturnDataistruetheLeafValue값으로 설정해야합니다SPGCONFIGIN.atttype이 잎 토토 꽁 머니에 대해 원래 색인으로 제공되는 유형. 또한,Recheck로 설정 될 수 있습니다True일치가 불확실하고 연산자를 실제 힙 튜플에 다시 적용하여 일치를 확인해야합니다..

선택적 사용자 정의 메소드는 다음과 같습니다.

Datum Compress (Datum in)

데이터 항목을 인덱스 페이지의 리프 토토 꽁 머니에서 물리적 저장에 적합한 형식으로 변환합니다. 그것은 받아들입니다SPGCONFIGIN.atttype값 및 반품SPGCONFIGOUT.LeafType값. 출력 값은 토스트되어서는 안됩니다.

모든 SP-Gist 지원 방법은 일반적으로 단기간 메모리 컨텍스트에서 호출됩니다. 즉,CurrentMemoryContext각 토토 꽁 머니을 처리 한 후 재설정됩니다. 그러므로 당신이 palloc의 모든 것을 pfree에 대해 걱정하는 것은 그리 중요하지 않습니다. (그만큼config메소드는 예외입니다. 메모리 누출을 피하려고 노력해야합니다. 그러나 보통config메소드는 전달 된 매개 변수 구조물에 상수를 할당하는 것 외에는 아무것도 할 필요가 없습니다.)

인덱스 된 열이 Collatable Data Type 인 경우 표준을 사용하여 모든 지원 방법으로 인덱스 콜레이션이 전달됩니다.pg_get_collation ()메커니즘.