31.11. �û���������

���� 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 �����������