aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2024-09-07 20:20:46 +0900
committerMichael Paquier <michael@paquier.xyz>2024-09-07 20:20:46 +0900
commitd8df7ac5c04cd17bf13bd3123dcfcaf8007c6280 (patch)
tree417660608b8fec27f28d0939fe523ccf3e394dbc /src
parent51edc4ca54f826cfac012c7306eee479f07a5dc7 (diff)
downloadpostgresql-d8df7ac5c04cd17bf13bd3123dcfcaf8007c6280.tar.gz
postgresql-d8df7ac5c04cd17bf13bd3123dcfcaf8007c6280.zip
Update extension lookup routines to use the syscache
The following routines are changed to use the syscache entries added for pg_extension in 490f869d92e5: - get_extension_oid() - get_extension_name() - get_extension_schema() A catalog scan is costly and could easily lead to a noticeable performance impact when called once or more per query, so this is going to be helpful for developers for extension data lookups. Author: Andrei Lepikhov Reviewed-by: Jelte Fennema-Nio Discussion: https://postgr.es/m/529295b2-6ba9-4dae-acd1-20a9c6fb8f9a@gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/extension.c82
1 files changed, 13 insertions, 69 deletions
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 1643c8c69a0..fab59ad5f66 100644
--- a/src/backend/commands/extension.c
+++ b/src/backend/commands/extension.c
@@ -64,6 +64,7 @@
#include "utils/memutils.h"
#include "utils/rel.h"
#include "utils/snapmgr.h"
+#include "utils/syscache.h"
#include "utils/varlena.h"
@@ -145,32 +146,9 @@ Oid
get_extension_oid(const char *extname, bool missing_ok)
{
Oid result;
- Relation rel;
- SysScanDesc scandesc;
- HeapTuple tuple;
- ScanKeyData entry[1];
-
- rel = table_open(ExtensionRelationId, AccessShareLock);
-
- ScanKeyInit(&entry[0],
- Anum_pg_extension_extname,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(extname));
- scandesc = systable_beginscan(rel, ExtensionNameIndexId, true,
- NULL, 1, entry);
-
- tuple = systable_getnext(scandesc);
-
- /* We assume that there can be at most one matching tuple */
- if (HeapTupleIsValid(tuple))
- result = ((Form_pg_extension) GETSTRUCT(tuple))->oid;
- else
- result = InvalidOid;
-
- systable_endscan(scandesc);
-
- table_close(rel, AccessShareLock);
+ result = GetSysCacheOid1(EXTENSIONNAME, Anum_pg_extension_oid,
+ CStringGetDatum(extname));
if (!OidIsValid(result) && !missing_ok)
ereport(ERROR,
@@ -190,32 +168,15 @@ char *
get_extension_name(Oid ext_oid)
{
char *result;
- Relation rel;
- SysScanDesc scandesc;
HeapTuple tuple;
- ScanKeyData entry[1];
- rel = table_open(ExtensionRelationId, AccessShareLock);
+ tuple = SearchSysCache1(EXTENSIONOID, ObjectIdGetDatum(ext_oid));
- ScanKeyInit(&entry[0],
- Anum_pg_extension_oid,
- BTEqualStrategyNumber, F_OIDEQ,
- ObjectIdGetDatum(ext_oid));
+ if (!HeapTupleIsValid(tuple))
+ return NULL;
- scandesc = systable_beginscan(rel, ExtensionOidIndexId, true,
- NULL, 1, entry);
-
- tuple = systable_getnext(scandesc);
-
- /* We assume that there can be at most one matching tuple */
- if (HeapTupleIsValid(tuple))
- result = pstrdup(NameStr(((Form_pg_extension) GETSTRUCT(tuple))->extname));
- else
- result = NULL;
-
- systable_endscan(scandesc);
-
- table_close(rel, AccessShareLock);
+ result = pstrdup(NameStr(((Form_pg_extension) GETSTRUCT(tuple))->extname));
+ ReleaseSysCache(tuple);
return result;
}
@@ -229,32 +190,15 @@ Oid
get_extension_schema(Oid ext_oid)
{
Oid result;
- Relation rel;
- SysScanDesc scandesc;
HeapTuple tuple;
- ScanKeyData entry[1];
-
- rel = table_open(ExtensionRelationId, AccessShareLock);
- ScanKeyInit(&entry[0],
- Anum_pg_extension_oid,
- BTEqualStrategyNumber, F_OIDEQ,
- ObjectIdGetDatum(ext_oid));
+ tuple = SearchSysCache1(EXTENSIONOID, ObjectIdGetDatum(ext_oid));
- scandesc = systable_beginscan(rel, ExtensionOidIndexId, true,
- NULL, 1, entry);
-
- tuple = systable_getnext(scandesc);
-
- /* We assume that there can be at most one matching tuple */
- if (HeapTupleIsValid(tuple))
- result = ((Form_pg_extension) GETSTRUCT(tuple))->extnamespace;
- else
- result = InvalidOid;
-
- systable_endscan(scandesc);
+ if (!HeapTupleIsValid(tuple))
+ return InvalidOid;
- table_close(rel, AccessShareLock);
+ result = ((Form_pg_extension) GETSTRUCT(tuple))->extnamespace;
+ ReleaseSysCache(tuple);
return result;
}