From c53d6e927f5ebdbd89d59cb8837ad51ab603a9d7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 14 May 2004 16:11:25 +0000 Subject: Tighten parsing of boolean options to CREATE TYPE and related functions, so as to deliver more useful error messages for mistakes like 'PASSEDBYVALUE = f'. Per gripe from Gaetano Mendola. --- src/backend/commands/define.c | 21 ++++++++++++++++++++- src/backend/commands/functioncmds.c | 7 ++++--- src/backend/commands/operatorcmds.c | 6 +++--- src/backend/commands/typecmds.c | 4 ++-- 4 files changed, 29 insertions(+), 9 deletions(-) (limited to 'src/backend/commands') diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c index 19f14879a0..e4a62b7730 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.87 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.88 2004/05/14 16:11:25 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -119,6 +119,25 @@ defGetNumeric(DefElem *def) return 0; /* keep compiler quiet */ } +/* + * Extract a boolean value from a DefElem. + */ +bool +defGetBoolean(DefElem *def) +{ + /* + * Presently, boolean flags must simply be present or absent. + * Later we could allow 'flag = t', 'flag = f', etc. + */ + if (def->arg == NULL) + return true; + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s does not take a parameter", + def->defname))); + return false; /* keep compiler quiet */ +} + /* * Extract an int64 value from a DefElem. */ diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index a0a9c58240..c118e8e3b5 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.45 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.46 2004/05/14 16:11:25 tgl Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -329,11 +329,12 @@ compute_attributes_with_style(List *parameters, bool *isStrict_p, char *volatili DefElem *param = (DefElem *) lfirst(pl); if (pg_strcasecmp(param->defname, "isstrict") == 0) - *isStrict_p = true; + *isStrict_p = defGetBoolean(param); else if (pg_strcasecmp(param->defname, "iscachable") == 0) { /* obsolete spelling of isImmutable */ - *volatility_p = PROVOLATILE_IMMUTABLE; + if (defGetBoolean(param)) + *volatility_p = PROVOLATILE_IMMUTABLE; } else ereport(WARNING, diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index 2736a31f3c..a198f51eee 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.14 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.15 2004/05/14 16:11:25 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -124,9 +124,9 @@ DefineOperator(List *names, List *parameters) else if (pg_strcasecmp(defel->defname, "join") == 0) joinName = defGetQualifiedName(defel); else if (pg_strcasecmp(defel->defname, "hashes") == 0) - canHash = TRUE; + canHash = defGetBoolean(defel); else if (pg_strcasecmp(defel->defname, "merges") == 0) - canMerge = TRUE; + canMerge = defGetBoolean(defel); else if (pg_strcasecmp(defel->defname, "sort1") == 0) leftSortName = defGetQualifiedName(defel); else if (pg_strcasecmp(defel->defname, "sort2") == 0) diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 411ad725bc..03428369ff 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.55 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.56 2004/05/14 16:11:25 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -176,7 +176,7 @@ DefineType(List *names, List *parameters) else if (pg_strcasecmp(defel->defname, "default") == 0) defaultValue = defGetString(defel); else if (pg_strcasecmp(defel->defname, "passedbyvalue") == 0) - byValue = true; + byValue = defGetBoolean(defel); else if (pg_strcasecmp(defel->defname, "alignment") == 0) { char *a = defGetString(defel); -- cgit v1.2.3