From: | Boszormenyi Zoltan <zb(at)cybertec(dot)at> |
---|---|
To: | Hiroshi Inoue <inoue(at)tpf(dot)co(dot)jp> |
Cc: | Hiroshi Saito <hiroshi(at)winpg(dot)jp>, pgsql-odbc(at)postgresql(dot)org, Hans-Jürgen Schönig <hs(at)cybertec(dot)at> |
Subject: | Re: Error reporting goes into an infinite loop when compiled --with-odbcver=0x0250 |
Date: | 2012-09-01 17:13:52 |
Message-ID: | 50424250.602@cybertec.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-odbc |
Hi,
2012-09-01 17:22 keltezéssel, Boszormenyi Zoltan írta:
> Hi,
>
> 2012-09-01 11:19 keltezéssel, Hiroshi Inoue írta:
>> Hi,
>>
>> (2012/08/31 20:21), Boszormenyi Zoltan wrote:
>>> Hi,
>>>
>>> we had to recently test psqlODBC with an older application
>>> which doesn't expect ODBC 3.x.
>>>
>>> The problem is that the client locks up as soon as it encounters
>>> an error of any kind, like restarting the server from under the client
>>> or simply executing a bad query.
>>>
>>> After debugging the problem and reading the code of both
>>> unixODBC 2.3.1 and psqlODBC (version 09.00.0310 and 09.01.0200),
>>> I discovered that the DriverManager calls the driver's SQLError()
>>> and SQLGetDiagRec() in a loop
>>
>> Does the DriverManager call both SQLError() and SQLGetDiagRec()?
>
> Yes, it detects which is supported and calls that in the error handler part
> of SQLExecute(). In case psqlODBC is compiled using --with-odbcver=0x0250,
> SQLGetDiagRec() is naturally not supported.
>
>> Could you send me (loop part of) the Mylog output?
>
> I attached the unixODBC tracefile (/tmp/Trace.txt), there is no "mylog"
> lines in it. I execute a single "select * from test;" and this table doesn't exist.
> The trace file shows that the error code is repeated ad infinitum.
>
> But for my debugging, I didn't use the ODBC tracing, I added my extra printf()s
> so I can see on the client terminal what is going on.
Attached is the mylog output for the vanilla psqlODBC 09.01.0200
which also shows the infinite loop.
>
> I wrote:
>>> The attached patch fixes this problem. Though, I am not sure about
>>> whether the (stapos > msglen) and (error->errorpos >= msglen)
>>> checks are redundant or not.
>>
>
> ----8<--------8<--------8<--------8<--------8<----
> @@ -226,7 +226,17 @@ ER_ReturnError(PG_ErrorInfo **pgerror,
> }
> stapos = (RecNumber - 1) * error->recsize;
> if (stapos > msglen)
> + {
> + if (clear_str)
> + {
> + if (error->errorpos >= msglen)
> + {
> + ER_Destructor(error);
> + *pgerror = NULL;
> + }
> + }
> return SQL_NO_DATA_FOUND;
> + }
> pcblen = wrtlen = msglen - stapos;
> if (pcblen > error->recsize)
> pcblen = error->recsize;
> ----8<--------8<--------8<--------8<--------8<----
>
> It seems the two checks are indeed redundant, valgrind shows no leaks
> which means ER_Destructor() is called so the second check must be true.
>
> Best regards,
> Zoltán Böszörményi
>
>
>
--
----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt, Austria
Web: http://www.postgresql-support.de
http://www.postgresql.at/
Attachment | Content-Type | Size |
---|---|---|
10581.log.gz | application/x-tar | 18.8 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Ross Reedstrom | 2012-09-06 18:59:49 | Re: MS Office - OS X Lion (10.7) |
Previous Message | Boszormenyi Zoltan | 2012-09-01 15:22:52 | Re: Error reporting goes into an infinite loop when compiled --with-odbcver=0x0250 |