Re: pg14 psql broke \d datname.nspname.relname - Mailing list pgsql-hackers

From Mark Dilger
Subject Re: pg14 psql broke \d datname.nspname.relname
Date
Msg-id A0072D8D-F53B-4F68-95A1-A0A57801A9DC@enterprisedb.com
Whole thread Raw
In response to Re: pg14 psql broke \d datname.nspname.relname  (Robert Haas <robertmhaas@gmail.com>)
Responses Re: pg14 psql broke \d datname.nspname.relname
List pgsql-hackers

> On Oct 13, 2021, at 6:24 AM, Robert Haas <robertmhaas@gmail.com> wrote:
>
>> and when you stop doing that, passing additional dots through to the POSIX regular expression for processing is the
mostnatural thing to do.  This is, in fact, how v14 works.  It is a bit debatable whether treating the first dot as a
separatorand the additional dots as stuff to be passed through is the right thing, so we could call the v14 behavior a
mis-feature,but it's not as clearcut as the discussion upthread suggested.  Reverting to v13 behavior seems wrong, but
I'mnow uncertain how to proceed. 
>
> But not this part, or at least not entirely.
>
> If we pass the dots through to the POSIX regular expression, we can
> only do that either for the table name or the schema name, not both -

Agreed.

> either the first or last dot must mark the boundary between the two.
> That means that you can't use all the same regexy things for one as
> you can for the other, which is a strange system.

The closest analogy is how regular expressions consider \1 \2 .. \9 as backreferences, but \10 \11 ... are dependent on
context: "A multi-digit sequence not starting with a zero is taken as a back reference if it comes after a suitable
subexpression(i.e., the number is in the legal range for a back reference), and otherwise is taken as octal."  Taking a
dotas a separator if it can be taken that way, and as a regex character otherwise, is not totally out of line with
existingprecedent.  On the other hand, the backreference vs. octal precedent is not one I particularly like. 

> I knew that your
> patch made it do that, and I committed it that way because I didn't
> think it really mattered, and also because the whole system is already
> pretty strange, so what's one more bit of strangeness?
>
> I think there are at least 3 defensible behaviors here:
>
> 1. Leave it like it is. If there is more than one dot, the extra ones
> are part of one of the regex-glob thingies.
>
> 2. If there is more than one dot, error! Tell the user they messed up.

I don't like the backward compatibility issues with this one.  Justin's use of database.schema.relname will work up
untilv14 (by throwing away the database part), then draw an error in v14, then (assuming we support the database
portionin v15 onward) start working again. 

> 3. If there are exactly two dots, treat it as db-schema-user. Accept
> it if the dbname matches the current db, and otherwise say we can't
> access the named db. If there are more than two dots, then (a) it's an
> error as in (2) or (b) the extra ones become part of the regex-glob
> thingies as in (2).

3a is a bit strange, when considered in the context of patterns.  If db1, db2, and db3 all exist and each have a table
foo.bar,and psql is connected to db1, how should the command \d db?.foo.bar behave?  We have no problem with
db1.foo.bar,but we do have problems with the other two.  If the answer is to complain about the databases that are
unconnected,consider what happens if the user writes this in a script when only db1 exists, and later the script stops
workingbecause somebody created database db2.  Maybe that's not completely horrible, but surely it is less than ideal. 

3b is what pg_amcheck does.  It accepts database.schema.relname, and it will complain if no matching
database/schema/relationcan be found (unless --no-strict-names was given.) 

—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company






pgsql-hackers by date:

Previous
From: Ekaterina Sokolova
Date:
Subject: Re: RFC: Logging plan of the running query
Next
From: Bruce Momjian
Date:
Subject: Re: storing an explicit nonce