Re: COPY vs \COPY FROM PROGRAM $$ quoting difference?

From: Alexander Stoddard <alexander(dot)stoddard(at)gmail(dot)com>
To: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: COPY vs \COPY FROM PROGRAM $$ quoting difference?
Date: 2017-09-29 17:18:41
Message-ID: CADDNc-BTPc_sh4T7607OdDaE6ft3YQdBcApC+gpVr5o0_Vqz0A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Fri, Sep 29, 2017 at 11:54 AM, David G. Johnston <
david(dot)g(dot)johnston(at)gmail(dot)com> wrote:

> On Fri, Sep 29, 2017 at 9:27 AM, Alexander Stoddard <
> alexander(dot)stoddard(at)gmail(dot)com> wrote:
>
>> I found what seems to be an odd difference between COPY and \copy parsing.
>>
> ​[...]
> ​
>
>
>> COPY dest_table FROM PROGRAM $$ sed 's/x/y/' | etc... $$
>>
>> To my surprise this worked with COPY but not \COPY which failed with:
>> \copy: parse error at "$$"
>>
>> Is this an undocumented difference? Is this even the appropriate email
>> list to ask this kind of question or report such a difference?
>>
>
> ​This is the correct place for seeking such clarification.​ The docs
> cannot cover every possible thing people might do and these lists (-general
> in particular) are here to fill in the gaps.
>
> ​The negative condition that "psql" itself doesn't understand
> dollar-quoting​ is not documented. Dollar-quoting is documented as a
> server-interpreted SQL Syntax feature and only applies there.
>
> While the commands are similar COPY is server-side SQL while \copy is a
> psql meta-command that psql converts to SQL, executes, obtains the results,
> and processes. Note that the server would never see "PROGRAM $$" since the
> server would be unable to access the local program being referred to. The
> server sees "FROM stdin" and psql feeds the results of the PROGRAM
> invocation to the server over that pipe.
>
> David J.
>
>
Thank you, David. That helps makes sense of everything. There is the
situation where psql is executed by a non-superuser on the server. But the
docs make clear that only STDOUT / STDIN, not not named files or commands
are allowed in that case. So I now realize I would just have been trading a
parse error for a security one had my dollar-quoting worked with \copy!

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Victor Yegorov 2017-09-29 17:32:10 Converting inherited partitions into declarative ones
Previous Message David G. Johnston 2017-09-29 16:54:25 Re: COPY vs \COPY FROM PROGRAM $$ quoting difference?