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.
This commit is contained in:
parent
89a8e15671
commit
c53d6e927f
|
@ -8,7 +8,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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)))
|
(internalSize <= 0 || internalSize > (int16) sizeof(Datum)))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||||
errmsg("invalid type internal size %d",
|
errmsg("internal size %d is invalid for passed-by-value type",
|
||||||
internalSize)));
|
internalSize)));
|
||||||
|
|
||||||
/* Only varlena types can be toasted */
|
/* Only varlena types can be toasted */
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* DESCRIPTION
|
||||||
* The "DefineFoo" routines take the parse tree and pick out the
|
* The "DefineFoo" routines take the parse tree and pick out the
|
||||||
|
@ -119,6 +119,25 @@ defGetNumeric(DefElem *def)
|
||||||
return 0; /* keep compiler quiet */
|
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.
|
* Extract an int64 value from a DefElem.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* DESCRIPTION
|
||||||
* These routines take the parse tree and pick out the
|
* 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);
|
DefElem *param = (DefElem *) lfirst(pl);
|
||||||
|
|
||||||
if (pg_strcasecmp(param->defname, "isstrict") == 0)
|
if (pg_strcasecmp(param->defname, "isstrict") == 0)
|
||||||
*isStrict_p = true;
|
*isStrict_p = defGetBoolean(param);
|
||||||
else if (pg_strcasecmp(param->defname, "iscachable") == 0)
|
else if (pg_strcasecmp(param->defname, "iscachable") == 0)
|
||||||
{
|
{
|
||||||
/* obsolete spelling of isImmutable */
|
/* obsolete spelling of isImmutable */
|
||||||
*volatility_p = PROVOLATILE_IMMUTABLE;
|
if (defGetBoolean(param))
|
||||||
|
*volatility_p = PROVOLATILE_IMMUTABLE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ereport(WARNING,
|
ereport(WARNING,
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* DESCRIPTION
|
||||||
* The "DefineFoo" routines take the parse tree and pick out the
|
* 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)
|
else if (pg_strcasecmp(defel->defname, "join") == 0)
|
||||||
joinName = defGetQualifiedName(defel);
|
joinName = defGetQualifiedName(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "hashes") == 0)
|
else if (pg_strcasecmp(defel->defname, "hashes") == 0)
|
||||||
canHash = TRUE;
|
canHash = defGetBoolean(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "merges") == 0)
|
else if (pg_strcasecmp(defel->defname, "merges") == 0)
|
||||||
canMerge = TRUE;
|
canMerge = defGetBoolean(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "sort1") == 0)
|
else if (pg_strcasecmp(defel->defname, "sort1") == 0)
|
||||||
leftSortName = defGetQualifiedName(defel);
|
leftSortName = defGetQualifiedName(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "sort2") == 0)
|
else if (pg_strcasecmp(defel->defname, "sort2") == 0)
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* DESCRIPTION
|
||||||
* The "DefineFoo" routines take the parse tree and pick out the
|
* 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)
|
else if (pg_strcasecmp(defel->defname, "default") == 0)
|
||||||
defaultValue = defGetString(defel);
|
defaultValue = defGetString(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "passedbyvalue") == 0)
|
else if (pg_strcasecmp(defel->defname, "passedbyvalue") == 0)
|
||||||
byValue = true;
|
byValue = defGetBoolean(defel);
|
||||||
else if (pg_strcasecmp(defel->defname, "alignment") == 0)
|
else if (pg_strcasecmp(defel->defname, "alignment") == 0)
|
||||||
{
|
{
|
||||||
char *a = defGetString(defel);
|
char *a = defGetString(defel);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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 char *defGetString(DefElem *def);
|
||||||
extern double defGetNumeric(DefElem *def);
|
extern double defGetNumeric(DefElem *def);
|
||||||
|
extern bool defGetBoolean(DefElem *def);
|
||||||
extern int64 defGetInt64(DefElem *def);
|
extern int64 defGetInt64(DefElem *def);
|
||||||
extern List *defGetQualifiedName(DefElem *def);
|
extern List *defGetQualifiedName(DefElem *def);
|
||||||
extern TypeName *defGetTypeName(DefElem *def);
|
extern TypeName *defGetTypeName(DefElem *def);
|
||||||
|
|
Loading…
Reference in New Issue