diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2009-02-02 19:31:40 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2009-02-02 19:31:40 +0000 |
commit | 3a5b77371522b64feda006a7aed2a0e57bfb2b22 (patch) | |
tree | 2a3660571ea184c8e40a78608839914af4f2bb27 /src/backend/commands/define.c | |
parent | 80f95a6500d7f5762e4701c80eb202c3fce9095f (diff) | |
download | postgresql-3a5b77371522b64feda006a7aed2a0e57bfb2b22.tar.gz postgresql-3a5b77371522b64feda006a7aed2a0e57bfb2b22.zip |
Allow reloption names to have qualifiers, initially supporting a TOAST
qualifier, and add support for this in pg_dump.
This allows TOAST tables to have user-defined fillfactor, and will also
enable us to move the autovacuum parameters to reloptions without taking
away the possibility of setting values for TOAST tables.
Diffstat (limited to 'src/backend/commands/define.c')
-rw-r--r-- | src/backend/commands/define.c | 94 |
1 files changed, 62 insertions, 32 deletions
diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c index 77f7d8bfdb9..c5e2a13d950 100644 --- a/src/backend/commands/define.c +++ b/src/backend/commands/define.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.102 2009/01/01 17:23:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.103 2009/02/02 19:31:38 alvherre Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -55,24 +55,20 @@ case_translate_language_name(const char *input) } -/* - * Extract a string value (otherwise uninterpreted) from a DefElem. - */ -char * -defGetString(DefElem *def) +static char * +nodeGetString(Node *value, char *name) { - if (def->arg == NULL) + if (value == NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("%s requires a parameter", - def->defname))); - switch (nodeTag(def->arg)) + errmsg("%s requires a parameter", name))); + switch (nodeTag(value)) { case T_Integer: { char *str = palloc(32); - snprintf(str, 32, "%ld", (long) intVal(def->arg)); + snprintf(str, 32, "%ld", (long) intVal(value)); return str; } case T_Float: @@ -81,20 +77,29 @@ defGetString(DefElem *def) * T_Float values are kept in string form, so this type cheat * works (and doesn't risk losing precision) */ - return strVal(def->arg); + return strVal(value); case T_String: - return strVal(def->arg); + return strVal(value); case T_TypeName: - return TypeNameToString((TypeName *) def->arg); + return TypeNameToString((TypeName *) value); case T_List: - return NameListToString((List *) def->arg); + return NameListToString((List *) value); default: - elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg)); + elog(ERROR, "unrecognized node type: %d", (int) nodeTag(value)); } return NULL; /* keep compiler quiet */ } /* + * Extract a string value (otherwise uninterpreted) from a DefElem. + */ +char * +defGetString(DefElem *def) +{ + return nodeGetString(def->arg, def->defname); +} + +/* * Extract a numeric value (actually double) from a DefElem. */ double @@ -120,25 +125,22 @@ defGetNumeric(DefElem *def) return 0; /* keep compiler quiet */ } -/* - * Extract a boolean value from a DefElem. - */ -bool -defGetBoolean(DefElem *def) +static bool +nodeGetBoolean(Node *value, char *name) { /* * If no parameter given, assume "true" is meant. */ - if (def->arg == NULL) + if (value == NULL) return true; /* * Allow 0, 1, "true", "false" */ - switch (nodeTag(def->arg)) + switch (nodeTag(value)) { case T_Integer: - switch (intVal(def->arg)) + switch (intVal(value)) { case 0: return false; @@ -151,7 +153,7 @@ defGetBoolean(DefElem *def) break; default: { - char *sval = defGetString(def); + char *sval = nodeGetString(value, name); if (pg_strcasecmp(sval, "true") == 0) return true; @@ -163,12 +165,20 @@ defGetBoolean(DefElem *def) } ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("%s requires a Boolean value", - def->defname))); + errmsg("%s requires a Boolean value", name))); return false; /* keep compiler quiet */ } /* + * Extract a boolean value from a DefElem. + */ +bool +defGetBoolean(DefElem *def) +{ + return nodeGetBoolean(def->arg, def->defname); +} + +/* * Extract an int64 value from a DefElem. */ int64 @@ -305,15 +315,35 @@ defGetTypeLength(DefElem *def) return 0; /* keep compiler quiet */ } + +/* + * Extract a string value (otherwise uninterpreted) from a ReloptElem. + */ +char * +reloptGetString(ReloptElem *relopt) +{ + return nodeGetString(relopt->arg, relopt->optname); +} + +/* + * Extract a boolean value from a ReloptElem. + */ +bool +reloptGetBoolean(ReloptElem *relopt) +{ + return nodeGetBoolean(relopt->arg, relopt->optname); +} + /* - * Create a DefElem setting "oids" to the specified value. + * Create a ReloptElem setting "oids" to the specified value. */ -DefElem * -defWithOids(bool value) +ReloptElem * +reloptWithOids(bool value) { - DefElem *f = makeNode(DefElem); + ReloptElem *f = makeNode(ReloptElem); - f->defname = "oids"; + f->optname = "oids"; + f->nmspc = NULL; f->arg = (Node *) makeInteger(value); return f; } |