107#define EXEC_MJ_INITIALIZE_OUTER 1
108#define EXEC_MJ_INITIALIZE_INNER 2
109#define EXEC_MJ_JOINTUPLES 3
110#define EXEC_MJ_NEXTOUTER 4
111#define EXEC_MJ_TESTOUTER 5
112#define EXEC_MJ_NEXTINNER 6
113#define EXEC_MJ_SKIP_TEST 7
114#define EXEC_MJ_SKIPOUTER_ADVANCE 8
115#define EXEC_MJ_SKIPINNER_ADVANCE 9
116#define EXEC_MJ_ENDOUTER 10
117#define EXEC_MJ_ENDINNER 11
153#define MarkInnerTuple(innerTupleSlot, mergestate) \
154 ExecCopySlot((mergestate)->mj_MarkedTupleSlot, (innerTupleSlot))
192 foreach(
cl, mergeclauses)
206 elog(
ERROR,
"mergejoin clause is not an OpExpr");
226 elog(
ERROR,
"cannot merge using non-equality operator %u",
256 elog(
ERROR,
"missing support function %d(%u,%u) in opfamily %u",
465 MJ_printf(
"ExecMergeJoin: returning outer fill tuple\n");
496 MJ_printf(
"ExecMergeJoin: returning inner fill tuple\n");
540#ifdef EXEC_MERGEJOINDEBUG
547 printf(
"==== outer tuple ====\n");
559 printf(
"==== inner tuple ====\n");
571 printf(
"==== marked tuple ====\n");
581 printf(
"******** ExecMergeTupleDump ********\n");
650 MJ_printf(
"ExecMergeJoin: EXEC_MJ_INITIALIZE_OUTER\n");
680 MJ_printf(
"ExecMergeJoin: nothing in outer subplan\n");
698 MJ_printf(
"ExecMergeJoin: EXEC_MJ_INITIALIZE_INNER\n");
735 MJ_printf(
"ExecMergeJoin: nothing in inner subplan\n");
760 MJ_printf(
"ExecMergeJoin: EXEC_MJ_JOINTUPLES\n");
831 MJ_printf(
"ExecMergeJoin: returning tuple\n");
851 MJ_printf(
"ExecMergeJoin: EXEC_MJ_NEXTINNER\n");
904 elog(
ERROR,
"mergejoin input data is out of order");
952 MJ_printf(
"ExecMergeJoin: EXEC_MJ_NEXTOUTER\n");
990 MJ_printf(
"ExecMergeJoin: end of outer subplan\n");
1042 MJ_printf(
"ExecMergeJoin: EXEC_MJ_TESTOUTER\n");
1147 elog(
ERROR,
"mergejoin input data is out of order");
1180 MJ_printf(
"ExecMergeJoin: EXEC_MJ_SKIP_TEST\n");
1214 MJ_printf(
"ExecMergeJoin: EXEC_MJ_SKIPOUTER_ADVANCE\n");
1252 MJ_printf(
"ExecMergeJoin: end of outer subplan\n");
1276 MJ_printf(
"ExecMergeJoin: EXEC_MJ_SKIPINNER_ADVANCE\n");
1322 MJ_printf(
"ExecMergeJoin: end of inner subplan\n");
1344 MJ_printf(
"ExecMergeJoin: EXEC_MJ_ENDOUTER\n");
1377 MJ_printf(
"ExecMergeJoin: end of inner subplan\n");
1390 MJ_printf(
"ExecMergeJoin: EXEC_MJ_ENDINNER\n");
1419 MJ_printf(
"ExecMergeJoin: end of outer subplan\n");
1430 elog(
ERROR,
"unrecognized mergejoin state: %d",
1452 "initializing node");
1576 errmsg(
"RIGHT JOIN is only supported with merge-joinable join conditions")));
1594 errmsg(
"FULL JOIN is only supported with merge-joinable join conditions")));
1597 elog(
ERROR,
"unrecognized join type: %d",
1606 node->mergeFamilies,
1607 node->mergeCollations,
1608 node->mergeReversals,
1609 node->mergeNullsFirst,
1625 "node initialized");
1641 "ending node processing");
1650 "node processing ended");
CompareType IndexAmTranslateStrategy(StrategyNumber strategy, Oid amoid, Oid opfamily, bool missing_ok)
#define Assert(condition)
#define OidIsValid(objectId)
int errcode(int sqlerrcode)
#define ereport(elevel,...)
void ExecMarkPos(PlanState *node)
void ExecReScan(PlanState *node)
void ExecRestrPos(PlanState *node)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
ExprState * ExecInitQual(List *qual, PlanState *parent)
void ExecEndNode(PlanState *node)
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
const TupleTableSlotOps TTSOpsVirtual
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecInitNullTupleSlot(EState *estate, TupleDesc tupType, const TupleTableSlotOps *tts_ops)
TupleDesc ExecGetResultType(PlanState *planstate)
ExprContext * CreateExprContext(EState *estate)
void ExecAssignExprContext(EState *estate, PlanState *planstate)
void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc)
const TupleTableSlotOps * ExecGetResultSlotOps(PlanState *planstate, bool *isfixed)
#define MJ_DEBUG_COMPARE(res)
#define MJ_DEBUG_QUAL(clause, res)
#define MJ_DEBUG_PROC_NODE(slot)
#define MJ_debugtup(slot)
#define InstrCountFiltered1(node, delta)
#define outerPlanState(node)
#define InstrCountFiltered2(node, delta)
#define innerPlanState(node)
struct MergeJoinClauseData * MergeJoinClause
#define EXEC_FLAG_BACKWARD
static TupleTableSlot * ExecProject(ProjectionInfo *projInfo)
#define ResetExprContext(econtext)
static bool ExecQual(ExprState *state, ExprContext *econtext)
static TupleTableSlot * ExecProcNode(PlanState *node)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define OidFunctionCall1(functionId, arg1)
void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op, int *strategy, Oid *lefttype, Oid *righttype)
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
Oid get_opfamily_method(Oid opfid)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define CHECK_FOR_INTERRUPTS()
#define BTSORTSUPPORT_PROC
static MergeJoinClause MJExamineQuals(List *mergeclauses, Oid *mergefamilies, Oid *mergecollations, bool *mergereversals, bool *mergenullsfirst, PlanState *parent)
static int MJCompare(MergeJoinState *mergestate)
#define EXEC_MJ_SKIP_TEST
#define EXEC_MJ_JOINTUPLES
static TupleTableSlot * ExecMergeJoin(PlanState *pstate)
#define EXEC_MJ_SKIPOUTER_ADVANCE
#define MarkInnerTuple(innerTupleSlot, mergestate)
#define EXEC_MJ_TESTOUTER
static TupleTableSlot * MJFillOuter(MergeJoinState *node)
void ExecReScanMergeJoin(MergeJoinState *node)
static MJEvalResult MJEvalOuterValues(MergeJoinState *mergestate)
#define EXEC_MJ_INITIALIZE_OUTER
#define EXEC_MJ_SKIPINNER_ADVANCE
MergeJoinState * ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
#define EXEC_MJ_NEXTOUTER
void ExecEndMergeJoin(MergeJoinState *node)
#define EXEC_MJ_INITIALIZE_INNER
static MJEvalResult MJEvalInnerValues(MergeJoinState *mergestate, TupleTableSlot *innerslot)
#define EXEC_MJ_NEXTINNER
static TupleTableSlot * MJFillInner(MergeJoinState *node)
static bool check_constant_qual(List *qual, bool *is_const_false)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static int list_length(const List *l)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
void PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup)
static int ApplySortComparator(Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
MemoryContext ecxt_per_tuple_memory
TupleTableSlot * ecxt_innertuple
TupleTableSlot * ecxt_outertuple
TupleTableSlot * mj_MarkedTupleSlot
TupleTableSlot * mj_NullInnerTupleSlot
TupleTableSlot * mj_NullOuterTupleSlot
TupleTableSlot * mj_InnerTupleSlot
TupleTableSlot * mj_OuterTupleSlot
ExprContext * ps_ExprContext
ProjectionInfo * ps_ProjInfo
int(* comparator)(Datum x, Datum y, SortSupport ssup)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)