SQLExecute returns 0 rows with BoolsAsChar=1
От | Heikki Linnakangas |
---|---|
Тема | SQLExecute returns 0 rows with BoolsAsChar=1 |
Дата | |
Msg-id | 51479445.7020905@vmware.com обсуждение исходный текст |
Ответы |
Re: SQLExecute returns 0 rows with BoolsAsChar=1
Re: SQLExecute returns 0 rows with BoolsAsChar=1 |
Список | pgsql-odbc |
If you SQLPrepare a query, and bind a VARCHAR parameter with column_size of exactly 5, and you have BoolsAsChar=1 (which is the default), the subsequent SQLExecute will return 0 rows. With those conditions, HowToPrepareBeforeExec returns shouldExec, which means that the query is sent to the server to be parse, in a Parse message. PGAPI_Execute() calls HowToPrepareBeforeExec, and calls prepareParameters(), which sends the Parse message, and reads the resulting ParameterDescription messages from the server. It also creates a new QResultClass object, and stores it as the statement's result. Now, when PGAPI_Execute() proceeds to execute the statement for real, it doesn't clear the dummy result set created by prepareParameters(), but just appends the real result set to the statement object's chain of results. When SQLExecute() returns, the first result set (the one that the application cares about) is the dummy one, with 0 rows. As a quick fix, but which I believe is quite safe and correct anyway, is to always clear any existing result sets in PGAPI_Execute() before actually executing the query. Normally, there shouldn't be any result sets, so clearing is harmless. In this buggy corner, case it clears the dummy result set, fixing the problem. Attached is a patch to fix that. As usual, this is also present in my github repository at https://github.com/hlinnaka/psqlodbc/, as well as a test case in the master-with-testcases branch. - Heikki
Вложения
В списке pgsql-odbc по дате отправления: