6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 13:33:07 +01:00

Added/Updated tests\bugs\gh_8062_test.py: Checked on Windows, 6.0.0.315 SS/CS, intermediate snapshot on commit #003b2e0.

This commit is contained in:
pavel-zotov 2024-04-16 14:40:43 +03:00
parent 6cdf45d182
commit 7cd288b89b

876
tests/bugs/gh_8062_test.py Normal file
View File

@ -0,0 +1,876 @@
#coding:utf-8
"""
ID: issue-8062
ISSUE: https://github.com/FirebirdSQL/firebird/issues/8062
TITLE: CREATE [IF NOT EXISTS]
DESCRIPTION:
Test uses pre-created databases.conf which has alias (see variable REQUIRED_ALIAS) and SecurityDatabase in its details
which points to that alias, thus making such database be self-security.
Database file for that alias must NOT exist in the QA_root/files/qa/ subdirectory: it will be created here.
NOTE.
This database MUST be self-secutity because test creates *GLOBAL* mapping which must not be written to default security.db
We create objects of all types which are enumerated in doc to be avaliable for 'CREATE [IF NOT EXISTS]' statement, and also we
create DDL triggers for log appropriate activity in the table 'log_ddl_triggers_activity'.
Then we run CREATE IF NOT EXISTS statements:
* for NON-existing objects (this MUST be logged).
* for existing objects (this must NOT be logged)
Also, we check 'ALTER TABLE ADD COLUMN IF NOT EXISTS' for combination of existing and non-existing columns (it must be logged).
Finally, content of table 'log_ddl_triggers_activity' is checked.
Every issued DDL statement must be logged FOUR times: two by before- and after-triggers for this event and two by 'universal'
triggers for ANY DDL STATEMENT.
NOTES:
[15.04.2024] pzotov
1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None.
2. Value of REQUIRED_ALIAS must be EXACTLY the same as alias specified in the pre-created databases.conf
(for LINUX this equality is case-sensitive, even when aliases are compared!)
3. Content of databases.conf must be taken from $QA_ROOT/files/qa-databases.conf (one need to replace it before every test session).
Discussed with pcisar, letters since 30-may-2022 13:48, subject:
"new qa, core_4964_test.py: strange outcome when use... shutil.copy() // comparing to shutil.copy2()"
4. It is crucial to be sure that current OS environment has no ISC_USER and ISC_PASSWORD variables. Test forcibly unsets them.
5. 'CREATE USER IF NOT EXISTS' currently not checked because DDL trigger *will* be fire for that command if user does exist.
Checked on Windows, 6.0.0.315 SS/CS, intermediate snapshot on commit #003b2e0.
"""
import os
import re
import locale
from pathlib import Path
import time
import pytest
from firebird.qa import *
substitutions = [('[ \t]+', ' '), ]
REQUIRED_ALIAS = 'tmp_gh_8062_alias'
# MANDATORY! OTHERWISE ISC_ variables will take precedense over credentials = False!
for v in ('ISC_USER','ISC_PASSWORD'):
try:
del os.environ[ v ]
except KeyError as e:
pass
db = db_factory()
act = python_act('db', substitutions=substitutions)
@pytest.mark.version('>=6.0')
def test_1(act: Action, capsys):
# Scan line-by-line through databases.conf, find line starting with REQUIRED_ALIAS and extract name of file that
# must be created in the $(dir_sampleDb)/qa/ folder. This name will be used further as target database (tmp_fdb).
# NOTE: we have to SKIP lines which are commented out, i.e. if they starts with '#':
p_required_alias_ptn = re.compile( '^(?!#)((^|\\s+)' + REQUIRED_ALIAS + ')\\s*=\\s*\\$\\(dir_sampleDb\\)/qa/', re.IGNORECASE )
fname_in_dbconf = None
with open(act.home_dir/'databases.conf', 'r') as f:
for line in f:
if p_required_alias_ptn.search(line):
# If databases.conf contains line like this:
# tmp_8062_alias = $(dir_sampleDb)/qa/tmp_qa_8062.fdb
# - then we extract filename: 'tmp_qa_8062.fdb' (see below):
fname_in_dbconf = Path(line.split('=')[1].strip()).name
break
# if 'fname_in_dbconf' remains undefined here then propably REQUIRED_ALIAS not equals to specified in the databases.conf!
#
assert fname_in_dbconf
tmp_dba_pswd = 'p@$$w8062'
check_sql = f"""
-- DO NOT: set bail on; -- we have to drop database at final point!
set list on;
-- /*
rollback;
create database '{REQUIRED_ALIAS}';
alter database set linger to 0;
create user {act.db.user} password '{tmp_dba_pswd}' using plugin Srp;
commit;
connect '{REQUIRED_ALIAS}' user {act.db.user};
-- */
select mon$sec_database from mon$database; -- must be: 'Self'
commit;
drop global mapping if exists map_global_existent;
drop user if exists u_gh_8062_existent;
-- ####################################################
-- INITIAL creation of DB objects (before DDL triggers)
-- ####################################################
create mapping map_local_existent using plugin Srp from any user to user;
create global mapping map_global_existent using plugin Srp from any user to user;
create user u_gh_8062_existent password '123';
create role role_existent;
create domain dm_existent as int;
create sequence gen_existent;
create exception exc_existent 'foo';
create collation coll_existent for utf8 from unicode;
create table log_ddl_triggers_activity (
id int generated by default as identity constraint pk_log_ddl_triggers_activity primary key
,ddl_trigger_name varchar(64)
,event_type varchar(25) not null
,object_type varchar(25) not null
,ddl_event varchar(25) not null
,object_name varchar(64) not null
,dts timestamp default 'now'
,running_ddl varchar(8190)
);
create view v_detailed_ddl_log as
select
id
,running_ddl
,ddl_trigger_name
,event_type
,object_type
,ddl_event
,object_name
,count(*)over(partition by ddl_event, object_name) as fired_ddl_trg_count
from log_ddl_triggers_activity
order by id;
create view v_check_ddl_log as
select
id
,ddl_trigger_name
,event_type
,object_type
,ddl_event
,object_name
,fired_ddl_trg_count
from v_detailed_ddl_log
;
create table es_list(
id int generated by default as identity constraint pk_es_list primary key
,sttm varchar(8190)
);
create table t_existent (
id int primary key
,pid int
,f01_existent int
,f02_existent int
,f03_existent int
,constraint t_existent_fk foreign key(pid) references t_existent(id) on delete cascade
);
create index t_existent_f01 on t_existent(f01_existent);
create view v_existent as select * from t_existent;
create table t_one_else_existent (
id int primary key
,pid int
,f01_one_else_existent int
,f02_one_else_existent int
,f03_one_else_existent int
);
set term ^;
create trigger trg_existent for t_existent before insert as
begin
end
^
create procedure sp_existent as
begin
end
^
create function fn_existent returns int as
begin
return 1;
end
^
create package pg_existent as
begin
procedure p;
function f returns int;
end
^
create package body pg_existent as
begin
procedure p as
begin
end
function f returns int as
begin
return 1;
end
end
^
-- This package initially has NO body.
-- We will use it for 'create package body if not exists' -- see below:
create package pg_missed_implementation as
begin
procedure p_missed;
function f_missed returns int;
end
^
commit
^
-- ###################
-- create DDL triggers
-- ###################
execute block as
declare v_lf char(1) = x'0A';
begin
rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', '1');
for
with
a as (
select 'ANY DDL STATEMENT' x from rdb$database union all
select 'ALTER TABLE' from rdb$database union all
select 'CREATE MAPPING' from rdb$database union all
select 'CREATE TABLE' from rdb$database union all
select 'CREATE PROCEDURE' from rdb$database union all
select 'CREATE FUNCTION' from rdb$database union all
select 'CREATE TRIGGER' from rdb$database union all
select 'CREATE EXCEPTION' from rdb$database union all
select 'CREATE VIEW' from rdb$database union all
select 'CREATE DOMAIN' from rdb$database union all
select 'CREATE ROLE' from rdb$database union all
select 'CREATE SEQUENCE' from rdb$database union all
select 'CREATE USER' from rdb$database union all
select 'CREATE INDEX' from rdb$database union all
select 'CREATE COLLATION' from rdb$database union all
select 'CREATE PACKAGE' from rdb$database union all
select 'CREATE PACKAGE BODY' from rdb$database
)
,e as (
select 'before' w from rdb$database union all select 'after' from rdb$database
)
,t as (
select upper(trim(replace(trim(a.x),' ','_')) || iif(e.w='before', '_before', '_after')) as trg_name, a.x, e.w
from e, a
)
select
'create trigger trg_' || t.trg_name
|| ' active ' || t.w || ' ' || trim(t.x) || ' as '
|| :v_lf
|| 'begin'
|| :v_lf
|| q'! if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then!'
|| :v_lf
|| ' insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name, running_ddl) values('
|| :v_lf
|| q'!'!' || trim(t.trg_name) || q'!'!'
|| :v_lf
|| q'!, rdb$get_context('DDL_TRIGGER', 'EVENT_TYPE')!'
|| :v_lf
|| q'!, rdb$get_context('DDL_TRIGGER', 'OBJECT_TYPE')!'
|| :v_lf
|| q'!, rdb$get_context('DDL_TRIGGER', 'DDL_EVENT')!'
|| :v_lf
|| q'!, rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME')!'
|| :v_lf
|| q'!, rdb$get_context('USER_SESSION', 'RUNNING_DDL')!'
|| :v_lf
|| ');'
|| :v_lf
|| ' end'
as sttm
from t
as cursor c
do begin
execute statement(c.sttm) with autonomous transaction;
end
rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', null);
end
^
commit
^
set term ;^
-- ##########################
-- RUN 'CREATE IF NOT EXISTS' (DDL triggers must log actions if object did not exists before that)
-- ##########################
-- THIS CURRENTLY *WILL* BE LOGGED THUS WE SKIP CHECK: ('create user if not exists u_gh_8062_existent password ''123'' using plugin Srp; -- must NOT be logged because already exists (current DB is SELF-SECURITY!)')
-- ('create user if not exists u_gh_8062_missed password ''123'' using plugin Srp; -- MUST be logged because not yet exists')
set bulk_insert insert into es_list(sttm) values(?);
('create mapping if not exists map_local_existent using plugin Srp from any user to user; -- must NOT be logged because already exists (current DB is SELF-SECURITY!)')
('create mapping if not exists map_local_missed using plugin Srp from any user to user; -- MUST be logged because not yet exists')
('create global mapping if not exists map_global_existent using plugin Srp from any user to user; -- must NOT be logged because already exists')
('create global mapping if not exists map_global_missed using plugin Srp from any user to user;')
('create role if not exists role_existent; -- must NOT be logged because already exists')
('create role if not exists role_missed; -- MUST be logged because not yet exists')
('create domain if not exists dm_existent as int; -- must NOT be logged because already exists')
('create domain if not exists dm_missed as int; -- MUST be logged because not yet exists')
('create sequence if not exists gen_existent; -- must NOT be logged because already exists')
('create sequence if not exists gen_missed; -- MUST be logged because not yet exists')
('create exception if not exists exc_existent ''bar''; -- must NOT be logged because already exists')
('create exception if not exists exc_missed ''rio''; -- MUST be logged because not yet exists')
('create collation if not exists coll_existent for iso8859_1 from pt_pt; -- must NOT be logged because already exists')
('create collation if not exists coll_missed for iso8859_1 from pt_pt; -- MUST be logged because not yet exists')
('create index if not exists t_existent_f01 on t_existent(f01_existent); -- must NOT belogged because such index already exists')
('create descending index if not exists t_missed_f01 on t_existent(f01_existent); -- MUST be logged: this index not yet exists')
('create view if not exists v_existent as select * from t_existent; -- must NOT be logged: this view already exists')
('create view if not exists v_missed as select * from t_existent; -- MUST be logged: this view not yet exists')
('create trigger if not exists trg_existent for t_existent after insert or update or delete as begin end;')
('create trigger if not exists trg_missed for t_existent after insert or update or delete as begin end;')
('create procedure if not exists sp_existent as begin end; -- must NOT be logged because already exists')
('create procedure if not exists sp_missed as begin end; -- MUST be logged because not yet exists')
('create function if not exists fn_existent(a_1 bigint) returns int128 as
begin
return a_1 * a_1;
end -- must NOT be logged: this function already exists (and has different signature)')
('create function if not exists fn_missed(a_1 bigint) returns int128 as
begin
return a_1 * a_1;
end -- MUST be logged because such function not yet exists')
('create package body if not exists pg_existent as
begin
procedure p_diff as
begin
end
function f_diff returns int as
begin
return 1;
end
end -- must NOT be logged: such package already exists (and has different names of its units)')
('create package body if not exists pg_missed_implementation as
begin
procedure p_missed as
begin
end
function f_missed returns int as
begin
return 1;
end
end -- MUST be logged because package exists but its BODY was not yet created')
('alter table t_existent add if not exists f01_existent smallint; -- must NOT be logged because column f01_existent DOES exist')
('alter table t_existent add if not exists g01_missed smallint; -- must be logged because column g01_missed NOT YET exist')
('alter table t_one_else_existent
-- doc:
-- "For ALTER TABLE ... ADD subclause, DDL triggers are not fired if there are only IF NOT EXISTS subclauses
-- and ALL of them are related to EXISTING columns or constraints."
------------------
-- must be logged because at least one column (g01_one_else_missed) NOT YET exist:
add if not exists g01_one_else_missed decfloat(34)
,add if not exists f01_one_else_existent smallint
,add if not exists f02_one_else_existent int128')
('create table if not exists t_existent (id int primary key); -- must NOT be logged because such table altready exists')
('create table if not exists t_missed (id int primary key); -- MUST be logged because such table not yet exists')
('create procedure if not exists t_missed as
begin
-- must NOT be logged, procedure must NOT be created and NO error must raise.
-- doc:
-- Some objects share the same "namespace", for example, there cannot be a table and a procedure with the same name.
-- In this case, if there is table T_MISSED and CREATE PROCEDURE IF NOT EXISTS T_MISSED is tried, the procedure
-- will not be created and no error will be raised.
end')
stop
commit;
set term ^;
execute block as
begin
for
select sttm from es_list as cursor c
do begin
rdb$set_context('USER_SESSION', 'RUNNING_DDL', c.sttm);
execute statement c.sttm
with autonomous transaction;
end
end
^
set term ;^
commit;
-- ###################################
-- CHECK RESULT: SHOW DDL TRIGGERS LOG
-- ###################################
-- ::: NB :::
-- ############################################################
-- Use 'select * from v_detailed_ddl_log' if any problem occurs
-- Query to this view will display executed DDL statements
-- and comments about whether their must [not] be logged.
-- ############################################################
set count on;
select * from v_check_ddl_log;
rollback;
/*
connect '{REQUIRED_ALIAS}' user {act.db.user};
drop database;
quit;
-- */
"""
expected_stdout = f"""
MON$SEC_DATABASE Self
ID 1
DDL_TRIGGER_NAME CREATE_MAPPING_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_LOCAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 2
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_LOCAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 3
DDL_TRIGGER_NAME CREATE_MAPPING_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_LOCAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 4
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_LOCAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 5
DDL_TRIGGER_NAME CREATE_MAPPING_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_GLOBAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 6
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_GLOBAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 7
DDL_TRIGGER_NAME CREATE_MAPPING_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_GLOBAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 8
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE MAPPING
DDL_EVENT CREATE MAPPING
OBJECT_NAME MAP_GLOBAL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 9
DDL_TRIGGER_NAME CREATE_ROLE_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE ROLE
DDL_EVENT CREATE ROLE
OBJECT_NAME ROLE_MISSED
FIRED_DDL_TRG_COUNT 4
ID 10
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE ROLE
DDL_EVENT CREATE ROLE
OBJECT_NAME ROLE_MISSED
FIRED_DDL_TRG_COUNT 4
ID 11
DDL_TRIGGER_NAME CREATE_ROLE_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE ROLE
DDL_EVENT CREATE ROLE
OBJECT_NAME ROLE_MISSED
FIRED_DDL_TRG_COUNT 4
ID 12
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE ROLE
DDL_EVENT CREATE ROLE
OBJECT_NAME ROLE_MISSED
FIRED_DDL_TRG_COUNT 4
ID 13
DDL_TRIGGER_NAME CREATE_DOMAIN_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE DOMAIN
DDL_EVENT CREATE DOMAIN
OBJECT_NAME DM_MISSED
FIRED_DDL_TRG_COUNT 4
ID 14
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE DOMAIN
DDL_EVENT CREATE DOMAIN
OBJECT_NAME DM_MISSED
FIRED_DDL_TRG_COUNT 4
ID 15
DDL_TRIGGER_NAME CREATE_DOMAIN_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE DOMAIN
DDL_EVENT CREATE DOMAIN
OBJECT_NAME DM_MISSED
FIRED_DDL_TRG_COUNT 4
ID 16
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE DOMAIN
DDL_EVENT CREATE DOMAIN
OBJECT_NAME DM_MISSED
FIRED_DDL_TRG_COUNT 4
ID 17
DDL_TRIGGER_NAME CREATE_SEQUENCE_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE SEQUENCE
DDL_EVENT CREATE SEQUENCE
OBJECT_NAME GEN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 18
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE SEQUENCE
DDL_EVENT CREATE SEQUENCE
OBJECT_NAME GEN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 19
DDL_TRIGGER_NAME CREATE_SEQUENCE_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE SEQUENCE
DDL_EVENT CREATE SEQUENCE
OBJECT_NAME GEN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 20
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE SEQUENCE
DDL_EVENT CREATE SEQUENCE
OBJECT_NAME GEN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 21
DDL_TRIGGER_NAME CREATE_EXCEPTION_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE EXCEPTION
DDL_EVENT CREATE EXCEPTION
OBJECT_NAME EXC_MISSED
FIRED_DDL_TRG_COUNT 4
ID 22
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE EXCEPTION
DDL_EVENT CREATE EXCEPTION
OBJECT_NAME EXC_MISSED
FIRED_DDL_TRG_COUNT 4
ID 23
DDL_TRIGGER_NAME CREATE_EXCEPTION_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE EXCEPTION
DDL_EVENT CREATE EXCEPTION
OBJECT_NAME EXC_MISSED
FIRED_DDL_TRG_COUNT 4
ID 24
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE EXCEPTION
DDL_EVENT CREATE EXCEPTION
OBJECT_NAME EXC_MISSED
FIRED_DDL_TRG_COUNT 4
ID 25
DDL_TRIGGER_NAME CREATE_COLLATION_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE COLLATION
DDL_EVENT CREATE COLLATION
OBJECT_NAME COLL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 26
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE COLLATION
DDL_EVENT CREATE COLLATION
OBJECT_NAME COLL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 27
DDL_TRIGGER_NAME CREATE_COLLATION_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE COLLATION
DDL_EVENT CREATE COLLATION
OBJECT_NAME COLL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 28
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE COLLATION
DDL_EVENT CREATE COLLATION
OBJECT_NAME COLL_MISSED
FIRED_DDL_TRG_COUNT 4
ID 29
DDL_TRIGGER_NAME CREATE_INDEX_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE INDEX
DDL_EVENT CREATE INDEX
OBJECT_NAME T_MISSED_F01
FIRED_DDL_TRG_COUNT 4
ID 30
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE INDEX
DDL_EVENT CREATE INDEX
OBJECT_NAME T_MISSED_F01
FIRED_DDL_TRG_COUNT 4
ID 31
DDL_TRIGGER_NAME CREATE_INDEX_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE INDEX
DDL_EVENT CREATE INDEX
OBJECT_NAME T_MISSED_F01
FIRED_DDL_TRG_COUNT 4
ID 32
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE INDEX
DDL_EVENT CREATE INDEX
OBJECT_NAME T_MISSED_F01
FIRED_DDL_TRG_COUNT 4
ID 33
DDL_TRIGGER_NAME CREATE_VIEW_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE VIEW
DDL_EVENT CREATE VIEW
OBJECT_NAME V_MISSED
FIRED_DDL_TRG_COUNT 4
ID 34
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE VIEW
DDL_EVENT CREATE VIEW
OBJECT_NAME V_MISSED
FIRED_DDL_TRG_COUNT 4
ID 35
DDL_TRIGGER_NAME CREATE_VIEW_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE VIEW
DDL_EVENT CREATE VIEW
OBJECT_NAME V_MISSED
FIRED_DDL_TRG_COUNT 4
ID 36
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE VIEW
DDL_EVENT CREATE VIEW
OBJECT_NAME V_MISSED
FIRED_DDL_TRG_COUNT 4
ID 37
DDL_TRIGGER_NAME CREATE_TRIGGER_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE TRIGGER
DDL_EVENT CREATE TRIGGER
OBJECT_NAME TRG_MISSED
FIRED_DDL_TRG_COUNT 4
ID 38
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE TRIGGER
DDL_EVENT CREATE TRIGGER
OBJECT_NAME TRG_MISSED
FIRED_DDL_TRG_COUNT 4
ID 39
DDL_TRIGGER_NAME CREATE_TRIGGER_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE TRIGGER
DDL_EVENT CREATE TRIGGER
OBJECT_NAME TRG_MISSED
FIRED_DDL_TRG_COUNT 4
ID 40
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE TRIGGER
DDL_EVENT CREATE TRIGGER
OBJECT_NAME TRG_MISSED
FIRED_DDL_TRG_COUNT 4
ID 41
DDL_TRIGGER_NAME CREATE_PROCEDURE_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE PROCEDURE
DDL_EVENT CREATE PROCEDURE
OBJECT_NAME SP_MISSED
FIRED_DDL_TRG_COUNT 4
ID 42
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE PROCEDURE
DDL_EVENT CREATE PROCEDURE
OBJECT_NAME SP_MISSED
FIRED_DDL_TRG_COUNT 4
ID 43
DDL_TRIGGER_NAME CREATE_PROCEDURE_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE PROCEDURE
DDL_EVENT CREATE PROCEDURE
OBJECT_NAME SP_MISSED
FIRED_DDL_TRG_COUNT 4
ID 44
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE PROCEDURE
DDL_EVENT CREATE PROCEDURE
OBJECT_NAME SP_MISSED
FIRED_DDL_TRG_COUNT 4
ID 45
DDL_TRIGGER_NAME CREATE_FUNCTION_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE FUNCTION
DDL_EVENT CREATE FUNCTION
OBJECT_NAME FN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 46
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE FUNCTION
DDL_EVENT CREATE FUNCTION
OBJECT_NAME FN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 47
DDL_TRIGGER_NAME CREATE_FUNCTION_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE FUNCTION
DDL_EVENT CREATE FUNCTION
OBJECT_NAME FN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 48
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE FUNCTION
DDL_EVENT CREATE FUNCTION
OBJECT_NAME FN_MISSED
FIRED_DDL_TRG_COUNT 4
ID 49
DDL_TRIGGER_NAME CREATE_PACKAGE_BODY_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE PACKAGE BODY
DDL_EVENT CREATE PACKAGE BODY
OBJECT_NAME PG_MISSED_IMPLEMENTATION
FIRED_DDL_TRG_COUNT 4
ID 50
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE PACKAGE BODY
DDL_EVENT CREATE PACKAGE BODY
OBJECT_NAME PG_MISSED_IMPLEMENTATION
FIRED_DDL_TRG_COUNT 4
ID 51
DDL_TRIGGER_NAME CREATE_PACKAGE_BODY_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE PACKAGE BODY
DDL_EVENT CREATE PACKAGE BODY
OBJECT_NAME PG_MISSED_IMPLEMENTATION
FIRED_DDL_TRG_COUNT 4
ID 52
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE PACKAGE BODY
DDL_EVENT CREATE PACKAGE BODY
OBJECT_NAME PG_MISSED_IMPLEMENTATION
FIRED_DDL_TRG_COUNT 4
ID 53
DDL_TRIGGER_NAME ALTER_TABLE_BEFORE
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 54
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 55
DDL_TRIGGER_NAME ALTER_TABLE_AFTER
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 56
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 57
DDL_TRIGGER_NAME ALTER_TABLE_BEFORE
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_ONE_ELSE_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 58
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_ONE_ELSE_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 59
DDL_TRIGGER_NAME ALTER_TABLE_AFTER
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_ONE_ELSE_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 60
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE ALTER
OBJECT_TYPE TABLE
DDL_EVENT ALTER TABLE
OBJECT_NAME T_ONE_ELSE_EXISTENT
FIRED_DDL_TRG_COUNT 4
ID 61
DDL_TRIGGER_NAME CREATE_TABLE_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE TABLE
DDL_EVENT CREATE TABLE
OBJECT_NAME T_MISSED
FIRED_DDL_TRG_COUNT 4
ID 62
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_BEFORE
EVENT_TYPE CREATE
OBJECT_TYPE TABLE
DDL_EVENT CREATE TABLE
OBJECT_NAME T_MISSED
FIRED_DDL_TRG_COUNT 4
ID 63
DDL_TRIGGER_NAME CREATE_TABLE_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE TABLE
DDL_EVENT CREATE TABLE
OBJECT_NAME T_MISSED
FIRED_DDL_TRG_COUNT 4
ID 64
DDL_TRIGGER_NAME ANY_DDL_STATEMENT_AFTER
EVENT_TYPE CREATE
OBJECT_TYPE TABLE
DDL_EVENT CREATE TABLE
OBJECT_NAME T_MISSED
FIRED_DDL_TRG_COUNT 4
Records affected: 64
"""
act.expected_stdout = expected_stdout
act.isql(switches=['-q', act.db.db_path, '-user', act.db.user], input = check_sql, credentials = False, connect_db = False, combine_output = True, io_enc = locale.getpreferredencoding())
#time.sleep(10000)
# temply, use 4debug when DB is not self-sec:
#act.isql(input = check_sql, combine_output = True, io_enc = locale.getpreferredencoding())
assert act.clean_stdout == act.clean_expected_stdout