diff options
Diffstat (limited to 'src/backend/executor/execExpr.c')
-rw-r--r-- | src/backend/executor/execExpr.c | 134 |
1 files changed, 0 insertions, 134 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 23c0fb9379b..e33231f7be8 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -3696,137 +3696,3 @@ ExecBuildGroupingEqual(TupleDesc ldesc, TupleDesc rdesc, return state; } - -/* - * Build equality expression that can be evaluated using ExecQual(), returning - * true if the expression context's inner/outer tuples are equal. Datums in - * the inner/outer slots are assumed to be in the same order and quantity as - * the 'eqfunctions' parameter. NULLs are treated as equal. - * - * desc: tuple descriptor of the to-be-compared tuples - * lops: the slot ops for the inner tuple slots - * rops: the slot ops for the outer tuple slots - * eqFunctions: array of function oids of the equality functions to use - * this must be the same length as the 'param_exprs' list. - * collations: collation Oids to use for equality comparison. Must be the - * same length as the 'param_exprs' list. - * parent: parent executor node - */ -ExprState * -ExecBuildParamSetEqual(TupleDesc desc, - const TupleTableSlotOps *lops, - const TupleTableSlotOps *rops, - const Oid *eqfunctions, - const Oid *collations, - const List *param_exprs, - PlanState *parent) -{ - ExprState *state = makeNode(ExprState); - ExprEvalStep scratch = {0}; - int maxatt = list_length(param_exprs); - List *adjust_jumps = NIL; - ListCell *lc; - - state->expr = NULL; - state->flags = EEO_FLAG_IS_QUAL; - state->parent = parent; - - scratch.resvalue = &state->resvalue; - scratch.resnull = &state->resnull; - - /* push deform steps */ - scratch.opcode = EEOP_INNER_FETCHSOME; - scratch.d.fetch.last_var = maxatt; - scratch.d.fetch.fixed = false; - scratch.d.fetch.known_desc = desc; - scratch.d.fetch.kind = lops; - if (ExecComputeSlotInfo(state, &scratch)) - ExprEvalPushStep(state, &scratch); - - scratch.opcode = EEOP_OUTER_FETCHSOME; - scratch.d.fetch.last_var = maxatt; - scratch.d.fetch.fixed = false; - scratch.d.fetch.known_desc = desc; - scratch.d.fetch.kind = rops; - if (ExecComputeSlotInfo(state, &scratch)) - ExprEvalPushStep(state, &scratch); - - for (int attno = 0; attno < maxatt; attno++) - { - Form_pg_attribute att = TupleDescAttr(desc, attno); - Oid foid = eqfunctions[attno]; - Oid collid = collations[attno]; - FmgrInfo *finfo; - FunctionCallInfo fcinfo; - AclResult aclresult; - - /* Check permission to call function */ - aclresult = pg_proc_aclcheck(foid, GetUserId(), ACL_EXECUTE); - if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, OBJECT_FUNCTION, get_func_name(foid)); - - InvokeFunctionExecuteHook(foid); - - /* Set up the primary fmgr lookup information */ - finfo = palloc0(sizeof(FmgrInfo)); - fcinfo = palloc0(SizeForFunctionCallInfo(2)); - fmgr_info(foid, finfo); - fmgr_info_set_expr(NULL, finfo); - InitFunctionCallInfoData(*fcinfo, finfo, 2, - collid, NULL, NULL); - - /* left arg */ - scratch.opcode = EEOP_INNER_VAR; - scratch.d.var.attnum = attno; - scratch.d.var.vartype = att->atttypid; - scratch.resvalue = &fcinfo->args[0].value; - scratch.resnull = &fcinfo->args[0].isnull; - ExprEvalPushStep(state, &scratch); - - /* right arg */ - scratch.opcode = EEOP_OUTER_VAR; - scratch.d.var.attnum = attno; - scratch.d.var.vartype = att->atttypid; - scratch.resvalue = &fcinfo->args[1].value; - scratch.resnull = &fcinfo->args[1].isnull; - ExprEvalPushStep(state, &scratch); - - /* evaluate distinctness */ - scratch.opcode = EEOP_NOT_DISTINCT; - scratch.d.func.finfo = finfo; - scratch.d.func.fcinfo_data = fcinfo; - scratch.d.func.fn_addr = finfo->fn_addr; - scratch.d.func.nargs = 2; - scratch.resvalue = &state->resvalue; - scratch.resnull = &state->resnull; - ExprEvalPushStep(state, &scratch); - - /* then emit EEOP_QUAL to detect if result is false (or null) */ - scratch.opcode = EEOP_QUAL; - scratch.d.qualexpr.jumpdone = -1; - scratch.resvalue = &state->resvalue; - scratch.resnull = &state->resnull; - ExprEvalPushStep(state, &scratch); - adjust_jumps = lappend_int(adjust_jumps, - state->steps_len - 1); - } - - /* adjust jump targets */ - foreach(lc, adjust_jumps) - { - ExprEvalStep *as = &state->steps[lfirst_int(lc)]; - - Assert(as->opcode == EEOP_QUAL); - Assert(as->d.qualexpr.jumpdone == -1); - as->d.qualexpr.jumpdone = state->steps_len; - } - - scratch.resvalue = NULL; - scratch.resnull = NULL; - scratch.opcode = EEOP_DONE; - ExprEvalPushStep(state, &scratch); - - ExecReadyExpr(state); - - return state; -} |