Bug: psql misquotes constraints

Started by Rod Taylorover 21 years ago12 messages
#1Rod Taylor
pg@rbt.ca

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

Thoughts?

rt=# create table c ("""vers""ion""" integer unique references a);
NOTICE: CREATE TABLE / UNIQUE will create implicit index
"c_"vers"ion"_key" for table "c"
CREATE TABLE

rt=# \d c
Table "public.c"
Column | Type | Modifiers
------------+---------+-----------
"vers"ion" | integer |
Indexes:
"c_"vers"ion"_key" unique, btree ("""vers""ion""")
Foreign-key constraints:
"$1" FOREIGN KEY ("""vers""ion""") REFERENCES a("version")

#2Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Rod Taylor (#1)
Re: Bug: psql misquotes constraints

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

It's misquoted because psql DOES NOT share the fmtId function with
pg_dump. It simply puts double quotes around it. If you can fix psql
so that it is able to link to the fmtId function, then you can easily
fix the problem.

Chris

#3Bruce Momjian
pgman@candle.pha.pa.us
In reply to: Christopher Kings-Lynne (#2)
Re: Bug: psql misquotes constraints

I can do that for 7.6. Is it worth it? Is it a TODO?

---------------------------------------------------------------------------

Christopher Kings-Lynne wrote:

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

It's misquoted because psql DOES NOT share the fmtId function with
pg_dump. It simply puts double quotes around it. If you can fix psql
so that it is able to link to the fmtId function, then you can easily
fix the problem.

Chris

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
#4Rod Taylor
pg@rbt.ca
In reply to: Bruce Momjian (#3)
Re: Bug: psql misquotes constraints

On Sun, 2004-07-11 at 20:57, Bruce Momjian wrote:

I can do that for 7.6. Is it worth it? Is it a TODO?

I'm not sure what Christopher mentioned is the correct fix. The
information is displayed correctly in all places except where a
pg_get_.* function is used (indexes, constraints, etc.).

Those functions are tailored to what pg_dump requires (escaped
identifier: """vers""ion""") rather than what psql requires (unescaped
identifier: "vers"ion").

Right now psql shows a mix of both.

Show quoted text

Christopher Kings-Lynne wrote:

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

It's misquoted because psql DOES NOT share the fmtId function with
pg_dump. It simply puts double quotes around it. If you can fix psql
so that it is able to link to the fmtId function, then you can easily
fix the problem

#5Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Bruce Momjian (#3)
Re: Bug: psql misquotes constraints

It should be done, otherwise you cannot copy and paste foreign key
creation code from the psql output :)

Chris

Bruce Momjian wrote:

Show quoted text

I can do that for 7.6. Is it worth it? Is it a TODO?

---------------------------------------------------------------------------

Christopher Kings-Lynne wrote:

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

It's misquoted because psql DOES NOT share the fmtId function with
pg_dump. It simply puts double quotes around it. If you can fix psql
so that it is able to link to the fmtId function, then you can easily
fix the problem.

Chris

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

#6Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Rod Taylor (#4)
Re: Bug: psql misquotes constraints

I'm not sure what Christopher mentioned is the correct fix. The
information is displayed correctly in all places except where a
pg_get_.* function is used (indexes, constraints, etc.).

The name of the constraint (ie. the "$1" bit) is done by psql, the rest
comes from the pg_get_function.

Chris

#7Rod Taylor
pg@rbt.ca
In reply to: Christopher Kings-Lynne (#5)
Re: Bug: psql misquotes constraints

I remember a thread about pretty-print functions. Are those used? This
is probably the best place to put the fix, since they already munge
things for display purposes.

Show quoted text

On Sun, 2004-07-11 at 21:33, Christopher Kings-Lynne wrote:

It should be done, otherwise you cannot copy and paste foreign key
creation code from the psql output :)

Chris

Bruce Momjian wrote:

I can do that for 7.6. Is it worth it? Is it a TODO?

---------------------------------------------------------------------------

Christopher Kings-Lynne wrote:

As a result of the constraint output functions being shared between
pg_dump and psql, some of the output is mis-quoted in the display area
for columns including quotes. Notice it's correct in the table Column
list, but the constraint has the escaped versions.

It's misquoted because psql DOES NOT share the fmtId function with
pg_dump. It simply puts double quotes around it. If you can fix psql
so that it is able to link to the fmtId function, then you can easily
fix the problem.

Chris

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

#8Rod Taylor
pg@rbt.ca
In reply to: Christopher Kings-Lynne (#6)
Re: Bug: psql misquotes constraints

On Sun, 2004-07-11 at 21:34, Christopher Kings-Lynne wrote:

I'm not sure what Christopher mentioned is the correct fix. The
information is displayed correctly in all places except where a
pg_get_.* function is used (indexes, constraints, etc.).

The name of the constraint (ie. the "$1" bit) is done by psql, the rest
comes from the pg_get_function.

I didn't even notice the "$1" bit.

btree ("""vers""ion""")

I was hoping the above would be:

btree ("vers"ion")

#9Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Rod Taylor (#7)
Re: Bug: psql misquotes constraints

I remember a thread about pretty-print functions. Are those used? This
is probably the best place to put the fix, since they already munge
things for display purposes.

Seriously man - the pg_get_def stuff ONLY does the string from the words
FOREIGN KEY onwards. The constraint name is done by psql. Pretty
printing won't help you.

Chris

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Christopher Kings-Lynne (#5)
Re: Bug: psql misquotes constraints

Christopher Kings-Lynne <chriskl@familyhealth.com.au> writes:

It should be done, otherwise you cannot copy and paste foreign key
creation code from the psql output :)

Since when was that a design goal for psql's \d output? We had better
revert the entire pretty-printing patch if you expect this sort of thing
to work reliably. I thought the point of \d formatting was to be
readable, not to be technically the exact same SQL you'd need to enter.

regards, tom lane

#11Greg Stark
gsstark@mit.edu
In reply to: Tom Lane (#10)
Re: Bug: psql misquotes constraints

Tom Lane <tgl@sss.pgh.pa.us> writes:

Since when was that a design goal for psql's \d output? We had better
revert the entire pretty-printing patch if you expect this sort of thing
to work reliably. I thought the point of \d formatting was to be
readable, not to be technically the exact same SQL you'd need to enter.

Hm, I always assumed it would work. It always did modulo quoting issues around
$n.

It's certainly inconvenient if it doesn't given that there's no supported way
to disable a particular constraint and then reenable it later without having
the source available.

--
greg

#12Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Greg Stark (#11)
Re: Bug: psql misquotes constraints

Since when was that a design goal for psql's \d output? We had better
revert the entire pretty-printing patch if you expect this sort of thing
to work reliably. I thought the point of \d formatting was to be
readable, not to be technically the exact same SQL you'd need to enter.

Hm, I always assumed it would work. It always did modulo quoting issues around
$n.

It's certainly inconvenient if it doesn't given that there's no supported way
to disable a particular constraint and then reenable it later without having
the source available.

One thing that would be nice about using fmtId in psql is that names
that DON'T need to be quoted would not be quoted.

Chris