On 25 November 2013 15:25, Rajeev rastogi <rajeev.rast...@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 > > >