aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/common/reloptions.c42
-rw-r--r--src/backend/commands/tablecmds.c9
-rw-r--r--src/include/access/reloptions.h1
-rw-r--r--src/include/utils/rel.h52
-rw-r--r--src/tools/pgindent/typedefs.list1
5 files changed, 76 insertions, 29 deletions
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 522b671993e..c7ad6f96f86 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -834,10 +834,12 @@ extractRelOptions(HeapTuple tuple, TupleDesc tupdesc, Oid amoptions)
{
case RELKIND_RELATION:
case RELKIND_TOASTVALUE:
- case RELKIND_VIEW:
case RELKIND_MATVIEW:
options = heap_reloptions(classForm->relkind, datum, false);
break;
+ case RELKIND_VIEW:
+ options = view_reloptions(datum, false);
+ break;
case RELKIND_INDEX:
options = index_reloptions(amoptions, datum, false);
break;
@@ -1200,10 +1202,6 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
offsetof(StdRdOptions, autovacuum) +offsetof(AutoVacOpts, vacuum_scale_factor)},
{"autovacuum_analyze_scale_factor", RELOPT_TYPE_REAL,
offsetof(StdRdOptions, autovacuum) +offsetof(AutoVacOpts, analyze_scale_factor)},
- {"security_barrier", RELOPT_TYPE_BOOL,
- offsetof(StdRdOptions, security_barrier)},
- {"check_option", RELOPT_TYPE_STRING,
- offsetof(StdRdOptions, check_option_offset)},
{"user_catalog_table", RELOPT_TYPE_BOOL,
offsetof(StdRdOptions, user_catalog_table)}
};
@@ -1225,6 +1223,38 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
}
/*
+ * Option parser for views
+ */
+bytea *
+view_reloptions(Datum reloptions, bool validate)
+{
+ relopt_value *options;
+ ViewOptions *vopts;
+ int numoptions;
+ static const relopt_parse_elt tab[] = {
+ {"security_barrier", RELOPT_TYPE_BOOL,
+ offsetof(ViewOptions, security_barrier)},
+ {"check_option", RELOPT_TYPE_STRING,
+ offsetof(ViewOptions, check_option_offset)}
+ };
+
+ options = parseRelOptions(reloptions, validate, RELOPT_KIND_VIEW, &numoptions);
+
+ /* if none set, we're done */
+ if (numoptions == 0)
+ return NULL;
+
+ vopts = allocateReloptStruct(sizeof(ViewOptions), options, numoptions);
+
+ fillRelOptions((void *) vopts, sizeof(ViewOptions), options, numoptions,
+ validate, tab, lengthof(tab));
+
+ pfree(options);
+
+ return (bytea *) vopts;
+}
+
+/*
* Parse options for heaps, views and toast tables.
*/
bytea *
@@ -1248,8 +1278,6 @@ heap_reloptions(char relkind, Datum reloptions, bool validate)
case RELKIND_RELATION:
case RELKIND_MATVIEW:
return default_reloptions(reloptions, validate, RELOPT_KIND_HEAP);
- case RELKIND_VIEW:
- return default_reloptions(reloptions, validate, RELOPT_KIND_VIEW);
default:
/* other relkinds are not supported */
return NULL;
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 60d387a5e6c..5dc4d18b6a5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -533,7 +533,10 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId)
reloptions = transformRelOptions((Datum) 0, stmt->options, NULL, validnsps,
true, false);
- (void) heap_reloptions(relkind, reloptions, true);
+ if (relkind == RELKIND_VIEW)
+ (void) view_reloptions(reloptions, true);
+ else
+ (void) heap_reloptions(relkind, reloptions, true);
if (stmt->ofTypename)
{
@@ -8889,10 +8892,12 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
{
case RELKIND_RELATION:
case RELKIND_TOASTVALUE:
- case RELKIND_VIEW:
case RELKIND_MATVIEW:
(void) heap_reloptions(rel->rd_rel->relkind, newOptions, true);
break;
+ case RELKIND_VIEW:
+ (void) view_reloptions(newOptions, true);
+ break;
case RELKIND_INDEX:
(void) index_reloptions(rel->rd_am->amoptions, newOptions, true);
break;
diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h
index 81ff3286cf2..c22644841f9 100644
--- a/src/include/access/reloptions.h
+++ b/src/include/access/reloptions.h
@@ -268,6 +268,7 @@ extern void fillRelOptions(void *rdopts, Size basesize,
extern bytea *default_reloptions(Datum reloptions, bool validate,
relopt_kind kind);
extern bytea *heap_reloptions(char relkind, Datum reloptions, bool validate);
+extern bytea *view_reloptions(Datum reloptions, bool validate);
extern bytea *index_reloptions(RegProcedure amoptions, Datum reloptions,
bool validate);
extern bytea *attribute_reloptions(Datum reloptions, bool validate);
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index af4f53f1121..37b6cbbb4d0 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -216,8 +216,6 @@ typedef struct StdRdOptions
int32 vl_len_; /* varlena header (do not touch directly!) */
int fillfactor; /* page fill factor in percent (0..100) */
AutoVacOpts autovacuum; /* autovacuum-related options */
- bool security_barrier; /* for views */
- int check_option_offset; /* for views */
bool user_catalog_table; /* use as an additional catalog
* relation */
} StdRdOptions;
@@ -248,54 +246,68 @@ typedef struct StdRdOptions
(BLCKSZ * (100 - RelationGetFillFactor(relation, defaultff)) / 100)
/*
+ * RelationIsUsedAsCatalogTable
+ * Returns whether the relation should be treated as a catalog table
+ * from the pov of logical decoding. Note multiple eval or argument!
+ */
+#define RelationIsUsedAsCatalogTable(relation) \
+ ((relation)->rd_options ? \
+ ((StdRdOptions *) (relation)->rd_options)->user_catalog_table : false)
+
+
+/*
+ * ViewOptions
+ * Contents of rd_options for views
+ */
+typedef struct ViewOptions
+{
+ int32 vl_len_; /* varlena header (do not touch directly!) */
+ bool security_barrier;
+ int check_option_offset;
+} ViewOptions;
+
+/*
* RelationIsSecurityView
- * Returns whether the relation is security view, or not
+ * Returns whether the relation is security view, or not. Note multiple
+ * eval of argument!
*/
#define RelationIsSecurityView(relation) \
((relation)->rd_options ? \
- ((StdRdOptions *) (relation)->rd_options)->security_barrier : false)
+ ((ViewOptions *) (relation)->rd_options)->security_barrier : false)
/*
* RelationHasCheckOption
* Returns true if the relation is a view defined with either the local
- * or the cascaded check option.
+ * or the cascaded check option. Note multiple eval of argument!
*/
#define RelationHasCheckOption(relation) \
((relation)->rd_options && \
- ((StdRdOptions *) (relation)->rd_options)->check_option_offset != 0)
+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0)
/*
* RelationHasLocalCheckOption
* Returns true if the relation is a view defined with the local check
- * option.
+ * option. Note multiple eval of argument!
*/
#define RelationHasLocalCheckOption(relation) \
((relation)->rd_options && \
- ((StdRdOptions *) (relation)->rd_options)->check_option_offset != 0 ? \
+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0 ? \
strcmp((char *) (relation)->rd_options + \
- ((StdRdOptions *) (relation)->rd_options)->check_option_offset, \
+ ((ViewOptions *) (relation)->rd_options)->check_option_offset, \
"local") == 0 : false)
/*
* RelationHasCascadedCheckOption
* Returns true if the relation is a view defined with the cascaded check
- * option.
+ * option. Note multiple eval of argument!
*/
#define RelationHasCascadedCheckOption(relation) \
((relation)->rd_options && \
- ((StdRdOptions *) (relation)->rd_options)->check_option_offset != 0 ? \
+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0 ? \
strcmp((char *) (relation)->rd_options + \
- ((StdRdOptions *) (relation)->rd_options)->check_option_offset, \
+ ((ViewOptions *) (relation)->rd_options)->check_option_offset, \
"cascaded") == 0 : false)
-/*
- * RelationIsUsedAsCatalogTable
- * Returns whether the relation should be treated as a catalog table
- * from the pov of logical decoding.
- */
-#define RelationIsUsedAsCatalogTable(relation) \
- ((relation)->rd_options ? \
- ((StdRdOptions *) (relation)->rd_options)->user_catalog_table : false)
/*
* RelationIsValid
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index f75fc69a254..913d6ef6b28 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1955,6 +1955,7 @@ VariableSpace
VariableStatData
Vfd
ViewCheckOption
+ViewOptions
ViewStmt
VirtualTransactionId
Vsrt