Обсуждение: Prepared statement error with UseServerSidePrepare=1
Hi,
I found some strangeness in psqlodbc’s behavior. May be you can explain to me, do I do something wrong or there is a bug.
Tested on psqlodbc 9.3.3 and postgresql 9.3.4.
I have department tree table named KEY11 with 2 indexes on that:
CREATE TABLE Key11 (
ID INTEGER not null,
Disp VARCHAR (64) not null,
Search VARCHAR (64) not null,
CustomerID INTEGER not null,
ParentID INTEGER not null,
primary KEY (Search,Disp,CustomerID,ParentID)
);
create unique index key11_idx on Key11 (ID);
create unique index key11_disp_idx on Key11(Disp,CustomerID,ParentID);
So I can’t insert same named department for same customer and on same organization level (ParentID).
I do login to the database and prepare all SQL statements only once. Afterward prepared SQL statements are reused with different parameters.
So I do insert new department to KEY11 table:
SQLPrepare - INSERT INTO KEY11 (ID, DISP, SEARCH, CUSTOMERID, PARENTID) VALUES (?,?,?,?,?)
SQLExecute with values for example (6022, ‘New department’, ‘NEW DEPARTMENT’, 2, 6021)
Everything fine.
Now I make another insert with same parameters:
SQLExecute with values for example (6023, ‘New department’, ‘NEW DEPARTMENT’, 2, 6021)
Fine, I get an error: duplicate key value violates unique constraint "key11_disp_idx"
Now I rename department 6022 “New Department” -> “New Department 2”:
SQLPrepare - UPDATE KEY11 SET DISP = ?, SEARCH = ? WHERE ID = ? AND CUSTOMERID = ?
SQLExecute with values for example (‘New department 2’, ‘NEW DEPARTMENT’, 6022, 2)
Fine again. Department’s name is renamed, so I can try to insert new department again. Error while executing the query
Third insert with new department in parameters:
SQLExecute with values for example (6024, ‘New department’, ‘NEW DEPARTMENT’, 2, 6021)
Still an error, but only: “Error while executing the query” ?
But if I query now the KEY11 table, I see that New department was added despite of error:
select * from key11 where parentid = 6021;
id | disp | search | customerid | parentid
------+-----------------------------+-----------------------------+------------+----------
6022 | New department 2 | NEW DEPARTMENT 2 | 2 | 6021
6024 | New department | NEW DEPARTMENT | 2 | 6021
(3 rows)
I noticed the behavior on psqlodbc 9.2.1. In that version third insert returned same error, but didn’t really insert the data.
If I disable UseServerSidePrepare=0, then third insert executes successfully.
Thanks in advance,
Lev Bukovski
Вложения
On 05/28/2014 01:52 AM, lev.bukovski@teliasonera.com wrote: > Hi, > > I found some strangeness in psqlodbc’s behavior. May be you can explain > to me, do I do something wrong or there is a bug. > > Tested on psqlodbc 9.3.3 and postgresql 9.3.4. > I noticed the behavior on psqlodbc 9.2.1. In that version third insert > returned same error, but didn’t really insert the data. > > If I disable UseServerSidePrepare=0, then third insert executes > successfully. I would tail the Postgres log and see what it says when you go through the sequence. My suspicion is that it is a transaction rollback not being handled. > > Thanks in advance, > > Lev Bukovski > > > > -- Adrian Klaver adrian.klaver@aklaver.com
On 05/30/2014 05:12 AM, lev.bukovski@teliasonera.com wrote:
> I do rollback after any error and commit even after rollback :)
So what does the Postgres log show during this?
You have mentioned errors, but you have not said exactly what errors.
So what are the actual errors?
>
> bool RollBack()
> {
> RETCODE rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_ROLLBACK);
> if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
> {
> return false;
>
> }
> return true;
> }
>
--
Adrian Klaver
adrian.klaver@aklaver.com
On 06/01/2014 12:19 PM, lev.bukovski@teliasonera.com wrote: > Rollback is successfull, no problems on that. > > Log files in the original message have exact error code and description, > but like I wrote > > on wrong insert I get logical error "duplicate key value violates unique > constraint "key11_disp_idx". Error while executing the query", but when > I afterward try to make correct insert, I still get an error from > psqlodbc "Error while executing the query", which is like a last part of > the first error. > Hmm, not sure what is going on. I would say you will need to show the full code of what you are doing in the Prepare/bind/Execute cycle. Hopefully others can see if there is anything out of place. Would not hurt to crank the psqlodbc logging and capture that also. -- Adrian Klaver adrian.klaver@aklaver.com
Hi Lev, Could you please try the attahced patch? regards, Hiroshi Inoue (2014/05/28 17:52), lev.bukovski@teliasonera.com wrote: > Hi, > > I found some strangeness in psqlodbc’s behavior. May be you can explain > to me, do I do something wrong or there is a bug. > > Tested on psqlodbc 9.3.3 and postgresql 9.3.4. > > I have department tree table named KEY11 with 2 indexes on that: > > CREATE TABLE Key11 ( > > ID INTEGER not null, > > Disp VARCHAR (64) not null, > > Search VARCHAR (64) not null, > > CustomerID INTEGER not null, > > ParentID INTEGER not null, > > primary KEY (Search,Disp,CustomerID,ParentID) > > ); > > create unique index key11_idx on Key11 (ID); > > create unique index key11_disp_idx on Key11(Disp,CustomerID,ParentID); > > So I can’t insert same named department for same customer and on same > organization level (ParentID). > > I do login to the database and prepare all SQL statements only once. > Afterward prepared SQL statements are reused with different parameters. > > So I do insert new department to KEY11 table: > > SQLPrepare - INSERT INTO KEY11 (ID, DISP, SEARCH, CUSTOMERID, PARENTID) > VALUES (?,?,?,?,?) > > SQLExecute with values for example (6022, ‘New department’, ‘NEW > DEPARTMENT’, 2, 6021) > > Everything fine. > > Now I make another insert with same parameters: > > SQLExecute with values for example (6023, ‘New department’, ‘NEW > DEPARTMENT’, 2, 6021) > > Fine, I get an error: duplicate key value violates unique constraint > "key11_disp_idx" > > Now I rename department 6022 “New Department” -> “New Department 2”: > > SQLPrepare - UPDATE KEY11 SET DISP = ?, SEARCH = ? WHERE ID = ? AND > CUSTOMERID = ? > > SQLExecute with values for example (‘New department 2’, ‘NEW > DEPARTMENT’, 6022, 2) > > Fine again. Department’s name is renamed, so I can try to insert new > department again. Error while executing the query > > Third insert with new department in parameters: > > SQLExecute with values for example (6024, ‘New department’, ‘NEW > DEPARTMENT’, 2, 6021) > > Still an error, but only: “Error while executing the query” ? > > But if I query now the KEY11 table, I see that New department was added > despite of error: > > select * from key11 where parentid = 6021; > > id | disp | search | > customerid | parentid > > ------+-----------------------------+-----------------------------+------------+---------- > > 6022 | New department 2 | NEW DEPARTMENT 2 > | 2 | 6021 > > 6024 | New department | NEW DEPARTMENT > | 2 | 6021 > > (3 rows) > > I noticed the behavior on psqlodbc 9.2.1. In that version third insert > returned same error, but didn’t really insert the data. > > If I disable UseServerSidePrepare=0, then third insert executes > successfully. > > Thanks in advance, > > Lev Bukovski
Вложения
(2014/06/02 22:11), lev.bukovski@teliasonera.com wrote: > Hi Hiroshi, > > I applied your patch on psqlodbc 9.3.3 (NOT on the head branch). > Now I can't even get to insert operations, because I get error while application configuration fetch. > > I have this CONFIG table, from where I load configuration parameters (SELECT VALUE2, VALUE3 FROM CONFIG WHERE VALUE1 =?) > Each execute of the SQL returns one row. So the first execute success, but second returns with 'Null statement result inPGAPI_ExtendedFetch' error. > > psqlodbc and mylog files are in attechaments. Thanks for the report. Please apply the attached patch also. It's the same as the one attached in the thread [ODBC] Problems using SQLFetch on prepared INSERT with RETURNING clause . regards, Hiroshi Inoue
Вложения
Hi Hiroshi,
I applied your patch on psqlodbc 9.3.3 (NOT on the head branch).
Now I can't even get to insert operations, because I get error while application configuration fetch.
I have this CONFIG table, from where I load configuration parameters (SELECT VALUE2, VALUE3 FROM CONFIG WHERE VALUE1 =
?)
Each execute of the SQL returns one row. So the first execute success, but second returns with 'Null statement result
inPGAPI_ExtendedFetch' error.
psqlodbc and mylog files are in attechaments.
Lev Bukovski
-----Original Message-----
From: Hiroshi Inoue [mailto:inoue@tpf.co.jp]
Sent: 2. kesäkuuta 2014 6:59
To: Bukovski, Lev /External; pgsql-odbc@postgresql.org
Subject: Re: [ODBC] Prepared statement error with UseServerSidePrepare=1
Hi Lev,
Could you please try the attahced patch?
regards,
Hiroshi Inoue
(2014/05/28 17:52), lev.bukovski@teliasonera.com wrote:
> Hi,
>
> I found some strangeness in psqlodbc's behavior. May be you can
> explain to me, do I do something wrong or there is a bug.
>
> Tested on psqlodbc 9.3.3 and postgresql 9.3.4.
>
> I have department tree table named KEY11 with 2 indexes on that:
>
> CREATE TABLE Key11 (
>
> ID INTEGER not null,
>
> Disp VARCHAR (64) not null,
>
> Search VARCHAR (64) not null,
>
> CustomerID INTEGER not null,
>
> ParentID INTEGER not null,
>
> primary KEY (Search,Disp,CustomerID,ParentID)
>
> );
>
> create unique index key11_idx on Key11 (ID);
>
> create unique index key11_disp_idx on Key11(Disp,CustomerID,ParentID);
>
> So I can't insert same named department for same customer and on same
> organization level (ParentID).
>
> I do login to the database and prepare all SQL statements only once.
> Afterward prepared SQL statements are reused with different parameters.
>
> So I do insert new department to KEY11 table:
>
> SQLPrepare - INSERT INTO KEY11 (ID, DISP, SEARCH, CUSTOMERID,
> PARENTID) VALUES (?,?,?,?,?)
>
> SQLExecute with values for example (6022, 'New department', 'NEW
> DEPARTMENT', 2, 6021)
>
> Everything fine.
>
> Now I make another insert with same parameters:
>
> SQLExecute with values for example (6023, 'New department', 'NEW
> DEPARTMENT', 2, 6021)
>
> Fine, I get an error: duplicate key value violates unique constraint
> "key11_disp_idx"
>
> Now I rename department 6022 "New Department" -> "New Department 2":
>
> SQLPrepare - UPDATE KEY11 SET DISP = ?, SEARCH = ? WHERE ID = ? AND
> CUSTOMERID = ?
>
> SQLExecute with values for example ('New department 2', 'NEW
> DEPARTMENT', 6022, 2)
>
> Fine again. Department's name is renamed, so I can try to insert new
> department again. Error while executing the query
>
> Third insert with new department in parameters:
>
> SQLExecute with values for example (6024, 'New department', 'NEW
> DEPARTMENT', 2, 6021)
>
> Still an error, but only: "Error while executing the query" ?
>
> But if I query now the KEY11 table, I see that New department was
> added despite of error:
>
> select * from key11 where parentid = 6021;
>
> id | disp | search |
> customerid | parentid
>
> ------+-----------------------------+-----------------------------+------------+----------
>
> 6022 | New department 2 | NEW DEPARTMENT 2
> | 2 | 6021
>
> 6024 | New department | NEW DEPARTMENT
> | 2 | 6021
>
> (3 rows)
>
> I noticed the behavior on psqlodbc 9.2.1. In that version third insert
> returned same error, but didn't really insert the data.
>
> If I disable UseServerSidePrepare=0, then third insert executes
> successfully.
>
> Thanks in advance,
>
> Lev Bukovski
Вложения
Hi, The patches together are working. All problems I noticed in psqlodbc 9.3.3 are gone. Thank you very much. Now, I guess, I have to test my application all over again. When can I expect a new release of the psqlodbc driver? Lev Bukovski -----Original Message----- From: Hiroshi Inoue [mailto:inoue@tpf.co.jp] Sent: 2. kesäkuuta 2014 18:17 To: Bukovski, Lev /External; pgsql-odbc@postgresql.org Subject: Re: [ODBC] Prepared statement error with UseServerSidePrepare=1 (2014/06/02 22:11), lev.bukovski@teliasonera.com wrote: > Hi Hiroshi, > > I applied your patch on psqlodbc 9.3.3 (NOT on the head branch). > Now I can't even get to insert operations, because I get error while application configuration fetch. > > I have this CONFIG table, from where I load configuration parameters > (SELECT VALUE2, VALUE3 FROM CONFIG WHERE VALUE1 = ?) Each execute of the SQL returns one row. So the first execute success,but second returns with 'Null statement result in PGAPI_ExtendedFetch' error. > > psqlodbc and mylog files are in attechaments. Thanks for the report. Please apply the attached patch also. It's the same as the one attached in the thread [ODBC] Problems using SQLFetch on prepared INSERT with RETURNING clause . regards, Hiroshi Inoue