aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/define.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2009-02-02 19:31:40 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2009-02-02 19:31:40 +0000
commit3a5b77371522b64feda006a7aed2a0e57bfb2b22 (patch)
tree2a3660571ea184c8e40a78608839914af4f2bb27 /src/backend/commands/define.c
parent80f95a6500d7f5762e4701c80eb202c3fce9095f (diff)
downloadpostgresql-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.c94
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;
}