]> granicus.if.org Git - postgresql/commitdiff
typeTypeName() must return a pstrdup'd copy of the type name, not a
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jun 2000 16:50:37 +0000 (16:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Jun 2000 16:50:37 +0000 (16:50 +0000)
direct pointer into the syscache entry for the type.  In some cases
the syscache entry might get flushed before we are done using the
returned type name.  This bug accounts for difficult-to-repeat
failures seen when INSERTs into columns of certain data types are
run in parallel with VACUUMs of system tables.  There may be related
problems elsewhere --- we need to take a harder look at uses of
syscache data.

src/backend/parser/parse_type.c

index ac4f94ec957bdab72e8473237f304c3e271c9221..69037338428190720347e7181ea66952077bce21 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.30 2000/05/30 04:24:49 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.31 2000/06/06 16:50:37 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -48,7 +48,8 @@ typeidTypeName(Oid id)
                return NULL;
        }
        typetuple = (Form_pg_type) GETSTRUCT(tup);
-       return NameStr(typetuple->typname);
+       /* pstrdup here because result may need to outlive the syscache entry */
+       return pstrdup(NameStr(typetuple->typname));
 }
 
 /* return a Type structure, given a type id */
@@ -119,7 +120,8 @@ typeTypeName(Type t)
        Form_pg_type typ;
 
        typ = (Form_pg_type) GETSTRUCT(t);
-       return NameStr(typ->typname);
+       /* pstrdup here because result may need to outlive the syscache entry */
+       return pstrdup(NameStr(typ->typname));
 }
 
 /* given a type, return its typetype ('c' for 'c'atalog types) */