2021-04-26 20:07:00 +02:00
|
|
|
#coding:utf-8
|
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
"""
|
|
|
|
ID: issue-4040
|
|
|
|
ISSUE: 4040
|
|
|
|
TITLE: Cannot drop a NOT NULL constraint on a field participating in the UNIQUE constraint
|
|
|
|
DESCRIPTION:
|
|
|
|
JIRA: CORE-3692
|
|
|
|
"""
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
import pytest
|
|
|
|
from firebird.qa import *
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
init_script = """
|
|
|
|
recreate table cset (cname varchar(250) character set none not null);
|
|
|
|
commit;
|
|
|
|
alter table cset add constraint uq_cset unique (cname);
|
|
|
|
commit;
|
2021-12-22 20:23:11 +01:00
|
|
|
"""
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
db = db_factory(init=init_script)
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
test_script = """
|
2021-04-26 20:07:00 +02:00
|
|
|
show table cset;
|
2022-01-22 21:59:15 +01:00
|
|
|
|
2021-04-26 20:07:00 +02:00
|
|
|
set term ^;
|
|
|
|
execute block as
|
|
|
|
declare v_stt varchar(70);
|
|
|
|
begin
|
|
|
|
for
|
|
|
|
with
|
|
|
|
inp as(select 'cset' nm from rdb$database)
|
|
|
|
,pk_defs as( -- obtain PK constraint and get fields that assembles it
|
|
|
|
select
|
|
|
|
rc.rdb$relation_name rel_name
|
|
|
|
,rc.rdb$constraint_name pk_name
|
|
|
|
,rc.rdb$index_name pk_idx
|
|
|
|
,rs.rdb$field_name fld_name
|
|
|
|
,rs.rdb$field_position fld_pos
|
|
|
|
from rdb$relation_constraints rc
|
|
|
|
join rdb$index_segments rs on rc.rdb$index_name=rs.rdb$index_name
|
|
|
|
join inp i on rc.rdb$relation_name containing i.nm
|
|
|
|
where rc.rdb$constraint_type containing 'PRIMARY'
|
|
|
|
)
|
|
|
|
-- select * from pk_defs
|
|
|
|
,chk_list as(
|
|
|
|
select
|
|
|
|
rc.rdb$relation_name rel_name
|
|
|
|
,rc.rdb$constraint_name sub_name
|
|
|
|
,rc.rdb$constraint_type sub_type
|
|
|
|
,'alter table '||trim(rc.rdb$relation_name)||' drop constraint '||trim(rc.rdb$constraint_name)||'; -- '||trim(rc.rdb$constraint_type) stt
|
|
|
|
,ck.rdb$trigger_name
|
|
|
|
,p.pk_name -- not null ==> field is included in PK, skip it
|
|
|
|
,decode(rc.rdb$constraint_type, 'UNIQUE', 99, 0) sort_weitgh
|
|
|
|
from rdb$relation_constraints rc
|
|
|
|
join inp i on rc.rdb$relation_name containing i.nm
|
|
|
|
left join rdb$check_constraints ck on rc.rdb$constraint_name=ck.rdb$constraint_name
|
|
|
|
left join pk_defs p on rc.rdb$relation_name=p.rel_name and ck.rdb$trigger_name=p.fld_name
|
|
|
|
where
|
|
|
|
rc.rdb$relation_name not like 'RDB$%'
|
|
|
|
and rc.rdb$relation_name not like 'MON$%'
|
|
|
|
and rc.rdb$relation_name not like 'IBE$%'
|
|
|
|
and rc.rdb$constraint_type not containing 'PRIMARY'
|
|
|
|
and p.pk_name is null -- ==> this field is NOT included in PK constraint
|
|
|
|
order by rc.rdb$relation_name, decode(rc.rdb$constraint_type, 'UNIQUE', 99, 0)
|
|
|
|
)
|
|
|
|
select cast(stt as varchar(70)) stt from chk_list
|
|
|
|
into v_stt
|
|
|
|
do begin
|
|
|
|
execute statement (v_stt);
|
|
|
|
end
|
2022-01-22 21:59:15 +01:00
|
|
|
|
2021-04-26 20:07:00 +02:00
|
|
|
end
|
|
|
|
^ set term ;^
|
|
|
|
commit;
|
2022-01-22 21:59:15 +01:00
|
|
|
|
2021-04-26 20:07:00 +02:00
|
|
|
show table cset;
|
2021-12-22 20:23:11 +01:00
|
|
|
"""
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
act = isql_act('db', test_script)
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
expected_stdout = """
|
|
|
|
CNAME VARCHAR(250) Not Null
|
2021-04-26 20:07:00 +02:00
|
|
|
CONSTRAINT UQ_CSET:
|
|
|
|
Unique key (CNAME)
|
2022-01-22 21:59:15 +01:00
|
|
|
CNAME VARCHAR(250) Nullable
|
2021-12-22 20:23:11 +01:00
|
|
|
"""
|
2021-04-26 20:07:00 +02:00
|
|
|
|
2022-01-22 21:59:15 +01:00
|
|
|
@pytest.mark.version('>=3')
|
|
|
|
def test_1(act: Action):
|
|
|
|
act.expected_stdout = expected_stdout
|
|
|
|
act.execute()
|
|
|
|
assert act.clean_stdout == act.clean_expected_stdout
|
2021-04-26 20:07:00 +02:00
|
|
|
|