이제 우리는 아이디어를 보았으니 여기에 약속 된 예가 있습니다. 새로운 운영자 클래스 생성 먼저, 우리는 세트가 필요합니다 운영자. 운영자를 정의하는 절차는에서 논의되었습니다.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 (complex *a, complex *b) Double Amag = mag (a), bmag = mag (b); return (amag == bmag);
(우리는 이것에서 평등 연산자 만 보여줄 것입니다. 텍스트. 다른 4 명의 운영자는 매우 유사합니다. 참조complex.c또는Complex.Source세부 사항은.)
우리는 기능을 알려줍니다.PostgreSQL처럼 :
함수 만들기 complex_abs_eq (복잡한, 복잡한) boolean을 반환합니다 처럼 'pgroot/SRC/Tutorial/Complex ' 언어 C;
여기서 일어나고있는 중요한 일들이 있습니다 :
먼저, 연산자보다 적은 수치에 유의하십시오.
덜 평등하고 평등하며 평등 한 것보다 크고
더 큰복잡한존재 중입니다
한정된. 우리는 하나의 운영자만이 다음과 같이 가질 수 있습니다.
유형 복용복잡한둘 다
피연산자. 이 경우 다른 연산자가 없습니다 = for복잡한, 그러나 우리가 구축중인 경우 a
우리가 원하는 실용적인 데이터 유형 = 평범한
복소수에 대한 평등 작동. 이 경우 우리는 그랬습니다
다른 연산자 이름을 사용해야합니다complex_abs_eq
.
두 번째이지만postgresql운영자에 대처할 수 있습니다 입력이 다른 한 동일한 이름을 갖습니다. 데이터 유형, C는 하나의 글로벌 루틴에만 대처할 수 있습니다. 주어진 이름, 기간. 따라서 C 함수의 이름을 지정해서는 안됩니다 단순한 것과 같은abs_eq. 일반적으로 데이터 유형 이름을 C 함수 이름, 함수와 충돌하지 않도록 기타 데이터 유형.
셋째, 우리는를 만들 수있었습니다PostgreSQL함수 이름abs_eq, 의존PostgreSQL입력으로 구별하려면 다른 모든 데이터 유형PostgreSQL같은 이름의 함수. 에게 예제를 간단하게 유지하면 기능이 동일하게 만듭니다. C 레벨 및의 이름PostgreSQL레벨.
마지막으로,이 연산자 기능은 부울 반환합니다 값. 실제로 모든 운영자는 인덱스 액세스로 정의되었습니다 메소드 전략은 유형을 반환해야합니다부울, 최상위 레벨에 나타나야하므로 A여기서색인. 반면에 토토 사이트 기능은 무엇이든 반환합니다 특정 액세스 방법은 B- 트리의 비교 함수, 서명 된 정수.)
이제 연산자를 정의 할 준비가되었습니다 :
생성 연산자 = ( leftarg = complex, rightarg = complex, 절차 = complex_abs_eq, 제한 = eqsel, join = eqjoinsel );
여기서 중요한 것은 절차 이름입니다 ( 위에서 정의 된 C 기능) 및 제한 및 조인 선택성 함수. 선택성 만 사용해야합니다 예제에 사용 된 함수 (Complex.Source). 다른 것이 있습니다 이러한 기능은 덜, 평등하고, 더 큰 경우에 대한 기능. 이들은 공급해야합니다. 그렇지 않으면 최적화가 만들 수 없습니다. 인덱스의 효과적인 사용.
다음 단계는 비교 등록입니다"토토 사이트 루틴"B- 트리에 의해 요구됩니다. 이것을 구현하는 C 코드는 운영자 절차 :
함수 만들기 complex_abs_cmp (복잡하고 복잡한) 정수를 반환합니다 처럼 'pgroot/src/튜토리얼/복합체 ' 언어 C;