Tom Dunstan wrote:
Let's just throw the error instead.  (I agree that enum_in can just fail
with "no such label", but CREATE TYPE ought to give a specific
error about it.)


Agreed.

Andrew, you said you had a mostly-working patch already?



Working patch attached. If everyone's happy I'll apply it.

cheers

andrew

Index: src/backend/commands/typecmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/typecmds.c,v
retrieving revision 1.101
diff -c -r1.101 typecmds.c
*** src/backend/commands/typecmds.c	2 Apr 2007 03:49:38 -0000	1.101
--- src/backend/commands/typecmds.c	2 Apr 2007 19:57:40 -0000
***************
*** 949,954 ****
--- 949,955 ----
  	Oid		enumNamespace;
  	Oid		enumTypeOid;
  	AclResult	aclresult;
+ 	ListCell    *lc;
  
  	/* Convert list of names to a name and namespace */
  	enumNamespace = QualifiedNameGetCreationNamespace(stmt->typename,
***************
*** 970,975 ****
--- 971,987 ----
  				 errmsg("type names must be %d characters or less",
  						NAMEDATALEN - 2)));
  
+ 	foreach (lc, stmt->vals)
+ 	{
+ 		char *lab = strVal(lfirst(lc));
+ 		if (strlen(lab) > (NAMEDATALEN - 1))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_INVALID_NAME),
+ 					 errmsg("invalid enum label \"%s\", must be %d characters or less",
+ 							lab,
+ 							NAMEDATALEN - 1)));
+ 	}
+ 
  	/* Create the pg_type entry */
  	enumTypeOid = 
  		TypeCreate(enumName,		/* type name */
Index: src/backend/utils/adt/enum.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/enum.c,v
retrieving revision 1.1
diff -c -r1.1 enum.c
*** src/backend/utils/adt/enum.c	2 Apr 2007 03:49:39 -0000	1.1
--- src/backend/utils/adt/enum.c	2 Apr 2007 19:57:41 -0000
***************
*** 44,49 ****
--- 44,57 ----
  {
  	HeapTuple tup;
  	Oid enumoid;
+ 	size_t namelen = strlen(name);
+ 
+ 	if (namelen >= NAMEDATALEN)
+         ereport(ERROR,
+                 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+                  errmsg("invalid input value for enum %s: \"%s\"",
+ 						format_type_be(enumtypoid),
+                         name)));
  
  	tup = SearchSysCache(ENUMTYPOIDNAME,
  						 ObjectIdGetDatum(enumtypoid),
Index: src/test/regress/expected/enum.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/enum.out,v
retrieving revision 1.1
diff -c -r1.1 enum.out
*** src/test/regress/expected/enum.out	2 Apr 2007 03:49:42 -0000	1.1
--- src/test/regress/expected/enum.out	2 Apr 2007 19:57:43 -0000
***************
*** 40,45 ****
--- 40,59 ----
  (6 rows)
  
  --
+ -- Name, Values too long
+ --
+ CREATE TYPE 
+  abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789
+  AS ENUM('a');
+ NOTICE:  identifier "abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789" will be truncated to "abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxy"
+ ERROR:  type names must be 62 characters or less
+ CREATE TYPE toolong AS ENUM 
+ ('abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789');
+ ERROR:  invalid enum label "abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789", must be 63 characters or less
+ INSERT INTO enumtest VALUES
+ ('abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789');
+ ERROR:  invalid input value for enum rainbow: "abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789"
+ --
  -- Operators, no index
  --
  SELECT * FROM enumtest WHERE col = 'orange';
Index: src/test/regress/sql/enum.sql
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/sql/enum.sql,v
retrieving revision 1.1
diff -c -r1.1 enum.sql
*** src/test/regress/sql/enum.sql	2 Apr 2007 03:49:42 -0000	1.1
--- src/test/regress/sql/enum.sql	2 Apr 2007 19:57:44 -0000
***************
*** 27,32 ****
--- 27,45 ----
  SELECT * FROM enumtest;
  
  --
+ -- Name, Values too long
+ --
+ CREATE TYPE 
+  abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789
+  AS ENUM('a');
+ 
+ CREATE TYPE toolong AS ENUM 
+ ('abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789');
+ 
+ INSERT INTO enumtest VALUES
+ ('abcdefghijklmnopqrsatuvwxyz0123456789abcdefghijklmnopqrsatuvwxyz0123456789');
+ 
+ --
  -- Operators, no index
  --
  SELECT * FROM enumtest WHERE col = 'orange';
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to