mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 13:33:07 +01:00
92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
#coding:utf-8
|
|
|
|
"""
|
|
ID: issue-8020
|
|
ISSUE: https://github.com/FirebirdSQL/firebird/issues/8020
|
|
TITLE: AV when both function and dependent table are dropped in the same transaction
|
|
DESCRIPTION:
|
|
NOTES:
|
|
[12.03.2024] pzotov
|
|
1. Crash occured only when connection is done via TCP protocol.
|
|
2. Another bug currently *remains* in FB 6.x if DROP-statements are in DSQL form, i.e are not 'enclosed' in PSQL and begin/end blocks:
|
|
==========
|
|
Statement failed, SQLSTATE = 39000
|
|
unsuccessful metadata update
|
|
-DROP TABLE T_FN failed
|
|
-invalid request BLR at offset 1
|
|
-function F is not defined
|
|
==========
|
|
See https://github.com/FirebirdSQL/firebird/issues/8021 (currently not fixed).
|
|
Because of this, it was decided to run DROP statements within PSQL code.
|
|
3. Test checks whether MON$SERVER_PID remains the same after execution of DROP statements. In case of crash this is not so.
|
|
|
|
Confirmed bug on 6.0.0.268
|
|
Checked on 6.0.0.269
|
|
"""
|
|
|
|
import pytest
|
|
from firebird.qa import *
|
|
|
|
db = db_factory()
|
|
|
|
expected_stdout = """
|
|
IS_SERVER_PID_THE_SAME <true>
|
|
Statement failed, SQLSTATE = 38000
|
|
unsuccessful metadata update
|
|
-cannot delete
|
|
-Function F
|
|
-there are 1 dependencies
|
|
"""
|
|
|
|
act = python_act('db')
|
|
|
|
@pytest.mark.version('>=6.0')
|
|
def test_1(act: Action):
|
|
test_script = f"""
|
|
set list on;
|
|
|
|
set term ^;
|
|
create function f(x int)
|
|
returns int
|
|
as
|
|
begin
|
|
return x;
|
|
end
|
|
^
|
|
create table t_fn (x int, fx computed by (f(x)))
|
|
^
|
|
commit
|
|
^
|
|
set term ;^
|
|
commit;
|
|
|
|
connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}';
|
|
set autoddl off;
|
|
set bail on;
|
|
commit;
|
|
set term ^;
|
|
execute block returns(is_server_pid_the_same boolean) as
|
|
declare v_server_pid_init int;
|
|
declare v_server_pid_curr int;
|
|
begin
|
|
select mon$server_pid from mon$attachments where mon$attachment_id = current_connection into v_server_pid_init;
|
|
begin
|
|
execute statement 'drop function f';
|
|
execute statement 'drop table t_fn';
|
|
when any do
|
|
begin
|
|
end
|
|
end
|
|
select mon$server_pid from mon$attachments where mon$attachment_id = current_connection into v_server_pid_curr;
|
|
is_server_pid_the_same = (v_server_pid_init = v_server_pid_curr);
|
|
suspend;
|
|
end
|
|
^
|
|
set term ;^
|
|
commit;
|
|
"""
|
|
|
|
act.expected_stdout = expected_stdout
|
|
act.isql(switches=['-q'], input = test_script, combine_output = True)
|
|
assert act.clean_stdout == act.clean_expected_stdout
|