���ߤΥ���ѥ��������"�С������ 1"���ե������ʳ��Τ������Ǻ������줿�ؿ��θƤӽФ��Ϥ��٤ơ�����θ����Ѥ��ƤӽФ��ϥ�ɥ����ͳ���ޤ��� (����ˤϡ��桼�������³������Ǻ������줿�ؿ���SQL�Ǻ������줿�ؿ�������ѥ�������ѥС������0���ե���������Ѥ����ؿ����ޤޤ�ޤ���) ���줿�������ƥ����Ȥ��᤹��ʤɤˤ�äơ��ؿ��μ¹Ԥ��̣�Τ�����ˡ�ǹԤʤ����Ȥϡ��ƤӽФ��ϥ�ɥ����Ǥ�Ǥ��� ���ξϤǤϡ��ɤΤ褦�˿�������³������θƤӽФ��ϥ�ɥ������Ǥ��뤫�ˤĤ��Ƴ��פ��ޤ���
��³�������ѤθƤӽФ��ϥ�ɥ��"�̾�"�δؿ��ǡ�C�ʤɤΥ���ѥ������Ǻ��������С������1���ե���������Ѥ���������Ȥ餺��language_handler���֤���ΤȤ���PostgreSQL����Ͽ���ʤ���Фʤ�ޤ��� �����ü�ʲ��۷��ϡ����δؿ����ƤӽФ��ϥ�ɥ�Ȥ��Ƽ��̤���SQL���ޥ�����ľ�ܤ��δؿ����ƤӽФ���뤳�Ȥ��ɻߤ��ޤ���
�ƤӽФ��ϥ�ɥ�ϡ�¾�δؿ���Ʊ����ˡ�ǸƤӽФ���ޤ��� �����ͤȸƤӽФ��줿�ؿ��ˤĤ��Ƥξ����ޤ�FunctionCallInfoData struct�Υݥ������ꡢDatum���η�̤��֤����(�����ơ�SQL��NULL�Ȥ�����̤��֤����Ȥ�����ˡ�FunctionCallInfoData ��¤�Τ�isnull�ե�����ɤ����ꤹ�뤫�⤷��ʤ����)�����ꤵ��Ƥ��ޤ��� �ƤӽФ��ϥ�ɥ���̾�θƤӽФ����ؿ��Ȥΰ㤤�ϡ� FunctionCallInfoData��¤�Τ�flinfo->fn_oid�ˡ��ƤӽФ��ϥ�ɥ鼫�ȤǤϤʤ����ºݤ˸ƤӽФ����ؿ���OID���ޤޤ��Ȥ������Ǥ��� �ƤӽФ��ϥ�ɥ�Ϥ��Υե�����ɤ���Ѥ��ơ��ɤδؿ���ƤӽФ��Τ�����ꤷ�ʤ���Фʤ�ޤ��� �ޤ����Ϥ��줿�����ꥹ�Ȥϡ��ƤӽФ��ϥ�ɥ������ǤϤʤ�����Ū�Ȥ���ؿ�������˽����褦���ꤵ��Ƥ��ޤ���
pg_proc �����ƥ�ơ��֥뤫��ؿ��Υ���ȥ����Ф����ƤӽФ����ؿ��ΰ���������ͤη�����Ϥ���ޤǤ�ƤӽФ��ϥ�ɥ餬�Ԥʤ��ޤ��� �ؿ���CREATE FUNCTION��AS��ϡ�pg_proc�ιԤ�prosrc��ˤ���ޤ��� �����(PL/Tcl�ʤɤ�)��³�����켫�ΤǺ������줿�������ƥ����Ȥξ��䡢�ե�����ؤΥѥ�̾�ξ��䡢���餫�θƤӽФ��ϥ�ɥ�˾ܺ٤˲��٤��������Τ����Τξ�礬����ޤ���
1�Ĥ�SQLʸ���Ф��ơ�Ʊ���ؿ��������ƤӽФ���뤳�Ȥ��褯����ޤ��� �ƤӽФ��ϥ�ɥ�ϡ�flinfo->fn_extra�ե�����ɤ���Ѥ��ơ��ƤӽФ��ؿ��˴ؤ��������֤��������뤳�Ȥ��ɤ����Ȥ��Ǥ��ޤ��� ����Ͻ�����֤Ǥ�NULL�Ǥ������ƤӽФ��ϥ�ɥ�ˤ�äƸƤӽФ��ؿ��ξ����ؤ��褦�����ꤹ�뤳�Ȥ�Ǥ��ޤ��� ���θ�θƤӽФ��Ǥϡ�flinfo->fn_extra����NULL�Ǥ���С��������Ѥ��ơ��������ʳ����ά���뤳�Ȥ��Ǥ��ޤ��� �ƤӽФ��ϥ�ɥ��flinfo->fn_extra�����ʤ��Ȥ⸽�ߤ��䤤��碌�ν�λ�ޤ�ͭ���ʥ����ؤ��Ƥ��뤫�ɤ������ǧ���ʤ���Фʤ�ޤ��� FmgrInfo�ǡ�����¤�Τ�Ĺ���ݻ�������ǽ�������뤫��Ǥ��� ������ˡ��1�ĤȤ��ơ� flinfo->fn_mcxt�ǻ��ꤵ�줿���ꥳ��ƥ��������;ʬ�ʥǡ����������Ƥ뤳�ȤǤ��� ���Υǡ������̾�FmgrInfo ���Ȥ�Ʊ����ͭ���Ǥ��� ���������ϥ�ɥ�Ϥޤ���Ĺ���֥��ꥳ��ƥ����Ȥˤ����Τ���Ѥ��뤫�ɤ��������֤��Ȥ�Ǥ��ޤ��� ����ˤ�ꡢ�䤤��碌��٤ä����ؿ���������å��夹�뤳�Ȥ��Ǥ��ޤ���
��³������ؿ����ȥꥬ�Ȥ��ƸƤӽФ��줿��硢�������̾����ˡ�Ǥ��Ϥ��줺��FunctionCallInfoData��context�ե�����ɤ������̤δؿ��ƤӽФ��Τ褦��NULL�ˤϤʤ餺�ˡ�TriggerData��¤�Τ�ؤ��Ƥ��ޤ��� �ƤӽФ��ϥ�ɥ�ϡ���³��������Ф��ȥꥬ�������Ф����������ޤ���
�ʲ��ϡ�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; }
����ԤΥ����ɤ��ΥɥåȤ�������ɲä�������ǡ��ƤӽФ��ϥ�ɥ�������뤳�Ȥ��Ǥ��ޤ���
�ϥ�ɥ�ؿ���ưŪ�ɤ߹��߲�ǽ�ʥ⥸�塼��˥���ѥ��뤷���塢�ʲ��Υ��ޥ�ɤǥ���ץ�μ�³���������Ͽ���뤳�Ȥ��Ǥ��ޤ���(��33.7.6�Ȥ��Ʋ�������)
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS 'filename' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;