���ж��ò��ǵ�ǰ"�汾 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�ο�ҳҲ��һЩ���õ�ϸ�ڡ�
��һҳ | ��ʼҳ | ��һҳ |
������� | ��һ�� | ��дһ���ⲿ���ݰ�װ�� |