Commit e23014f3 authored by Fujii Masao's avatar Fujii Masao

Allow units to be specified in relation option setting value.

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
parent 8167a388
...@@ -97,7 +97,7 @@ static relopt_int intRelOpts[] = ...@@ -97,7 +97,7 @@ static relopt_int intRelOpts[] =
"Packs table pages only to this percentage", "Packs table pages only to this percentage",
RELOPT_KIND_HEAP 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[] = ...@@ -105,7 +105,7 @@ static relopt_int intRelOpts[] =
"Packs btree index pages only to this percentage", "Packs btree index pages only to this percentage",
RELOPT_KIND_BTREE 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[] = ...@@ -113,7 +113,7 @@ static relopt_int intRelOpts[] =
"Packs hash index pages only to this percentage", "Packs hash index pages only to this percentage",
RELOPT_KIND_HASH 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[] = ...@@ -121,7 +121,7 @@ static relopt_int intRelOpts[] =
"Packs gist index pages only to this percentage", "Packs gist index pages only to this percentage",
RELOPT_KIND_GIST 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[] = ...@@ -129,7 +129,7 @@ static relopt_int intRelOpts[] =
"Packs spgist index pages only to this percentage", "Packs spgist index pages only to this percentage",
RELOPT_KIND_SPGIST 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[] = ...@@ -137,7 +137,7 @@ static relopt_int intRelOpts[] =
"Minimum number of tuple updates or deletes prior to vacuum", "Minimum number of tuple updates or deletes prior to vacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 0, INT_MAX -1, 0, INT_MAX, 0
}, },
{ {
{ {
...@@ -145,7 +145,7 @@ static relopt_int intRelOpts[] = ...@@ -145,7 +145,7 @@ static relopt_int intRelOpts[] =
"Minimum number of tuple inserts, updates or deletes prior to analyze", "Minimum number of tuple inserts, updates or deletes prior to analyze",
RELOPT_KIND_HEAP RELOPT_KIND_HEAP
}, },
-1, 0, INT_MAX -1, 0, INT_MAX, 0
}, },
{ {
{ {
...@@ -153,7 +153,7 @@ static relopt_int intRelOpts[] = ...@@ -153,7 +153,7 @@ static relopt_int intRelOpts[] =
"Vacuum cost delay in milliseconds, for autovacuum", "Vacuum cost delay in milliseconds, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 0, 100 -1, 0, 100, GUC_UNIT_MS
}, },
{ {
{ {
...@@ -161,7 +161,7 @@ static relopt_int intRelOpts[] = ...@@ -161,7 +161,7 @@ static relopt_int intRelOpts[] =
"Vacuum cost amount available before napping, for autovacuum", "Vacuum cost amount available before napping, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 1, 10000 -1, 1, 10000, 0
}, },
{ {
{ {
...@@ -169,7 +169,7 @@ static relopt_int intRelOpts[] = ...@@ -169,7 +169,7 @@ static relopt_int intRelOpts[] =
"Minimum age at which VACUUM should freeze a table row, for autovacuum", "Minimum age at which VACUUM should freeze a table row, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 0, 1000000000 -1, 0, 1000000000, 0
}, },
{ {
{ {
...@@ -177,7 +177,7 @@ static relopt_int intRelOpts[] = ...@@ -177,7 +177,7 @@ static relopt_int intRelOpts[] =
"Minimum multixact age at which VACUUM should freeze a row multixact's, for autovacuum", "Minimum multixact age at which VACUUM should freeze a row multixact's, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 0, 1000000000 -1, 0, 1000000000, 0
}, },
{ {
{ {
...@@ -185,7 +185,7 @@ static relopt_int intRelOpts[] = ...@@ -185,7 +185,7 @@ static relopt_int intRelOpts[] =
"Age at which to autovacuum a table to prevent transaction ID wraparound", "Age at which to autovacuum a table to prevent transaction ID wraparound",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 100000000, 2000000000 -1, 100000000, 2000000000, 0
}, },
{ {
{ {
...@@ -193,21 +193,21 @@ static relopt_int intRelOpts[] = ...@@ -193,21 +193,21 @@ static relopt_int intRelOpts[] =
"Multixact age at which to autovacuum a table to prevent multixact wraparound", "Multixact age at which to autovacuum a table to prevent multixact wraparound",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
-1, 100000000, 2000000000 -1, 100000000, 2000000000, 0
}, },
{ {
{ {
"autovacuum_freeze_table_age", "autovacuum_freeze_table_age",
"Age at which VACUUM should perform a full table sweep to freeze row versions", "Age at which VACUUM should perform a full table sweep to freeze row versions",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, -1, 0, 2000000000 }, -1, 0, 2000000000, 0
}, },
{ {
{ {
"autovacuum_multixact_freeze_table_age", "autovacuum_multixact_freeze_table_age",
"Age of multixact at which VACUUM should perform a full table sweep to freeze row versions", "Age of multixact at which VACUUM should perform a full table sweep to freeze row versions",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, -1, 0, 2000000000 }, -1, 0, 2000000000, 0
}, },
/* list terminator */ /* list terminator */
...@@ -503,7 +503,7 @@ add_bool_reloption(bits32 kinds, char *name, char *desc, bool default_val) ...@@ -503,7 +503,7 @@ add_bool_reloption(bits32 kinds, char *name, char *desc, bool default_val)
*/ */
void void
add_int_reloption(bits32 kinds, char *name, char *desc, int default_val, 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; relopt_int *newoption;
...@@ -512,6 +512,7 @@ add_int_reloption(bits32 kinds, char *name, char *desc, int default_val, ...@@ -512,6 +512,7 @@ add_int_reloption(bits32 kinds, char *name, char *desc, int default_val,
newoption->default_val = default_val; newoption->default_val = default_val;
newoption->min = min_val; newoption->min = min_val;
newoption->max = max_val; newoption->max = max_val;
newoption->flags = flags_val;
add_reloption((relopt_gen *) newoption); add_reloption((relopt_gen *) newoption);
} }
...@@ -1000,12 +1001,15 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len, ...@@ -1000,12 +1001,15 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
case RELOPT_TYPE_INT: case RELOPT_TYPE_INT:
{ {
relopt_int *optint = (relopt_int *) option->gen; 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) if (validate && !parsed)
ereport(ERROR, ereport(ERROR,
(errmsg("invalid value for integer option \"%s\": %s", (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 || if (validate && (option->values.int_val < optint->min ||
option->values.int_val > optint->max)) option->values.int_val > optint->max))
ereport(ERROR, ereport(ERROR,
......
...@@ -92,6 +92,7 @@ typedef struct relopt_int ...@@ -92,6 +92,7 @@ typedef struct relopt_int
int default_val; int default_val;
int min; int min;
int max; int max;
int flags;
} relopt_int; } relopt_int;
typedef struct relopt_real typedef struct relopt_real
...@@ -244,7 +245,7 @@ extern relopt_kind add_reloption_kind(void); ...@@ -244,7 +245,7 @@ extern relopt_kind add_reloption_kind(void);
extern void add_bool_reloption(bits32 kinds, char *name, char *desc, extern void add_bool_reloption(bits32 kinds, char *name, char *desc,
bool default_val); bool default_val);
extern void add_int_reloption(bits32 kinds, char *name, char *desc, 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, extern void add_real_reloption(bits32 kinds, char *name, char *desc,
double default_val, double min_val, double max_val); double default_val, double min_val, double max_val);
extern void add_string_reloption(bits32 kinds, char *name, char *desc, extern void add_string_reloption(bits32 kinds, char *name, char *desc,
......
...@@ -1811,6 +1811,20 @@ Check constraints: ...@@ -1811,6 +1811,20 @@ Check constraints:
"test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
Inherits: test_inh_check 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 -- lock levels
-- --
......
...@@ -1254,6 +1254,12 @@ ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric; ...@@ -1254,6 +1254,12 @@ ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric;
\d test_inh_check \d test_inh_check
\d test_inh_check_child \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 -- lock levels
-- --
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment