Folks,

Version: 8.1.3
Platform: SuSE Linux, GCC
Severity: mild data corruption
Reproducability: 100%

Steps to Reproduce:
(sample code attached)
1) Create a table.
2) Create a function which inserts a row into that table.
3) Run the function once.
4) ALTER the table with a new column and SET DEFAULT for that column.
5) Run the function again.
6) Re-load the function (via REPLACE)
7) Insert one more row using the function.
8) The table will have NULL values in the first TWO rows, not the first ONE 
row as it should.   This is because the DEFAULT value is not being "seen" 
by the cached plan of the function. As an example, the attached code 
produces:

ltreetest=# select * from bugtest;
 id |      name      | is_true
----+----------------+---------
  1 | Before ALTER   |
  2 | Look, its null |
  3 | Now its true.  | t

When it should produce:

ltreetest=# select * from bugtest;
 id |      name      | is_true
----+----------------+---------
  1 | Before ALTER   |
  2 | Look, its null | t
  3 | Now its true.  | t

-- 
--Josh

Josh Berkus
Aglio Database Solutions
San Francisco
create table bugtest (
	id serial not null primary key,
	name text not null unique
);

create function insert_bugtest (
	vname text )
returns int as $f$
begin
	insert into bugtest ( name ) values ( vname );
	return currval('bugtest_id_seq');
end; $f$ language plpgsql security definer;

select insert_bugtest('Before ALTER');

alter table bugtest add is_true boolean;
alter table bugtest alter is_true set default true;

select insert_bugtest('Look, its null');

create or replace function insert_bugtest (
	vname text )
returns int as $f$
begin
	insert into bugtest ( name ) values ( vname );
	return currval('bugtest_id_seq');
end; $f$ language plpgsql security definer;

select insert_bugtest('Now its true.');

select * from bugtest order by id;
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to