Thanks to visit codestin.com
Credit goes to github.com

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/[email protected]
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)