Re: Bound parameters in escaped functions
"Inoue, Hiroshi" <[email protected]> Mon, 20 May 2019 20:58:21 +0900
| Newsgroups | gmane.comp.db.postgresql.odbc |
|---|---|
| Message-ID | <[email protected]> |
Hi, We would make a new release this weekend. regards, Hiroshi Inoue On 2019/05/20 6:21, Grant Shirreffs wrote: > > Thank you, Hiroshi. > > Do you have any idea when there is likely to be a formal release > containing this fix? > > Kind regards > > Grant > > *From:*Inoue, Hiroshi <[email protected]> > *Sent:* Sunday, 19 May 2019 16:06 > *To:* Grant Shirreffs <[email protected]> > *Cc:* [email protected] > *Subject:* Re: Bound parameters in escaped functions > > Hi Grant, > > I've pushed changes to git. > Please look at > https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=summary . > > regards, > Hiroshi Inoue > > On 2019/05/17 9:48, Inoue, Hiroshi wrote: > > Hi Grant, > > Thanks for the report. > I would take care of the bug fix. > > regards, > Hiroshi Inoue > > On 2019/05/14 12:58, Grant Shirreffs wrote: > > Hello, > > I have found a bug in the translation of ‘?’ parameters in > escaped ODBC functions. > > Where there is an escaped ODBC function within another, for > example: > > CASE WHEN {fn LENGTH({fn LTRIM(Name || > ?))=? […] > > During convert_escape (convert.c:5471), at line 5626 the > QueryBuild object is copied to a local temporary (‘ncb’), > which is then passed to ‘processParameters’, which then calls > recursively back into convert_escape for the inner function. > > Then, at line 5771, the parameter number from ncb is passed > back into the original QueryBuild, so that query processing > carries on successfully. However, crucially, the > dollar_number value from ncb, which has been incremented while > processing the parameters inside the function, is not passed > back. So although the parameters themselves are correctly > handled, the incorrect PostgreSQL placeholder symbol is generated. > > In the example above, the resulting SQL is: > > CASE WHEN LENGTH(LTRIM(Name || $1))=$1::int4 […] > > Where it should of course be: > > CASE WHEN LENGTH(LTRIM(Name) || $1))=$2:int4 > > The fix is to copy the dollar_number back from ncb to the > original QueryBuild: > > if(SQL_ERROR != retval) > > { > > qb->param_number = nqb.param_number; > > qb->dollar_number = nqb.dollar_number; > > qb->flags = nqb.flags; > > } > --- このメールは、AVG によってウイルス チェックされています。 http://www.avg.com