토토 커뮤니티되지 않는 버전 :7.3 / 7.2
이 문서는 토토 커뮤니티되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 토토 커뮤니티 버전 중 하나입니다.

17.6. 운영자와 토토 커뮤니티을 만들었습니다 루틴

이제 액세스 방법과 연산자 클래스가 있습니다. 우리 여전히 일련의 운영자가 필요합니다. 정의 절차 운영자는에서 논의되었습니다.스포츠 토토 베트맨 : 문서 : 7.2 : SQL 확장 : 연산자.complex_abs_ops운영자 클래스 B- 트리에서 우리가 필요로하는 운영자는 다음과 같습니다.

  • 절대 값이 적은 것보다 (전략 1)
  • 절대 값은 평등하지 않은 것 (전략 2)
  • 절대 값 동일 (전략 3)
  • 절대 값은 평등 한 것보다 더 큰 값 (전략 4)
  • 절대 값보다 큰 절대 값 (전략 5)

이러한 함수를 구현하는 코드가 저장되어 있다고 가정합니다. 파일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 (복잡한, 복잡한) 부울을 반환합니다
    처럼 'pgroot/SRC/Tutorial/Complex '
    언어 C;

여기서 일어나고있는 중요한 일들이 있습니다 :

  • 먼저, 더 적은 연산자, 덜 평등하고 평등하며 평등 한 것보다 크고 더 큰복잡한존재 중입니다 한정된. 우리는 하나의 운영자만이 다음과 같이 가질 수 있습니다. 유형 복용복잡한둘 다 피연산자. 이 경우 다른 연산자가 없습니다 = for복잡한, 그러나 우리가 구축중인 경우 a 우리가 원하는 실용적인 데이터 유형 = 평범한 복소수에 대한 평등 작동. 이 경우 우리는 그랬습니다 다른 연산자 이름을 사용해야합니다complex_abs_eq.

  • 두 번째, 비록PostgreSQL운영자에 대처할 수 있습니다 입력이 다른 한 동일한 이름을 갖습니다. 데이터 유형, C는 하나의 글로벌 루틴에만 대처할 수 있습니다. 주어진 이름, 기간. 따라서 C 함수의 이름을 지정해서는 안됩니다 단순한 것과 같은abs_eq. 일반적으로 데이터 유형 이름을 C 함수 이름, 함수와 충돌하지 않도록 기타 데이터 유형.

  • 셋째, 우리는를 만들 수있었습니다PostgreSQL함수 이름abs_eq, 의존PostgreSQL입력으로 구별합니다 다른 모든 데이터 유형PostgreSQL같은 이름의 함수. 에게 예제를 간단하게 유지하면 기능이 동일하게 만듭니다. C 레벨 및의 이름postgresql레벨.

  • 마지막으로,이 연산자 기능은 부울 반환합니다 값. 실제로 모든 운영자는 인덱스 액세스로 정의되었습니다 메소드 전략은 유형을 반환해야합니다부울, 최상위 레벨에 나타나야하므로 A여기서색인. 반면에 토토 커뮤니티 함수가 반환됩니다 특정 액세스 방법이 기대하는 것은 무엇이든 사례, 서명 된 정수.)

파일의 최종 루틴은입니다."토토 커뮤니티 루틴"우리가 논의 할 때 언급amsupport열의 열PG_AM테이블. 나중에 이것을 사용할 것입니다. 을 위한 이제 무시하십시오.

이제 연산자를 정의 할 준비가되었습니다.

생성 연산자 = (
     leftarg = complex, rightarg = complex,
     절차 = complex_abs_eq,
     제한 = eqsel, join = eqjoinsel
         );

여기서 중요한 것은 절차 이름입니다 ( 위에서 정의 된 C 기능) 및 제한 및 조인 선택성 함수. 선택성 만 사용해야합니다 예제에 사용 된 함수 (Complex.Source). 다른 것이 있습니다 이러한 기능은 덜, 평등하고, 더 큰 경우에 대한 기능. 이들은 공급해야합니다. 그렇지 않으면 최적화가 만들 수 없습니다. 인덱스의 효과적인 사용.

다음 단계는 이러한 연산자에 대한 항목을에 추가하는 것입니다.pg_amop관계. 이를 위해 방금 정의한 연산자의 OID가 필요합니다. 우리는 볼 것이다 유형의 두 피연산자를 사용하는 모든 연산자의 이름을 높이십시오복잡한, 그리고 우리를 선택하십시오 :

O.Oid로 Opoid, O.Oprname을 선택하십시오
    온도 테이블에 complex_ops_tmp
    pg_operator o, pg_type t에서
    여기서 o.oprleft = t.oid 및 o.oprright = t.oid
      및 t.typname = 'complex';

 Opoid | oprname
--------+-------
 277963 | +
 277970 | <
 277971 | <=
 277972 | =
 277973 |  =
 277974 | 
(6 줄)

(다시, 일부 OID 번호 중 일부는 거의 확실합니다. 우리가 관심있는 운영자는 OIDS 277970 ~ 277974. 당신이 얻는 가치는 아마도 다르고 아래 값으로 대체해야합니다. 우리는 선택한 진술로 이것을 할 것입니다.

이제 항목을 삽입 할 준비가되었습니다pg_amop새로운 운영자 클래스. 이것들 항목은 올바른 B- 트리 전략 번호를 연관시켜야합니다 우리가 필요한 각 운영자. 삽입하는 명령 덜 운영자는 다음과 같습니다.

pg_amop에 삽입
    opcl.oid, 1, false, c.opoid를 선택하십시오
        pg_opclass opcl, complex_ops_tmp c
        어디
            opcamid = (pg_am에서 Oid를 선택하여 Amname = 'btree') 및
            opcname = 'complex_abs_ops'및
            c.oprname = '<';

이제 다른 연산자가를 대체하는 다른 연산자를 위해이 작업을 수행합니다.1위의 두 번째 줄에서<마지막 줄에서. 순서에 주목하십시오 :""보다 작습니다.IS 1,""또는 평등 "is 2,"Equal"is 3,"더 큰 OR 동일한"IS 4,""보다 큰 "is 5

필드amopreqcheck는 그렇지 않습니다 여기에서 논의; B- 트리의 경우 항상 거짓이어야합니다 연산자.

마지막 단계는 등록입니다."토토 커뮤니티 루틴"이전에 우리의 설명 에 대한 토론PG_AM. OID 이 토토 커뮤니티 루틴은에 저장됩니다.PG_AMPROC테이블, 연산자 클래스에 의해 키 OID 및 토토 커뮤니티 루틴 번호.

먼저, 우리는에 함수를 등록해야합니다.PostgreSQL(우리가 C 코드를 넣었음을 기억하십시오 이 루틴은 파일 맨 아래에서 우리는 운영자 루틴을 구현했습니다) :

함수 만들기 complex_abs_cmp (복잡하고 복잡한)
    정수를 반환합니다
    처럼 'pgroot/SRC/Tutorial/Complex '
    언어 C;

PG_PROC에서 OID, Proname을 선택하십시오
    여기서 proname = 'complex_abs_cmp';

  oid |     프로 이름
--------+------------------
 277997 | complex_abs_cmp
(1 행)

(다시, OID 번호가 다를 것입니다.)

우리는 다음과 같이 새 행을 추가 할 수 있습니다 :

pg_amproc에 삽입
    opcl.oid, 1, p.oid를 선택하십시오
        pg_opclass opcl에서, pg_proc p
        어디
            opcamid = (pg_am에서 Oid를 선택하여 Amname = 'btree') 및
            opcname = 'complex_abs_ops'및
            p.proname = 'complex_abs_cmp';

그리고 우리는 끝났습니다! (Whew.) 이제 만들 수 있어야합니다 B-Tree Indexes on 사용복잡한