Skip to content

Non-compilable trigger code may remain in memory and prevent further DML #8997

@pavel-zotov

Description

@pavel-zotov

Consider following script:

set list on;
set echo on;
set autoddl ON;
shell if exist r:\temp\tmp4test.fdb del r:\temp\tmp4test.fdb;
create database 'localhost:r:\temp\tmp4test.fdb' user 'sysdba' password 'masterkey';

create or alter procedure sp_test(a_x int) as begin end;
recreate table test(id int primary key, x bigint, y bigint);
insert into test values(1,  3,  7);
commit;

set term ^;
create or alter procedure sp_test returns(o_y int) as
begin
    suspend;
end
^
commit
^
create or alter trigger test_ad for test active after delete as
begin
    
    -- SQLSTATE = 42S22 / ... / -Column unknown / -NEW.X
    -- execute procedure sp_test returning_values(new.x);
    -- new.x = 1;

    -- SQLSTATE = 42000 /attempted update of read-only column TEST.Y
    --execute procedure sp_test returning_values(old.y);
    old.y = 2;
end
^
set term ;^
commit;

set count on;
select * from rdb$triggers where rdb$system_flag is distinct from 1;
commit;

delete from test where id = 1;  ---------- [ 1 ]
commit;

delete from test where id = 1;  ---------- [ 2 ]
commit;

connect 'localhost:r:\temp\tmp4test.fdb' user 'sysdba' password 'masterkey';

delete from test where id = 1;  ---------- [ 3 ]
commit;

select * from test;

Compilation of trigger will fail with SQLSTATE = 42000 /attempted update of read-only column TEST.Y, trigger will not be stored in DB.
But statements marked as [1] and [2] will fail with:

Statement failed, SQLSTATE = 42000
attempted update of read-only column

Only statement [3] (which runs after re-connect) will complete w/o error.

If we change trigger in such manner:

    -- SQLSTATE = 42S22 / ... / -Column unknown / -NEW.X
    -- execute procedure sp_test returning_values(new.x);
    new.x = 1;

    -- SQLSTATE = 42000 /attempted update of read-only column TEST.Y
    --execute procedure sp_test returning_values(old.y);
    -- old.y = 2;

-- then no problems with DML statements, they run w/o errors.

Checked on WI-V3.0.14.33855; WI-V4.0.7.3269; WI-V5.0.4.1808.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions