]> granicus.if.org Git - postgresql/commitdiff
Allow units to be specified in relation option setting value.
authorFujii Masao <fujii@postgresql.org>
Thu, 28 Aug 2014 06:55:50 +0000 (15:55 +0900)
committerFujii Masao <fujii@postgresql.org>
Thu, 28 Aug 2014 06:55:50 +0000 (15:55 +0900)
This introduces an infrastructure which allows us to specify the units
like ms (milliseconds) in integer relation option, like GUC parameter.
Currently only autovacuum_vacuum_cost_delay reloption can accept
the units.

Reviewed by Michael Paquier

src/backend/access/common/reloptions.c
src/include/access/reloptions.h
src/test/regress/expected/alter_table.out
src/test/regress/sql/alter_table.sql

index e0b81b9eb5139e8db3c4de25ca3bec7ffaab21bb..ee4aef2dd2986203733d6acbaf73f113029aa42e 100644 (file)
@@ -97,7 +97,7 @@ static relopt_int intRelOpts[] =
                        "Packs table pages only to this percentage",
                        RELOPT_KIND_HEAP
                },
-               HEAP_DEFAULT_FILLFACTOR, HEAP_MIN_FILLFACTOR, 100
+               HEAP_DEFAULT_FILLFACTOR, HEAP_MIN_FILLFACTOR, 100, 0
        },
        {
                {
@@ -105,7 +105,7 @@ static relopt_int intRelOpts[] =
                        "Packs btree index pages only to this percentage",
                        RELOPT_KIND_BTREE
                },
-               BTREE_DEFAULT_FILLFACTOR, BTREE_MIN_FILLFACTOR, 100
+               BTREE_DEFAULT_FILLFACTOR, BTREE_MIN_FILLFACTOR, 100, 0
        },
        {
                {
@@ -113,7 +113,7 @@ static relopt_int intRelOpts[] =
                        "Packs hash index pages only to this percentage",
                        RELOPT_KIND_HASH
                },
-               HASH_DEFAULT_FILLFACTOR, HASH_MIN_FILLFACTOR, 100
+               HASH_DEFAULT_FILLFACTOR, HASH_MIN_FILLFACTOR, 100, 0
        },
        {
                {
@@ -121,7 +121,7 @@ static relopt_int intRelOpts[] =
                        "Packs gist index pages only to this percentage",
                        RELOPT_KIND_GIST
                },
-               GIST_DEFAULT_FILLFACTOR, GIST_MIN_FILLFACTOR, 100
+               GIST_DEFAULT_FILLFACTOR, GIST_MIN_FILLFACTOR, 100, 0
        },
        {
                {
@@ -129,7 +129,7 @@ static relopt_int intRelOpts[] =
                        "Packs spgist index pages only to this percentage",
                        RELOPT_KIND_SPGIST
                },
-               SPGIST_DEFAULT_FILLFACTOR, SPGIST_MIN_FILLFACTOR, 100
+               SPGIST_DEFAULT_FILLFACTOR, SPGIST_MIN_FILLFACTOR, 100, 0
        },
        {
                {
@@ -137,7 +137,7 @@ static relopt_int intRelOpts[] =
                        "Minimum number of tuple updates or deletes prior to vacuum",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 0, INT_MAX
+               -1, 0, INT_MAX, 0
        },
        {
                {
@@ -145,7 +145,7 @@ static relopt_int intRelOpts[] =
                        "Minimum number of tuple inserts, updates or deletes prior to analyze",
                        RELOPT_KIND_HEAP
                },
-               -1, 0, INT_MAX
+               -1, 0, INT_MAX, 0
        },
        {
                {
@@ -153,7 +153,7 @@ static relopt_int intRelOpts[] =
                        "Vacuum cost delay in milliseconds, for autovacuum",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 0, 100
+               -1, 0, 100, GUC_UNIT_MS
        },
        {
                {
@@ -161,7 +161,7 @@ static relopt_int intRelOpts[] =
                        "Vacuum cost amount available before napping, for autovacuum",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 1, 10000
+               -1, 1, 10000, 0
        },
        {
                {
@@ -169,7 +169,7 @@ static relopt_int intRelOpts[] =
                        "Minimum age at which VACUUM should freeze a table row, for autovacuum",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 0, 1000000000
+               -1, 0, 1000000000, 0
        },
        {
                {
@@ -177,7 +177,7 @@ static relopt_int intRelOpts[] =
                        "Minimum multixact age at which VACUUM should freeze a row multixact's, for autovacuum",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 0, 1000000000
+               -1, 0, 1000000000, 0
        },
        {
                {
@@ -185,7 +185,7 @@ static relopt_int intRelOpts[] =
                        "Age at which to autovacuum a table to prevent transaction ID wraparound",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 100000000, 2000000000
+               -1, 100000000, 2000000000, 0
        },
        {
                {
@@ -193,21 +193,21 @@ static relopt_int intRelOpts[] =
                        "Multixact age at which to autovacuum a table to prevent multixact wraparound",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
                },
-               -1, 100000000, 2000000000
+               -1, 100000000, 2000000000, 0
        },
        {
                {
                        "autovacuum_freeze_table_age",
                        "Age at which VACUUM should perform a full table sweep to freeze row versions",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
-               }, -1, 0, 2000000000
+               }, -1, 0, 2000000000, 0
        },
        {
                {
                        "autovacuum_multixact_freeze_table_age",
                        "Age of multixact at which VACUUM should perform a full table sweep to freeze row versions",
                        RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
-               }, -1, 0, 2000000000
+               }, -1, 0, 2000000000, 0
        },
 
        /* list terminator */
@@ -503,7 +503,7 @@ add_bool_reloption(bits32 kinds, char *name, char *desc, bool default_val)
  */
 void
 add_int_reloption(bits32 kinds, char *name, char *desc, int default_val,
-                                 int min_val, int max_val)
+                                 int min_val, int max_val, int flags_val)
 {
        relopt_int *newoption;
 
@@ -512,6 +512,7 @@ add_int_reloption(bits32 kinds, char *name, char *desc, int default_val,
        newoption->default_val = default_val;
        newoption->min = min_val;
        newoption->max = max_val;
+       newoption->flags = flags_val;
 
        add_reloption((relopt_gen *) newoption);
 }
@@ -1000,12 +1001,15 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
                case RELOPT_TYPE_INT:
                        {
                                relopt_int *optint = (relopt_int *) option->gen;
+                               const char *hintmsg;
 
-                               parsed = parse_int(value, &option->values.int_val, 0, NULL);
+                               parsed = parse_int(value, &option->values.int_val,
+                                                                  optint->flags, &hintmsg);
                                if (validate && !parsed)
                                        ereport(ERROR,
                                           (errmsg("invalid value for integer option \"%s\": %s",
-                                                          option->gen->name, value)));
+                                                          option->gen->name, value),
+                                               hintmsg ? errhint("%s", _(hintmsg)) : 0));
                                if (validate && (option->values.int_val < optint->min ||
                                                                 option->values.int_val > optint->max))
                                        ereport(ERROR,
index c22644841f93e007a7f7b031a83dc2b8d7666621..a54bbd0eaa658a55de3c56d6dd6bd5610fbf8102 100644 (file)
@@ -92,6 +92,7 @@ typedef struct relopt_int
        int                     default_val;
        int                     min;
        int                     max;
+       int                     flags;
 } relopt_int;
 
 typedef struct relopt_real
@@ -244,7 +245,7 @@ extern relopt_kind add_reloption_kind(void);
 extern void add_bool_reloption(bits32 kinds, char *name, char *desc,
                                   bool default_val);
 extern void add_int_reloption(bits32 kinds, char *name, char *desc,
-                                 int default_val, int min_val, int max_val);
+                                 int default_val, int min_val, int max_val, int flags_val);
 extern void add_real_reloption(bits32 kinds, char *name, char *desc,
                                   double default_val, double min_val, double max_val);
 extern void add_string_reloption(bits32 kinds, char *name, char *desc,
index 10f45f25a5ed4528d0cc6a962f6c73be5f03b065..1d31b81456f4f45256a310d350a7fb34c1948d64 100644 (file)
@@ -1811,6 +1811,20 @@ Check constraints:
     "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
 Inherits: test_inh_check
 
+-- Set a storage parameter with unit
+CREATE TABLE test_param_unit (a text) WITH (autovacuum_vacuum_cost_delay = '80ms');
+ALTER TABLE test_param_unit SET (autovacuum_vacuum_cost_delay = '3min');
+ERROR:  value 3min out of bounds for option "autovacuum_vacuum_cost_delay"
+DETAIL:  Valid values are between "0" and "100".
+ALTER TABLE test_param_unit SET (autovacuum_analyze_threshold = '3min'); -- fails
+ERROR:  invalid value for integer option "autovacuum_analyze_threshold": 3min
+\d+ test_param_unit
+                  Table "public.test_param_unit"
+ Column | Type | Modifiers | Storage  | Stats target | Description 
+--------+------+-----------+----------+--------------+-------------
+ a      | text |           | extended |              | 
+Options: autovacuum_vacuum_cost_delay=80ms
+
 --
 -- lock levels
 --
index 12fd7c2321be44e07e5a66bda5379d0e54dff193..2c21006615f60707884c7b7ef2412b00f1dc5801 100644 (file)
@@ -1254,6 +1254,12 @@ ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric;
 \d test_inh_check
 \d test_inh_check_child
 
+-- Set a storage parameter with unit
+CREATE TABLE test_param_unit (a text) WITH (autovacuum_vacuum_cost_delay = '80ms');
+ALTER TABLE test_param_unit SET (autovacuum_vacuum_cost_delay = '3min');
+ALTER TABLE test_param_unit SET (autovacuum_analyze_threshold = '3min'); -- fails
+\d+ test_param_unit
+
 --
 -- lock levels
 --