이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 36.13. 사용자 정의 토토 캔버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

32.11. 사용자 정의 젠 토토

설명대로PostgreSQL : 문서 : 8.1 : PostgreSQL 토토 사이트 시스템, PostgreSQL할 수 있습니다 새로운 데이터 젠 토토을 지원하도록 확장되었습니다. 이 섹션에서는 방법을 설명합니다 아래 정의 된 데이터 젠 토토 인 새 기본 젠 토토을 정의합니다. 레벨SQL언어. 새로운 기본 젠 토토을 만들려면 기능을 구현해야합니다 저수준 언어로 젠 토토에서 작동합니다. 일반적으로 C

이 섹션의 예는에서 찾을 수 있습니다.complex.sqlandcomplex.cinSRC/Tutorial소스의 디렉토리 분포. 참조readme파일 예제 실행에 대한 지침을위한 해당 디렉토리.

사용자 정의 젠 토토에는 항상 입력이 있어야합니다 출력 기능.이 함수는 방법을 결정합니다 유형은 문자열에 나타납니다 (사용자가 입력하고 사용자) 및 유형이 메모리에서 구성되는 방법. 입력 함수 무효가 종결 된 문자열을 인수로 취합니다 유형의 내부 (메모리) 표현을 반환합니다. 그만큼 출력 함수는 유형의 내부 표현을 다음과 같이합니다. 인수와 널리 터진 문자열을 반환합니다. 우리가 단순히 저장하는 것보다 유형으로 더 많은 일을하고 싶습니다. 무엇이든 구현하기 위해 추가 기능을 제공해야합니다 유형에 대해 갖고 싶은 작업.

우리가 젠 토토을 정의하고 싶다고 가정복잡한이것은 복소수를 나타냅니다. a를 대표하는 자연스러운 방법 메모리의 복소수는 다음 C 구조입니다.

typedef struct complex 
    더블 X;
    이중 Y;
 복잡한;

우리는 이것을 통과하는 젠 토토으로 만들어야합니다. 너무 큰 싱글Datumvalue.

젠 토토의 외부 문자열 표현으로서 우리는 양식의 문자열(x, y).

입력 및 출력 함수는 일반적으로 쓰기가 어렵지 않습니다. 특히 출력 기능. 그러나 외부를 정의 할 때 젠 토토의 문자열 표현은 당신이해야한다는 것을 기억하십시오 결국에는 완전하고 강력한 파서를 작성하십시오 입력 함수로서의 표현. 예를 들어:

pg_function_info_v1 (complex_in);

자료
complex_in (pg_function_args)

    char *str = pg_getarg_cstring (0);
    더블 X,
                와이;
    복잡한 *결과;

    if (sscanf (str, "( %lf, %lf)", & x, & y)! = 2)
        Ereport (오류,
                (errcode (errcode_invalid_text_representation),
                 errmsg ( "복합체에 대한 잘못된 입력 구문 : \"%s \ "",
                        str));

    결과 = (복합 *) palloc (sizeof (complex));
    결과- x = x;
    결과- y = y;
    pg_return_pointer (결과);

출력 함수는 단순히 다음과 같습니다.

pg_function_info_v1 (complex_out);

자료
complex_out (pg_function_args)

    complex *complex = (복합체 *) pg_getarg_pointer (0);
    char *결과;

    결과 = (char *) palloc (100);
    snprintf (결과, 100, "(%g,%g)", complex- x, complex- y);
    pg_return_cstring (결과);

입력 및 출력 함수를 조심해야합니다. 서로의 역전. 그렇지 않다면, 당신은 심각하게 될 것입니다 데이터를 파일에 덤프해야 할 때 문제가 발생한 다음 다시 읽으십시오. 이것은 특히 일반적인 문제입니다. 부동 소수점 숫자가 관련되어 있습니다.

선택적으로, 사용자 정의 젠 토토은 이진 입력을 제공 할 수 있습니다 출력 루틴. 이진 I/O는 일반적으로 더 빠르지 만 휴대성이 떨어집니다 텍스트 I/O보다. 텍스트 I/O와 마찬가지로 정의하는 것은 귀하에게 달려 있습니다. 외부 바이너리 표현이 정확히 무엇인지. 대부분의 내장 데이터 젠 토토은 기계 독립적 이진을 제공하려고합니다 대표. 을 위한복잡한, 우리는 젠 토토 용 바이너리 I/O 변환기의 돼지백float8:

pg_function_info_v1 (complex_recv);

자료
complex_recv (pg_function_args)

    StringInfo buf = (stringInfo) pg_getarg_pointer (0);
    복잡한 *결과;

    결과 = (복합 *) palloc (sizeof (complex));
    결과- x = pq_getmsgfloat8 (buf);
    결과- y = pq_getmsgfloat8 (buf);
    pg_return_pointer (결과);

pg_function_info_v1 (complex_send);

자료
complex_send (pg_function_args)

    complex *complex = (복합체 *) pg_getarg_pointer (0);
    StringInfodata buf;

    pq_begintypsend (& buf);
    pq_sendfloat8 (& buf, complex- x);
    pq_sendfloat8 (& buf, complex- y);
    pg_return_bytea_p (pq_endtypsend (& buf));

정의하려면복잡한타이핑해야합니다 작성하기 전에 사용자 정의 I/O 함수를 만듭니다 젠 토토:

함수 complex_in (cstring) 생성
    복잡한 반환
    처럼 'filename'
    언어 C 불변의 엄격;

함수 만들기 complex_out (complex)
    cstring을 반환합니다
    처럼 'filename'
    언어 C 불변의 엄격;

함수 만들기 complex_recv (내부)
   복잡한 반환
   처럼 'filename'
   언어 C 불변의 엄격;

함수 만들기 complex_send (complex)
   Bytea를 반환합니다
   처럼 'filename'
   언어 c 불변의 엄격한;

입력 및 출력 기능의 선언이 있음을 알 수 있습니다. 정의되지 않은 젠 토토을 참조해야합니다. 이것은 허용되지만 무시할 수있는 경고 메시지를 그립니다. 입력 기능은 먼저 나타나야합니다.

마지막으로 데이터 젠 토토을 선언 할 수 있습니다 :

젠 토토 생성 단지 (
   내부 길이 = 16, 
   입력 = complex_in,
   출력 = complex_out,
   수신 = complex_recv,
   send = complex_send,
   정렬 = 이중
);

새 기본 젠 토토을 정의 할 때PostgreSQL자동으로 지원을 제공합니다 해당 젠 토토의 배열의 경우역사적 이유, 배열 젠 토토은 기본과 동일한 이름을 갖습니다. 밑줄 문자로 입력하십시오 (_) 선불.

데이터 유형이 존재하면 추가 기능을 선언 할 수 있습니다. 데이터 유형에 유용한 작업을 제공합니다. 운영자는 할 수 있습니다 함수 위에 정의되고 필요한 경우 운영자 클래스 데이터 유형의 인덱싱을 지원하도록 만들 수 있습니다. 이것들 추가 레이어는 다음 섹션에서 논의됩니다.

당신의 값이라면 데이터 젠 토토은 크기가 수백 바이트를 초과 할 수 있습니다 (내부에서 양식), 데이터 젠 토토을 만들어야토스트-abable (참조섹션 50.2). 이를 위해 내부 표준 레이아웃을 따라야합니다 가변 길이 데이터 : 처음 4 바이트는이어야합니다.int32의 바이트의 총 길이를 포함합니다 데이텀 (자체 포함). C는 데이터에서 작동하는 기능입니다 젠 토토은 구운 값을 풀려면 조심해야합니다. 사용하여PG_DETOAST_DATUM. (이 세부 사항은 관례 적으로 젠 토토 특정 정의로 숨겨져 있습니다getarg매크로) 그런 다음 실행할 때 그만큼젠 토토 만들기명령을 지정하십시오 내부 길이 as가변및 선택 적절한 스토리지 옵션.

자세한 내용은 설명을 참조하십시오.PostgreSQL : 문서 : 8.1 : 토토 베이 생성명령.