이제 우리는 아이디어를 보았으므로 여기에 약속된 예가 있습니다 새로운 연산자 클래스를 만드는 것입니다. 먼저, 세트가 필요합니다. 연산자. 연산자를 정의하는 절차는 다음에서 논의되었습니다.Postgre무지개 토토 : 문서 : 7.3 : 무지개 토토 확장 : 연산자. 에 대한complex_abs_opsB-트리의 연산자 클래스, 우리에게 필요한 연산자는 다음과 같습니다:
이 기능을 구현하는 코드가 다음 위치에 저장되어 있다고 가정합니다. 파일PGROOT/src/tutorial/complex.c, 우리는 다음과 같이 컴파일했습니다.PGROOT/src/tutorial/complex.so. 부품 C 코드는 다음과 같습니다.
#define Mag(c) ((c)-x*(c)-x + (c)-y*(c)-y)
부울
complex_abs_eq(복소수 *a, 복소수 *b)
이중 amag = Mag(a), bmag = Mag(b);
return (amag==bmag);
(여기에는 같음 연산자만 표시됩니다. 텍스트. 다른 4개의 연산자는 매우 유사합니다. 참조복잡한.c또는복합체.소스자세한 내용은.)
우리는 함수를 다음에게 알려줍니다.포스트그레SQL이렇게:
CREATE FUNCTION complex_abs_eq(complex, complex) RETURNS 부울
그대로 'PGROOT/src/tutorial/complex'
언어 C;
여기서 몇 가지 중요한 일이 일어나고 있습니다:
먼저, 보다 작음에 대한 연산자에 유의하세요.
작거나 같음, 같음, 크거나 같음 및
보다 큼복잡한중입니다
정의되었습니다. =와 같은 연산자는 하나만 가질 수 있습니다.
복용 유형복잡한둘 모두에 대해
피연산자. 이 경우 다른 연산자는 없습니다 = for복잡한, 하지만 우리가
우리가 원하는 실용적인 데이터 유형 = 평범한 데이터 유형
복소수에 대한 동등 연산. 그렇다면 우리는
다른 연산자 이름을 사용해야 합니다.complex_abs_eq.
두 번째이지만포스트그레SQL운영자에 대처할 수 있습니다 입력이 다른 한 이름은 동일합니다. 데이터 유형, C는 다음을 갖는 하나의 전역 루틴에만 대처할 수 있습니다. 이름, 기간. 따라서 C 함수의 이름을 지정해서는 안 됩니다. 다음과 같은 간단한 것abs_eq. 일반적으로 데이터 유형 이름을 함수와 충돌하지 않도록 C 함수 이름 다른 데이터 유형.
셋째, 우리는 다음을 만들 수 있었습니다.포스트그레SQL함수 이름abs_eq, 의지함포스트그레SQL입력으로 구별하기 위해 다른 데이터 유형포스트그레SQL같은 이름의 함수입니다. 받는 사람 예제를 단순하게 유지하고 함수를 동일하게 만듭니다. C 레벨의 이름 및포스트그레SQL레벨.
마지막으로, 이 연산자 함수는 부울값을 반환한다는 점에 유의하십시오. 가치. 실제로는 인덱스 액세스로 정의된 모든 연산자 메소드 전략은 유형을 반환해야 합니다.부울, 최상위 수준에 나타나야 하므로 의어디에서절과 함께 사용됩니다. 색인. (반면에 토토 사이트 함수는 무엇이든 반환합니다. 특정 액세스 방법이 예상하는 경우 - 부호 있는 정수인 B-트리에 대한 비교 함수입니다.)
이제 연산자를 정의할 준비가 되었습니다:
연산자 생성 = (
leftarg = 복잡함, rightarg = 복잡함,
절차 = complex_abs_eq,
제한 = eqsel, 조인 = eqjoinsel
);
여기서 중요한 것은 절차 이름입니다( 위에 정의된 C 함수)와 제한 및 조인 선택성 기능. 선택성을 이용하면 됩니다 예제에 사용된 함수(참조복합체.소스). 다양하니 참고하세요 보다 작음, 같음, 보다 큼의 경우에 대한 함수입니다. 이는 반드시 제공되어야 하며 그렇지 않으면 최적화 프로그램이 다음을 수행할 수 없습니다. 인덱스를 효과적으로 사용합니다.
다음 단계는 비교 등록입니다."토토 사이트 루틴"B-트리에 필요합니다. 이를 구현하는 C 코드는 다음을 포함하는 동일한 파일에 있습니다. 운영자 절차:
CREATE FUNCTION complex_abs_cmp(복합,복잡)
정수를 반환합니다.
그대로 'PGROOT/src/tutorial/complex'
언어 C;