Re: Inconsistent error message for varchar(n) - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Inconsistent error message for varchar(n)
Date
Msg-id 1922059.1636818145@sss.pgh.pa.us
Whole thread Raw
In response to Inconsistent error message for varchar(n)  (Japin Li <japinli@hotmail.com>)
Responses Re: Inconsistent error message for varchar(n)
List pgsql-hackers
Japin Li <japinli@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



pgsql-hackers by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: support for MERGE
Next
From: "Euler Taveira"
Date:
Subject: Re: Allow users to choose what happens when recovery target is not reached