�� 54. ��дһ���������Դ�����

���ж��ò��ǵ�ǰ"�汾 1"�ӿڣ����ڱ��������ԣ����Ա�д�ĺ�����������û�����Ĺ��������еĺ�����SQL ��д�ĺ����Լ�ʹ�ð汾 0 ���������Խӿڵĺ������ĵ��ö�������һ������ָ�����Ե����ô����������ô�����������һ��������ķ�ʽִ�иú���������ͨ���������ṩ��Դ�ı������¹�������α�дһ���µĹ������Ե��ô�������������

һ���������Եĵ��ô�������һ��"������"��������������һ�ֱ��������ԣ��� C����д��ʹ�ð汾-1�ӿڲ�����PostgreSQL��ע��Ϊ�޲����ҷ�������language_handler�����������α���ͱ�ʶ�ú�����һ�����ô�����������ֹ���� SQL �����б�ֱ�ӵ��á����� C ���Ե��ù����Ͷ�̬����ĸ���ϸ�ڣ������ 36.9 ����

���ô������ĵ��÷�ʽ�������κκ�����ͬ��������һ����������ֵ���йر����ú�����Ϣ��FunctionCallInfoData �ṹ������������������һ��Datum��������������ϣ������һ�� SQL ��ֵ���������������FunctionCallInfoData�ṹ��isnull�򣩡�һ�����ô�������һ����ͨ�����ú���֮���������FunctionCallInfoData�ṹ��flinfo->fn_oid�򽫰���Ҫ�����õ�ʵ�ʺ����� OID�������ǵ��ô��������������ô���������ʹ�������������Ҫִ���ĸ�������ͬ���������ݵIJ����б��Ѿ�������Ŀ�꺯�������ǵ��ô����������������úá�

���ô����������pg_procϵͳĿ¼��ȡ�øú�������ҷ��������ú����IJ����ͷ������͡��ú�����CREATE FUNCTION�����AS�Ӿ������pg_proc�е�prosrc���б��ҵ���ͨ�����ǹ��������е�Դ�ı���������������������������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"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(plsample_call_handler);

Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
    Datum          retval;

    if (CALLED_AS_TRIGGER(fcinfo))
    {
        /*
         * Called as a trigger procedure
         */
        TriggerData    *trigdata = (TriggerData *) fcinfo->context;

        retval = ...
    }
    else
    {
        /*
         * Called as a function
         */

        retval = ...
    }

    return retval;
}

Ҫ��ɸõ��ô�������ֻ��Ҫ���뼸ǧ�д����������ż��ɡ�

�ڽ����������������һ��������ģ�飨�� 36.9.6 �����󣬽�������������ע�����ӹ������ԣ�

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

�����ṩһ�����ô��������ڴ���һ����С���������Ѿ��㹻���������ṩ����������ѡ�ĺ������øú��������á���������֤����������������һ����֤�����Ա��ṩ��������CREATE FUNCTION�ڼ����������صļ�顣һ���������������Ա��ṩ����������֧��ͨ��DO����ִ����������顣

���һ����֤����һ�����������ṩ�������뱻����Ϊһ������һ����һoid���Ͳ����ĺ���������֤���Ľ�������ԣ���Ϊ��ͨ��������Ϊ����void����֤������һ���Ѿ������˻������һ���Ըù������Ա�д�ĺ�����CREATE FUNCTION����֮�󱻵��á�������� OID �Ǻ�����pg_proc�е� OID����֤��������ͨ����ʽȡ������У��������κκ��ʵļ�顣���ȣ�����CheckFunctionValidatorAccess()����϶��û�ͨ��CREATE FUNCTION�޷��ﵽ����֤������ʽ���á����͵ļ�������֤�����IJ����ͽ�������Ƿ񱻸�����֧�֣��Լ��ú������ڸ��������﷨�Ƿ���ȷ�������֤�����ָú����Ǻõģ���Ӧ��ֻ�Ƿ��ء����������һ��������Ӧ��ͨ��ͨ����ereport()���󱨸���Ʊ���ô����׳�һ������ǿ��һ������ع����������ֹ����ȷ�ĺ������屻�ύ��

��֤������ͨ��Ӧ������check_function_bodies��������������ر���ô�κδ��۴�Ļ����������еļ��Ӧ�ñ�����������������ṩ�˱���ʱ����ִ�У���֤���������ƿ�����������ִ�еļ�顣�ر�أ���������ᱻpg_dump�رգ�������������������Ժ��������õ��ĸ����û���Щ��������������ݿ�������������Ϊ����Ҫ�󣬵��ô�����Ӧ�ñ��������֤���Ѿ������ؼ����ú�����ӵ��һ����֤����Ҫ�㲻���õ��ô��������Լ�飬���������һ��CREATE FUNCTION�����з������Դ���ʱ������ʾ�û�����Ȼ���������ʲô��ѡ��󲿷ֶ���������֤��������ע�⵱check_function_bodiesΪ��ʱ������CREATE FUNCTION����ִֻ�и��ӵ�һ��������SET�Ӿ䡣 ��ˣ�Ϊ�˱�������������һ��ת��ʱ��αʧ�ܣ���check_function_bodiesΪ�ر�ʱ��������ܻᱻ GUC ����Ӱ��ļ�����Ӧ����������

���һ�����������ṩ��һ�������������������뱻����Ϊһ������һ����һinternal���Ͳ����ĺ����������������Ľ���ᱻ���ԣ������ͨ��������Ϊ����void����һ��DO��䱻����ִ��ָ����������ʱ�������������������á�ʵ�ʱ����ݵIJ�����һ��ָ��һ��InlineCodeBlock�ṹ��ָ�룬�������й�DO�������Ķ���Ϣ���ر��ǽ���ִ�е������������ı�������������Ӧ��ִ�иô��벢���ء�

�����Ƽ����װ������Щ�����������Լ�CREATE LANGUAGE�������һ��extension�У�����һ���򵥵�CREATE EXTENSION��������԰�װ�����ԡ����ڱ�д��չ����Ϣ����� 36.15 ����

�ڳ��Ա�д���Լ������Դ�����ʱ�������ڱ�׼�����еĹ��������ǺܺõIJο�������Դ�����е�src/pl��Ŀ¼��CREATE LANGUAGE�ο�ҳҲ��һЩ���õ�ϸ�ڡ�