mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 13:33:07 +01:00
More pyton tests
This commit is contained in:
parent
c893f5c946
commit
e7b07eade0
@ -34,12 +34,19 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
import time
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from firebird.qa import db_factory, python_act, Action, temp_file
|
||||
|
||||
# version: 2.5.6
|
||||
# resources: None
|
||||
|
||||
substitutions_1 = [('0: CREATE INDEX LOG: RDB_EXPR_BLOB.*', '0: CREATE INDEX LOG: RDB_EXPR_BLOB'), ('BULK_INSERT_START.*', 'BULK_INSERT_START'), ('BULK_INSERT_FINISH.*', 'BULK_INSERT_FINISH'), ('CREATE_INDX_START.*', 'CREATE_INDX_START'), ('AFTER LINE.*', 'AFTER LINE')]
|
||||
substitutions_1 = [('0: CREATE INDEX LOG: RDB_EXPR_BLOB.*', '0: CREATE INDEX LOG: RDB_EXPR_BLOB'),
|
||||
('BULK_INSERT_START.*', 'BULK_INSERT_START'),
|
||||
('BULK_INSERT_FINISH.*', 'BULK_INSERT_FINISH'),
|
||||
('CREATE_INDX_START.*', 'CREATE_INDX_START'),
|
||||
('AFTER LINE.*', 'AFTER LINE')]
|
||||
|
||||
init_script_1 = """
|
||||
create or alter procedure sp_ins(n int) as begin end;
|
||||
@ -266,7 +273,11 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
# cleanup( [i.name for i in (f_bulk_insert_sql, f_create_indx_sql, f_bulk_insert_log, f_create_indx_log)] )
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
tmp_file_bi_in = temp_file('bulk_insert.sql')
|
||||
tmp_file_bi_out = temp_file('bulk_insert.out')
|
||||
|
||||
expected_stdout_1 = """
|
||||
0: BULK INSERTS LOG: BULK_INSERT_START
|
||||
@ -274,7 +285,7 @@ expected_stdout_1 = """
|
||||
0: CREATE INDEX LOG: INSERTS_STATE OK, IS RUNNING
|
||||
0: CREATE INDEX LOG: CREATE_INDX_START
|
||||
0: CREATE INDEX LOG: SET TRANSACTION WAIT;
|
||||
0: CREATE INDEX LOG: CREATE INDEX TEST_WAIT ON TEST COMPUTED BY( 'WAIT'|| S );
|
||||
0: CREATE INDEX LOG: CREATE INDEX TEST_WAIT ON TEST COMPUTED BY('WAIT'|| S);
|
||||
0: CREATE INDEX LOG: COMMIT;
|
||||
0: CREATE INDEX LOG: SET ECHO OFF;
|
||||
0: CREATE INDEX LOG: INSERTS_STATE OK, FINISHED
|
||||
@ -282,7 +293,7 @@ expected_stdout_1 = """
|
||||
0: CREATE INDEX LOG: RDB$UNIQUE_FLAG 0
|
||||
0: CREATE INDEX LOG: RDB$INDEX_INACTIVE 0
|
||||
0: CREATE INDEX LOG: RDB_EXPR_BLOB
|
||||
0: CREATE INDEX LOG: ( 'WAIT'|| S )
|
||||
0: CREATE INDEX LOG: ('WAIT'|| S)
|
||||
0: CREATE INDEX LOG: RECORDS AFFECTED: 1
|
||||
0: CREATE INDEX LOG: SET PLAN ON;
|
||||
0: CREATE INDEX LOG: SELECT 1 FROM TEST WHERE 'WAIT'|| S > '' ROWS 0;
|
||||
@ -295,31 +306,166 @@ expected_stdout_1 = """
|
||||
1: CREATE INDEX LOG: INSERTS_STATE OK, IS RUNNING
|
||||
1: CREATE INDEX LOG: CREATE_INDX_START
|
||||
1: CREATE INDEX LOG: SET TRANSACTION NO WAIT;
|
||||
1: CREATE INDEX LOG: CREATE INDEX TEST_NO_WAIT ON TEST COMPUTED BY( 'NO_WAIT'|| S );
|
||||
1: CREATE INDEX LOG: CREATE INDEX TEST_NO_WAIT ON TEST COMPUTED BY('NO_WAIT'|| S);
|
||||
1: CREATE INDEX LOG: COMMIT;
|
||||
1: CREATE INDEX LOG: STATEMENT FAILED, SQLSTATE = 40001
|
||||
1: CREATE INDEX LOG: LOCK CONFLICT ON NO WAIT TRANSACTION
|
||||
1: CREATE INDEX LOG: -UNSUCCESSFUL METADATA UPDATE
|
||||
1: CREATE INDEX LOG: -OBJECT TABLE "TEST" IS IN USE
|
||||
1: CREATE INDEX LOG: AFTER LINE
|
||||
|
||||
2: BULK INSERTS LOG: BULK_INSERT_START
|
||||
2: BULK INSERTS LOG: BULK_INSERT_FINISH
|
||||
2: CREATE INDEX LOG: INSERTS_STATE OK, IS RUNNING
|
||||
2: CREATE INDEX LOG: CREATE_INDX_START
|
||||
2: CREATE INDEX LOG: SET TRANSACTION LOCK TIMEOUT 1;
|
||||
2: CREATE INDEX LOG: CREATE INDEX TEST_LOCK_TIMEOUT_1 ON TEST COMPUTED BY( 'LOCK_TIMEOUT_1'|| S );
|
||||
2: CREATE INDEX LOG: CREATE INDEX TEST_LOCK_TIMEOUT_1 ON TEST COMPUTED BY('LOCK_TIMEOUT_1'|| S);
|
||||
2: CREATE INDEX LOG: COMMIT;
|
||||
2: CREATE INDEX LOG: STATEMENT FAILED, SQLSTATE = 40001
|
||||
2: CREATE INDEX LOG: LOCK TIME-OUT ON WAIT TRANSACTION
|
||||
2: CREATE INDEX LOG: -UNSUCCESSFUL METADATA UPDATE
|
||||
2: CREATE INDEX LOG: -OBJECT TABLE "TEST" IS IN USE
|
||||
2: CREATE INDEX LOG: AFTER LINE
|
||||
"""
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=2.5.6')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
def test_1(act_1: Action, tmp_file_bi_in: Path, tmp_file_bi_out: Path, capsys):
|
||||
# NB-1: value of 'rows_to_add' must have value that will require at least
|
||||
# 4...5 seconds for inserting such number of rows
|
||||
# NB-2: FB 2.5 makes DML *faster* than 3.0 in single-connection mode!
|
||||
rows_to_add = 1000
|
||||
tmp_file_bi_in.write_text (f'''
|
||||
set bail on;
|
||||
set list on;
|
||||
|
||||
-- do NOT use it !! >>> alter sequence g restart with 0; -- gen_id(g,1) will return 0 rather than 1 since 06-aug-2020 on FB 4.x !!
|
||||
|
||||
delete from test;
|
||||
set term ^;
|
||||
execute block as
|
||||
declare c bigint;
|
||||
begin
|
||||
c = gen_id(g, -gen_id(g, 0)); -- restart sequence
|
||||
end
|
||||
^
|
||||
set term ;^
|
||||
commit;
|
||||
|
||||
set transaction lock timeout 7; -- THIS LOCK TIMEOUT SERVES ONLY FOR DELAY, see below auton Tx start.
|
||||
|
||||
select current_timestamp as bulk_insert_start from rdb$database;
|
||||
set term ^;
|
||||
execute block as
|
||||
declare i int;
|
||||
begin
|
||||
execute procedure sp_ins({rows_to_add});
|
||||
begin
|
||||
-- #########################################################
|
||||
-- ####################### D E L A Y #####################
|
||||
-- #########################################################
|
||||
in autonomous transaction do
|
||||
insert into test( x ) values({rows_to_add}); -- this will cause delay because of duplicate in index
|
||||
when any do
|
||||
begin
|
||||
i = gen_id(g,1);
|
||||
end
|
||||
end
|
||||
end
|
||||
^
|
||||
set term ;^
|
||||
commit;
|
||||
select current_timestamp as bulk_insert_finish from rdb$database;
|
||||
''')
|
||||
|
||||
tx_param = ['WAIT', 'NO WAIT', 'LOCK TIMEOUT 1']
|
||||
#
|
||||
i = 0
|
||||
#
|
||||
for tx_decl in tx_param:
|
||||
idx_name = tx_decl.replace(' ', '_')
|
||||
idx_expr = "'" + idx_name + "'|| s"
|
||||
|
||||
sql_create_indx = f'''
|
||||
set bail on;
|
||||
set list on;
|
||||
set blob all;
|
||||
select
|
||||
iif( gen_id(g,0) > 0 and gen_id(g,0) < 1 + {rows_to_add},
|
||||
'OK, IS RUNNING',
|
||||
iif( gen_id(g,0) <=0,
|
||||
'WRONG: not yet started, current gen_id='||gen_id(g,0),
|
||||
'WRONG: already finished, rows_to_add='|| {rows_to_add} ||', current gen_id='||gen_id(g,0)
|
||||
)
|
||||
) as inserts_state,
|
||||
current_timestamp as create_indx_start
|
||||
from rdb$database;
|
||||
set autoddl off;
|
||||
commit;
|
||||
|
||||
set echo on;
|
||||
set transaction {tx_decl};
|
||||
|
||||
create index test_{idx_name} on test computed by({idx_expr});
|
||||
commit;
|
||||
set echo off;
|
||||
|
||||
select
|
||||
iif( gen_id(g,0) >= 1 + {rows_to_add},
|
||||
'OK, FINISHED',
|
||||
'SOMETHING WRONG: current gen_id=' || gen_id(g,0)||', rows_to_add='|| {rows_to_add}
|
||||
) as inserts_state
|
||||
from rdb$database;
|
||||
|
||||
set count on;
|
||||
select
|
||||
rdb$index_name
|
||||
,coalesce(rdb$unique_flag,0) as rdb$unique_flag
|
||||
,coalesce(rdb$index_inactive,0) as rdb$index_inactive
|
||||
,rdb$expression_source as rdb_expr_blob
|
||||
from rdb$indices ri
|
||||
where ri.rdb$index_name = upper( 'test_{idx_name}' )
|
||||
;
|
||||
set count off;
|
||||
set echo on;
|
||||
set plan on;
|
||||
select 1 from test where {idx_expr} > '' rows 0;
|
||||
set plan off;
|
||||
set echo off;
|
||||
commit;
|
||||
drop index test_{idx_name};
|
||||
commit;
|
||||
'''
|
||||
with open(tmp_file_bi_out, mode='w') as f_bulk_insert_log:
|
||||
# This will insert rows and then stay in pause 10 seconds:
|
||||
p_bulk_insert = subprocess.Popen([act_1.vars['isql'], act_1.db.dsn,
|
||||
'-user', act_1.db.user,
|
||||
'-password', act_1.db.password,
|
||||
'-q', '-i', str(tmp_file_bi_in)],
|
||||
stdout = f_bulk_insert_log,
|
||||
stderr = subprocess.STDOUT
|
||||
)
|
||||
#act_1.isql(switches=['-q'], input=sql_bulk_insert)
|
||||
#bulk_insert_log = act_1.stdout
|
||||
# 3.0 Classic: seems that it requires at least 2 seconds for ISQL be loaded into memory.
|
||||
time.sleep(3)
|
||||
# This will wait until first ISQL finished
|
||||
act_1.expected_stderr = 'DISABLED'
|
||||
act_1.isql(switches=['-q', '-n'], input=sql_create_indx)
|
||||
time.sleep(7) # NB: this delay plus previous (3+5=8) must be GREATER than lock timeout in <sql_bulk_insert>
|
||||
|
||||
p_bulk_insert.terminate()
|
||||
bulk_insert_log = tmp_file_bi_out.read_text()
|
||||
create_indx_log = act_1.stdout + act_1.stderr
|
||||
|
||||
for line in bulk_insert_log.splitlines():
|
||||
if line.split():
|
||||
print( str(i)+': BULK INSERTS LOG: '+line.strip().upper() )
|
||||
|
||||
for line in create_indx_log.splitlines():
|
||||
if line.split():
|
||||
print( str(i)+': CREATE INDEX LOG: '+line.strip().upper() )
|
||||
#
|
||||
i += 1
|
||||
# Checks
|
||||
act_1.reset()
|
||||
act_1.stdout = capsys.readouterr().out
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
@ -32,7 +32,61 @@ init_script_1 = """"""
|
||||
|
||||
db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
|
||||
# test_script_1
|
||||
test_script_1 = """
|
||||
set list on;
|
||||
|
||||
-- binary literal ::= { x | X } <quote> [ { <hexit> <hexit> }... ] <quote>
|
||||
|
||||
select x'1' from rdb$database; -- raises: token unknown because length is odd
|
||||
|
||||
select x'11' from rdb$database; -- must raise: token unknown because length is odd
|
||||
|
||||
select x'0123456789' from rdb$database;
|
||||
|
||||
select x'01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' from rdb$database;
|
||||
|
||||
-- must raise: token unknown because last char is not hexit
|
||||
select x'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678x' from rdb$database;
|
||||
|
||||
select uuid_to_char(x'BA1749B583BF9146B360F54E25FE583E') from rdb$database;
|
||||
|
||||
|
||||
-- ##############################################################################
|
||||
|
||||
-- Numeric literal: { 0x | 0X } <hexit> [ <hexit>... ]
|
||||
-- https://firebirdsql.org/refdocs/langrefupd25-bigint.html
|
||||
recreate view v_test as
|
||||
select
|
||||
+-0x1 "-1(a)"
|
||||
,-+-0xf "+15"
|
||||
,0x7FFF "32767"
|
||||
,0x8000 "32768"
|
||||
,0xFFFF "65535"
|
||||
,0x10000 "65536(a)"
|
||||
,0x000000000010000 "65536(b)"
|
||||
,0x80000000 "-2147483648"
|
||||
,0x080000000 "+2147483648(a)"
|
||||
,0x000000080000000 "+2147483648(b)"
|
||||
,0XFFFFFFFF "-1(b)"
|
||||
,0X0FFFFFFFF "+4294967295"
|
||||
,0x100000000 "+4294967296(a)"
|
||||
,0x0000000100000000 "+4294967296(b)"
|
||||
,0X7FFFFFFFFFFFFFFF "9223372036854775807"
|
||||
,0x8000000000000000 "-9223372036854775808"
|
||||
,0x8000000000000001 "-9223372036854775807"
|
||||
,0x8000000000000002 "-9223372036854775806"
|
||||
,0xffffffffffffffff "-1(c)"
|
||||
from rdb$database;
|
||||
|
||||
select * from v_test;
|
||||
|
||||
-- If the number of <hexit> is greater than 8, the constant data type is a signed BIGINT
|
||||
-- If it's less or equal than 8, the data type is a signed INTEGER
|
||||
set sqlda_display on;
|
||||
select * from v_test rows 0;
|
||||
set sqlda_display off;
|
||||
"""
|
||||
|
||||
#---
|
||||
#
|
||||
# import os
|
||||
@ -88,108 +142,114 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
# cleanup( (f_sql_log.name, f_sql_err.name) )
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
STDOUT: CONSTANT 11
|
||||
STDOUT: CONSTANT 0123456789
|
||||
STDOUT: CONSTANT 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
|
||||
STDOUT: UUID_TO_CHAR BA1749B5-83BF-9146-B360-F54E25FE583E
|
||||
STDOUT: -1(a) -1
|
||||
STDOUT: +15 15
|
||||
STDOUT: 32767 32767
|
||||
STDOUT: 32768 32768
|
||||
STDOUT: 65535 65535
|
||||
STDOUT: 65536(a) 65536
|
||||
STDOUT: 65536(b) 65536
|
||||
STDOUT: -2147483648 -2147483648
|
||||
STDOUT: +2147483648(a) 2147483648
|
||||
STDOUT: +2147483648(b) 2147483648
|
||||
STDOUT: -1(b) -1
|
||||
STDOUT: +4294967295 4294967295
|
||||
STDOUT: +4294967296(a) 4294967296
|
||||
STDOUT: +4294967296(b) 4294967296
|
||||
STDOUT: 9223372036854775807 9223372036854775807
|
||||
STDOUT: -9223372036854775808 -9223372036854775808
|
||||
STDOUT: -9223372036854775807 -9223372036854775807
|
||||
STDOUT: -9223372036854775806 -9223372036854775806
|
||||
STDOUT: -1(c) -1
|
||||
STDOUT: INPUT message field count: 0
|
||||
STDOUT: OUTPUT message field count: 19
|
||||
STDOUT: 01: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: -1(a) alias: -1(a)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 02: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: +15 alias: +15
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 03: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: 32767 alias: 32767
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 04: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: 32768 alias: 32768
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 05: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: 65535 alias: 65535
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 06: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: 65536(a) alias: 65536(a)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 07: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: 65536(b) alias: 65536(b)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 08: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: -2147483648 alias: -2147483648
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 09: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: +2147483648(a) alias: +2147483648(a)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 10: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: +2147483648(b) alias: +2147483648(b)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 11: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
STDOUT: : name: -1(b) alias: -1(b)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 12: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: +4294967295 alias: +4294967295
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 13: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: +4294967296(a) alias: +4294967296(a)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 14: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: +4294967296(b) alias: +4294967296(b)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 15: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: 9223372036854775807 alias: 9223372036854775807
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 16: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: -9223372036854775808 alias: -9223372036854775808
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 17: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: -9223372036854775807 alias: -9223372036854775807
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 18: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: -9223372036854775806 alias: -9223372036854775806
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
STDOUT: 19: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
STDOUT: : name: -1(c) alias: -1(c)
|
||||
STDOUT: : table: V_TEST owner: SYSDBA
|
||||
CONSTANT 11
|
||||
CONSTANT 0123456789
|
||||
CONSTANT 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
|
||||
UUID_TO_CHAR BA1749B5-83BF-9146-B360-F54E25FE583E
|
||||
-1(a) -1
|
||||
+15 15
|
||||
32767 32767
|
||||
32768 32768
|
||||
65535 65535
|
||||
65536(a) 65536
|
||||
65536(b) 65536
|
||||
-2147483648 -2147483648
|
||||
+2147483648(a) 2147483648
|
||||
+2147483648(b) 2147483648
|
||||
-1(b) -1
|
||||
+4294967295 4294967295
|
||||
+4294967296(a) 4294967296
|
||||
+4294967296(b) 4294967296
|
||||
9223372036854775807 9223372036854775807
|
||||
-9223372036854775808 -9223372036854775808
|
||||
-9223372036854775807 -9223372036854775807
|
||||
-9223372036854775806 -9223372036854775806
|
||||
-1(c) -1
|
||||
INPUT message field count: 0
|
||||
OUTPUT message field count: 19
|
||||
01: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: -1(a) alias: -1(a)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
02: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: +15 alias: +15
|
||||
: table: V_TEST owner: SYSDBA
|
||||
03: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: 32767 alias: 32767
|
||||
: table: V_TEST owner: SYSDBA
|
||||
04: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: 32768 alias: 32768
|
||||
: table: V_TEST owner: SYSDBA
|
||||
05: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: 65535 alias: 65535
|
||||
: table: V_TEST owner: SYSDBA
|
||||
06: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: 65536(a) alias: 65536(a)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
07: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: 65536(b) alias: 65536(b)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
08: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: -2147483648 alias: -2147483648
|
||||
: table: V_TEST owner: SYSDBA
|
||||
09: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: +2147483648(a) alias: +2147483648(a)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
10: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: +2147483648(b) alias: +2147483648(b)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
11: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4
|
||||
: name: -1(b) alias: -1(b)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
12: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: +4294967295 alias: +4294967295
|
||||
: table: V_TEST owner: SYSDBA
|
||||
13: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: +4294967296(a) alias: +4294967296(a)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
14: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: +4294967296(b) alias: +4294967296(b)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
15: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: 9223372036854775807 alias: 9223372036854775807
|
||||
: table: V_TEST owner: SYSDBA
|
||||
16: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: -9223372036854775808 alias: -9223372036854775808
|
||||
: table: V_TEST owner: SYSDBA
|
||||
17: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: -9223372036854775807 alias: -9223372036854775807
|
||||
: table: V_TEST owner: SYSDBA
|
||||
18: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: -9223372036854775806 alias: -9223372036854775806
|
||||
: table: V_TEST owner: SYSDBA
|
||||
19: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8
|
||||
: name: -1(c) alias: -1(c)
|
||||
: table: V_TEST owner: SYSDBA
|
||||
"""
|
||||
|
||||
STDERR: Statement failed, SQLSTATE = 42000
|
||||
STDERR: Dynamic SQL Error
|
||||
STDERR: -SQL error code = -104
|
||||
STDERR: -Token unknown - line 1, column 9
|
||||
STDERR: -'1'
|
||||
expected_stderr_1 = """
|
||||
Statement failed, SQLSTATE = 42000
|
||||
Dynamic SQL Error
|
||||
-SQL error code = -104
|
||||
-Token unknown - line 1, column 9
|
||||
-'1'
|
||||
|
||||
STDERR: Statement failed, SQLSTATE = 42000
|
||||
STDERR: Dynamic SQL Error
|
||||
STDERR: -SQL error code = -104
|
||||
STDERR: -Token unknown - line 1, column 9
|
||||
STDERR: -'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678x'
|
||||
"""
|
||||
Statement failed, SQLSTATE = 42000
|
||||
Dynamic SQL Error
|
||||
-SQL error code = -104
|
||||
-Token unknown - line 1, column 9
|
||||
-'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678x'
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=3.0')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
def test_1(act_1: Action):
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
act_1.expected_stderr = expected_stderr_1
|
||||
act_1.execute()
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
assert act_1.clean_stderr == act_1.clean_expected_stderr
|
||||
|
||||
|
||||
|
@ -24,12 +24,13 @@
|
||||
# qmid: bugs.core_1845
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action, user_factory, User
|
||||
from firebird.driver import DatabaseError
|
||||
|
||||
# version: 2.5
|
||||
# resources: None
|
||||
|
||||
substitutions_1 = [('SERVER VERSION:.*', 'SERVER VERSION:'), ('SERVER IMPLEMENTATION:.*', 'SERVER IMPLEMENTATION:'), ('SERVICE MANAGER VERSION:.*', 'SERVICE MANAGER VERSION:'), ('Statement failed, SQLSTATE = HY000', ''), ('record not found for user.*', '')]
|
||||
substitutions_1 = []
|
||||
|
||||
init_script_1 = """"""
|
||||
|
||||
@ -133,31 +134,22 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
WHO_AM_I TMP$C1845
|
||||
CHECK SERVICE 'INFO_SERVER_VERSION':
|
||||
SERVER VERSION: WI-V3.0.0.32266 FIREBIRD 3.0 RELEASE CANDIDATE 2
|
||||
CHECK SERVICE 'INFO_IMPLEMENTATION':
|
||||
SERVER IMPLEMENTATION: FIREBIRD/WINDOWS/INTEL/I386
|
||||
CHECK SERVICE 'INFO_USER_DBPATH':
|
||||
SERVICE ISC_INFO_SVC_USER_DBPATH REQUIRES SYSDBA PERMISSIONS. REATTACH TO THE SERVICE MANAGER USING THE SYSDBA ACCOUNT.
|
||||
CHECK SERVICE 'INFO_GET_ENV':
|
||||
SERVICE ISC_INFO_SVC_GET_ENV REQUIRES SYSDBA PERMISSIONS. REATTACH TO THE SERVICE MANAGER USING THE SYSDBA ACCOUNT.
|
||||
CHECK SERVICE 'INFO_GET_ENV_LOCK':
|
||||
SERVICE ISC_INFO_SVC_GET_ENV REQUIRES SYSDBA PERMISSIONS. REATTACH TO THE SERVICE MANAGER USING THE SYSDBA ACCOUNT.
|
||||
CHECK SERVICE 'INFO_GET_ENV_MSG':
|
||||
SERVICE ISC_INFO_SVC_GET_ENV REQUIRES SYSDBA PERMISSIONS. REATTACH TO THE SERVICE MANAGER USING THE SYSDBA ACCOUNT.
|
||||
CHECK SERVICE 'INFO_SVR_DB_INFO':
|
||||
SERVICE ISC_INFO_SVC_SVR_DB_INFO REQUIRES SYSDBA PERMISSIONS. REATTACH TO THE SERVICE MANAGER USING THE SYSDBA ACCOUNT.
|
||||
CHECK SERVICE 'INFO_VERSION':
|
||||
SERVICE MANAGER VERSION: 2
|
||||
"""
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
user_1 = user_factory(name='TMP$C1845', password='QweRtyUi')
|
||||
|
||||
@pytest.mark.version('>=2.5')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
def test_1(act_1: Action, user_1: User):
|
||||
with act_1.connect_server(user=user_1.name, password=user_1.password) as srv:
|
||||
with pytest.raises(DatabaseError, match='.*requires SYSDBA permissions.*'):
|
||||
print(srv.info.security_database)
|
||||
with pytest.raises(DatabaseError, match='.*requires SYSDBA permissions.*'):
|
||||
print(srv.info.home_directory)
|
||||
with pytest.raises(DatabaseError, match='.*requires SYSDBA permissions.*'):
|
||||
print(srv.info.lock_directory)
|
||||
with pytest.raises(DatabaseError, match='.*requires SYSDBA permissions.*'):
|
||||
print(srv.info.message_directory)
|
||||
with pytest.raises(DatabaseError, match='.*requires SYSDBA permissions.*'):
|
||||
print(srv.info.attached_databases)
|
||||
|
||||
|
@ -19,14 +19,22 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from io import BytesIO
|
||||
from firebird.qa import db_factory, python_act, Action
|
||||
from firebird.driver import SrvRestoreFlag
|
||||
|
||||
# version: 2.0
|
||||
# resources: None
|
||||
|
||||
substitutions_1 = []
|
||||
|
||||
init_script_1 = """"""
|
||||
init_script_1 = """
|
||||
create table tmain(id int);
|
||||
create table tdetl( id int, pid int, cost numeric(12,2) );
|
||||
alter table tmain
|
||||
add dsum2 computed by ( (select sum(cost) from tdetl d where d.pid = tmain.id) ) ;
|
||||
commit;
|
||||
"""
|
||||
|
||||
db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
|
||||
@ -76,12 +84,16 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
@pytest.mark.version('>=2.0')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
def test_1(act_1: Action):
|
||||
backup = BytesIO()
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.local_backup(database=str(act_1.db.db_path), backup_stream=backup)
|
||||
backup.seek(0)
|
||||
# test fails if restore raises an exception
|
||||
srv.database.local_restore(backup_stream=backup, database=str(act_1.db.db_path),
|
||||
flags=SrvRestoreFlag.ONE_AT_A_TIME | SrvRestoreFlag.REPLACE)
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
# qmid: bugs.core_1926
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action
|
||||
|
||||
# version: 2.1.2
|
||||
# resources: None
|
||||
@ -37,14 +37,21 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
# print (j-i)
|
||||
# con_detail.commit()
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """1
|
||||
"""
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
@pytest.mark.version('>=2.1.2')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
|
||||
def test_1(act_1: Action):
|
||||
with act_1.db.connect() as con:
|
||||
c = con.cursor()
|
||||
c.execute('SELECT 1 FROM RDB$DATABASE')
|
||||
with act_1.db.connect() as con_detail:
|
||||
con_detail.begin()
|
||||
c_detail = con_detail.cursor()
|
||||
c_detail.execute("select MON$NEXT_TRANSACTION from MON$DATABASE")
|
||||
tra_1 = c_detail.fetchone()[0]
|
||||
con_detail.commit()
|
||||
c_detail.execute("select MON$NEXT_TRANSACTION from MON$DATABASE")
|
||||
tra_2 = c_detail.fetchone()[0]
|
||||
con_detail.commit()
|
||||
assert tra_2 - tra_1 == 1
|
||||
|
@ -5,7 +5,7 @@
|
||||
# decription:
|
||||
# We create common user using Services API and try to establish TWO subsequent connections under his login:
|
||||
# 1) with flag 'forced_write' = 1 and then
|
||||
# 2) with flad 'no_reserve' = 1.
|
||||
# 2) with flag 'no_reserve' = 1.
|
||||
# Note: both values of these flags have to be equal 1 because of some specifics of DPB building inside fdb driver:
|
||||
# value 0 means 'nothing to add', so no error will be raised in this case (and we DO expect error in this ticket).
|
||||
# In WI-V2.1.1.17910 one may to specify *ANY* values of these flags and NO error will be raised.
|
||||
@ -33,7 +33,8 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action, user_factory, User
|
||||
from firebird.driver import driver_config, connect
|
||||
|
||||
# version: 2.1.1
|
||||
# resources: None
|
||||
@ -116,7 +117,8 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
Successfully added non-privileged user
|
||||
@ -131,9 +133,23 @@ expected_stdout_1 = """
|
||||
Successfully finished script
|
||||
"""
|
||||
|
||||
user_1 = user_factory(name='TMP$C1972', password='123')
|
||||
|
||||
@pytest.mark.version('>=2.1.1')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
def test_1(act_1: Action, user_1: User):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
# This test is not possible to implement with new Python driver as it does not
|
||||
# allow to specify `forced_writes` or `reserve_space` options on connect() as tested
|
||||
# configuration options are passed to DPB only for create_database()!
|
||||
# This is intentional change in firebird-driver from fdb, as using these DPB options
|
||||
# on connect has side-effects (changes database option) which was considered dangerous.
|
||||
#
|
||||
# 1. Try to specifying 'force_write' flag: no errors and NO changes in 2.1.1; error in 2.1.2 and above
|
||||
act_1.db._make_config(user=user_1.name, password=user_1.password)
|
||||
db_conf = driver_config.get_database('pytest')
|
||||
db_conf.forced_writes.value = True
|
||||
with pytest.raises():
|
||||
connect('pytest')
|
||||
# 2. Try to specifying 'no_reserve' flag: no errors and NO changes in 2.1.1; error in 2.1.2 and above
|
||||
|
||||
|
@ -35,7 +35,8 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action, temp_file
|
||||
from firebird.driver import SrvBackupFlag, SrvRestoreFlag
|
||||
|
||||
# version: 3.0.5
|
||||
# resources: None
|
||||
@ -208,16 +209,47 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
bkp: rows_without_stat=1
|
||||
res: rows_without_stat=2
|
||||
"""
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
file_1 = temp_file('pytest-run.fbk')
|
||||
|
||||
@pytest.mark.version('>=3.0.5')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
def test_1(act_1: Action, file_1):
|
||||
src_backup = act_1.vars['backups'] / 'core1999_30.fbk'
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.restore(database=str(act_1.db.db_path), backup=str(src_backup),
|
||||
flags=SrvRestoreFlag.REPLACE,
|
||||
verbose=True, stats='TDWR')
|
||||
restore_log = srv.readlines()
|
||||
srv.database.backup(database=str(act_1.db.db_path), backup=str(file_1),
|
||||
verbose=True, stats='TDWR')
|
||||
backup_log = srv.readlines()
|
||||
#
|
||||
# Backup log should contain SINGLE row without statistics, in its header (1st line):
|
||||
# gbak: time delta reads writes
|
||||
#
|
||||
rows_without_stat = 0
|
||||
for line in backup_log:
|
||||
tokens = line.split()
|
||||
if not (tokens[1].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[2].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[3].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[4].replace('.', '', 1).replace(',', '', 1).isdigit()):
|
||||
rows_without_stat = rows_without_stat + 1
|
||||
assert rows_without_stat == 1
|
||||
#
|
||||
# Restore log should contain TWO rows without statistics, first and last:
|
||||
# gbak: time delta reads writes
|
||||
# gbak:adjusting the ONLINE and FORCED WRITES flags
|
||||
#
|
||||
rows_without_stat = 0
|
||||
for line in restore_log:
|
||||
tokens = line.split()
|
||||
if not (tokens[1].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[2].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[3].replace('.', '', 1).replace(',', '', 1).isdigit() and
|
||||
tokens[4].replace('.', '', 1).replace(',', '', 1).isdigit()):
|
||||
rows_without_stat = rows_without_stat + 1
|
||||
assert rows_without_stat == 2
|
||||
|
||||
|
@ -25,12 +25,13 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action, user_factory, User
|
||||
|
||||
# version: 3.0
|
||||
# resources: None
|
||||
|
||||
substitutions_1 = [('Use CONNECT or CREATE DATABASE.*', ''), ('.*After line.*', '')]
|
||||
substitutions_1 = [('Use CONNECT or CREATE DATABASE.*', ''),
|
||||
('.*After line.*', '')]
|
||||
|
||||
init_script_1 = """
|
||||
create or alter view v_check as
|
||||
@ -179,40 +180,103 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
user_1 = user_factory(name='tmp$c2004_foo', password='123')
|
||||
user_2 = user_factory(name='tmp$c2004_bar', password='456')
|
||||
|
||||
expected_stdout_1 = """
|
||||
STDLOG: MSG init_state
|
||||
STDLOG: SEC$USER_NAME TMP$C2004_FOO
|
||||
STDLOG: SEC$ACTIVE <false>
|
||||
STDLOG: SEC$PLUGIN Srp
|
||||
STDLOG: MSG init_state
|
||||
STDLOG: SEC$USER_NAME TMP$C2004_BAR
|
||||
STDLOG: SEC$ACTIVE <false>
|
||||
STDLOG: SEC$PLUGIN Srp
|
||||
STDLOG: Records affected: 2
|
||||
STDLOG: MSG try to connect as INACTIVE users
|
||||
STDLOG: MSG try to connect as user FOO which was just set as active by SYSDBA.
|
||||
STDLOG: WHO_AM_I TMP$C2004_FOO
|
||||
STDLOG: WHATS_MY_ROLE RDB$ADMIN
|
||||
STDLOG: MSG try to connect as user BAR which was just set as active by FOO.
|
||||
STDLOG: WHO_AM_I TMP$C2004_BAR
|
||||
STDLOG: MSG try to drop both non-privileged users by SYSDBA.
|
||||
STDLOG: MSG final_state
|
||||
STDLOG: SEC$USER_NAME <null>
|
||||
STDLOG: SEC$ACTIVE <null>
|
||||
STDLOG: SEC$PLUGIN <null>
|
||||
STDLOG: Records affected: 1
|
||||
STDERR: Statement failed, SQLSTATE = 28000
|
||||
STDERR: Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
|
||||
STDERR: Statement failed, SQLSTATE = 28000
|
||||
STDERR: Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
|
||||
STDERR: After line 19 in file C:\\MIXirebird\\QAbt-repo mp mp_check_2004.sql
|
||||
"""
|
||||
MSG init_state
|
||||
SEC$USER_NAME TMP$C2004_FOO
|
||||
SEC$ACTIVE <false>
|
||||
SEC$PLUGIN Srp
|
||||
MSG init_state
|
||||
SEC$USER_NAME TMP$C2004_BAR
|
||||
SEC$ACTIVE <false>
|
||||
SEC$PLUGIN Srp
|
||||
Records affected: 2
|
||||
MSG try to connect as INACTIVE users
|
||||
MSG try to connect as user FOO which was just set as active by SYSDBA.
|
||||
WHO_AM_I TMP$C2004_FOO
|
||||
WHATS_MY_ROLE RDB$ADMIN
|
||||
MSG try to connect as user BAR which was just set as active by FOO.
|
||||
WHO_AM_I TMP$C2004_BAR
|
||||
"""
|
||||
|
||||
expected_stderr_1 = """
|
||||
Statement failed, SQLSTATE = 28000
|
||||
Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
|
||||
Statement failed, SQLSTATE = 28000
|
||||
Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
|
||||
After line 19 in file tmp_check_2004.sql
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=3.0')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
def test_1(act_1: Action, user_1: User, user_2: User):
|
||||
act_1.script = f'''
|
||||
set list on;
|
||||
commit;
|
||||
create or alter user tmp$c2004_foo password '123' inactive using plugin Srp grant admin role;
|
||||
|
||||
-- NB: currently it seems strange that one need to grant rdb$admin to 'foo'
|
||||
-- For what reason this role need to be added if 'foo' does his actions only in security_db ?
|
||||
-- Sent letter to dimitr and alex, 10-mar-18 16:00
|
||||
grant rdb$admin to tmp$c2004_foo;
|
||||
|
||||
create or alter user tmp$c2004_bar password '456' inactive using plugin Srp;
|
||||
commit;
|
||||
|
||||
set count on;
|
||||
select 'init_state' as msg, v.* from v_check v;
|
||||
set count off;
|
||||
|
||||
select 'try to connect as INACTIVE users' as msg from rdb$database;
|
||||
commit;
|
||||
|
||||
connect '{act_1.db.dsn}' user tmp$c2004_foo password '123'; -- should fail
|
||||
select current_user as who_am_i from rdb$database;
|
||||
rollback;
|
||||
|
||||
connect '{act_1.db.dsn}' user tmp$c2004_bar password '456'; -- should fail
|
||||
select current_user as who_am_i from rdb$database;
|
||||
rollback;
|
||||
|
||||
connect '{act_1.db.dsn}' user SYSDBA password 'masterkey';
|
||||
|
||||
|
||||
-- NB: following "alter user" statement must contain "using plugin Srp" clause
|
||||
-- otherwise get:
|
||||
-- Statement failed, SQLSTATE = HY000
|
||||
-- record not found for user: TMP$C2004_BAR
|
||||
|
||||
alter user tmp$c2004_foo active using plugin Srp;
|
||||
select 'try to connect as user FOO which was just set as active by SYSDBA.' as msg from rdb$database;
|
||||
commit;
|
||||
|
||||
connect '{act_1.db.dsn}' user tmp$c2004_foo password '123' role 'RDB$ADMIN'; -- should pass
|
||||
select current_user as who_am_i, current_role as whats_my_role from rdb$database;
|
||||
|
||||
|
||||
-- should pass because foo has admin role:
|
||||
create or alter user tmp$c2004_rio password '123' using plugin Srp;
|
||||
drop user tmp$c2004_rio using plugin Srp;
|
||||
|
||||
-- should pass because foo has admin role:
|
||||
alter user tmp$c2004_bar active using plugin Srp;
|
||||
select 'try to connect as user BAR which was just set as active by FOO.' as msg from rdb$database;
|
||||
commit;
|
||||
|
||||
connect '{act_1.db.dsn}' user tmp$c2004_bar password '456'; -- should pass
|
||||
select current_user as who_am_i from rdb$database;
|
||||
commit;
|
||||
'''
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
act_1.expected_stderr = expected_stderr_1
|
||||
act_1.execute()
|
||||
assert act_1.clean_stderr == act_1.clean_expected_stderr
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action
|
||||
|
||||
# version: 2.5.7
|
||||
# resources: None
|
||||
@ -117,15 +117,37 @@ db_1 = db_factory(page_size=4096, sql_dialect=3, init=init_script_1)
|
||||
# # BEFORE 3.0.2.32641: (202472, 'select * from sp_test', '3.0.0') // after: 104942
|
||||
# # BEFORE 4.0.0.459: (202472, 'select * from sp_test', '4.0.0') // after: 104942
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
IO statistics for procedure is OK
|
||||
"""
|
||||
IO statistics for procedure is OK
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=2.5.7')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
|
||||
def test_1(act_1: Action, capsys):
|
||||
sp_query = 'select * from sp_test'
|
||||
sql_io = '''
|
||||
select
|
||||
iif( i.mon$page_fetches > 104500, 'IO statistics for procedure is OK',
|
||||
'Strange low value for fetches: ' || i.mon$page_fetches
|
||||
) as fetches_result
|
||||
from rdb$database r
|
||||
left join mon$statements m on
|
||||
m.mon$sql_text containing 'select * from sp_test'
|
||||
and m.mon$sql_text NOT containing 'mon$statements'
|
||||
left join mon$io_stats i on
|
||||
m.mon$stat_id = i.mon$stat_id and i.mon$stat_group = 3
|
||||
;
|
||||
'''
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
with act_1.db.connect() as con:
|
||||
stt1 = con.cursor()
|
||||
stt2 = con.cursor()
|
||||
stt2.execute(sp_query)
|
||||
stt2.fetchall()
|
||||
stt1.execute(sql_io)
|
||||
for row in stt1:
|
||||
print(row[0])
|
||||
act_1.stdout = capsys.readouterr().out
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.driver import DbAccessMode
|
||||
|
||||
# version: 2.5
|
||||
# resources: None
|
||||
@ -53,22 +54,44 @@ db_1 = db_factory(charset='ISO8859_1', sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
MON$READ_ONLY 0
|
||||
RDB$FIELD_NAME X
|
||||
default 0
|
||||
Records affected: 1
|
||||
MON$READ_ONLY 1
|
||||
RDB$FIELD_NAME X
|
||||
default 0
|
||||
Records affected: 1
|
||||
"""
|
||||
test_script_1 = """
|
||||
set list on;
|
||||
set blob all;
|
||||
select mon$read_only from mon$database;
|
||||
set count on;
|
||||
select RDB$FIELD_NAME, rdb$default_source from rdb$relation_fields
|
||||
where rdb$default_source is not null;
|
||||
"""
|
||||
|
||||
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1_a = """
|
||||
MON$READ_ONLY 0
|
||||
RDB$FIELD_NAME X
|
||||
default 0
|
||||
Records affected: 1
|
||||
"""
|
||||
|
||||
expected_stdout_1_b = """
|
||||
MON$READ_ONLY 1
|
||||
RDB$FIELD_NAME X
|
||||
default 0
|
||||
Records affected: 1
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=2.5')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
def test_1(act_1: Action):
|
||||
act_1.expected_stdout = expected_stdout_1_a
|
||||
act_1.execute()
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
#
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.set_access_mode(database=str(act_1.db.db_path), mode=DbAccessMode.READ_ONLY)
|
||||
#
|
||||
act_1.reset()
|
||||
act_1.expected_stdout = expected_stdout_1_b
|
||||
act_1.isql(switches=[], charset='iso8859_1', input=act_1.script)
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
||||
|
||||
|
@ -9,7 +9,8 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from zipfile import Path
|
||||
from firebird.qa import db_factory, python_act, Action
|
||||
|
||||
# version: 3.0
|
||||
# resources: None
|
||||
@ -178,15 +179,17 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
Current plans match to original ones.
|
||||
"""
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
@pytest.mark.version('>=3.0')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
|
||||
def test_1(act_1: Action):
|
||||
# Read script and expected stdout from zip file
|
||||
datafile = Path(act_1.vars['files'] / 'core_2115.zip',
|
||||
at='tmp_core_2115_queries_with_long_plans.sql')
|
||||
act_1.script = datafile.read_text()
|
||||
datafile = Path(act_1.vars['files'] / 'core_2115.zip',
|
||||
at='tmp_core_2115_check_txt_of_long_plans.log')
|
||||
act_1.expected_stdout = datafile.read_text()
|
||||
act_1.execute()
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
@ -24,16 +24,50 @@
|
||||
# qmid: None
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from firebird.qa import db_factory, python_act, Action
|
||||
from firebird.driver import DbWriteMode, SrvRestoreFlag
|
||||
#from difflib import unified_diff
|
||||
from io import BytesIO
|
||||
|
||||
# version: 4.0
|
||||
# resources: None
|
||||
|
||||
substitutions_1 = []
|
||||
|
||||
init_script_1 = """"""
|
||||
test_size = 32768 # -- Ran 1 tests in 4.504s
|
||||
# test_size = 16384 # -- Ran 1 tests in 2.735s
|
||||
max_indx1 = int(test_size / 4 - 9)
|
||||
max_indx6 = int(max_indx1 / 6)
|
||||
max_indx8 = int(max_indx1 / 8)
|
||||
|
||||
db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
init_script_1 = f"""
|
||||
set list on;
|
||||
set bail on;
|
||||
set echo on;
|
||||
create sequence g;
|
||||
commit;
|
||||
create collation utf8_ci for utf8 from unicode case insensitive;
|
||||
create collation utf8_ai_ci for utf8 from unicode accent insensitive case insensitive ;
|
||||
commit;
|
||||
create domain dm_non_coll as varchar({max_indx1});
|
||||
create domain dm_collated_ci as varchar({max_indx6}) character set utf8 collate utf8_ci;
|
||||
create domain dm_collated_ai_ci as varchar({max_indx6}) character set utf8 collate utf8_ai_ci;
|
||||
commit;
|
||||
recreate table test_non_coll(
|
||||
txt_non_coll dm_non_coll
|
||||
);
|
||||
recreate table test_collated(
|
||||
txt_ci dm_collated_ci
|
||||
,txt_ai_ci dm_collated_ai_ci
|
||||
);
|
||||
commit;
|
||||
create index test_non_coll on test_non_coll(txt_non_coll);
|
||||
create index test_coll_ci on test_collated(txt_ci);
|
||||
create index test_coll_ai_ci on test_collated(txt_ai_ci);
|
||||
commit;
|
||||
"""
|
||||
|
||||
db_1 = db_factory(sql_dialect=3, init=init_script_1, page_size=32784)
|
||||
|
||||
# test_script_1
|
||||
#---
|
||||
@ -384,12 +418,150 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
test_script_1 = f'''
|
||||
--show version;
|
||||
delete from test_non_coll;
|
||||
delete from test_collated;
|
||||
commit;
|
||||
set count on;
|
||||
insert into test_non_coll(txt_non_coll)
|
||||
select
|
||||
rpad('', {max_indx1}, 'QWERTY' || gen_id(g,1) )
|
||||
from
|
||||
-- rdb$types rows 10000
|
||||
(select 1 i from rdb$types rows 200), (select 1 i from rdb$types rows 5)
|
||||
rows 361
|
||||
;
|
||||
commit;
|
||||
|
||||
insert into test_collated(txt_ci, txt_ai_ci)
|
||||
select
|
||||
rpad('', {max_indx6}, 'Ещё Съешь Этих Мягких Французских Булочек Да Выпей Же Чаю')
|
||||
,rpad('', {max_indx6}, 'Ещё Французских Булочек Этих Мягких Съешь Да Чаю Выпей Же')
|
||||
from
|
||||
(select 1 i from rdb$types rows 250), (select 1 i from rdb$types rows 2)
|
||||
;
|
||||
|
||||
commit;
|
||||
|
||||
set count off;
|
||||
set list on;
|
||||
set plan on;
|
||||
|
||||
select count(*)
|
||||
from test_non_coll
|
||||
where txt_non_coll starting with 'QWERTY'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ci starting with 'еЩё'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ai_ci starting with 'ёЩЕ'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ci = lower(rpad('', {max_indx6}, 'Ещё Съешь Этих Мягких Французских Булочек Да Выпей Же Чаю'))
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ai_ci = rpad('', {max_indx6}, 'Ещё Французских Булочек Этих Мягких Съешь Да Чаю Выпей Же')
|
||||
;
|
||||
|
||||
select count(*)
|
||||
from test_non_coll
|
||||
where txt_non_coll like 'QWERTY%%'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ci like 'еЩё%%'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ai_ci like 'ёЩЕ%%'
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ci between
|
||||
rpad('', {max_indx6}, 'ещё Съешь ЭТИХ Мягких Французских Булочек Да Выпей Же Чаю')
|
||||
and
|
||||
rpad('', {max_indx6}, 'ЕЩЁ Съешь Этих МЯГКИХ фРанцузских Булочек Да Выпей Же Чаю')
|
||||
|
||||
union all
|
||||
|
||||
select count(*)
|
||||
from test_collated
|
||||
where txt_ai_ci between
|
||||
rpad('', {max_indx6}, 'ёще фРанцузских Булочек Этих Мягких Съешь Да Чаю Выпёй Же')
|
||||
and
|
||||
rpad('', {max_indx6}, 'ёщё Французских Булочёк Этих Мягких Съёшь Да Чаю Выпёй Жё')
|
||||
;
|
||||
|
||||
set plan off;
|
||||
'''
|
||||
|
||||
act_1 = python_act('db_1', substitutions=substitutions_1)
|
||||
|
||||
@pytest.mark.version('>=4.0')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
|
||||
|
||||
def test_1(act_1: Action):
|
||||
# CHANGE FW to OFF
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.set_write_mode(database=str(act_1.db.db_path), mode=DbWriteMode.ASYNC)
|
||||
# 1. FIRST RUN DML_TEST
|
||||
act_1.script = test_script_1
|
||||
act_1.execute()
|
||||
run_dml_log_1 = act_1.stdout
|
||||
# 2. EXTRACT METADATA-1
|
||||
act_1.reset()
|
||||
act_1.isql(switches=['-x'])
|
||||
extract_meta1_sql = act_1.stdout
|
||||
# 3. VALIDATE DATABASE-1
|
||||
# [pcisar] I don't understand the point of validation as the original test does not check
|
||||
# that validation passed
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.validate(database=str(act_1.db.db_path))
|
||||
validate_log_1 = srv.readlines()
|
||||
# 4. TRY TO BACKUP AND RESTORE
|
||||
with act_1.connect_server() as srv:
|
||||
backup = BytesIO()
|
||||
srv.database.local_backup(database=str(act_1.db.db_path), backup_stream=backup)
|
||||
backup.seek(0)
|
||||
srv.database.local_restore(backup_stream=backup, database=str(act_1.db.db_path),
|
||||
flags=SrvRestoreFlag.REPLACE)
|
||||
backup.close()
|
||||
# 5. EXTRACT METADATA-2
|
||||
act_1.reset()
|
||||
act_1.isql(switches=['-x'])
|
||||
extract_meta2_sql = act_1.stdout
|
||||
# 6. AGAIN RUN DML_TEST
|
||||
act_1.reset()
|
||||
act_1.script = test_script_1
|
||||
act_1.execute()
|
||||
run_dml_log_2 = act_1.stdout
|
||||
# 7. VALIDATE DATABASE-2
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.validate(database=str(act_1.db.db_path))
|
||||
validate_log_2 = srv.readlines()
|
||||
# 8. CHECKS
|
||||
# 1) STDERR for: create DB, backup, restore, validation-1 and validation-2 - they all must be EMPTY.
|
||||
# [pcisar] This is granted as exception would be raised if there would be any error
|
||||
# 2) diff between dml_1.log and dml_2.log should be EMPTY.
|
||||
assert run_dml_log_1 == run_dml_log_2
|
||||
# 3) diff between meta1.log and meta2.log should be EMPTY.
|
||||
assert extract_meta1_sql == extract_meta2_sql
|
||||
|
@ -19,6 +19,8 @@
|
||||
|
||||
import pytest
|
||||
from firebird.qa import db_factory, isql_act, Action
|
||||
from io import BytesIO
|
||||
from firebird.driver import SrvRestoreFlag, SrvBackupFlag
|
||||
|
||||
# version: 2.5
|
||||
# resources: None
|
||||
@ -124,16 +126,49 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
|
||||
#
|
||||
#
|
||||
#---
|
||||
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
test_script_1 = '''
|
||||
delete from log;
|
||||
commit;
|
||||
set term ^;
|
||||
execute block as begin
|
||||
rdb$set_context('USER_SESSION', 'INIT_STATE','1');
|
||||
end
|
||||
^
|
||||
set term ;^
|
||||
alter trigger trg_attach active;
|
||||
alter trigger trg_detach active;
|
||||
commit;
|
||||
--set count on;
|
||||
--select * from log;
|
||||
'''
|
||||
|
||||
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_1)
|
||||
|
||||
expected_stdout_1 = """
|
||||
Records affected: 0
|
||||
Records affected: 0
|
||||
"""
|
||||
"""
|
||||
|
||||
@pytest.mark.version('>=2.5')
|
||||
@pytest.mark.xfail
|
||||
def test_1(db_1):
|
||||
pytest.fail("Test not IMPLEMENTED")
|
||||
def test_1(act_1: Action):
|
||||
check_sql = 'set list on; set count on; select 1, g.* from log g;'
|
||||
act_1.execute()
|
||||
backup = BytesIO()
|
||||
with act_1.connect_server() as srv:
|
||||
srv.database.local_backup(database=str(act_1.db.db_path), backup_stream=backup,
|
||||
flags=SrvBackupFlag.NO_TRIGGERS)
|
||||
backup.seek(0)
|
||||
act_1.reset()
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
act_1.isql(switches=['-nod'], input=check_sql)
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
srv.database.local_restore(backup_stream=backup, database=str(act_1.db.db_path),
|
||||
flags=SrvRestoreFlag.REPLACE)
|
||||
backup.close()
|
||||
act_1.reset()
|
||||
act_1.expected_stdout = expected_stdout_1
|
||||
act_1.isql(switches=['-nod'], input=check_sql)
|
||||
assert act_1.clean_stdout == act_1.clean_expected_stdout
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user