이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

63.3. 확장성

인터페이스는 추상화 수준이 높기 때문에 액세스 방법 구현자가 액세스되는 데이터 유형의 의미만 구현하면 됩니다.레이어 자체가 동시성, 로깅 및 트리 구조 검색을 관리합니다.

을 얻기 위해 필요한 모든 것액세스 방법 작동은 트리의 키 동작과 키, 색인된 항목 및 색인 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 방법을 구현하는 것입니다. 한마디로,확장성과 일반성, 코드 재사용 및 깔끔한 인터페이스를 결합합니다.

연산자 클래스에는 세 가지 메소드가 있습니다다음을 제공해야 합니다.

int 비교(데이텀 a, 데이텀 b)

두 개의 키(색인된 항목 아님!)를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환합니다. 이는 첫 번째 키가 두 번째 키보다 작거나 같거나 큰지 여부를 나타냅니다. Null 키는 이 함수에 전달되지 않습니다.

데이텀 *extractValue(데이텀 itemValue, int32 *nkeys, bool **nullFlags)

인덱싱할 항목이 주어지면 palloc'd 키 배열을 반환합니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있으면 다음 배열도 palloc에 추가합니다.*nkeys 부울필드, 해당 주소를에 저장*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL(초기값) 모든 키가 null이 아닌 경우. 반환 값은 다음과 같습니다.NULL항목에 키가 포함되어 있지 않은 경우.

데이텀 *extractQuery(데이텀 쿼리, int32 *nkeys, StrategyNumber n, bool **pmatch, 포인터 **extra_data, bool **nullFlags, int32 *searchMode)

쿼리할 값이 주어지면 palloc'd 키 배열을 반환합니다. 즉,질의왼쪽이 인덱싱된 열인 인덱싱 가능한 연산자의 오른쪽 값입니다.n은 연산자 클래스 내 연산자의 전략 번호입니다(참조섹션 36.14.2). 종종,추출쿼리상담이 필요합니다n데이터 유형 결정질의및 키 값을 추출하는 데 사용해야 하는 방법입니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있으면 다음 배열도 palloc에 추가합니다.*nkeys 부울필드, 주소를 다음 위치에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL11566_11639NULL만약에질의키가 포함되어 있지 않습니다.

검색모드다음을 허용하는 출력 인수입니다.추출쿼리검색 수행 방법에 대한 세부정보를 지정합니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_DEFAULT(호출 전에 초기화되는 값), 반환된 키 중 적어도 하나와 일치하는 항목만 후보 일치로 간주됩니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_INCLUDE_EMPTY, 그러면 일치하는 키가 하나 이상 포함된 항목 외에도 키가 전혀 포함되지 않은 항목도 후보 일치로 간주됩니다. (이 모드는 예를 들어 is-subset-of 연산자를 구현하는 데 유용합니다.) If*검색모드다음으로 설정됨GIN_SEARCH_MODE_ALL, 반환된 키와 일치하는지 여부에 관계없이 인덱스의 null이 아닌 모든 항목은 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야 하기 때문에 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우 이 모드가 필요한 연산자는 아마도 GIN 연산자 클래스에 적합한 후보가 아닐 것입니다.) 이 모드를 설정하는 데 사용할 기호는 다음에 정의되어 있습니다.액세스/gin.h.

pmatch은 부분 일치가 지원될 때 사용되는 출력 인수입니다. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 합니다.*nkeys부울을 계산하고 주소를 다음 위치에 저장합니다.*pmatch. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소를 TRUE로 설정하고, 그렇지 않은 경우 FALSE로 설정해야 합니다. 만일*pmatch다음으로 설정됨NULL그러면 GIN은 부분 일치가 필요하지 않다고 가정합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에, 부분 일치를 지원하지 않는 연산자 클래스에서는 이 인수를 무시할 수 있습니다.

extra_data다음을 허용하는 출력 인수입니다.추출쿼리추가 데이터를 다음에 전달하기 위해일관됨그리고비교부분메소드. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 합니다.*nkeys포인터를 저장하고 주소를 다음에 저장하세요.*extra_data, 그런 다음 원하는 것을 개별 포인터에 저장합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에 추가 데이터가 필요하지 않은 연산자 클래스에서는 이 인수를 무시할 수 있습니다. 만일*extra_data가 설정되면 전체 배열이일관됨메소드 및 해당 요소비교부분방법.

연산자 클래스는 색인된 항목이 쿼리와 일치하는지 확인하는 함수도 제공해야 합니다. 부울의 두 가지 맛이 있습니다.일관됨함수 및 삼항트리일관성함수.트리일관성두 가지 기능을 모두 다루므로 다음을 제공합니다.트리일관성그 자체만으로도 충분합니다. 그러나 부울 변형이 계산 비용이 훨씬 저렴하다면 두 가지를 모두 제공하는 것이 유리할 수 있습니다. 부울 변형만 제공되는 경우 모든 키를 가져오기 전에 색인 항목을 반박하는 데 의존하는 일부 최적화가 비활성화됩니다.

bool 일관된(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])

색인된 항목이 쿼리 연산자의 전략 번호를 만족하는 경우 TRUE를 반환합니다.n(또는 재확인 표시가 반환되면 이를 만족할 수도 있음). 이 함수는 인덱싱된 항목의 값에 직접 액세스할 수 없습니다.항목을 명시적으로 저장하지 않습니다. 오히려 쿼리에서 추출된 키 값이 특정 인덱싱된 항목에 나타나는지에 대한 정보가 이용 가능합니다.확인배열에 길이가 있음n키, 이는 이전에에서 반환된 키 수와 동일합니다.추출쿼리이것을 위해질의데이텀. 의 각 요소확인인덱싱된 항목에 해당 쿼리 키가 포함된 경우 배열은 TRUE입니다. 즉, (check[i] == TRUE)의 i번째 키인 경우추출쿼리결과 배열이 색인된 항목에 있습니다. 원본질의다음의 경우 데이터가 전달됩니다.일관됨메소드는 이를 참조해야 하며, 그도 마찬가지입니다쿼리키[]그리고nullFlags[]이전에 반환한 배열추출쿼리. extra_data은에서 반환된 추가 데이터 배열입니다.추출쿼리또는NULL없으면.

언제추출쿼리null 키를 반환합니다.쿼리키[], 해당확인[]인덱싱된 항목에 null 키가 포함되어 있으면 요소는 TRUE입니다. 즉, 의미론은확인[]같습니다다음과 다르지 않습니다.일관됨함수는 해당하는 것을 검사할 수 있습니다nullFlags[]일반 값 일치와 null 일치 간의 차이를 알려야 하는 경우 요소입니다.

성공하면,*다시 확인힙 튜플을 쿼리 연산자에 대해 다시 확인해야 하는 경우 TRUE로 설정해야 하며 인덱스 테스트가 정확하면 FALSE로 설정해야 합니다. 즉, FALSE 반환 값은 힙 튜플이 쿼리와 일치하지 않음을 보장합니다. 다음의 TRUE 반환 값:*다시 확인FALSE로 설정하면 힙 튜플이 쿼리와 일치함을 보장합니다. 그리고 TRUE 반환 값은*다시 확인TRUE로 설정하면 힙 튜플이 쿼리와 일치할 수 있으므로 원래 인덱싱된 항목에 대해 쿼리 연산자를 직접 평가하여 가져오고 다시 확인해야 함을 의미합니다.

GinTernaryValue triContant(GinTernaryValue check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], Datum queryKeys[], bool nullFlags[])

트리일관성다음과 유사함일관됨, 그러나의 부울 대신확인벡터, 각 키에 대해 세 가지 가능한 값이 있습니다:GIN_TRUE, GIN_FALSE그리고GIN_MAYBE. GIN_FALSEGIN_TRUE일반 부울 값과 동일한 의미를 갖는 반면GIN_MAYBE은 해당 키의 존재를 알 수 없음을 의미합니다. 언제GIN_MAYBE값이 존재합니다. 함수는 반환만 해야 합니다.GIN_TRUE인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부와 항목이 확실히 일치하는 경우. 마찬가지로 함수는 다음을 반환해야 합니다.GIN_FALSE항목이 확실히 일치하지 않는 경우에만 다음 항목이 포함되어 있는지 여부GIN_MAYBE키. 결과가 다음에 따라 달라지는 경우GIN_MAYBE항목, 즉 알려진 쿼리 키를 기반으로 일치를 확인하거나 반박할 수 없으며 함수는 반환해야 합니다.GIN_MAYBE.

없을 때GIN_MAYBE확인벡터, aGIN_MAYBE반환 값은 다음을 설정하는 것과 동일합니다.재확인부울 플래그일관됨함수.

선택적으로 다음에 대한 연산자 클래스다음 메소드를 제공할 수 있습니다:

int ComparePartial(데이텀 부분 키, 데이텀 키, 전략 번호 n, 포인터 extra_data)

부분 일치 쿼리 키를 토토 사이트 순위 키와 비교하십시오. 결과를 나타내는 부호가 있는 정수를 반환합니다. 0보다 작으면 토토 사이트 순위 키가 쿼리와 일치하지 않지만 토토 사이트 순위 스캔은 계속되어야 함을 의미합니다. 0은 토토 사이트 순위 키가 쿼리와 일치함을 의미합니다. 0보다 크면 더 이상 일치하는 항목이 없기 때문에 토토 사이트 순위 스캔이 중지되어야 함을 나타냅니다. 전략 번호n20479_20624extra_data는 다음에 의해 만들어진 추가 데이터 배열의 해당 요소입니다.추출쿼리, 또는NULL없으면. Null 키는 이 함수에 전달되지 않습니다.

지원하기 위해"부분 일치"쿼리, 연산자 클래스는 다음을 제공해야 합니다.비교부분방법 및 해당추출쿼리메소드는 다음을 설정해야 합니다pmatch부분 일치 쿼리가 발견될 때의 매개변수입니다. 참조섹션 63.4.2자세한 내용은.

다양한 실제 데이터 유형데이텀위에 언급된 값은 연산자 클래스에 따라 다릅니다. 전달된 항목 값추출값항상 연산자 클래스의 입력 유형이고 모든 키 값은 클래스의 입력 유형이어야 합니다.저장유형. 의 유형질의인수 전달됨추출쿼리, 일관됨그리고트리일관성는 전략 번호로 식별되는 클래스 멤버 연산자의 오른쪽 입력 유형입니다. 올바른 유형의 키 값을 추출할 수 있는 한 색인화된 유형과 동일할 필요는 없습니다. 그러나 이 세 가지 지원 함수의 SQL 선언에서는 opclass의 인덱스 데이터 유형을 사용하는 것이 좋습니다.질의인수, 비록 실제 유형이 연산자에 따라 다를 수도 있습니다.