> All other places at tablecmds.c, has this test: > if (attnum <= 0) > ereport(ERROR,
I was actually copying this code in indexcmds.c:
if (attno < 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("index creation on system columns is not supported")));
There's really no reason to prefer one over the other in this context.
I think the documentation is a bit confusing. According to the current documentation: /* * attnum is the "attribute number" for the attribute: A value that * uniquely identifies this attribute within its class. for user * attributes, Attribute numbers are greater than 0 and not greater than * the number of attributes in the class. i.e. if the Class pg_class says * that Class XYZ has 10 attributes, then the user attribute numbers in * Class pg_attribute must be 1-10. * * System attributes have attribute numbers less than 0 that are unique * within the class, but not constrained to any particular range. * * Note that (attnum - 1) is often used as the index to an array. Attributes equal to zero are in limbo.
IMO should be: * System attributes have attribute numbers less or equal to 0 that are * unique * within the class, but not constrained to any particular range.