INSERT / RETURNING: NULL is issued for the value of field which is defined
either with DEFAULT literal or as COMPUTED-BY and DML is applied to complex
view with TRIGGER which decides target table(s) for data storing
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: CORE-5250
URL: http://tracker.firebirdsql.org/browse/CORE-5250
Project: Firebird Core
Issue Type: Bug
Components: Engine
Affects Versions: 3.0.0, 4.0 Initial, 2.5.5
Reporter: Pavel Zotov
Consider following script:
===
set bail on;
set term ^;
execute block as
begin
begin
execute statement 'drop trigger v_complex_biu';
when any do begin end
end
begin
execute statement 'drop sequence g';
when any do begin end
end
end^
set term ;^
commit;
create sequence g;
commit;
create or alter view v_complex as select 1 i from rdb$database;
create or alter view v_trivial as select 1 i from rdb$database;
recreate table test_a(
id int primary key,
s varchar(8) default 'table_A', -------------------- ### NB-1: this
field has DEFAULT value ###
x int,
y computed by( x * x ), , -------------------- ### NB-2: this and next
fields have COMPUTED-BY definition ###
z computed by( 111 )
);
recreate table test_b(
id int primary key,
s varchar(8) default 'table_B',
x int,
y computed by( x * x ),
z computed by( 222)
);
recreate view v_trivial as
select s, id, x, y, z from test_a
;
recreate view v_complex as
select s, id, x, y, z from test_a
union all
select s, id, x, y, z from test_b
;
set term ^;
create or alter trigger v_complex_biu for v_complex before insert or update
or delete as
declare v int;
begin
if (inserting) then
begin
new.id = coalesce(new.id, gen_id(g,1));
if (mod( new.id, 2) = 1) then
insert into test_a(id, x) values( new.id, new.x);
else
insert into test_b(id, x) values( new.id, new.x);
end
else if (updating) then
begin
if (mod( old.id, 2 ) = 1) then
update test_a set x = new.x where id = old.id;
else
update test_b set x = new.x where id = old.id;
end
else
begin
if (mod( old.id, 2) = 1) then
delete from test_a where id = old.id;
else
delete from test_b where id = old.id;
end
end^
set term ;^
commit;
set list on;
set echo on;
insert into test_a(id, x) values( gen_id(g,1), 10) returning id,s,y,z;
select * from test_a;
rollback;
insert into v_trivial(id, x) values( gen_id(g,1), 11) returning id,s,y,z;
select * from v_trivial;
rollback;
insert into v_complex(id, x) values( gen_id(g,1), 12) returning id,s,y,z;
insert into v_complex(id, x) values( gen_id(g,1), 13) returning id,s,y,z;
select * from v_complex;
rollback;
===
It's output will finish with rows:
===
insert into v_trivial(id, x) values( gen_id(g,1), 11) returning id,s,y,z;
ID 2
S table_A
Y 121
Z 111
select * from v_trivial;
S table_A
ID 2
X 11
Y 121
Z 111
rollback;
insert into v_complex(id, x) values( gen_id(g,1), 12) returning id,s,y,z;
ID 3
S <null> -- ################# ??? #############
Y <null> -- ################# ??? #############
Z <null> -- ################# ??? #############
insert into v_complex(id, x) values( gen_id(g,1), 13) returning id,s,y,z;
ID 4
S <null> -- ################# ??? #############
Y <null> -- ################# ??? #############
Z <null> -- ################# ??? #############
select * from v_complex;
S table_A
ID 3
X 12
Y 144
Z 111
S table_B
ID 4
X 13
Y 169
Z 222
rollback;
===
So, when a view is defined in such manner that TRIGGER it required for proper
target of incoming data, we have a problem with RETURNING such of fields which
have either DEFAULT or COMPUTED-BY clause in DDL.
PS.Perhaps this issue is related to CORE-1036, but I've made separate ticket
after brief discuss with dimitr.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
Mobile security can be enabling, not merely restricting. Employees who
bring their own devices (BYOD) to work are irked by the imposition of MDM
restrictions. Mobile Device Manager Plus allows you to control only the
apps on BYO-devices by containerizing them, leaving personal data untouched!
https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel