���ߤΥ���ѥ��������"Version-1"���ե������ʳ��Τ������Ǻ������줿�ؿ��θƤӽФ��Ϥ��٤ơ�����θ����Ѥ��ƤӽФ��ϥ�ɥ����ͳ���ޤ� �ʤ���ˤϡ��桼�������³������Ǻ������줿�ؿ���SQL�Ǻ������줿�ؿ�������ѥ��������Version-0���ե���������Ѥ����ؿ����ޤޤ�ޤ��ˡ� ���줿�������ƥ����Ȥ��᤹��ʤɤˤ�äơ��ؿ��μ¹Ԥ��̣�Τ�����ˡ�ǹԤ����Ȥϡ��ƤӽФ��ϥ�ɥ����Ǥ�Ǥ��� �ܾϤǤϡ��ɤΤ褦�˿�������³������θƤӽФ��ϥ�ɥ������Ǥ��뤫�ˤĤ��Ƴ��פ��ޤ���
��³�������ѤθƤӽФ��ϥ�ɥ��"�̾�"�δؿ��ǡ�C�ʤɤΥ���ѥ������Ǻ�������Version-1���ե���������Ѥ����������餺��language_handler���֤���ΤȤ���PostgreSQL����Ͽ���ʤ���Фʤ�ޤ��� �����ü�ʲ��۷��ϡ����δؿ���ƤӽФ��ϥ�ɥ�Ȥ��Ƽ��̤���SQL���ޥ�����ľ�ܤ��δؿ����ƤӽФ���뤳�Ȥ��ɻߤ��ޤ��� C����θƤӽФ������ưŪ�����ɤˤĤ��Ƥ�項35.9�Ȥ��Ƥ���������
�ƤӽФ��ϥ�ɥ�ϡ�¾�δؿ���Ʊ����ˡ�ǸƤӽФ���ޤ��� �����ͤȸƤӽФ��줿�ؿ��ˤĤ��Ƥξ����ޤ�FunctionCallInfoData struct�Υݥ��������ꡢDatum���η�̤��֤���Ρʤ����ơ�SQL��NULL�Ȥ�����̤��֤����Ȥ�����ˡ�FunctionCallInfoData��¤�Τ�isnull�ե�����ɤ����ꤹ�뤫�⤷��ʤ���Ρˤ����ꤵ��Ƥ��ޤ��� �ƤӽФ��ϥ�ɥ���̾�θƤӽФ����ؿ��Ȥΰ㤤�ϡ�FunctionCallInfoData��¤�Τ�flinfo->fn_oid�ˡ��ƤӽФ��ϥ�ɥ鼫�ȤǤϤʤ����ºݤ˸ƤӽФ����ؿ���OID���ޤޤ��Ȥ������Ǥ��� �ƤӽФ��ϥ�ɥ�Ϥ��Υե�����ɤ���Ѥ��ơ��ɤδؿ���ƤӽФ��Τ�����ꤷ�ʤ���Фʤ�ޤ��� �ޤ����Ϥ��줿�����ꥹ�Ȥϡ��ƤӽФ��ϥ�ɥ������ǤϤʤ�����Ū�Ȥ���ؿ�������˽����褦���ꤵ��Ƥ��ޤ���
pg_proc
�����ƥ५����������ؿ��Υ���ȥ����Ф����ƤӽФ����ؿ��ΰ���������ͤη�����Ϥ���ޤǤ�ƤӽФ��ϥ�ɥ餬�Ԥ��ޤ���
�ؿ���CREATE FUNCTION���ޥ�ɤ�AS��ϡ�pg_proc
�ιԤ�prosrc��ˤ���ޤ���
������̾��³�����켫�ΤǺ������줿�������ƥ����ȤǤ�����������ϥե�����ؤΥѥ�̾�䡢���餫�θƤӽФ��ϥ�ɥ�˾ܺ٤˲��٤��������Τ����ΤȤ��뤳�Ȥ�Ǥ��ޤ���
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" #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)) { /* * �ȥꥬ�ؿ��Ȥ��ƸƤӽФ��줿 */ TriggerData *trigdata = (TriggerData *) fcinfo->context; retval = ... } else { /* * �ؿ��Ȥ��ƸƤӽФ��줿 */ retval = ... } return retval; }
����ԤΥ����ɤ��ΥɥåȤ�������ɲä�������ǡ��ƤӽФ��ϥ�ɥ�������뤳�Ȥ��Ǥ��ޤ���
�ϥ�ɥ�ؿ���ưŪ�����ɲ�ǽ�ʥ⥸�塼��˥���ѥ����項35.9.6�Ȥ��Ƥ��������ˤ����塢�ʲ��Υ��ޥ�ɤǥ���ץ�μ�³���������Ͽ���뤳�Ȥ��Ǥ��ޤ���
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS 'filename' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
����¤μ�³����������������ˤϸƤӽФ��ϥ�ɥ����������ǽ�ʬ�Ǥ�����¾�ˤ��ά��ǽ�Ǥ��������θ�������Ѥ�����ؤˤ��뤿����Ǥ���2�Ĥδؿ�������ޤ��� ������ͭ�������ڴؿ�������饤��ϥ�ɥ��Ǥ��� ͭ�������ڴؿ������ơ�CREATE FUNCTION���˸����ͭ�θ�����Ԥ����Ȥ��Ǥ��ޤ��� ����饤��ϥ�ɥ�����ơ������DO���ޥ�ɷ�ͳ��ƿ̾�����ɥ֥��å��¹Ԥݡ��Ȥ����뤳�Ȥ��Ǥ��ޤ���
ͭ�������ڴؿ�����³������ˤ��������硢oid����ñ��ѥ�������ؿ��Ȥ���������ʤ���Фʤ�ޤ���
ͭ�������ڴؿ��η�̤�̵�뤵��ޤ���
���Τ���褯void���֤���Τ��������ޤ���
ͭ�������ڴؿ��Ϥ��μ�³������Ǵؿ�������ޤ����ִ�����CREATE FUNCTION�κǸ�˸ƤӽФ���ޤ���
�Ϥ����OID�ϴؿ���pg_proc
�Ԥ�OID�Ǥ���
ͭ�������ڴؿ����̾����ˡ�Ǥ��ιԤ���Ф��ʤ���Фʤ餺��������Ŭ�ڤʸ�����¹Ԥ��ޤ���
ŵ��Ū�ʸ����Ȥ��ơ��ؿ���������ӷ�̤η������θ���ǥ��ݡ��Ȥ���Ƥ��뤫��ؿ����Τ����θ���ˤ�����ʸˡŪ�����������ɤ����ڤ��뤳�Ȥ����ޤ���
ͭ�������ڴؿ������δؿ������꤬�ʤ����Ȥ�Ƚ�ꤷ���顢ñ�����ޤ���
���顼�����뤳�Ȥ�Ƚ�ꤷ���顢�̾��ereport()
���顼�������Ѥ�����𤷤ʤ���Фʤ�ޤ���
���顼���֤����Ȥǡ�����Ū�˥ȥ�������ϥ�����Хå����졢�����ʴؿ���������ߥåȤ���뤳�Ȥ��ɤ��ޤ���
ͭ�������ڴؿ����̾�check_function_bodies�ѥ������餷�ʤ���Фʤ�ޤ��� ���줬̵���ʾ�硢����ޤ���ʸ̮����θ��������Ф��ʤ���Фʤ�ޤ��� ����Ū�ˤϤ��Υѥ����ϡ��ؿ����Τ�¾�Υǡ����١������֥������Ȥ˰�¸���Ƥ����ǽ�����θ���뤳�Ȥʤ���³������ؿ�������ɤǤ���褦�ˡ�pg_dump�ˤ��̵���ˤ���ޤ��� (���λ��ͤΤ���ƤӽФ��ϥ�ɥ��ͭ�������ڴؿ��������ˤ��δؿ����������Ȥ�����Ȥ��ƤϤ����ޤ��� ͭ�������ڴؿ��������Ū�ϡ��ƤӽФ��ϥ�ɥ餬�������ά�Ǥ��뤳�ȤǤϤʤ������Τʥ��顼��CREATE FUNCTION���ޥ�����¸�ߤ����硢�����¨�¤˥桼�������Τ��뤳�ȤǤ���) ��̩�˲������٤���������ϼ�Ȥ���ͭ���������ؿ��κ��̤˰Ѥͤ��Ƥ��ޤ�����check_function_bodies��ͭ���ʾ��ˤ�CREATE FUNCTION���濴�Ȥʤ륳���ɤϴؿ��˴�Ϣ�Ť���줿SET���¹Ԥ�������Ǥ��Τ����դ��Ʋ������� ���Τ��ᡢ���η�̤�GUC�ѥ����αƶ�������븡���ϡ�����פ������ɤ�����ε��μ��Ԥ��뤿��ˡ�check_function_bodies��̵���ʾ��ˤϳμ¤����Ф��ʤ���Фʤ�ޤ���
����饤��ϥ�ɥ餬��³������ˤ��������硢���δؿ���internal����ñ��ѥ��������ΤȤ����������ʤ���Фʤ�ޤ��� ����饤��ϥ�ɥ�η�̤�̵�뤵��ޤ��� ���Τ���褯void���֤���Τ��������ޤ��� ����饤��ϥ�ɥ������μ�³�������DOʸ���¹Ԥ��줿���˸ƤӽФ���ޤ��� �ºݤ��Ϥ����ѥ�����InlineCodeBlock��¤�ΤΥݥ��Ǥ��� �����ˤ�DOʸ�Υѥ���������Ū�ˤϼ¹Ԥ����ƿ̾�����ɥ֥��å��Υƥ����ȡ��˴ؤ�����ޤޤ�Ƥ��ޤ��� ����饤��ϥ�ɥ�Ϥ��Υ����ɤ�¹Ԥ������ʤ���Фʤ�ޤ���
��ñ��CREATE EXTENSION���ޥ�ɤǸ���ȡ��뤹�뤳�Ȥ���ʬ�ˤǤ���褦�ˡ������δؿ������CREATE LANGUAGE���ޥ�ɼ��Ȥ���ĥ�Ȥ��ƤޤȤ�뤳�Ȥ�ޤ��� ��ĥ�κ�����ˡ�ˤĤ��Ƥ�項35.15�Ȥ��Ƥ���������
�ȼ��θ���ϥ�ɥ���������ݡ�ɸ������ʪ�˴ޤޤ���³�������ͥ�줿��ե���Ǥ��� �������ĥ��src/pl���֥ǥ��쥯�ȥ��Ĵ�٤Ƥ��������� CREATE LANGUAGE�ޥ˥奢��ڡ�����ޤ�ͭ�Ѥʾ����ޤߤޤ���