From c53d6e927f5ebdbd89d59cb8837ad51ab603a9d7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 14 May 2004 16:11:25 +0000 Subject: [PATCH] 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/catalog/pg_type.c | 4 ++-- src/backend/commands/define.c | 21 ++++++++++++++++++++- src/backend/commands/functioncmds.c | 7 ++++--- src/backend/commands/operatorcmds.c | 6 +++--- src/backend/commands/typecmds.c | 4 ++-- src/include/commands/defrem.h | 3 ++- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index efd2f61747..b5b6eaf9aa 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.93 2004/02/12 23:41:02 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.94 2004/05/14 16:11:25 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -201,7 +201,7 @@ TypeCreate(const char *typeName, (internalSize <= 0 || internalSize > (int16) sizeof(Datum))) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("invalid type internal size %d", + errmsg("internal size %d is invalid for passed-by-value type", internalSize))); /* Only varlena types can be toasted */ 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 @@ -120,6 +120,25 @@ defGetNumeric(DefElem *def) } /* + * 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. */ int64 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); diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 78fe4ab907..892aee34ae 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.55 2004/05/05 04:48:47 tgl Exp $ + * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.56 2004/05/14 16:11:25 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -69,6 +69,7 @@ extern char *case_translate_language_name(const char *input); extern char *defGetString(DefElem *def); extern double defGetNumeric(DefElem *def); +extern bool defGetBoolean(DefElem *def); extern int64 defGetInt64(DefElem *def); extern List *defGetQualifiedName(DefElem *def); extern TypeName *defGetTypeName(DefElem *def); -- 2.11.0