Обсуждение: psql's \copy incompatible with :variables
Summary: \copy interprets psql's :variables as literal strings
Tested On: 8.4.4, 9.0.4
Severity: Annoyance
Steps to Reproduce:
psql
\set filename 'test.csv'
\copy pg_class to :filename with csv
\q
ls
:filename
Note that psql variables work perfectly fine with COPY. It's just \copy
which seems to be misbehaving.
--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com
Josh Berkus wrote:
> Summary: \copy interprets psql's :variables as literal strings
>
> Tested On: 8.4.4, 9.0.4
>
> Severity: Annoyance
>
> Steps to Reproduce:
>
> psql
>
> \set filename 'test.csv'
>
> \copy pg_class to :filename with csv
>
> \q
>
> ls
>
> :filename
>
> Note that psql variables work perfectly fine with COPY. It's just \copy
> which seems to be misbehaving.
The problem is that none of the backslash commands interpret variables:
test=> \set x '''y'''
test=> select :x;
?column?
----------
y
(1 row)
test=> \d :y
Did not find any relation named ":y".
Should they?
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ It's impossible for everything to be true. +
Bruce Momjian <bruce@momjian.us> writes:
> Josh Berkus wrote:
>> Note that psql variables work perfectly fine with COPY. It's just \copy
>> which seems to be misbehaving.
> The problem is that none of the backslash commands interpret variables:
Nonsense.
regression=# \set foo bar
regression=# \d foo
Did not find any relation named "foo".
regression=# \d :foo
Did not find any relation named "bar".
\copy is different because it uses OT_WHOLE_LINE mode to read the
argument, and that doesn't expand :variable references. I'd be a bit
leery of changing that.
regards, tom lane
Tom Lane wrote: > Bruce Momjian <bruce@momjian.us> writes: > > Josh Berkus wrote: > >> Note that psql variables work perfectly fine with COPY. It's just \copy > >> which seems to be misbehaving. > > > The problem is that none of the backslash commands interpret variables: > > Nonsense. > > regression=# \set foo bar > regression=# \d foo > Did not find any relation named "foo". > regression=# \d :foo > Did not find any relation named "bar". > > \copy is different because it uses OT_WHOLE_LINE mode to read the > argument, and that doesn't expand :variable references. I'd be a bit > leery of changing that. Oh, I see. My tests were wrong. Thanks. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
> \copy is different because it uses OT_WHOLE_LINE mode to read the > argument, and that doesn't expand :variable references. I'd be a bit > leery of changing that. So, doc warning then? -- Josh Berkus PostgreSQL Experts Inc. http://pgexperts.com
Josh Berkus wrote: > > > \copy is different because it uses OT_WHOLE_LINE mode to read the > > argument, and that doesn't expand :variable references. I'd be a bit > > leery of changing that. > > So, doc warning then? I don't think enough people have hit this problem to warrant that. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +