| From: | "Kevin Jenkins" <gameprogrammer(at)rakkar(dot)org> | 
|---|---|
| To: | pgsql-bugs(at)postgresql(dot)org | 
| Subject: | BUG #4407: Bug in PQexecPrepared when using an integer primary key that does not start at 1 | 
| Date: | 2008-09-07 02:20:32 | 
| Message-ID: | 200809070220.m872KWw8039668@wwwmaster.postgresql.org | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-bugs | 
The following bug has been logged online:
Bug reference:      4407
Logged by:          Kevin Jenkins
Email address:      gameprogrammer(at)rakkar(dot)org
PostgreSQL version: 8.3.3 build1400
Operating system:   Windows
Description:        Bug in PQexecPrepared when using an integer primary key
that does not start at 1
Details: 
If I call PQexecPrepared from C++, it can fail incorrectly along the
following lines:
ERROR:  insert or update on table "users" violates foreign key constraint
"users
_homecountryid_fk_fkey"
DETAIL:  Key (homecountryid_fk)=(1) is not present in table "country".
Using the following table:
CREATE TABLE lobby2.country
(
  country_id integer PRIMARY KEY NOT NULL, -- country id
  country_sort_id integer NOT NULL, -- display order for a list of
countries...
  country_code character varying(2) NOT NULL, -- country 2 letters ISO code,
like...
  country_name character varying(100) NOT NULL, -- county's full name
  country_has_states boolean NOT NULL DEFAULT false, -- defines if a country
has a pre-defined list of states. can be TRUE or FALSE
  country_enable boolean NOT NULL DEFAULT true -- country enabled or
disbaled, can be either true or false
)
WITH (OIDS=FALSE);
INSERT INTO lobby2.country (country_id, country_sort_id, country_code,
country_name, country_has_states, country_enable) VALUES (120, 100, 'AF',
'Afghanistan', false, true);
INSERT INTO lobby2.country (country_id, country_sort_id, country_code,
country_name, country_has_states, country_enable) VALUES (121, 200, 'AL',
'Albania', false, true);
// ...
INSERT INTO lobby2.country (country_id, country_sort_id, country_code,
country_name, country_has_states, country_enable) VALUES (355, 23700, 'US',
'United States', true, true);
INSERT INTO lobby2.country (country_id, country_sort_id, country_code,
country_name, country_has_states, country_enable) VALUES (356, 23800, 'UM',
'United States Minor Outlying Isl', false, true);
// ...
With the following statement:
UPDATE lobby2.users SET homeCountryId_fk=$1::integer WHERE
userId_pk=$2::integer
Where $1::integer is 355 and userId_pk is 1.
The exact same statement, using text instead of a parameter:
UPDATE lobby2.users SET homeCountryId_fk=355 WHERE userId_pk=$2::integer
Works fine. It of course also works in the pgAdmin III query browser.
Adding a phony country that starts at index 1:
-- Phony country
INSERT INTO lobby2.country (country_id, country_sort_id, country_code,
country_name, country_has_states, country_enable) VALUES (1, 1, '1', '1',
false, false);
Fixes the problem.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Bruce Momjian | 2008-09-07 13:06:02 | Re: PG 8.3.3 - ERROR: lock AccessShareLock on object 16385/16467/0 is already held | 
| Previous Message | Mike Gagnon | 2008-09-06 16:32:17 | BUG #4406: silent install error |