Skip to content

Commit d8df7ac

Browse files
committed
Update extension lookup routines to use the syscache
The following routines are changed to use the syscache entries added for pg_extension in 490f869: - 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
1 parent 51edc4c commit d8df7ac

File tree

1 file changed

+13
-69
lines changed

1 file changed

+13
-69
lines changed

src/backend/commands/extension.c

Lines changed: 13 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
#include "utils/memutils.h"
6565
#include "utils/rel.h"
6666
#include "utils/snapmgr.h"
67+
#include "utils/syscache.h"
6768
#include "utils/varlena.h"
6869

6970

@@ -145,32 +146,9 @@ Oid
145146
get_extension_oid(const char *extname, bool missing_ok)
146147
{
147148
Oid result;
148-
Relation rel;
149-
SysScanDesc scandesc;
150-
HeapTuple tuple;
151-
ScanKeyData entry[1];
152-
153-
rel = table_open(ExtensionRelationId, AccessShareLock);
154-
155-
ScanKeyInit(&entry[0],
156-
Anum_pg_extension_extname,
157-
BTEqualStrategyNumber, F_NAMEEQ,
158-
CStringGetDatum(extname));
159149

160-
scandesc = systable_beginscan(rel, ExtensionNameIndexId, true,
161-
NULL, 1, entry);
162-
163-
tuple = systable_getnext(scandesc);
164-
165-
/* We assume that there can be at most one matching tuple */
166-
if (HeapTupleIsValid(tuple))
167-
result = ((Form_pg_extension) GETSTRUCT(tuple))->oid;
168-
else
169-
result = InvalidOid;
170-
171-
systable_endscan(scandesc);
172-
173-
table_close(rel, AccessShareLock);
150+
result = GetSysCacheOid1(EXTENSIONNAME, Anum_pg_extension_oid,
151+
CStringGetDatum(extname));
174152

175153
if (!OidIsValid(result) && !missing_ok)
176154
ereport(ERROR,
@@ -190,32 +168,15 @@ char *
190168
get_extension_name(Oid ext_oid)
191169
{
192170
char *result;
193-
Relation rel;
194-
SysScanDesc scandesc;
195171
HeapTuple tuple;
196-
ScanKeyData entry[1];
197172

198-
rel = table_open(ExtensionRelationId, AccessShareLock);
173+
tuple = SearchSysCache1(EXTENSIONOID, ObjectIdGetDatum(ext_oid));
199174

200-
ScanKeyInit(&entry[0],
201-
Anum_pg_extension_oid,
202-
BTEqualStrategyNumber, F_OIDEQ,
203-
ObjectIdGetDatum(ext_oid));
175+
if (!HeapTupleIsValid(tuple))
176+
return NULL;
204177

205-
scandesc = systable_beginscan(rel, ExtensionOidIndexId, true,
206-
NULL, 1, entry);
207-
208-
tuple = systable_getnext(scandesc);
209-
210-
/* We assume that there can be at most one matching tuple */
211-
if (HeapTupleIsValid(tuple))
212-
result = pstrdup(NameStr(((Form_pg_extension) GETSTRUCT(tuple))->extname));
213-
else
214-
result = NULL;
215-
216-
systable_endscan(scandesc);
217-
218-
table_close(rel, AccessShareLock);
178+
result = pstrdup(NameStr(((Form_pg_extension) GETSTRUCT(tuple))->extname));
179+
ReleaseSysCache(tuple);
219180

220181
return result;
221182
}
@@ -229,32 +190,15 @@ Oid
229190
get_extension_schema(Oid ext_oid)
230191
{
231192
Oid result;
232-
Relation rel;
233-
SysScanDesc scandesc;
234193
HeapTuple tuple;
235-
ScanKeyData entry[1];
236-
237-
rel = table_open(ExtensionRelationId, AccessShareLock);
238194

239-
ScanKeyInit(&entry[0],
240-
Anum_pg_extension_oid,
241-
BTEqualStrategyNumber, F_OIDEQ,
242-
ObjectIdGetDatum(ext_oid));
195+
tuple = SearchSysCache1(EXTENSIONOID, ObjectIdGetDatum(ext_oid));
243196

244-
scandesc = systable_beginscan(rel, ExtensionOidIndexId, true,
245-
NULL, 1, entry);
246-
247-
tuple = systable_getnext(scandesc);
248-
249-
/* We assume that there can be at most one matching tuple */
250-
if (HeapTupleIsValid(tuple))
251-
result = ((Form_pg_extension) GETSTRUCT(tuple))->extnamespace;
252-
else
253-
result = InvalidOid;
254-
255-
systable_endscan(scandesc);
197+
if (!HeapTupleIsValid(tuple))
198+
return InvalidOid;
256199

257-
table_close(rel, AccessShareLock);
200+
result = ((Form_pg_extension) GETSTRUCT(tuple))->extnamespace;
201+
ReleaseSysCache(tuple);
258202

259203
return result;
260204
}

0 commit comments

Comments
 (0)