OSDN Git Service

Tighten parsing of boolean options to CREATE TYPE and related functions,
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 May 2004 16:11:25 +0000 (16:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 May 2004 16:11:25 +0000 (16:11 +0000)
so as to deliver more useful error messages for mistakes like
'PASSEDBYVALUE = f'.  Per gripe from Gaetano Mendola.

src/backend/catalog/pg_type.c
src/backend/commands/define.c
src/backend/commands/functioncmds.c
src/backend/commands/operatorcmds.c
src/backend/commands/typecmds.c
src/include/commands/defrem.h

index efd2f61..b5b6eaf 100644 (file)
@@ -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 */
index 19f1487..e4a62b7 100644 (file)
@@ -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
index a0a9c58..c118e8e 100644 (file)
@@ -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,
index 2736a31..a198f51 100644 (file)
@@ -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)
index 411ad72..0342836 100644 (file)
@@ -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);
index 78fe4ab..892aee3 100644 (file)
@@ -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);