summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2009-01-26 19:41:06 +0000
committerAlvaro Herrera2009-01-26 19:41:06 +0000
commit45ce09435f3980c277fc8551a5f221e15a8732f4 (patch)
tree1a9bf5c7614e80b804ec44cb63bf8928dcdbab1f
parentef46ae355352851e0157b8e714447b9f3d4f830c (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.c47
-rw-r--r--src/backend/utils/cache/relcache.c31
-rw-r--r--src/include/access/reloptions.h3
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,