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. +