PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 31. ��չ SQL | Fast Forward | Next |
���� Section 31.2 ��˵�� PostgreSQL ������չΪ֧�����������͡� ����������ζ����µĻ������ͣ���Щ��������Щ������ SQL ����֮�µ��������͡� ����һ���µĻ�������Ҫ��ʵ�ֺ�����һ�ֵͲ����Ե������ϲ�����ͨ���� C��
���ڵ����ӿ�����Դ�뷢���� src/tutorial Ŀ¼�� complex.sql �� complex.c ���ҵ���
һ���û������������������������������ ��Щ��������������������ִ�����֣����û������������û����Լ���������ڴ洢������֯�� ���뺯����һ���Կգ�null����β���ַ���Ϊ�������ҷ��ظ����͵��ڲ����ڴ���ı�����ʽ�� ��������Ը����͵��ڲ�������ʽΪ�������ҷ���һ���Կգ�null����β���ַ�����
��������Ҫ����һ������ complex ������ʾ������ ͨ��������ѡ������� C �ṹ���ڴ洢������ָ�����
typedef struct Complex { double x; double y; } Complex;
���ڸ����͵��ⲿ������ʽ��������ѡ������ (x,y) ���ִ���
�����������ͨ��������д��������������������ǣ� �ڶ�������ⲿ���ַ�����������ʽʱ��Ҫע����������Ϊ�ñ�����ʽдһ���������ҽ�׳�ķ�������Ϊ������뺯�������磺
PG_FUNCTION_INFO_V1(complex_in); Datum complex_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); double x, y; Complex *result; if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for complex: \"%s\"", str))); result = (Complex *) palloc(sizeof(Complex)); result->x = x; result->y = y; PG_RETURN_POINTER(result); }
����������Լľ��ǣ�
PG_FUNCTION_INFO_V1(complex_out); Datum complex_out(PG_FUNCTION_ARGS) { Complex *complex = (Complex *) PG_GETARG_POINTER(0); char *result; result = (char *) palloc(100); snprintf(result, 100, "(%g,%g)", complex->x, complex->y); PG_RETURN_CSTRING(result); }
��Ӧ�ð�������������������Ļ�Ϊ�棨������������㲻�������� ��Ϳ�������Ҫ�������������װ�ػ�ȥʱ���������ص����⣬���漰��������ʱ�����Ƿdz��ձ�����⡣
���⣬һ���û��������Ϳ����ṩ�����������������̡� ������ I/O ͨ�����죬����û���ı� I/O ��ֲ�Ժá� ��Ϊ�����ı� I/O ���ԣ���ȫ�������������ⲿ�Ķ�������ʽ����εġ� ��������õ��������Ͷ��������ṩһ��������صĶ�������ʽ�� ���� complex�����ǽ��Ѷ����� I/O ������ float8 �Ļ����ϡ�
PG_FUNCTION_INFO_V1(complex_recv); Datum complex_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); Complex *result; result = (Complex *) palloc(sizeof(Complex)); result->x = pq_getmsgfloat8(buf); result->y = pq_getmsgfloat8(buf); PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(complex_send); Datum complex_send(PG_FUNCTION_ARGS) { Complex *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)); }
Ҫ���� complex ���ͣ�����Ҫ�ڴ���������ǰ�ȴ����û������ I/O ������
CREATE FUNCTION complex_in(cstring) RETURNS complex AS 'filename' LANGUAGE C IMMUTABLE STRICT; CREATE FUNCTION complex_out(complex) RETURNS cstring AS 'filename' LANGUAGE C IMMUTABLE STRICT; CREATE FUNCTION complex_recv(internal) RETURNS complex AS 'filename' LANGUAGE C IMMUTABLE STRICT; CREATE FUNCTION complex_send(complex) RETURNS bytea AS 'filename' LANGUAGE C IMMUTABLE STRICT;
��ע���������������������������û�û��������͡� ��������ģ����ǻᵼ��һЩ���棬����Ժ�����Щ���档 �����ȶ������뺯����
������ǿ��������������ͣ�
CREATE TYPE complex ( internallength = 16, input = complex_in, output = complex_out, receive = complex_recv, send = complex_send, alignment = double );
���㶨��һ���µĻ�������ʱ�� PostgreSQL �Զ��ṩ�Ը����͵������֧�֡� ��Ϊ��ʷԭ�� �������͵���������������ͬ���ִ�ǰ��Ӹ��»����ַ�(_)��
һ���������ʹ��ڣ����ǾͿ�����������ĺ������ṩ�ڸ����������ϵ����õIJ����� Ȼ��Ϳ�������Щ�����϶���������������Ҫ�������Դ�����������֧�ָ��������͵������� ��Щ����IJ��ں�����½ڽ��ܡ�
�������������͵Ĵ�С���ܳ������ٸ��ֽ�(�ڲ���ʽ)�� ��ô��Ӧ�ú���ϸ�ذ����DZ��Ϊ�� TOAST �ģ����� Section 49.2���� Ҫ������һ�㣬 �����͵��ڲ���ʽ������ѭ�䳤�����ڲ���ʽ�ر����֣� ͷ�ĸ��ֽڱ�����һ�� int32���������ݵ�ȫ������������������ �ڸ������ϲ����� C ��������ͨ��ʹ�� PG_DETOAST_DATUM С�ĵؽ���Ǵ�����κΡ��濾��������ֵ����Щϸ��ͨ��������ͨ������������ص� GETARG ���ڸǣ��� �����ʹ�� CREATE TYPE �����ʱ�� �����ڲ�����Ϊ variable ����ѡ��ǡ���Ĵ洢ѡ�
�����ϸ������� CREATE TYPE �����������