diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2009-01-26 19:41:06 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2009-01-26 19:41:06 +0000 |
commit | c0f92b57dc91126248d80462ac31497c091a9939 (patch) | |
tree | 82a3eb05df0727db304bfcad4f0bec9fecb8f5e5 /src/backend/access/common/reloptions.c | |
parent | 39ab3c1c618e00a185f6a24b5dee602d2c63f9fe (diff) |
Allow extracting and parsing of reloptions from a bare pg_class tuple, and
refactor the relcache code that used to do that. This allows other callers
(particularly autovacuum) to do the same without necessarily having to open
and lock a table.
Diffstat (limited to 'src/backend/access/common/reloptions.c')
-rw-r--r-- | src/backend/access/common/reloptions.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 46e2d00bc64..105514be9dd 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.18 2009/01/12 21:02:14 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.19 2009/01/26 19:41:06 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -558,6 +558,53 @@ untransformRelOptions(Datum options) return result; } +/* + * Extract and parse reloptions from a pg_class tuple. + * + * This is a low-level routine, expected to be used by relcache code and + * callers that do not have a table's relcache entry (e.g. autovacuum). For + * other uses, consider grabbing the rd_options pointer from the relcache entry + * instead. + * + * tupdesc is pg_class' tuple descriptor. amoptions is the amoptions regproc + * in the case of the tuple corresponding to an index, or InvalidOid otherwise. + */ +bytea * +extractRelOptions(HeapTuple tuple, TupleDesc tupdesc, Oid amoptions) +{ + bytea *options; + bool isnull; + Datum datum; + Form_pg_class classForm; + + datum = fastgetattr(tuple, + Anum_pg_class_reloptions, + tupdesc, + &isnull); + if (isnull) + return NULL; + + classForm = (Form_pg_class) GETSTRUCT(tuple); + + /* Parse into appropriate format; don't error out here */ + switch (classForm->relkind) + { + case RELKIND_RELATION: + case RELKIND_TOASTVALUE: + case RELKIND_UNCATALOGED: + options = heap_reloptions(classForm->relkind, datum, false); + break; + case RELKIND_INDEX: + options = index_reloptions(amoptions, datum, false); + break; + default: + Assert(false); /* can't get here */ + options = NULL; /* keep compiler quiet */ + break; + } + + return options; +} /* * Interpret reloptions that are given in text-array format. |