Give an explicit error for serial[], rather than silently ignoring
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Mar 2008 22:10:56 +0000 (22:10 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Mar 2008 22:10:56 +0000 (22:10 +0000)
the array decoration as the code had been doing.

src/backend/parser/parse_utilcmd.c

index eec1e30d817f70e80d25dc4743d40e12a83a6203..b6a9a09b95de1db195e74f451b12a7413ad663e7 100644 (file)
@@ -266,7 +266,8 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 
        /* Check for SERIAL pseudo-types */
        is_serial = false;
-       if (list_length(column->typename->names) == 1)
+       if (list_length(column->typename->names) == 1 &&
+               !column->typename->pct_type)
        {
                char       *typname = strVal(linitial(column->typename->names));
 
@@ -284,6 +285,16 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
                        column->typename->names = NIL;
                        column->typename->typeid = INT8OID;
                }
+
+               /*
+                * We have to reject "serial[]" explicitly, because once we've
+                * set typeid, LookupTypeName won't notice arrayBounds.  We don't
+                * need any special coding for serial(typmod) though.
+                */
+               if (is_serial && column->typename->arrayBounds != NIL)
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("array of serial is not implemented")));
        }
 
        /* Do necessary work on the column type declaration */