diff options
author | Alvaro Herrera | 2009-01-26 19:41:06 +0000 |
---|---|---|
committer | Alvaro Herrera | 2009-01-26 19:41:06 +0000 |
commit | 45ce09435f3980c277fc8551a5f221e15a8732f4 (patch) | |
tree | 1a9bf5c7614e80b804ec44cb63bf8928dcdbab1f | |
parent | ef46ae355352851e0157b8e714447b9f3d4f830c (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.
-rw-r--r-- | src/backend/access/common/reloptions.c | 47 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 31 | ||||
-rw-r--r-- | src/include/access/reloptions.h | 3 |
3 files changed, 54 insertions, 27 deletions
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 01876ff90d..f9d36ee92b 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -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. diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index e9021de332..970063586f 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -351,8 +351,6 @@ AllocateRelationDesc(Relation relation, Form_pg_class relp) static void RelationParseRelOptions(Relation relation, HeapTuple tuple) { - Datum datum; - bool isnull; bytea *options; relation->rd_options = NULL; @@ -374,31 +372,10 @@ RelationParseRelOptions(Relation relation, HeapTuple tuple) * we might not have any other for pg_class yet (consider executing this * code for pg_class itself) */ - datum = fastgetattr(tuple, - Anum_pg_class_reloptions, - GetPgClassDescriptor(), - &isnull); - if (isnull) - return; - - /* Parse into appropriate format; don't error out here */ - switch (relation->rd_rel->relkind) - { - case RELKIND_RELATION: - case RELKIND_TOASTVALUE: - case RELKIND_UNCATALOGED: - options = heap_reloptions(relation->rd_rel->relkind, datum, - false); - break; - case RELKIND_INDEX: - options = index_reloptions(relation->rd_am->amoptions, datum, - false); - break; - default: - Assert(false); /* can't get here */ - options = NULL; /* keep compiler quiet */ - break; - } + options = extractRelOptions(tuple, + GetPgClassDescriptor(), + relation->rd_rel->relkind == RELKIND_INDEX ? + relation->rd_am->amoptions : InvalidOid); /* Copy parsed data into CacheMemoryContext */ if (options) diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 393d0bb5d3..8fc10d636d 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -18,6 +18,7 @@ #ifndef RELOPTIONS_H #define RELOPTIONS_H +#include "access/htup.h" #include "nodes/pg_list.h" /* types supported by reloptions */ @@ -241,6 +242,8 @@ extern void add_string_reloption(int kind, char *name, char *desc, extern Datum transformRelOptions(Datum oldOptions, List *defList, bool ignoreOids, bool isReset); extern List *untransformRelOptions(Datum options); +extern bytea *extractRelOptions(HeapTuple tuple, TupleDesc tupdesc, + Oid amoptions); extern relopt_value *parseRelOptions(Datum options, bool validate, relopt_kind kind, int *numrelopts); extern void *allocateReloptStruct(Size base, relopt_value *options, |