diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-04-12 19:19:24 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-04-12 19:19:24 -0400 |
commit | d64713df7e5996ab3ab337b5e0901cf2c53773f9 (patch) | |
tree | 7105a61bf9fef5cef674cea7f1305dfeb77aa39a /src/backend/commands | |
parent | 88543ecfec9c754b5f14b898bccbc68d941748b3 (diff) | |
download | postgresql-d64713df7e5996ab3ab337b5e0901cf2c53773f9.tar.gz postgresql-d64713df7e5996ab3ab337b5e0901cf2c53773f9.zip |
Pass collations to functions in FunctionCallInfoData, not FmgrInfo.
Since collation is effectively an argument, not a property of the function,
FmgrInfo is really the wrong place for it; and this becomes critical in
cases where a cached FmgrInfo is used for varying purposes that might need
different collation settings. Fix by passing it in FunctionCallInfoData
instead. In particular this allows a clean fix for bug #5970 (record_cmp
not working). This requires touching a bit more code than the original
method, but nobody ever thought that collations would not be an invasive
patch...
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/analyze.c | 11 | ||||
-rw-r--r-- | src/backend/commands/trigger.c | 3 | ||||
-rw-r--r-- | src/backend/commands/tsearchcmds.c | 7 |
3 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index dde301b89aa..0568a1bcf86 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -1930,8 +1930,6 @@ compute_minimal_stats(VacAttrStatsP stats, track_cnt = 0; fmgr_info(mystats->eqfunc, &f_cmpeq); - /* We always use the default collation for statistics */ - fmgr_info_set_collation(DEFAULT_COLLATION_OID, &f_cmpeq); for (i = 0; i < samplerows; i++) { @@ -1990,7 +1988,10 @@ compute_minimal_stats(VacAttrStatsP stats, firstcount1 = track_cnt; for (j = 0; j < track_cnt; j++) { - if (DatumGetBool(FunctionCall2(&f_cmpeq, value, track[j].value))) + /* We always use the default collation for statistics */ + if (DatumGetBool(FunctionCall2Coll(&f_cmpeq, + DEFAULT_COLLATION_OID, + value, track[j].value))) { match = true; break; @@ -2253,8 +2254,6 @@ compute_scalar_stats(VacAttrStatsP stats, SelectSortFunction(mystats->ltopr, false, &cmpFn, &cmpFlags); fmgr_info(cmpFn, &f_cmpfn); - /* We always use the default collation for statistics */ - fmgr_info_set_collation(DEFAULT_COLLATION_OID, &f_cmpfn); /* Initial scan to find sortable values */ for (i = 0; i < samplerows; i++) @@ -2729,7 +2728,9 @@ compare_scalars(const void *a, const void *b, void *arg) CompareScalarsContext *cxt = (CompareScalarsContext *) arg; int32 compare; + /* We always use the default collation for statistics */ compare = ApplySortFunction(cxt->cmpFn, cxt->cmpFlags, + DEFAULT_COLLATION_OID, da, false, db, false); if (compare != 0) return compare; diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 6b1ade89903..ce36ea8be45 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -1822,7 +1822,8 @@ ExecCallTriggerFunc(TriggerData *trigdata, /* * Call the function, passing no arguments but setting a context. */ - InitFunctionCallInfoData(fcinfo, finfo, 0, (Node *) trigdata, NULL); + InitFunctionCallInfoData(fcinfo, finfo, 0, + InvalidOid, (Node *) trigdata, NULL); pgstat_init_function_usage(&fcinfo, &fcusage); diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index ce0086ffa17..d08c9bbbc5c 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -96,6 +96,11 @@ get_ts_parser_func(DefElem *defel, int attnum) break; case Anum_pg_ts_parser_prslextype: nargs = 1; + /* + * Note: because the lextype method returns type internal, it must + * have an internal-type argument for security reasons. The + * argument is not actually used, but is just passed as a zero. + */ break; default: /* should not be here */ @@ -1947,7 +1952,7 @@ getTokenTypes(Oid prsId, List *tokennames) elog(ERROR, "method lextype isn't defined for text search parser %u", prsId); - /* OidFunctionCall0 is absent */ + /* lextype takes one dummy argument */ list = (LexDescr *) DatumGetPointer(OidFunctionCall1(prs->lextypeOid, (Datum) 0)); |