diff options
author | Michael Paquier <michael@paquier.xyz> | 2020-07-15 09:03:10 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2020-07-15 09:03:10 +0900 |
commit | 2a10fdc4307a667883f7a3369cb93a721ade9680 (patch) | |
tree | 634b6964507faa666395bef8542be4c5c7eef5f4 /src/backend/utils/adt/regproc.c | |
parent | 689696c7110f148ede8004aae50d7543d05b5587 (diff) | |
download | postgresql-2a10fdc4307a667883f7a3369cb93a721ade9680.tar.gz postgresql-2a10fdc4307a667883f7a3369cb93a721ade9680.zip |
Eliminate cache lookup errors in SQL functions for object addresses
When using the following functions, users could see various types of
errors of the type "cache lookup failed for OID XXX" with elog(), that
can only be used for internal errors:
* pg_describe_object()
* pg_identify_object()
* pg_identify_object_as_address()
The set of APIs managing object addresses for all object types are made
smarter by gaining a new argument "missing_ok" that allows any caller to
control if an error is raised or not on an undefined object. The SQL
functions listed above are changed to handle the case where an object is
missing.
Regression tests are added for all object types for the cases where
these are undefined. Before this commit, these cases failed with cache
lookup errors, and now they basically return NULL (minus the name of the
object type requested).
Author: Michael Paquier
Reviewed-by: Aleksander Alekseev, Dmitry Dolgov, Daniel Gustafsson,
Álvaro Herrera, Kyotaro Horiguchi
Discussion: https://postgr.es/m/CAB7nPqSZxrSmdHK-rny7z8mi=EAFXJ5J-0RbzDw6aus=wB5azQ@mail.gmail.com
Diffstat (limited to 'src/backend/utils/adt/regproc.c')
-rw-r--r-- | src/backend/utils/adt/regproc.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index b41189db5c1..6c1ee9c92df 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -418,7 +418,8 @@ format_procedure_extended(Oid procedure_oid, bits16 flags) * This can be used to feed get_object_address. */ void -format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs) +format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs, + bool missing_ok) { HeapTuple proctup; Form_pg_proc procform; @@ -428,7 +429,11 @@ format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs) proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procedure_oid)); if (!HeapTupleIsValid(proctup)) - elog(ERROR, "cache lookup failed for procedure with OID %u", procedure_oid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for procedure with OID %u", procedure_oid); + return; + } procform = (Form_pg_proc) GETSTRUCT(proctup); nargs = procform->pronargs; @@ -856,15 +861,20 @@ format_operator_qualified(Oid operator_oid) } void -format_operator_parts(Oid operator_oid, List **objnames, List **objargs) +format_operator_parts(Oid operator_oid, List **objnames, List **objargs, + bool missing_ok) { HeapTuple opertup; Form_pg_operator oprForm; opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operator_oid)); if (!HeapTupleIsValid(opertup)) - elog(ERROR, "cache lookup failed for operator with OID %u", - operator_oid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for operator with OID %u", + operator_oid); + return; + } oprForm = (Form_pg_operator) GETSTRUCT(opertup); *objnames = list_make2(get_namespace_name_or_temp(oprForm->oprnamespace), |