¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

第 51章��³������ϥ�ɥ�κ���

���ߤΥ���ѥ��������"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�ޥ˥奢��ڡ�����ޤ�ͭ�Ѥʾ����ޤߤޤ���