diff options
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execQual.c | 86 | ||||
-rw-r--r-- | src/backend/executor/functions.c | 3 | ||||
-rw-r--r-- | src/backend/executor/nodeAgg.c | 10 | ||||
-rw-r--r-- | src/backend/executor/nodeIndexscan.c | 12 | ||||
-rw-r--r-- | src/backend/executor/nodeMergejoin.c | 2 | ||||
-rw-r--r-- | src/backend/executor/nodeSubplan.c | 6 | ||||
-rw-r--r-- | src/backend/executor/nodeWindowAgg.c | 12 |
7 files changed, 61 insertions, 70 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 0faf52dfd79..e410818900d 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -82,7 +82,7 @@ static Datum ExecEvalParamExec(ExprState *exprstate, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); static Datum ExecEvalParamExtern(ExprState *exprstate, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); -static void init_fcache(Oid foid, FuncExprState *fcache, +static void init_fcache(Oid foid, Oid input_collation, FuncExprState *fcache, MemoryContext fcacheCxt, bool needDescForSets); static void ShutdownFuncExpr(Datum arg); static TupleDesc get_cached_rowtype(Oid type_id, int32 typmod, @@ -120,9 +120,6 @@ static Datum ExecEvalAnd(BoolExprState *andExpr, ExprContext *econtext, static Datum ExecEvalConvertRowtype(ConvertRowtypeExprState *cstate, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); -static Datum ExecEvalCollateExpr(GenericExprState *exprstate, - ExprContext *econtext, - bool *isNull, ExprDoneCond *isDone); static Datum ExecEvalCase(CaseExprState *caseExpr, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); static Datum ExecEvalCaseTestExpr(ExprState *exprstate, @@ -1179,7 +1176,7 @@ GetAttributeByName(HeapTupleHeader tuple, const char *attname, bool *isNull) * init_fcache - initialize a FuncExprState node during first use */ static void -init_fcache(Oid foid, FuncExprState *fcache, +init_fcache(Oid foid, Oid input_collation, FuncExprState *fcache, MemoryContext fcacheCxt, bool needDescForSets) { AclResult aclresult; @@ -1205,7 +1202,8 @@ init_fcache(Oid foid, FuncExprState *fcache, /* Set up the primary fmgr lookup information */ fmgr_info_cxt(foid, &(fcache->func), fcacheCxt); - fmgr_info_expr((Node *) fcache->xprstate.expr, &(fcache->func)); + fmgr_info_set_collation(input_collation, &(fcache->func)); + fmgr_info_set_expr((Node *) fcache->xprstate.expr, &(fcache->func)); /* Initialize the function call parameter struct as well */ InitFunctionCallInfoData(fcache->fcinfo_data, &(fcache->func), @@ -1976,7 +1974,7 @@ ExecMakeTableFunctionResult(ExprState *funcexpr, { FuncExpr *func = (FuncExpr *) fcache->xprstate.expr; - init_fcache(func->funcid, fcache, + init_fcache(func->funcid, func->inputcollid, fcache, econtext->ecxt_per_query_memory, false); } returnsSet = fcache->func.fn_retset; @@ -2255,7 +2253,8 @@ ExecEvalFunc(FuncExprState *fcache, FuncExpr *func = (FuncExpr *) fcache->xprstate.expr; /* Initialize function lookup info */ - init_fcache(func->funcid, fcache, econtext->ecxt_per_query_memory, true); + init_fcache(func->funcid, func->inputcollid, fcache, + econtext->ecxt_per_query_memory, true); /* Go directly to ExecMakeFunctionResult on subsequent uses */ fcache->xprstate.evalfunc = (ExprStateEvalFunc) ExecMakeFunctionResult; @@ -2277,7 +2276,8 @@ ExecEvalOper(FuncExprState *fcache, OpExpr *op = (OpExpr *) fcache->xprstate.expr; /* Initialize function lookup info */ - init_fcache(op->opfuncid, fcache, econtext->ecxt_per_query_memory, true); + init_fcache(op->opfuncid, op->inputcollid, fcache, + econtext->ecxt_per_query_memory, true); /* Go directly to ExecMakeFunctionResult on subsequent uses */ fcache->xprstate.evalfunc = (ExprStateEvalFunc) ExecMakeFunctionResult; @@ -2318,7 +2318,7 @@ ExecEvalDistinct(FuncExprState *fcache, { DistinctExpr *op = (DistinctExpr *) fcache->xprstate.expr; - init_fcache(op->opfuncid, fcache, + init_fcache(op->opfuncid, op->inputcollid, fcache, econtext->ecxt_per_query_memory, true); Assert(!fcache->func.fn_retset); } @@ -2395,7 +2395,7 @@ ExecEvalScalarArrayOp(ScalarArrayOpExprState *sstate, */ if (sstate->fxprstate.func.fn_oid == InvalidOid) { - init_fcache(opexpr->opfuncid, &sstate->fxprstate, + init_fcache(opexpr->opfuncid, opexpr->inputcollid, &sstate->fxprstate, econtext->ecxt_per_query_memory, true); Assert(!sstate->fxprstate.func.fn_retset); } @@ -2754,20 +2754,6 @@ ExecEvalConvertRowtype(ConvertRowtypeExprState *cstate, } /* ---------------------------------------------------------------- - * ExecEvalCollateExpr - * - * Evaluate a CollateExpr node. - * ---------------------------------------------------------------- - */ -static Datum -ExecEvalCollateExpr(GenericExprState *exprstate, - ExprContext *econtext, - bool *isNull, ExprDoneCond *isDone) -{ - return ExecEvalExpr(exprstate->arg, econtext, isNull, isDone); -} - -/* ---------------------------------------------------------------- * ExecEvalCase * * Evaluate a CASE clause. Will have boolean expressions @@ -3542,7 +3528,7 @@ ExecEvalNullIf(FuncExprState *nullIfExpr, { NullIfExpr *op = (NullIfExpr *) nullIfExpr->xprstate.expr; - init_fcache(op->opfuncid, nullIfExpr, + init_fcache(op->opfuncid, op->inputcollid, nullIfExpr, econtext->ecxt_per_query_memory, true); Assert(!nullIfExpr->func.fn_retset); } @@ -4129,9 +4115,8 @@ ExecEvalArrayCoerceExpr(ArrayCoerceExprState *astate, /* Set up the primary fmgr lookup information */ fmgr_info_cxt(acoerce->elemfuncid, &(astate->elemfunc), econtext->ecxt_per_query_memory); - - /* Initialize additional info */ - fmgr_info_expr((Node *) acoerce, &(astate->elemfunc)); + /* Note: coercion functions are assumed to not use collation */ + fmgr_info_set_expr((Node *) acoerce, &(astate->elemfunc)); } /* @@ -4400,6 +4385,18 @@ ExecInitExpr(Expr *node, PlanState *parent) state = (ExprState *) fstate; } break; + case T_NullIfExpr: + { + NullIfExpr *nullifexpr = (NullIfExpr *) node; + FuncExprState *fstate = makeNode(FuncExprState); + + fstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalNullIf; + fstate->args = (List *) + ExecInitExpr((Expr *) nullifexpr->args, parent); + fstate->func.fn_oid = InvalidOid; /* not initialized */ + state = (ExprState *) fstate; + } + break; case T_ScalarArrayOpExpr: { ScalarArrayOpExpr *opexpr = (ScalarArrayOpExpr *) node; @@ -4551,16 +4548,6 @@ ExecInitExpr(Expr *node, PlanState *parent) state = (ExprState *) cstate; } break; - case T_CollateExpr: - { - CollateExpr *collate = (CollateExpr *) node; - GenericExprState *gstate = makeNode(GenericExprState); - - gstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalCollateExpr; - gstate->arg = ExecInitExpr(collate->arg, parent); - state = (ExprState *) gstate; - } - break; case T_CaseExpr: { CaseExpr *caseexpr = (CaseExpr *) node; @@ -4713,11 +4700,11 @@ ExecInitExpr(Expr *node, PlanState *parent) Assert(list_length(rcexpr->opfamilies) == nopers); rstate->funcs = (FmgrInfo *) palloc(nopers * sizeof(FmgrInfo)); i = 0; - forthree(l, rcexpr->opnos, l2, rcexpr->opfamilies, l3, rcexpr->collids) + forthree(l, rcexpr->opnos, l2, rcexpr->opfamilies, l3, rcexpr->inputcollids) { Oid opno = lfirst_oid(l); Oid opfamily = lfirst_oid(l2); - Oid collid = lfirst_oid(l3); + Oid inputcollid = lfirst_oid(l3); int strategy; Oid lefttype; Oid righttype; @@ -4739,7 +4726,7 @@ ExecInitExpr(Expr *node, PlanState *parent) * does this code. */ fmgr_info(proc, &(rstate->funcs[i])); - fmgr_info_collation(collid, &(rstate->funcs[i])); + fmgr_info_set_collation(inputcollid, &(rstate->funcs[i])); i++; } state = (ExprState *) rstate; @@ -4799,7 +4786,8 @@ ExecInitExpr(Expr *node, PlanState *parent) * code. */ fmgr_info(typentry->cmp_proc, &(mstate->cfunc)); - fmgr_info_collation(minmaxexpr->collid, &(mstate->cfunc)); + fmgr_info_set_collation(minmaxexpr->inputcollid, + &(mstate->cfunc)); state = (ExprState *) mstate; } break; @@ -4836,18 +4824,6 @@ ExecInitExpr(Expr *node, PlanState *parent) state = (ExprState *) xstate; } break; - case T_NullIfExpr: - { - NullIfExpr *nullifexpr = (NullIfExpr *) node; - FuncExprState *fstate = makeNode(FuncExprState); - - fstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalNullIf; - fstate->args = (List *) - ExecInitExpr((Expr *) nullifexpr->args, parent); - fstate->func.fn_oid = InvalidOid; /* not initialized */ - state = (ExprState *) fstate; - } - break; case T_NullTest: { NullTest *ntest = (NullTest *) node; diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index a2f4fac74cb..0421be57a41 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -1290,6 +1290,7 @@ check_sql_fn_retval(Oid func_id, Oid rettype, List *queryTreeList, tle->expr = (Expr *) makeRelabelType(tle->expr, rettype, -1, + get_typcollation(rettype), COERCE_DONTCARE); /* Relabel is dangerous if TLE is a sort/group or setop column */ if (tle->ressortgroupref != 0 || parse->setOperations) @@ -1335,6 +1336,7 @@ check_sql_fn_retval(Oid func_id, Oid rettype, List *queryTreeList, tle->expr = (Expr *) makeRelabelType(tle->expr, rettype, -1, + get_typcollation(rettype), COERCE_DONTCARE); /* Relabel is dangerous if sort/group or setop column */ if (tle->ressortgroupref != 0 || parse->setOperations) @@ -1437,6 +1439,7 @@ check_sql_fn_retval(Oid func_id, Oid rettype, List *queryTreeList, tle->expr = (Expr *) makeRelabelType(tle->expr, atttype, -1, + get_typcollation(atttype), COERCE_DONTCARE); /* Relabel is dangerous if sort/group or setop column */ if (tle->ressortgroupref != 0 || parse->setOperations) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index d9bed220e4a..51b1228c26f 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -1669,19 +1669,21 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) numArguments, aggtranstype, aggref->aggtype, + aggref->inputcollid, transfn_oid, finalfn_oid, - aggref->collid, &transfnexpr, &finalfnexpr); fmgr_info(transfn_oid, &peraggstate->transfn); - fmgr_info_expr((Node *) transfnexpr, &peraggstate->transfn); + fmgr_info_set_collation(aggref->inputcollid, &peraggstate->transfn); + fmgr_info_set_expr((Node *) transfnexpr, &peraggstate->transfn); if (OidIsValid(finalfn_oid)) { fmgr_info(finalfn_oid, &peraggstate->finalfn); - fmgr_info_expr((Node *) finalfnexpr, &peraggstate->finalfn); + fmgr_info_set_collation(aggref->inputcollid, &peraggstate->finalfn); + fmgr_info_set_expr((Node *) finalfnexpr, &peraggstate->finalfn); } get_typlenbyval(aggref->aggtype, @@ -1831,6 +1833,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) SortGroupClause *sortcl = (SortGroupClause *) lfirst(lc); fmgr_info(get_opcode(sortcl->eqop), &peraggstate->equalfns[i]); + fmgr_info_set_collation(aggref->inputcollid, + &peraggstate->equalfns[i]); i++; } Assert(i == numDistinctCols); diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 55fce94b321..e60db7813a4 100644 --- a/src/backend/executor/nodeIndexscan.c +++ b/src/backend/executor/nodeIndexscan.c @@ -732,7 +732,6 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, int op_strategy; /* operator's strategy number */ Oid op_lefttype; /* operator's declared input types */ Oid op_righttype; - Oid collation; Expr *leftop; /* expr on lhs of operator */ Expr *rightop; /* expr on rhs ... */ AttrNumber varattno; /* att number used in scan */ @@ -833,7 +832,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, opfuncid, /* reg proc to use */ scanvalue); /* constant */ ScanKeyEntryInitializeCollation(this_scan_key, - ((OpExpr *) clause)->collid); + ((OpExpr *) clause)->inputcollid); } else if (IsA(clause, RowCompareExpr)) { @@ -842,7 +841,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, ListCell *largs_cell = list_head(rc->largs); ListCell *rargs_cell = list_head(rc->rargs); ListCell *opnos_cell = list_head(rc->opnos); - ListCell *collids_cell = list_head(rc->collids); + ListCell *collids_cell = list_head(rc->inputcollids); ScanKey first_sub_key; int n_sub_key; @@ -858,6 +857,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, ScanKey this_sub_key = &first_sub_key[n_sub_key]; int flags = SK_ROW_MEMBER; Datum scanvalue; + Oid inputcollation; /* * leftop should be the index key Var, possibly relabeled @@ -901,7 +901,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, op_righttype, BTORDER_PROC); - collation = lfirst_oid(collids_cell); + inputcollation = lfirst_oid(collids_cell); collids_cell = lnext(collids_cell); /* @@ -960,7 +960,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, opfuncid, /* reg proc to use */ scanvalue); /* constant */ ScanKeyEntryInitializeCollation(this_sub_key, - collation); + inputcollation); n_sub_key++; } @@ -1045,7 +1045,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, Index scanrelid, opfuncid, /* reg proc to use */ (Datum) 0); /* constant */ ScanKeyEntryInitializeCollation(this_scan_key, - saop->collid); + saop->inputcollid); } else if (IsA(clause, NullTest)) { diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index c0b9f230855..75c3a645359 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -242,7 +242,7 @@ MJExamineQuals(List *mergeclauses, /* Set up the fmgr lookup information */ fmgr_info(cmpproc, &(clause->cmpfinfo)); - fmgr_info_collation(collation, &(clause->cmpfinfo)); + fmgr_info_set_collation(collation, &(clause->cmpfinfo)); /* Fill the additional comparison-strategy flags */ if (opstrategy == BTLessStrategyNumber) diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index e9b3d76df1c..08a3017e614 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -831,7 +831,9 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent) /* Lookup the equality function (potentially cross-type) */ fmgr_info(opexpr->opfuncid, &sstate->cur_eq_funcs[i - 1]); - fmgr_info_expr((Node *) opexpr, &sstate->cur_eq_funcs[i - 1]); + fmgr_info_set_collation(opexpr->inputcollid, + &sstate->cur_eq_funcs[i - 1]); + fmgr_info_set_expr((Node *) opexpr, &sstate->cur_eq_funcs[i - 1]); /* Look up the equality function for the RHS type */ if (!get_compatible_hash_operators(opexpr->opno, @@ -839,6 +841,8 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent) elog(ERROR, "could not find compatible hash operator for operator %u", opexpr->opno); fmgr_info(get_opcode(rhs_eq_oper), &sstate->tab_eq_funcs[i - 1]); + fmgr_info_set_collation(opexpr->inputcollid, + &sstate->tab_eq_funcs[i - 1]); /* Lookup the associated hash functions */ if (!get_op_hash_functions(opexpr->opno, diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 372262ad7f6..5680efeb69e 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -1561,7 +1561,9 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) fmgr_info_cxt(wfunc->winfnoid, &perfuncstate->flinfo, econtext->ecxt_per_query_memory); - fmgr_info_expr((Node *) wfunc, &perfuncstate->flinfo); + fmgr_info_set_collation(wfunc->inputcollid, &perfuncstate->flinfo); + fmgr_info_set_expr((Node *) wfunc, &perfuncstate->flinfo); + get_typlenbyval(wfunc->wintype, &perfuncstate->resulttypeLen, &perfuncstate->resulttypeByVal); @@ -1792,19 +1794,21 @@ initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc, numArguments, aggtranstype, wfunc->wintype, + wfunc->inputcollid, transfn_oid, finalfn_oid, - wfunc->collid, &transfnexpr, &finalfnexpr); fmgr_info(transfn_oid, &peraggstate->transfn); - fmgr_info_expr((Node *) transfnexpr, &peraggstate->transfn); + fmgr_info_set_collation(wfunc->inputcollid, &peraggstate->transfn); + fmgr_info_set_expr((Node *) transfnexpr, &peraggstate->transfn); if (OidIsValid(finalfn_oid)) { fmgr_info(finalfn_oid, &peraggstate->finalfn); - fmgr_info_expr((Node *) finalfnexpr, &peraggstate->finalfn); + fmgr_info_set_collation(wfunc->inputcollid, &peraggstate->finalfn); + fmgr_info_set_expr((Node *) finalfnexpr, &peraggstate->finalfn); } get_typlenbyval(wfunc->wintype, |