Japin Li <japi...@hotmail.com> writes: > postgres=# CREATE TABLE tbl (s varchar(2147483647)); > ERROR: length for type varchar cannot exceed 10485760 > LINE 1: CREATE TABLE tbl (s varchar(2147483647)); > ^
> postgres=# CREATE TABLE tbl (s varchar(2147483648)); > ERROR: syntax error at or near "2147483648" > LINE 1: CREATE TABLE tbl (s varchar(2147483648)); > ^ I'm having a very hard time getting excited about that. We could maybe switch the grammar production to use generic expr_list syntax for the typmod, like GenericType does. But that would just result in this: regression=# CREATE TABLE tbl (s "varchar"(2147483648)); ERROR: value "2147483648" is out of range for type integer LINE 1: CREATE TABLE tbl (s "varchar"(2147483648)); ^ which doesn't seem any less confusing for a novice who doesn't know that typmods are constrained to be integers. There might be something to be said for switching all the hard-wired type productions to use opt_type_modifiers and pushing the knowledge that's in, eg, opt_float out to per-type typmodin routines. But any benefit would be in reduction of the grammar size, and I'm dubious that it'd be worth the trouble. I suspect that overall, the resulting error messages would be slightly worse not better --- note for example the poorer placement of the error cursor above. A related example is regression=# CREATE TABLE tbl (s varchar(2,3)); ERROR: syntax error at or near "," LINE 1: CREATE TABLE tbl (s varchar(2,3)); ^ regression=# CREATE TABLE tbl (s "varchar"(2,3)); ERROR: invalid type modifier LINE 1: CREATE TABLE tbl (s "varchar"(2,3)); ^ That's explained by the comment in anychar_typmodin: * we're not too tense about good error message here because grammar * shouldn't allow wrong number of modifiers for CHAR and we could surely improve that message, but anychar_typmodin can't give a really on-point error cursor. regards, tom lane