Re: PostgreSQL Gotchas - Mailing list pgsql-general

From Chris Travers
Subject Re: PostgreSQL Gotchas
Date
Msg-id 435199B2.4020507@travelamericas.com
Whole thread Raw
In response to Re: PostgreSQL Gotchas  (Greg Stark <gsstark@mit.edu>)
List pgsql-general
Greg Stark wrote:

>Tom Lane <tgl@sss.pgh.pa.us> writes:
>
>
>
>>If you write, say,
>>
>>    select max(relpages) from pg_class;
>>
>>and the lexer thinks that it should fold unquoted identifiers to upper
>>case, then the catalog entries defining these names had better read
>>PG_CLASS, RELPAGES, and MAX, not the lower-case names they contain
>>today.
>>
>>
>
>Well the case of unquoted identifiers could be finessed by having it match
>RELPAGES first and fail over to relpages second. It could even be made to
>match RelPages and whatever if there isn't any ambiguity.
>
>
Personally I don't see why relpages and pg_class are problems.  After
all, the backend treats identifiers as already quoted internally.  If
you change what the language means, you are going to get backward
compatibility issues.  End of story.  But we have done this sort of
thing before so it is not the end of the world as long as we provide a
way to get back.  Indeed treating identifiers as already quoted should
prevent a huge number of bugs that might otherwise be problematic.  But
because there are no guarantees that the system catalogs won't change
with each new major release, this isn't a problem.  I.e. it isn't the
responsibility of the core development team (IMO) to make this work.
The information_schema is a bigger problem, but I don't see why you
can't have two information schemas with cases to match each behavior.
Sure it means a little more disk space, but I don't really see why it
would be a major issue.

You do have an issue with MAX v. max which could get nasty.  I have
proposed solving this one with a duplicate entry in the system catalogs
with upper names for aggregates and builtin functions.

Basically, if what I have read is accurate, this seems to be the least
amount of work to make the following statement work:
SELECT max("relpages") FROM "pg_class";

What we don't want to see is the requirement for a statement even less
standard, like:
SELECT "max"("relpage") FROM "pg_class";

Note that if you allow system catalogs to be created in upper case, and
the backend treats identifiers as already double-quoted, then you have
to go through and case fold these again, which is problematic, impacts
performance, and adds the potential for many bugs.

>I think the problem case arises when you have code that has a quoted
>"relpages". In that case the code is just not going to work unless the column
>really is named "relpages" not "RELPAGES".
>
>So to be completely backward compatible you need "relpages" as well as an
>unquoted relpages to work. And to be spec compliant you need "RELPAGES" to
>work too. That makes things a bit sticky.
>
>
Is this really a requirement given that the system catalogs are not
guaranteed to be backwards compatible and have been changed in the past?

Best Wishes,
Chris Travers

pgsql-general by date:

Previous
From: jeff sacksteder
Date:
Subject: Re: unsigned types
Next
From: Chris Travers
Date:
Subject: Re: On "multi-master"