Re: Output parameters problem - Mailing list pgsql-odbc

From Hiroshi Inoue
Subject Re: Output parameters problem
Date
Msg-id 44ECF0ED.4080508@tpf.co.jp
Whole thread Raw
In response to Output parameters problem  (Bart Samwel <bart@samwel.tk>)
List pgsql-odbc
Bart Samwel wrote:
> Hi there,
>
> I've found a problem with psqlodbc and output parameters. The problem is
> as follows: if I execute {CALL foobar(?,x,y,z)} where the parameter is
> an output parameter, the psqlodbc  will execute

 > "SELECT foobar(,x,y,z)",

Oops my oversight.

> instead of "SELECT foobar(x,y,z)". Output parameters in the second or
> later position are no problem, it's only the first parameter that's
> treated incorrectly. This is because even though the output parameter
> '?' is ignored, psqlodbc then tries to remove the comma _preceding_ the
> parameter from the output. If there is no comma (as is the case with the
> first parameter) this doesn't work, of course.
>
> I've fixed it as follows, by making the following changes in convert.c:
>
> 1. Pass an optional QueryParse *qp to ResolveOneParam(), i.e.:
>
> static int
> ResolveOneParam(QueryBuild *qb, QueryParse *qp);
>
> 2. In ResolveOneParam, there is the following segment of code:
>
> if (outputDiscard)
> {
>   for (npos = qb->npos - 1; npos >= 0 &&
> isspace(qb->query_statement[npos]) ; npos--) ;
>   if (npos >= 0 && qb->query_statement[npos] == ',')
>   {
>     qb->npos = npos;
>     qb->query_statement[npos] = '\0';
>   }
>   return SQL_SUCCESS_WITH_INFO;
> }
>
>
> Immediately before the return statement, I added:
>
>   else if (npos >= 0 && qb->query_statement[npos] == '(' && qp)
>   {
>     for (npos = qp->opos+1; isspace(qp->statement[npos]); npos++) ;
>     if (qp->statement[npos] == ',')
>     {
>       qp->opos = npos;
>     }
>   }

Thanks a lot.
I would take care of it.

regards,
Hiroshi Inoue

pgsql-odbc by date:

Previous
From: Hiroshi Inoue
Date:
Subject: Re: ADO and sequences
Next
From: Andreas
Date:
Subject: Re: ADO and sequences