¾�ΥС�������ʸ�� �� 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

50.2. �����ǡ�����åѤΥ�����Хå��롼����

FDW�ϥ�ɥ�ؿ��ϡ��ʲ��Υ�����Хå��ؿ��ؤΥݥ��󥿤�ޤࡢpalloc���줿FdwRoutine��¤�Τ��֤��ޤ���

FdwPlan *
PlanForeignScan (Oid foreigntableid,
                 PlannerInfo *root,
                 RelOptInfo *baserel);

�����ơ��֥�ؤΥ������μ¹Էײ��������ޤ��� ���δؿ��ϥ�����μ¹Էײ���������Ȥ��˸ƤӽФ���ޤ��� foreigntableid�Ϥ��γ����ơ��֥��pg_class��OID�Ǥ��� root�Ϥ��Υ�����˴ؤ���ץ��ʤΥ������Х����ǡ�baserel�Ϥ��Υơ��֥�˴ؤ���ץ��ʤξ���Ǥ��� ���δؿ��ϡ������Ȥθ��Ѥ��˲ä��ơ���dz����ơ��֥륹������¹Ԥ���Τ�ɬ�פ�FDW�Υץ饤�١��Ⱦ����ޤࡢpalloc���줿��¤�Τ��֤��ʤ���Фʤ�ޤ��� (�ץ饤�١��Ⱦ����copyObject�����ԡ���ˡ���ΤäƤ��������ɽ������Ƥ��ʤ���Фʤ�ʤ����Ȥ����դ��Ƥ���������)

root��baserel�˴ޤޤ�����ϡ������ơ��֥뤫����Ф�����򸺤餹�����(��̤Ȥ��ƥ����ȸ��Ѥ��򸺤餹���Ȥ�)�Ȥ����Ȥ��Ǥ��ޤ��� baserel->baserestrictinfo�ϡ����Ф��Ԥ����̤���Τ˻��ѤǤ���������(WHERE��)��ޤ�Ǥ��ꡢ�ä˶�̣������ΤǤ��� (�ǽ�Ū�ʼ¹Էײ�Ǥ����������٥����å�����Τǡ�FDW�Ǥ����ξ���Ŭ�Ѥ��ʤ���Фʤ�ʤ��櫓�ǤϤ���ޤ���) baserel->reltargetlist�ϼ��Ф�ɬ�פ����륫������ꤹ��Τ˻��ѤǤ��ޤ���

���δؿ��ϡ������ȸ��Ѥ����֤��Τ˲ä��ơ�������ˤ��ե��륿��󥰤��θ���������Υ��������֤��������Կ���baserel->rows�򹹿����٤��Ǥ��� baserel->rows�ν���ͤ�ñ�ʤ�ǥե���Ȥθ��Ѥ��Ǥ��ꡢ��ǽ�Ǥ�����֤���������٤���ΤǤ��� ʿ�ѹ�Ĺ�Τ���ɤ����Ѥ��򻻽ФǤ���ΤǤ���С����δؿ���baserel->width�򹹿����뤳�Ȥ����򤹤뤳�Ȥ�Ǥ��ޤ���

void
ExplainForeignScan (ForeignScanState *node,
                    ExplainState *es);

�����ơ��֥륹�������ɲä�EXPLAIN���Ϥ�ɽ�����ޤ��� ����ɽ������ɬ�פ��ʤ��ΤǤ���С�ñ�˥꥿���󤹤뤳�Ȥ�Ǥ��ޤ��� �⤷���ϡ�EXPLAIN���Ϥ˥ե�����ɤ��ɲä��뤿���ExplainPropertyText���Ϣ����ؿ���ƤӽФ��٤��Ǥ��� es����Υե饰�ե�����ɤϲ���ɽ�����뤫�����Τ˻��ѤǤ��ޤ����ޤ���EXPLAIN ANALYZE�ξ��ˤϡ��¹Ի����׾�����󶡤��뤿���ForeignScanState�Ρ��ɤξ��֤�Ĵ�٤뤳�Ȥ��Ǥ��ޤ���

void
BeginForeignScan (ForeignScanState *node,
                  int eflags);

�����ơ��֥륹�����μ¹Ԥ򳫻Ϥ��ޤ��� ���δؿ��ϥ��������塼���Υ������ȥ��å���˸ƤӽФ���ޤ��� �������򳫻ϤǤ���褦�ˤʤ����ˡ�������ɬ�פʽ������¹Ԥ���٤��Ǥ������ºݤΥ������μ¹Ԥ�Ϥ��٤��ǤϤ���ޤ���(����Ϻǽ��IterateForeignScan�ƤӽФ��ˤ����ƹԤ���٤��Ǥ�)�� ForeignScanState�Ρ��ɤϺ�������Ƥ��ޤ���������fdw_state�ե�����ɤ�NULL�ΤޤޤǤ��� ������󤹤�ơ��֥�ξ���ϡ�ForeignScanState�Ρ���(�ºݤˤϤ�����ˤ��롢PlanForeignScan�����֤��줿FdwPlan��¤�ΤؤΥݥ��󥿤�ޤࡢForeignScan�ץ��Ρ���)���̤��ƥ���������ǽ�Ǥ���

(eflags & EXEC_FLAG_EXPLAIN_ONLY)�����ξ�硢���δؿ��ϳ����˸����륢�������򵯤����٤��ǤϤʤ����Ȥ����դ��Ƥ��������� ExplainForeignScan��EndForeignScan�Ѥ˥Ρ��ɾ��֤�ͭ���ˤ���Τ�ɬ�פȤ����Ǿ��¤Τ��Ȥ����򤹤٤��Ǥ���

TupleTableSlot *
IterateForeignScan (ForeignScanState *node);

���������������Ԥ���Ф��ơ�����򥿥ץ�ơ��֥륹���åȤ�������֤��ޤ�(�������ӤˤϥΡ��ɤ�ScanTupleSlot��Ȥ��٤��Ǥ�)�� ���Ѳ�ǽ�ʹԤ��ʤ����ϡ�NULL���֤��ޤ��� ���ץ�ơ��֥륹���åȵ�����Ȥ��ȡ�ʪ�����ץ�Ȳ��ۥ��ץ�Τɤ���Ǥ��֤��ޤ��� �ۤȤ�ɤξ�硢�ѥե����ޥ󥹤δ��������Ԥ����֤Τ��ɤ��Ǥ��礦�� ���δؿ��ϡ��ƽФ����Ȥ˥ꥻ�åȤ����û̿�ʥ��ꥳ��ƥ�������ǸƤӽФ���뤳�Ȥ����դ��Ƥ��������� ���Ĺ̿�ʥ��ȥ졼����ɬ�פʾ��ϡ�BeginForeignScan�ǥ��ꥳ��ƥ����Ȥ�������뤫���Ρ��ɤ�EState�˴ޤޤ��es_query_cxt����Ѥ��Ƥ���������

�֤����Ԥϥ�����󤵤�Ƥ��볰���ơ��֥�Υ���ॷ���ͥ���Ȱ��פ��ʤ���Фʤ�ޤ��� ���פʥ�������Ф��ʤ��褦�˺�Ŭ�����뤳�Ȥ����֤ʤ顢�����Υ������֤�NULL�������٤��Ǥ���

PostgreSQL�Υ��������塼�����֤��줿�Ԥ������ơ��֥�����������줿NOT NULL����˰�ȿ���Ƥ��뤫�ɤ����ϵ��ˤ��ޤ��󤬡��ץ��ʤϤ���˴ؿ��������NULL�ͤ�ޤޤʤ���������줿���NULL�ͤ����줿���������ʥ������Ŭ���򤷤Ƥ��ޤ���礬���뤳�Ȥ����դ��Ƥ��������� �桼�������äƤϤʤ�ʤ�����������Τ�NULL�ͤ�������������(�ǡ����������פ��ʤ��ä����ˤ���ɬ�פ�����Τ�Ʊ�ͤ�)���顼��ȯ��������Τ�Ŭ�ڤǤ��礦��

void
ReScanForeignScan (ForeignScanState *node);

��Ƭ���饹������Ƴ����ޤ��� ������󤬰�¸���뤤���줫�Υѥ�᡼�����ͤ��ѹ����Ƥ��뤫�⤷��ʤ��Τǡ��������������ɬ�����⸷̩��Ʊ���Ԥ��֤��Ȥϸ¤�ʤ����Ȥ����դ��Ƥ���������

void
EndForeignScan (ForeignScanState *node);

��������λ���꥽������������ޤ��� �̾palloc���줿�����������뤳�ȤϽ��פǤϤ���ޤ��󤬡��������ե�������⡼�ȥ����Фؤ���³�ʤɤϥ��꡼�󥢥åפ���٤��Ǥ���

FdwRoutine��FdwPlan�ι�¤�η���src/include/foreign/fdwapi.h���������Ƥ���Τǡ�����ʤ�ܺ٤Ϥ�����򸫤Ʋ�������