]> granicus.if.org Git - postgresql/commitdiff
Move view reloptions into their own varlena struct
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 14 Jul 2014 21:24:40 +0000 (17:24 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 14 Jul 2014 21:24:40 +0000 (17:24 -0400)
Per discussion after a gripe from me in
http://www.postgresql.org/message-id/20140611194633.GH18688@eldon.alvh.no-ip.org

Jaime Casanova

src/backend/access/common/reloptions.c
src/backend/commands/tablecmds.c
src/include/access/reloptions.h
src/include/utils/rel.h
src/tools/pgindent/typedefs.list

index 522b671993edccbbe7f10951f60b11bc1eb950d4..c7ad6f96f863d618235f2abc298cccea384a3508 100644 (file)
@@ -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)}
        };
@@ -1224,6 +1222,38 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
        return (bytea *) rdopts;
 }
 
+/*
+ * 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.
  */
@@ -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;
index 60d387a5e6c6711080527705ccf3a38266342dfd..5dc4d18b6a5a63b26244fe27e4c0a649306f830e 100644 (file)
@@ -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;
index 81ff3286cf2cf61f0548309915dbb34d9cdd2b0d..c22644841f93e007a7f7b031a83dc2b8d7666621 100644 (file)
@@ -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);
index af4f53f1121b9e04c92f1620684177fd66fa69bd..37b6cbbb4d0674511f7a94cdf7846c92e0ae0327 100644 (file)
@@ -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;
@@ -247,55 +245,69 @@ typedef struct StdRdOptions
 #define RelationGetTargetPageFreeSpace(relation, defaultff) \
        (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
index f75fc69a2547c98868b98feace4a32bb64ac8042..913d6ef6b288778517dd180724add688272081e5 100644 (file)
@@ -1955,6 +1955,7 @@ VariableSpace
 VariableStatData
 Vfd
 ViewCheckOption
+ViewOptions
 ViewStmt
 VirtualTransactionId
 Vsrt