Chapter 45. ��дһ���������Ծ��

���ú�����ʱ�������������д���Բ���Ŀǰ��"�汾 1"�ı������Խӿڣ�������û�����Ĺ�������д�ĺ����� �� SQL д�ĺ������Լ��ð汾 0 �ı������Խӿ�д�ĺ�����������ͨ��һ�� ���þ�������������ԡ� ���þ����������һ��������ķ���ִ���������������˵�������ṩ���ı��ȵȡ����¼�������дһ���µĹ������Ե��þ����

�������Եĵ��þ����һ��"��ͨ"�ĺ����� ����ʹ��һ�ֱ���������д������ C��ʹ�ð汾-1�Ľӿڣ������� PostgreSQL ��ע��ɽ�������������ҷ������� language_handler�� ��������α���ͱ�ʶ�ú���Ϊһ�����þ�����ұ�����ֱ���� SQL �����б����á�

���þ���ĵ��÷�ʽ����������һ����������һ��ָ��һ�� FunctionCallInfoData struct ��ָ�룬���ָ���������ֵ���йر����õĺ�������Ϣ�� ����Ԥ��������һ�� Datum ����������ϣ������һ�� SQL �Ŀս���� ��ô�������� isnull �ֶΣ��� ���þ������ͨ�ı��������������� FunctionCallInfoData �ṹ�� flinfo->fn_oid �ֶ�ǿ����ʵ��Ҫ���õĺ����� OID�� �����ǵ��þ���������þ������ʹ������ֶ��ж�Ҫִ���ĸ������� ͨ�������ݽ����IJ����б�Ҳ�ǰ���Ŀ�꺯�����������õģ������Ǹ����þ�����õġ�

��ϵͳ�� pg_proc ��ץȡ��������Լ��������������IJ����ͷ������;��ǵ��þ�������ˡ� ���� CREATE FUNCTION �����е� AS �Ӿ佫���� pg_proc �е� prosrc �ֶ����ҵ������ͨ���ǹ������Ա����Դ�ı�����Ҳ�����DZ�Ķ���������һ��ָ��ij���ļ���·������ �����κθ��ߵ��þ�������ϸ����Ķ�����

ͨ����ÿ�� SQL ����������Ҫ����ͬһ��������Ρ� ���þ���������� flinfo->fn_extra �ֶα����ظ��ز����йر�����������Ϣ�� ����ֶγ�ʼΪ NULL�����ǿ��Ա����þ������Ϊָ���йر�����������Ϣ�� �����ĵ����У���� flinfo->fn_extra �Ѿ�Ϊ��NULL����ô�Ϳ���ֱ��ʹ�������������²�����Ϣ�� ���þ������ȷ�� flinfo->fn_extra ������ָ��һ�����ٻ����浽��ǰ��ѯ�������ڴ���� ��Ϊһ�� FmgrInfo ���ݽṹ���ᱣ����ô����ʱ�䡣 һ��ʵ�����Ҫ��ķ������� flinfo->fn_mcxt �������ڴ滷�������һ���������ݣ� ����������ͨ���� FmgrInfo �Լ���һ���������ڡ� ���Ǿ��Ҳ����ͬ��ѡ��ʹ��һ�����������ڵĻ������������Ϳ��Կ��ѯ���溯�����塣

�ڹ������Ժ����Դ���������ʽ���õ�ʱ�򣬾�û��ʲô������ͨ���ķ�ʽ���ݽ����� ���� FunctionCallInfoData �� context �ֶ�ָ��һ�� TriggerData �ṹ�� ����������ͨ������������� NULL ������һ�����Ծ��Ӧ��Ϊ�������Ժ����ṩ��ȡ��������Ϣ�Ļ��ơ�

������һ���� C д����Զ�������Ծ����ģ�棺

#include "postgres.h"
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"

PG_FUNCTION_INFO_V1(plsample_call_handler);

Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
    Datum          retval;

    if (CALLED_AS_TRIGGER(fcinfo))
    {
        /*
         * �Դ��������̵���
         */
        TriggerData    *trigdata = (TriggerData *) fcinfo->context;

        retval = ...
    }
    else
    {
        /*
         * �Ժ�������
         */

        retval = ...
    }

    return retval;
}

�ڴ��ĵط����ϼ�ǧ�д���Ϳ�����ɵ��þ����

�ڰѾ�����������һ����װ�ص�ģ�飨���� Section 31.9.6��֮�� ���������Ϳ���ע��������ӹ������ԣ�

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS 'filename'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

�������д�Լ��ĵ��þ������ô�����ڱ�׼��������Ĺ��������Ǻܺõ����ӡ� �ο�һ��Դ�������е� src/pl ��Ŀ¼��