PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Fast Forward | Next |
���ú�����ʱ�������������д���Բ���Ŀǰ��"�汾 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 ��Ŀ¼��