On 20 November, Amit Khandekar wrote: >>>>I hope you meant to write test case as psql -d postgres -c "\copy tab from >>>>stdin; insert into tab values ('lll', 3)", as if we are reading from file, >>>>then the above issue does not come. >>>I meant COPY with a slash. \COPY is equivalent to COPY FROM STDIN. So the >>>issue can also be reproduced by : >>>\COPY tab from 'client_filename' ...
>>>>I have modified the patch as per your comment and same is attached with >>>>this mail. >>>Thanks. The COPY FROM looks good. >>OK..Thanks >>>With the patch applied, \COPY TO 'data_file' command outputs the COPY >>>status into the data file, instead of printing it in the psql session. >>>postgres=# \copy tab to '/tmp/fout'; >>>postgres=# >>>$ cat /tmp/fout >>>ee 909 >>>COPY 1 >>>This is probably because client-side COPY overrides the pset.queryFout with >>>its own destination file, and while printing the COPY status, the overridden >>>file pointer is not yet reverted back. >>This looks to be an issue without our new patch also. Like I tried following >>command and output was as follows: >>rajeev@linux-ltr9:~/9.4gitcode/install/bin<mailto:rajeev@linux-ltr9:~/9.4gitcode/install/bin>> >> ./psql -d postgres -c "\copy tbl to 'new.txt';insert into tbl values(55);" >>rajeev@linux-ltr9:~/9.4gitcode/install/bin<mailto:rajeev@linux-ltr9:~/9.4gitcode/install/bin>> >> cat new.txt >>5 >>67 >>5 >>67 >>2 >>2 >>99 >>1 >>1 >INSERT 0 1 >Ok. Yes it is an existing issue. Because we are now printing the COPY status >even for COPY TO, the existing issue surfaces too easily with the patch. \COPY >TO is a pretty common scenario. And it does not have to have a subsequent >another command >to reproduce the issue Just a single \COPY TO command reproduces the issue. >>I have fixed the same as per your suggestion by resetting the pset.queryFout >>after the function call "handleCopyOut". >>! pset.queryFout = stdout; >The original pset.queryFout may not be stdout. psql -o option can override the >stdout default. >I think solving the \COPY TO part is going to be a different (and an >involved) issue to solve than the COPY FROM. Even if we manage to revert back >the queryFout, I think ProcessResult() is not the right place to do it. >ProcessResult() should not > assume that somebody else has changed queryFout. Whoever has changed it > should revert it. Currently, do_copy() is indeed doing this correctly: > save_file = *override_file; > *override_file = copystream; > success = SendQuery(query.data); > *override_file = save_file; >But the way SendQuery() itself processes the results and prints them, is >conflicting with the above. >So I think it is best to solve this as a different issue, and we should , for >this commitfest, fix only COPY FROM. Once the \COPY existing issue is solved, >only then we can start printing the \COPY TO status as well. You mean to say that I should change the patch to keep only COPY FROM related changes and remove changes related to COPY TO. If yes, then I shall change the patch accordingly and also mention same in documentation also. Please let me know about this so that I can share the modified patch. Thanks and Regards, Kumar Rajeev Rastogi