Re: COPY table FROM STDIN doesn't show count tag - Mailing list pgsql-hackers

From Amit Khandekar
Subject Re: COPY table FROM STDIN doesn't show count tag
Date
Msg-id CACoZds3g-o4ZFgUEdugWYRtsX79EvsCQscr9j8-Vp=ANgEdiWQ@mail.gmail.com
Whole thread Raw
In response to Re: COPY table FROM STDIN doesn't show count tag  (Rajeev rastogi <rajeev.rastogi@huawei.com>)
List pgsql-hackers



On 25 November 2013 15:25, Rajeev rastogi <rajeev.rastogi@huawei.com> wrote:

OK. I have revised the patch as per the discussion.

Could you please submit only the \COPY fix first ? The attached patch also contains the fix for the original COPY status fix.

Now if \copy command is called then, we are setting the appropriate value of _psqlSettings->copystream in do_copy and same is being used inside handleCopyIn() and handleCopyOut(). Once the \copy command execution finishes, we are resetting the value of _psqlSettings->copystream to NULL. And if COPY(No slash) command is used, then in that case _psqlSettings->copystream will be NULL. So based on this value being NULL, copyStream will be assigned as stdout/stdin depending on TO/FROM respectively inside the function handleCopyOut()/handleCopyIn().

 

Also in order to address the queries like

./psql -d postgres -c "\copy tbl to '/home/rajeev/9.4gitcode/install/bin/data/temp.txt'; copy tbl from stdin;"

Inside the function ProcessResult, we check that if it is the second cycle and result status is COPY OUT or IN, then we reset the value of _psqlSettings->copystream to NULL, so that it can take the value as stdout/stdin for further processing.

 


Yes, that's right, the second cycle should not use pset.copyStream.


handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
 {
        bool            OK = true;
        char       *buf;
        int                     ret;
-       PGresult   *res;
+
+       if (!copystream)
+               copystream = stdout;

It should use pset.queryFout if it's NULL. Same in hadleCopyIn(). Otherwise, the result of the following command goes to stdout, when it should go to the output file :
psql -d postgres -o /tmp/p.out -c "copy tab to stdout"


+                               /*
+                                * If this is second copy; then it will be definately not \copy,
+                                * and also it can not be from any user given file.
+                                * So reset the value of copystream to NULL, so that read/wrie
+                                * happens from stdin/stdout.
+                                */
+                               if (!first_cycle)
+                                       pset.copyStream = NULL;

Let ProcessResult() not change pset.copyStream. Let only do_copy() update it. Instead of the above location, I suggest, just before calling handleCopyOut/In(), we decide what to pass them as their copyStream parameter depending upon whether it is first cycle or not.



 

Please provide your opinion.

 

Thanks and Regards,

Kumar Rajeev Rastogi

 


pgsql-hackers by date:

Previous
From: Haribabu kommi
Date:
Subject: Re: Regress tests to improve the function coverage of schemacmds and user and tablespace files
Next
From: Alexander Korotkov
Date:
Subject: Re: GIN improvements part 1: additional information