Fold FindConversion() into FindConversionByName() and remove ACL check.
All callers of FindConversionByName() already do suitable permissions checking already apart from this function, but this is not just dead code removal: the unnecessary permissions check can actually lead to spurious failures - there's no reason why inability to execute the underlying function should prohibit renaming the conversion, for example. (The error messages in these cases were also rather poor: FindConversion would return InvalidOid, eventually leading to a complaint that the conversion "did not exist", which was not correct.) KaiGai Kohei
This commit is contained in:
parent
4d32f6d7bf
commit
d8db6a6096
|
@ -13,7 +13,7 @@
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.121 2010/01/02 16:57:36 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.122 2010/02/02 18:52:33 rhaas Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -2836,7 +2836,10 @@ FindConversionByName(List *name)
|
||||||
{
|
{
|
||||||
/* use exact schema given */
|
/* use exact schema given */
|
||||||
namespaceId = LookupExplicitNamespace(schemaname);
|
namespaceId = LookupExplicitNamespace(schemaname);
|
||||||
return FindConversion(conversion_name, namespaceId);
|
return GetSysCacheOid(CONNAMENSP,
|
||||||
|
PointerGetDatum(conversion_name),
|
||||||
|
ObjectIdGetDatum(namespaceId),
|
||||||
|
0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2850,7 +2853,10 @@ FindConversionByName(List *name)
|
||||||
if (namespaceId == myTempNamespace)
|
if (namespaceId == myTempNamespace)
|
||||||
continue; /* do not look in temp namespace */
|
continue; /* do not look in temp namespace */
|
||||||
|
|
||||||
conoid = FindConversion(conversion_name, namespaceId);
|
conoid = GetSysCacheOid(CONNAMENSP,
|
||||||
|
PointerGetDatum(conversion_name),
|
||||||
|
ObjectIdGetDatum(namespaceId),
|
||||||
|
0, 0);
|
||||||
if (OidIsValid(conoid))
|
if (OidIsValid(conoid))
|
||||||
return conoid;
|
return conoid;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.48 2010/01/02 16:57:36 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.49 2010/02/02 18:52:33 rhaas Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -209,38 +209,3 @@ FindDefaultConversion(Oid name_space, int32 for_encoding, int32 to_encoding)
|
||||||
ReleaseSysCacheList(catlist);
|
ReleaseSysCacheList(catlist);
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* FindConversion
|
|
||||||
*
|
|
||||||
* Find conversion by namespace and conversion name.
|
|
||||||
* Returns conversion OID.
|
|
||||||
*/
|
|
||||||
Oid
|
|
||||||
FindConversion(const char *conname, Oid connamespace)
|
|
||||||
{
|
|
||||||
HeapTuple tuple;
|
|
||||||
Oid procoid;
|
|
||||||
Oid conoid;
|
|
||||||
AclResult aclresult;
|
|
||||||
|
|
||||||
/* search pg_conversion by connamespace and conversion name */
|
|
||||||
tuple = SearchSysCache(CONNAMENSP,
|
|
||||||
PointerGetDatum(conname),
|
|
||||||
ObjectIdGetDatum(connamespace),
|
|
||||||
0, 0);
|
|
||||||
if (!HeapTupleIsValid(tuple))
|
|
||||||
return InvalidOid;
|
|
||||||
|
|
||||||
procoid = ((Form_pg_conversion) GETSTRUCT(tuple))->conproc;
|
|
||||||
conoid = HeapTupleGetOid(tuple);
|
|
||||||
|
|
||||||
ReleaseSysCache(tuple);
|
|
||||||
|
|
||||||
/* Check we have execute rights for the function */
|
|
||||||
aclresult = pg_proc_aclcheck(procoid, GetUserId(), ACL_EXECUTE);
|
|
||||||
if (aclresult != ACLCHECK_OK)
|
|
||||||
return InvalidOid;
|
|
||||||
|
|
||||||
return conoid;
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/catalog/pg_conversion_fn.h,v 1.5 2010/01/02 16:58:01 momjian Exp $
|
* $PostgreSQL: pgsql/src/include/catalog/pg_conversion_fn.h,v 1.6 2010/02/02 18:52:33 rhaas Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -19,7 +19,6 @@ extern Oid ConversionCreate(const char *conname, Oid connamespace,
|
||||||
int32 conforencoding, int32 contoencoding,
|
int32 conforencoding, int32 contoencoding,
|
||||||
Oid conproc, bool def);
|
Oid conproc, bool def);
|
||||||
extern void RemoveConversionById(Oid conversionOid);
|
extern void RemoveConversionById(Oid conversionOid);
|
||||||
extern Oid FindConversion(const char *conname, Oid connamespace);
|
|
||||||
extern Oid FindDefaultConversion(Oid connamespace, int32 for_encoding, int32 to_encoding);
|
extern Oid FindDefaultConversion(Oid connamespace, int32 for_encoding, int32 to_encoding);
|
||||||
|
|
||||||
#endif /* PG_CONVERSION_FN_H */
|
#endif /* PG_CONVERSION_FN_H */
|
||||||
|
|
Loading…
Reference in New Issue