mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 21:43:06 +01:00
116 lines
3.6 KiB
Python
116 lines
3.6 KiB
Python
#coding:utf-8
|
|
#
|
|
# id: bugs.core_6138
|
|
# title: Inconsistent behavior regarding visibility of master record on detail inserts
|
|
# decription:
|
|
# Confirmed bug on: 3.0.5.33152 (built 14.09.19), 4.0.0.1598 (built 08.09.19):
|
|
# no error raised when second attach tried to insert record into child table
|
|
# after first attach did commit (but main record was not visible to 2nd attach
|
|
# because of SNAPSHOT isolation level).
|
|
#
|
|
# Works fine on:
|
|
# 4.0.0.1639 SS: 1.745s.
|
|
# 4.0.0.1633 CS: 2.266s.
|
|
# 3.0.5.33183 SS: 1.265s.
|
|
# 3.0.5.33178 CS: 1.611s.
|
|
#
|
|
# tracker_id: CORE-6138
|
|
# min_versions: ['3.0.5']
|
|
# versions: 3.0.5
|
|
# qmid: None
|
|
|
|
import pytest
|
|
from firebird.qa import db_factory, python_act, Action
|
|
from firebird.driver import tpb, Isolation, DatabaseError
|
|
|
|
# version: 3.0.5
|
|
# resources: None
|
|
|
|
substitutions_1 = [('[ \t]+', ' ')]
|
|
|
|
init_script_1 = """"""
|
|
|
|
db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
|
|
|
# test_script_1
|
|
#---
|
|
#
|
|
# import os
|
|
# import sys
|
|
#
|
|
# os.environ["ISC_USER"] = user_name
|
|
# os.environ["ISC_PASSWORD"] = user_password
|
|
# db_conn.close()
|
|
#
|
|
# custom_tpb = fdb.TPB()
|
|
# custom_tpb.isolation_level = fdb.isc_tpb_concurrency
|
|
# custom_tpb.lock_resolution = fdb.isc_tpb_nowait
|
|
#
|
|
# con1=fdb.connect( dsn = dsn )
|
|
# con2=fdb.connect( dsn = dsn )
|
|
# con2.begin( tpb = custom_tpb )
|
|
#
|
|
# #print( 'FDB version: ' + fdb.__version__ )
|
|
# #print( 'Firebird version: ' + con1.firebird_version )
|
|
#
|
|
# con1.execute_immediate( 'create table a (id int primary key)' )
|
|
# con1.execute_immediate( 'create table b (id int primary key, id_a int, constraint fk_b__a foreign key(id_a) references a(id) on update cascade on delete cascade)' )
|
|
# con1.commit()
|
|
#
|
|
# con1.begin( tpb = custom_tpb )
|
|
# cur1=con1.cursor()
|
|
# cur1.execute('insert into a(id) values( ? )', ( 1, ) )
|
|
#
|
|
# con2.commit()
|
|
# con2.begin(tpb = custom_tpb )
|
|
# cur2=con2.cursor()
|
|
# cur2.execute('select id from a')
|
|
#
|
|
# con1.commit()
|
|
# try:
|
|
# cur2.execute( 'insert into b (id, id_a) values (?, ?)', (1, 1,) )
|
|
# print('UNEXPECTED SUCCESS: CHILD RECORD INSERTED W/O ERROR.')
|
|
# except Exception as e:
|
|
#
|
|
# print( ('EXPECTED: FK violation encountered.' if '335544466' in repr(e) else 'Unknown/unexpected exception.') )
|
|
#
|
|
# # print( x for x in e ) # Python 3.x: TypeError: 'DatabaseError' object is not iterable
|
|
# # print( e[0] ) # Python 3.x: TypeError: 'DatabaseError' object is not subscriptable
|
|
#
|
|
# finally:
|
|
# cur2.close()
|
|
#
|
|
# con2.close()
|
|
#
|
|
# cur1.close()
|
|
# con1.close()
|
|
#
|
|
#
|
|
#---
|
|
|
|
act_1 = python_act('db_1', substitutions=substitutions_1)
|
|
|
|
@pytest.mark.version('>=3.0.5')
|
|
def test_1(act_1: Action):
|
|
custom_tpb = tpb(isolation=Isolation.CONCURRENCY, lock_timeout=0)
|
|
with act_1.db.connect() as con1, act_1.db.connect() as con2:
|
|
con2.begin(custom_tpb)
|
|
|
|
con1.execute_immediate('create table a (id int primary key)')
|
|
con1.execute_immediate('create table b (id int primary key, id_a int, constraint fk_b__a foreign key(id_a) references a(id) on update cascade on delete cascade)')
|
|
con1.commit()
|
|
|
|
con1.begin(custom_tpb)
|
|
cur1 = con1.cursor()
|
|
cur1.execute('insert into a(id) values( ? )', [1])
|
|
|
|
con2.commit()
|
|
con2.begin(custom_tpb)
|
|
cur2 = con2.cursor()
|
|
cur2.execute('select id from a')
|
|
|
|
con1.commit()
|
|
|
|
with pytest.raises(DatabaseError, match='.*violation of FOREIGN KEY constraint.*'):
|
|
cur2.execute('insert into b (id, id_a) values (?, ?)', [1, 1])
|