Postgresql 9.0.23 문서화 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.0 : 토토 결과자 정의 집계 | up | 제 35 장. 확장SQL | 다음 |
설명대로PostgreSQL : 문서 : 9.0 : PostgreSQL 사설 토토 시스템, postgresql할 수 있습니다 새로운 데이터 스포츠 토토 사이트을 지원하도록 확장되었습니다. 이 섹션에서는 방법을 설명합니다 아래 정의 된 데이터 스포츠 토토 사이트 인 새 기본 스포츠 토토 사이트을 정의합니다. 레벨SQL언어. 새로운 기본 스포츠 토토 사이트을 만들려면 기능을 구현해야합니다 저수준 언어로 스포츠 토토 사이트에서 작동합니다. 일반적으로 C
이 섹션의 예는에서 찾을 수 있습니다.complex.sqlandcomplex.cinSRC/Tutorial소스의 디렉토리 분포. 참조readme파일 예제 실행에 대한 지침을위한 해당 디렉토리.
사용자 정의 유형은 항상 입력 및 출력이 있어야합니다 기능. 이러한 기능은 유형이 어떻게 나타나는지 결정합니다 문자열 (사용자에 의한 입력 및 사용자에 대한 출력) 및 유형은 메모리로 구성됩니다. 입력 함수는 a를 취합니다 Null-Terminated 캐릭터 문자열은 인수로서 반환합니다 유형의 내부 (메모리) 표현. 출력 함수는 유형의 내부 표현을 사용합니다 인수와 널리 터진 문자열을 반환합니다. 우리가 단순히 저장하는 것보다 유형으로 더 많은 일을하고 싶습니다. 무엇이든 구현하기 위해 추가 기능을 제공해야합니다 유형에 대해 갖고 싶은 작업.
우리가 스포츠 토토 사이트을 정의하고 싶다고 가정복잡한이것은 복소수를 나타냅니다. 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 함수를 작성하고이를 편집하면 공유 라이브러리, 우리는를 정의 할 수 있습니다.복잡한SQL을 입력하십시오. 먼저 우리는 그것을 쉘 유형으로 선언합니다 :
스포츠 토토 사이트 생성 단지;
이것은 우리가 참조 할 수있는 자리 표시 자 역할을합니다. I/O 함수를 정의하는 동안 입력하십시오. 이제 I/O를 정의 할 수 있습니다 기능 :
함수 complex_in (cstring) 생성 복잡한 반환 처럼 'filename' 언어 C 불변의 엄격; 함수 만들기 complex_out (complex) cstring을 반환합니다 처럼 'filename' 언어 C 불변의 엄격; 함수 만들기 complex_recv (내부) 복잡한 반환 처럼 'filename' 언어 C 불변의 엄격; 함수 만들기 complex_send (complex) Bytea를 반환합니다 처럼 'filename' 언어 c 불변의 엄격한;
마지막으로 데이터의 전체 정의를 제공 할 수 있습니다. 스포츠 토토 사이트:
유형 Complex ( 내부 길이 = 16, 입력 = complex_in, 출력 = complex_out, 수신 = complex_recv, send = complex_send, 정렬 = 이중 );
새 기본 스포츠 토토 사이트을 정의 할 때PostgreSQL자동으로 지원을 제공합니다 해당 스포츠 토토 사이트의 배열의 경우. 배열 스포츠 토토 사이트은 일반적으로 동일합니다 밑줄 문자가있는 기본 스포츠 토토 사이트으로 이름을 지정하십시오 (_) Prefended.
데이터 유형이 존재하면 추가 기능을 선언 할 수 있습니다. 데이터 유형에 유용한 작업을 제공합니다. 운영자는 할 수 있습니다 함수 위에 정의되고 필요한 경우 운영자 클래스 데이터 유형의 인덱싱을 지원하도록 만들 수 있습니다. 이것들 추가 레이어는 다음 섹션에서 논의됩니다.
데이터 스포츠 토토 사이트의 값이 크기가 다르면 (내부에서 양식), 데이터 스포츠 토토 사이트을 만들어야토스트-abable (참조섹션 54.2). 당신은 이것을해야합니다 데이터가 항상 너무 작아 압축되거나 저장되는 경우 외부, 왜냐하면토스트can 헤더 오버 헤드를 줄임으로써 작은 데이터에도 공간을 절약하십시오.
이렇게하려면 내부 표현이 따라야합니다
가변 길이 데이터의 표준 레이아웃 : 처음 4 바이트char [4]결코없는 필드
직접 액세스 (관습 적으로 명명 된VL_LEN_). 사용해야합니다set_varsize ()
Datum의 크기를 저장하려면
이 필드와varsize ()
to
검색하십시오. 데이터 스포츠 토토 사이트에서 작동하는 C 기능은해야합니다
항상 건배 된 값을 풀도록 조심하십시오.
사용하여PG_DETOAST_DATUM
. (이것
세부 사항은 관례 적으로 스포츠 토토 사이트별로 정의하여 숨겨져 있습니다getarg_datatype_p
매크로) 그런 다음,
실행할 때스포츠 토토 사이트 만들기명령,
내부 길이를로 지정합니다.가변그리고 적절한 스토리지 옵션을 선택하십시오.
18479_18666PG_DETOAST_DATUM
. 사용할 수 있습니다pg_detoast_datum_packed
대신
(관습 적으로 agetarg_datatype_pp
매크로) 및 매크로 사용varsize_any_exhdr
andvardata_any
잠재적으로 포장 된 것에 액세스하려면
자료. 다시,이 매크로가 반환 한 데이터는 정렬되지 않습니다.
데이터 스포츠 토토 사이트 정의가 정렬을 지정하더라도. 만약
정렬이 중요합니다. 정기적으로 진행해야합니다pg_detoast_datum
인터페이스.
참고 :이전 코드가 자주 선언VL_LEN_ASint32대신 필드char [4]. 이것은 괜찮습니다 구조물 정의에 다른 필드가있는 한 최소int32정렬. 그러나 그것은입니다 작업 할 때 그러한 구조물 정의를 사용하는 것이 위험합니다. 잠재적으로 정렬되지 않은 데이텀; 컴파일러는 다음과 같이 가져갈 수 있습니다 데이텀이 실제로 정렬되었다고 가정하는 라이센스는 엄격한 아키텍처의 핵심 덤프 조정.
자세한 내용은 설명을 참조하십시오.스포츠 토토 사이트 만들기명령.