6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-02-02 02:40:42 +01:00

Implementation of Python-based tests

This commit is contained in:
Pavel Císař 2021-11-10 19:02:05 +01:00
parent 8166fbdb36
commit 7eb6992fd5
18 changed files with 950 additions and 502 deletions

View File

@ -10,7 +10,8 @@
# 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 TPB, Isolation
# version: 2.5
# resources: None
@ -69,12 +70,37 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# con2.close()
#
#---
#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.5')
@pytest.mark.xfail
def test_1(db_1):
pytest.fail("Test not IMPLEMENTED")
def test_1(act_1: Action):
stm1 = '''create or alter procedure sp_test as
begin
exit;
end
'''
stm2 = '''create or alter procedure sp_test as
declare x int;
begin
exit;
end
'''
tpb = TPB(isolation=Isolation.CONCURRENCY).get_buffer()
with act_1.db.connect() as con1, act_1.db.connect() as con2:
con1.begin(tpb)
cur1 = con1.cursor()
cur2 = con2.cursor()
cur1.execute(stm1)
con1.commit()
con2.begin(tpb)
cur2.execute(stm2)
con2.commit()
con1.begin(tpb)
cur1.execute(stm1)
con1.commit()

View File

@ -11,7 +11,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
# resources: None
@ -51,12 +51,30 @@ db_1 = db_factory(page_size=4096, sql_dialect=3, init=init_script_1)
# i += 1
# db_conn.commit()
#---
#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.5')
@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()
# Create 4000 triggers on table T
i = 1
cmd = """create trigger LOGT_%d for T after insert as
begin
insert into log (PK) values (new.pk);
end
"""
while i <= 4000:
c.execute(cmd % i)
i += 1
con.commit()
# Grants
i = 1
cmd = """GRANT INSERT ON LOG TO TRIGGER LOGT_%d"""
while i <= 4000:
c.execute(cmd % i)
i += 1
con.commit()

View File

@ -112,36 +112,61 @@ 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 = """
SHOW SQL DIALECT;
CLIENT SQL DIALECT HAS NOT BEEN SET AND NO DATABASE HAS BEEN CONNECTED YET.
Client SQL dialect has not been set and no database has been connected yet.
SET SQL DIALECT 1;
SHOW SQL DIALECT;
CLIENT SQL DIALECT IS SET TO: 1. NO DATABASE HAS BEEN CONNECTED.
Client SQL dialect is set to: 1. No database has been connected.
SET SQL DIALECT 3;
CREATE DATABASE 'LOCALHOST:C:\\FBTESTING\\QA\\FBT-REPO\\TMP2\\TMP_0337.FDB' USER 'SYSDBA' PASSWORD 'MASTERKEY';
SHOW SQL DIALECT;
CLIENT SQL DIALECT IS SET TO: 3 AND DATABASE SQL DIALECT IS: 3
Client SQL dialect is set to: 3 and database SQL dialect is: 3
DROP DATABASE;
SHOW DATABASE;
COMMAND ERROR: SHOW DATABASE
SHOW SQL DIALECT;
CLIENT SQL DIALECT IS SET TO: 3. NO DATABASE HAS BEEN CONNECTED.
Client SQL dialect is set to: 3. No database has been connected.
SET SQL DIALECT 1;
"""
expected_stderr_1 = """
Use CONNECT or CREATE DATABASE to specify a database
Use CONNECT or CREATE DATABASE to specify a database
Command error: SHOW DATABASE
"""
act_1 = isql_act('db_1', "", substitutions=substitutions_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.db.drop()
act_1.script = f"""
SET ECHO ON;
SHOW SQL DIALECT;
SET SQL DIALECT 1;
SHOW SQL DIALECT;
SET SQL DIALECT 3;
CREATE DATABASE '{act_1.db.dsn}' USER '{act_1.db.user}' PASSWORD '{act_1.db.password}';
SHOW SQL DIALECT;
DROP DATABASE;
SHOW DATABASE;
SHOW SQL DIALECT;
SET SQL DIALECT 1;
"""
act_1.expected_stdout = expected_stdout_1
act_1.expected_stderr = expected_stderr_1
act_1.execute(do_not_connect=True)
assert act_1.clean_expected_stdout == act_1.clean_stdout
assert act_1.clean_expected_stderr == act_1.clean_stderr
act_1.db.create()

View File

@ -21,7 +21,7 @@
# qmid: None
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 3.0.4
# resources: None
@ -77,20 +77,41 @@ 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 = """
2
2
3
3
0
TEST_X
"""
act_1 = python_act('db_1', substitutions=substitutions_1)
expected_stdout_1 = """2
2
3
3
0
TEST_X
"""
@pytest.mark.version('>=3.0.4')
@pytest.mark.xfail
def test_1(db_1):
pytest.fail("Test not IMPLEMENTED")
def test_1(act_1: Action, capsys):
with act_1.db.connect() as con:
con.execute_immediate('recreate table test(x int)')
con.commit()
cur = con.cursor()
cur.executemany('insert into test( x ) values( ? )', [(2,), (3,), (3,), (2,)])
for r in cur.execute('select x from test order by x'):
print(r[0])
cur.execute('delete from test')
for r in cur.execute('select count(*) from test'):
print(r[0])
con.execute_immediate('create unique index test_x on test(x)')
con.commit()
for r in cur.execute("select rdb$index_name from rdb$indices where rdb$relation_name='TEST'"):
print(r[0].rstrip())
#
output = capsys.readouterr()
assert output.out == expected_stdout_1

View File

@ -28,6 +28,10 @@
# 3.0.5.33084 SC: 1.344s.
# 3.0.5.33212 CS: 3.175s.
#
# [pcisar] 9.11.2021
# This test was fragile from start, usualy lefts behind resources and requires
# temporary changes to firebird.conf on run-time. It's questionable whether
# wire-compression should be tested at all.
#
# tracker_id: CORE-0733
# min_versions: ['3.0.0']

View File

@ -46,7 +46,7 @@ show view v_users_name;
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """Database: localhost:C: btest2 mpugs.core_0790.fdb, User: SYSDBA
expected_stdout_1 = """Database: localhost:C:/fbtest2/tmp/bugs.core_0790.fdb, User: SYSDBA
SQL> CON> SQL> SQL> ID INTEGER Nullable
NAME VARCHAR(20) Nullable
PASSWD VARCHAR(20) Nullable
@ -65,7 +65,8 @@ View Source:
==== ======
select name from v_users
SQL> SQL> SQL> SQL>"""
SQL> SQL> SQL> SQL>
"""
@pytest.mark.version('>=2.5.0')
def test_1(act_1: Action):

View File

@ -11,7 +11,7 @@
# qmid: None
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 3.0
# resources: None
@ -84,15 +84,18 @@ db_1 = db_factory(charset='UTF8', 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 = """
ALTER DOMAIN DM_TEST ADD CONSTRAINT
"""
@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.extract_meta()
expected = ''.join([x for x in act_1.clean_stdout.splitlines() if 'ALTER DOMAIN' in x.upper()])
assert act_1.clean_expected_stdout == expected

View File

@ -86,9 +86,27 @@ expected_stdout_1 = """
octet_length diff: 1
"""
test_script_1 = """
set list on;
select c.rdb$character_set_name as connection_cset
from mon$attachments a
join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id
where a.mon$attachment_id = current_connection;
select t.id as "test_1 result:" from rdb$database r left join test t on t.f01 not containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1';
select t.id as "test_2 result:" from rdb$database r left join test t on t.f01 containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1';
select t.id as "ci_ai result:" from rdb$database r left join test t on lower(t.f02) = upper(t.f02);
select t.id as "between result:" from rdb$database r left join test t on lower(t.f01) between lower(t.f02) and upper(t.f02);
select * from v_test;
"""
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_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.charset = 'WIN1252'
act_1.expected_stdout = expected_stdout_1
act_1.execute()
assert act_1.clean_expected_stdout == act_1.clean_stdout

View File

@ -9,7 +9,7 @@
# qmid: bugs.core_929
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 2.1
# resources: None
@ -39,12 +39,16 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# print (e)
#
#---
#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.1')
@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()
try:
c.prepare('SELECT * FROM TEST WHERE MYDATE + CAST(? AS INTEGER) >= ?')
except:
pytest.fail("Test FAILED")

View File

@ -13,7 +13,7 @@
# * with count of data pages and average fill for table 'TEST'
# * with number of index root page, depath of index and number of buckets and nodes for index 'TEST_S'
# * with timestamp of GSTAT finish.
# If line from log matches to any of pattenrs then we do output if this line for checking in 'expected_stdout' section.
# If line from log matches to any of patterns then we do output if this line for checking in 'expected_stdout' section.
# Otherwise line is ignored.
#
# Check is done using regexp searches -- see definition of patterns hdr_dbname_ptn, hdr_dbattr_ptn, table_ppip_ptn etc.
@ -25,18 +25,29 @@
# FB30SS, build 3.0.3.32837: OK, 2.344s.
# FB40SS, build 4.0.0.800: OK, 2.437s.
#
# [pcisar] 9.11.2021
# This test is wrong as it uses service manager.
# It should use gstat directly with pseudo-remote path (i.e. localhost:filename)
#
# tracker_id: CORE-959
# min_versions: ['2.5']
# versions: 3.0
# qmid: None
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
import re
# version: 3.0
# resources: None
substitutions_1 = [('Database ".*', 'Database'), ('Gstat execution time .*', 'Gstat execution time'), ('Attributes .*', 'Attributes'), ('Primary pointer page: \\d+, Index root page: \\d+\\s*', 'Primary pointer page, Index root page'), ('Data pages: \\d+, average fill: \\d+[percent_sign]', 'Data pages, average fill'), ('Root page: \\d+, depth: \\d+, leaf buckets: \\d+, nodes: \\d+\\s*', 'Root page, depth, leaf buckets, nodes'), ('Gstat completion time .*', 'Gstat completion time')]
substitutions_1 = [('Database ".*', 'Database'),
('Gstat execution time .*', 'Gstat execution time'),
('Attributes .*', 'Attributes'),
('Primary pointer page: \\d+, Index root page: \\d+\\s*', 'Primary pointer page, Index root page'),
('Data pages: \\d+, average fill: \\d+[percent_sign]', 'Data pages, average fill'),
('Root page: \\d+, depth: \\d+, leaf buckets: \\d+, nodes: \\d+\\s*', 'Root page, depth, leaf buckets, nodes'),
('Gstat completion time .*', 'Gstat completion time')]
init_script_1 = """
create sequence g;
@ -144,7 +155,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 = """
Database "C:\\MIX\\FIREBIRD\\QA\\FBT-REPO\\TMP\\BUGS.CORE_0959.FDB"
@ -157,8 +169,31 @@ expected_stdout_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):
hdr_dbname_ptn = re.compile('Database\\s+"', re.IGNORECASE)
hdr_dbattr_ptn = re.compile('Attributes\\s+\\.*', re.IGNORECASE)
table_ppip_ptn = re.compile('Primary\\s+pointer\\s+page:\\s+\\d+,\\s+Index root page:\\s+\\d+\\s*', re.IGNORECASE)
table_dpaf_ptn = re.compile('Data\\s+pages:\\s+\\d+,\\s+average\\s+fill:\\s+\\d+%\\s*', re.IGNORECASE)
index_root_ptn = re.compile('Root\\s+page:\\s+\\d+,\\s+depth:\\s+\\d+,\\s+leaf\\s+buckets:\\s+\\d+,\\s+nodes:\\s+\\d+\\s*', re.IGNORECASE)
#
gstat_init_ptn = re.compile('Gstat\\s+execution\\s+time\\s+', re.IGNORECASE)
gstat_fini_ptn = re.compile('Gstat\\s+completion\\s+time\\s+', re.IGNORECASE)
#
watched_ptn_list = [hdr_dbname_ptn, hdr_dbattr_ptn, table_ppip_ptn, table_dpaf_ptn,
index_root_ptn, gstat_init_ptn, gstat_fini_ptn]
#
act_1.expected_stdout = expected_stdout_1
act_1.gstat(switches=['-d', '-i', '-r'])
#
matched = []
for line in act_1.stdout.splitlines():
for p in watched_ptn_list:
if p.search(line):
matched.append(' '.join(line.replace('%','[percent_sign]').split()))
#
actual = '\n'.join(matched)
actual = act_1.string_strip(actual, act_1.substitutions)
assert 'localhost' in act_1.db.dsn
assert act_1.clean_expected_stdout == actual

View File

@ -9,7 +9,8 @@
# qmid: bugs.core_967
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
from firebird.driver import DatabaseError
# version: 2.1
# resources: None
@ -36,14 +37,18 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# c.execute('select * from t')
# printData(c)
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """'Error while preparing SQL statement:/n- SQLCODE: -104/n- Dynamic SQL Error/n- SQL error code = -104/n- Token unknown - line 1, column 17/n- /xee'
"""
act_1 = python_act('db_1', substitutions=substitutions_1)
#expected_stdout_1 = """'Error while preparing SQL statement:/n- SQLCODE: -104/n- Dynamic SQL Error/n- SQL error code = -104/n- Token unknown - line 1, column 17/n- /xee'
#"""
@pytest.mark.version('>=2.1')
@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()
with pytest.raises(DatabaseError, match="Dynamic SQL Error\n-SQL error code = -104\n-Token unknown - line 1, column 17\n.*") as excinfo:
c.execute('update t set i=1'+chr(238)+' where 1=0')

View File

@ -32,7 +32,7 @@
# 3.0.5.33178 CS: 3.153s.
#
# 17-mar-2021. Re-implemented in order to have ability to run this test on Linux.
# Ttest creates table and fills it with non-ascii characters in init_script, using charset = UTF8.
# Test creates table and fills it with non-ascii characters in init_script, using charset = UTF8.
# Then it generates .sql script for running it in separae ISQL process.
# This script makes connection to test DB using charset = WIN1251 and perform needed DML.
# Result will be redirected to .log which will be opened via codecs.open(...encoding='cp1251').
@ -49,12 +49,13 @@
# 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 pathlib import Path
# version: 3.0
# resources: None
substitutions_1 = []
substitutions_1 = [('in file .*', 'in file XXX')]
init_script_1 = """"""
@ -374,15 +375,192 @@ 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 = """
STDLOG WHEN CSET=NONE: FOUND EXPECTED 'CREATE COLLATION STATEMENT'
STDERR WHEN CSET=NONE: FOUND EXPECTED SQLSTATE IN ERROR MESSAGE
STDLOG WHEN CSET=1251: ALL FINISHED OK.
"""
act_1 = python_act('db_1', substitutions=substitutions_1)
expected_stdout_1_a = """create collation "Циферки" for utf8 from unicode case insensitive 'NUMERIC-SORT=1';"""
expected_stderr_1_a_40 = """
Statement failed, SQLSTATE = 22018
arithmetic exception, numeric overflow, or string truncation
-Cannot transliterate character between character sets
After line 4 in file /tmp/pytest/pytest-124/test/non_ascii_ddl.sql
"""
expected_stderr_1_a_30 = """
Statement failed, SQLSTATE = 22000
unsuccessful metadata update
-CREATE COLLATION Циферки failed
-Malformed string
"""
non_ascii_ddl='''
set bail on;
set echo on;
create collation "Циферки" for utf8 from unicode case insensitive 'NUMERIC-SORT=1';
create collation "Испания" for iso8859_1 from es_es_ci_ai 'SPECIALS-FIRST=1';;
commit;
create domain "ИД'шники" int;
create domain "Группы" varchar(30) check( value in ('Электрика', 'Ходовая', 'Арматурка', 'Кузовщина') );
create domain "Артикулы" varchar(12) character set utf8 check( value = upper(value) )
collate "Циферки" -- enabled since core-5220 was fixed (30.04.2016)
;
create domain "Комрады" varchar(40) character set iso8859_1
collate "Испания" -- enabled since core-5220 was fixed (30.04.2016)
;
create domain "Кол-во" numeric(12,3) not null;
create sequence generilka;
create sequence "Генерилка";
create role "манагер";
create role "начсклд";
-- TEMPLY COMMENTED UNTIL CORE-5209 IS OPEN:
-- ISQL -X ignores connection charset for text of EXCEPTION message (restoring it in initial charset when exception was created)
recreate exception "Невзлет" 'Запись обломалась, ваши не пляшут. Но не стесняйтесь и обязательно заходите еще, мы всегда рады видеть вас. До скорой встречи, товарищ!';
commit;
-------------------------------------------------
recreate table "склад" (
"ИД'шник" "ИД'шники"
,"Откудова" "Группы"
,"Номенклатура" "Артикулы"
,"ИД'родителя" "ИД'шники"
,"сколько там" "Кол-во"
,constraint "ПК-ИД'шник" primary key ("ИД'шник") using index "склад_ПК"
,constraint "ФК-на-родока" foreign key("ИД'родителя") references "склад" ("ИД'шник") using index "склад_ФК"
,constraint "остаток >=0" check ("сколько там" >= 0)
);
recreate view "Электрика"("ид изделия", "Название", "Запас") as
select
"ИД'шник"
,"Номенклатура"
,"сколько там"
from "склад"
where "Откудова" = 'Электрика'
;
set term ^;
create or alter trigger "склад би" for "склад" active before insert as
begin
--new."ИД'шник" = coalesce( new."ИД'шник", gen_id(generilka, 1) );
-- not avail up to 2.5.6:
new."ИД'шник" = coalesce( new."ИД'шник", gen_id("Генерилка", 1) );
end
^
create or alter procedure "Доб на склад"(
"Откудова" varchar(30)
,"Номенклатура" varchar(30)
,"ИД'родителя" int
,"сколько там" numeric(12,3)
) returns (
"код возврата" int
) as
begin
insert into "склад"(
"Откудова"
,"Номенклатура"
,"ИД'родителя"
,"сколько там"
) values (
:"Откудова"
,:"Номенклатура"
,:"ИД'родителя"
,:"сколько там"
);
end
^
create or alter procedure "Удалить" as
begin
/*
Антон Павлович Чехов. Каштанка
1. Дурное поведение
Молодая рыжая собака - помесь такса с дворняжкой - очень похожая мордой
на лисицу, бегала взад и вперед по тротуару и беспокойно оглядывалась по
сторонам. Изредка она останавливалась и, плача, приподнимая то одну озябшую
лапу, то другую, старалась дать себе отчет: как это могло случиться, что она
заблудилась?
*/
end
^
set term ;^
grant select on "склад" to "манагер";
grant select, insert, update, delete on "склад" to "начсклд";
-- no avail in 2.0: grant execute procedure "Доб на склад" to "начсклд";
comment on sequence "Генерилка" is 'Генератор простых идей';
comment on table "склад" is 'Это всё, что мы сейчас имеем в наличии';
comment on view "Электрика" is 'Не суй пальцы в розетку, будет бо-бо!';
comment on procedure "Доб на склад" is 'Процедурка добавления изделия на склад';
comment on parameter "Доб на склад"."Откудова" is 'Группа изделия, которое собираемся добавить';
comment on parameter "Доб на склад"."ИД'родителя" is '
Федор Михайлович Достоевский
Преступление и наказание
Роман в шести частях с эпилогом
Часть первая
I
В начале июля, в чрезвычайно жаркое время, под вечер, один молодой человек вышел из своей каморки, которую нанимал от жильцов в С -- м переулке, на улицу и медленно, как бы в нерешимости, отправился к К -- ну мосту.
Он благополучно избегнул встречи с своею хозяйкой на лестнице. Каморка его приходилась под самою кровлей высокого пятиэтажного дома и походила более на шкаф, чем на квартиру. Квартирная же хозяйка его, у которой он нанимал эту каморку с обедом и прислугой, помещалась одною лестницей ниже, в отдельной квартире, и каждый раз, при выходе на улицу, ему непременно надо было проходить мимо хозяйкиной кухни, почти всегда настежь отворенной на лестницу. И каждый раз молодой человек, проходя мимо, чувствовал какое-то болезненное и трусливое ощущение, которого стыдился и от которого морщился. Он был должен кругом хозяйке и боялся с нею встретиться.
Не то чтоб он был так труслив и забит, совсем даже напротив; но с некоторого времени он был в раздражительном и напряженном состоянии, похожем на ипохондрию. Он до того углубился в себя и уединился от всех, что боялся даже всякой встречи, не только встречи с хозяйкой. Он был задавлен бедностью; но даже стесненное положение перестало в последнее время тяготить его. Насущными делами своими он совсем перестал и не хотел заниматься. Никакой хозяйки, в сущности, он не боялся, что бы та ни замышляла против него. Но останавливаться на лестнице, слушать всякий вздор про всю эту обыденную дребедень, до которой ему нет никакого дела, все эти приставания о платеже, угрозы, жалобы, и при этом самому изворачиваться, извиняться, лгать, -- нет уж, лучше проскользнуть как-нибудь кошкой по лестнице и улизнуть, чтобы никто не видал.
Впрочем, на этот раз страх встречи с своею кредиторшей даже его самого поразил по выходе на улицу.
"На какое дело хочу покуситься и в то же время каких пустяков боюсь! -- подумал он с странною улыбкой. -- Гм... да... всё в руках человека, и всё-то он мимо носу проносит, единственно от одной трусости... это уж аксиома... Любопытно, чего люди больше всего боятся? Нового шага, нового собственного слова они всего больше боятся... А впрочем, я слишком много болтаю. Оттого и ничего не делаю, что болтаю. Пожалуй, впрочем, и так: оттого болтаю, что ничего не делаю. Это я в этот последний месяц выучился болтать, лежа по целым суткам в углу и думая... о царе Горохе. Ну зачем я теперь иду? Разве я способен на это? Разве это серьезно? Совсем не серьезно. Так, ради фантазии сам себя тешу; игрушки! Да, пожалуй что и игрушки!"
На улице жара стояла страшная, к тому же духота, толкотня, всюду известка, леса, кирпич, пыль и та особенная летняя вонь, столь известная каждому петербуржцу, не имеющему возможности нанять дачу, -- всё это разом неприятно потрясло и без того уже расстроенные нервы юноши. Нестерпимая же вонь из распивочных, которых в этой части города особенное множество, и пьяные, поминутно попадавшиеся, несмотря на буднее время, довершили отвратительный и грустный колорит картины. Чувство глубочайшего омерзения мелькнуло на миг в тонких чертах молодого человека. Кстати, он был замечательно хорош собою, с прекрасными темными глазами, темно-рус, ростом выше среднего, тонок и строен. Но скоро он впал как бы в глубокую задумчивость, даже, вернее сказать, как бы в какое-то забытье, и пошел, уже не замечая окружающего, да и не желая его замечать. Изредка только бормотал он что-то про себя, от своей привычки к монологам, в которой он сейчас сам себе признался. В эту же минуту он и сам сознавал, что мысли его порою мешаются и что он очень слаб: второй день как уж он почти совсем ничего не ел.
Он был до того худо одет, что иной, даже и привычный человек, посовестился бы днем выходить в таких лохмотьях на улицу. Впрочем, квартал был таков, что костюмом здесь было трудно кого-нибудь удивить. Близость Сенной, обилие известных заведений и, по преимуществу, цеховое и ремесленное население, скученное в этих серединных петербургских улицах и переулках, пестрили иногда общую панораму такими субъектами, что странно было бы и удивляться при встрече с иною фигурой. Но столько злобного презрения уже накопилось в душе молодого человека, что, несмотря на всю свою, иногда очень молодую, щекотливость, он менее всего совестился своих лохмотьев на улице. Другое дело при встрече с иными знакомыми или с прежними товарищами, с которыми вообще он не любил встречаться... А между тем, когда один пьяный, которого неизвестно почему и куда провозили в это время по улице в огромной телеге, запряженной огромною ломовою лошадью, крикнул ему вдруг, проезжая: "Эй ты, немецкий шляпник!" -- и заорал во всё горло, указывая на него рукой, -- молодой человек вдруг остановился и судорожно схватился за свою шляпу. Шляпа эта была высокая, круглая, циммермановская, но вся уже изношенная, совсем рыжая, вся в дырах и пятнах, без полей и самым безобразнейшим углом заломившаяся на сторону. Но не стыд, а совсем другое чувство, похожее даже на испуг, охватило его.
"Я так и знал! -- бормотал он в смущении, -- я так и думал! Это уж всего сквернее! Вот эдакая какая-нибудь глупость, какая-нибудь пошлейшая мелочь, весь замысел может испортить! Да, слишком приметная шляпа... Смешная, потому и приметная... К моим лохмотьям непременно нужна фуражка, хотя бы старый блин какой-нибудь, а не этот урод. Никто таких не носит, за версту заметят, запомнят... главное, потом запомнят, ан и улика. Тут нужно быть как можно неприметнее... Мелочи, мелочи главное!.. Вот эти-то мелочи и губят всегда и всё..."
';
--------------------------------------------------
commit;
--/*
--TEMPLY COMMENTED UNTIL CORE-5221 IS OPEN:
set echo on;
show collation;
show domain;
show exception; -- <<<<<<<<<<<<<
show sequence;
show table;
show trigger;
show view;
show procedure;
show role;
--*/
set list on;
set echo off;
select 'Metadata created OK.' as msg from rdb$database;
'''
tmp_file_1 = temp_file('non_ascii_ddl.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, tmp_file_1: Path):
#
tmp_file_1.write_bytes(non_ascii_ddl.encode('cp1251'))
# run without specifying charset
act_1.expected_stdout = expected_stdout_1_a
act_1.expected_stderr = expected_stderr_1_a_40 if act_1.is_version('>=4.0') else expected_stderr_1_a_30
act_1.isql(switches=['-q'], input_file=tmp_file_1, charset=None, io_enc='cp1251')
assert act_1.clean_stdout == act_1.clean_expected_stdout
assert act_1.clean_stderr == act_1.clean_expected_stderr
# run with charset
act_1.reset()
act_1.isql(switches=['-q'], input_file=tmp_file_1, charset='win1251', io_enc='cp1251')
assert act_1.clean_stdout.endswith('Metadata created OK.')

View File

@ -9,7 +9,7 @@
# qmid: bugs.core_1073
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 2.1
# resources: None
@ -100,12 +100,83 @@ 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)
def check(step, cur, statement, exp):
r = cur.execute(statement).fetchone()
if (exp and (r is None)) or (not exp and (r is not None)):
pytest.fail(f'Test FAILED in step {step}, expectation {exp}')
@pytest.mark.version('>=2.1')
@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()
#
p_singular = 'select 1 from rdb$database where singular(select * from t where a = 1)'
n_singular = 'select 1 from rdb$database where not(singular(select * from t where a = 1))'
p_nsingular = 'select 1 from rdb$database where not singular( select * from t where a = 1)'
n_nsingular = 'select 1 from rdb$database where not(not singular(select * from t where a = 1))'
#
ins = 'insert into t values (%s)'
#
# Step 1
#
c.execute(ins % '2')
c.execute(ins % 'null')
con.commit()
#
check(1, c, p_singular, False)
check(1, c, n_singular, True)
check(1, c, p_nsingular, True)
check(1, c, n_nsingular, False)
#
c.execute('delete from t')
con.commit()
#
# Step 2
#
c.execute(ins % '1')
c.execute(ins % 'null')
con.commit()
#
check(2, c, p_singular, True)
check(2, c, n_singular, False)
check(2, c, p_nsingular, False)
check(2, c, n_nsingular, True)
#
c.execute('delete from t')
con.commit()
#
# Step 3
#
c.execute(ins % '1')
c.execute(ins % 'null')
c.execute(ins % '1')
con.commit()
#
check(3, c, p_singular, False)
check(3, c, n_singular, True)
check(3, c, p_nsingular, True)
check(3, c, n_nsingular, False)
#
c.execute('delete from t')
con.commit()
#
# Step 4
#
c.execute(ins % '1')
c.execute(ins % '1')
c.execute(ins % 'null')
con.commit()
#
check(4, c, p_singular, False)
check(4, c, n_singular, True)
check(4, c, p_nsingular, True)
check(4, c, n_nsingular, False)
#
c.execute('delete from t')
con.commit()

View File

@ -15,7 +15,7 @@
# qmid:
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 3.0
# resources: None
@ -168,21 +168,33 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# cleanup( [i.name for i in (f_svc_log, f_svc_err, f_sql_log, f_sql_err, f_sql_txt)] )
#
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
act_1 = python_act('db_1', substitutions=substitutions_1)
expected_stdout_1 = """
SVC STDOUT: Try to add user.
SVC STDOUT: Try to modify user: change password and some attributes.
SVC STDOUT: All done.
SQL STDOUT: SEC$USER_NAME NEBUCHADNEZZAR2_KING_OF_BABYLON
SQL STDOUT: SEC$FIRST_NAME Nebuchadnezzar3_King_of_Babylon
SQL STDOUT: SEC$MIDDLE_NAME Nebuchadnezzar4_King_of_Babylon
SQL STDOUT: SEC$LAST_NAME Nebuchadnezzar5_King_of_Babylon
"""
SEC$USER_NAME NEBUCHADNEZZAR2_KING_OF_BABYLON
SEC$FIRST_NAME Nebuchadnezzar3_King_of_Babylon
SEC$MIDDLE_NAME Nebuchadnezzar4_King_of_Babylon
SEC$LAST_NAME Nebuchadnezzar5_King_of_Babylon
"""
@pytest.mark.version('>=3.0')
@pytest.mark.xfail
def test_1(db_1):
pytest.fail("Test not IMPLEMENTED")
def test_1(act_1: Action):
with act_1.connect_server() as srv:
check_login = "Nebuchadnezzar2_King_of_Babylon"
srv.user.add(user_name=check_login, password="Nebu_King_of_Babylon")
srv.user.update(user_name=check_login,
first_name="Nebuchadnezzar3_King_of_Babylon",
middle_name="Nebuchadnezzar4_King_of_Babylon",
last_name="Nebuchadnezzar5_King_of_Babylon")
#
act_1.script = f"""set list on;
select sec$user_name, sec$first_name, sec$middle_name, sec$last_name from sec$users
where upper(sec$user_name) = upper('{check_login}');
commit;
drop user {check_login};
"""
act_1.expected_stdout = expected_stdout_1
act_1.execute()
assert act_1.clean_stdout == act_1.clean_expected_stdout

View File

@ -9,7 +9,7 @@
# qmid: bugs.core_1112
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 2.1
# resources: None
@ -36,14 +36,18 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# c.execute("select 'a' from rdb$database")
# print (c.fetchall())
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """[('a',)]
"""
act_1 = python_act('db_1', substitutions=substitutions_1)
@pytest.mark.version('>=2.1')
@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()
longstr = 'abc' * 10930
c.execute(f"select * from rdb$database where '{longstr}' = 'a'")
c.execute(f"select * from rdb$database where '{longstr}' containing 'a'")
c.execute("select 'a' from rdb$database")
result = c.fetchall()
assert result == [('a',)]

View File

@ -17,12 +17,15 @@
# qmid: bugs.core_1148
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action, temp_user, User
from firebird.driver import DatabaseError
# version: 2.5
# resources: None
substitutions_1 = [('ENGINE_VERSION .*', 'ENGINE_VERSION'), ('STDERR: UNABLE TO PERFORM OPERATION.*', 'STDERR: UNABLE TO PERFORM OPERATION'), ('STDERR: -YOU MUST HAVE SYSDBA RIGHTS AT THIS SERVER*', '')]
substitutions_1 = [('ENGINE_VERSION .*', 'ENGINE_VERSION'),
('STDERR: UNABLE TO PERFORM OPERATION.*', 'STDERR: UNABLE TO PERFORM OPERATION'),
('STDERR: -YOU MUST HAVE SYSDBA RIGHTS AT THIS SERVER*', '')]
init_script_1 = """"""
@ -89,15 +92,16 @@ 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 = """
STDERR: UNABLE TO PERFORM OPERATION
"""
act_1 = python_act('db_1', substitutions=substitutions_1)
user_1 = temp_user(name='TMP$C1148', 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='Unable to perform operation\n-You must have SYSDBA rights at this server'):
srv.info.get_log()

View File

@ -9,7 +9,7 @@
# qmid: bugs.core_1156
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 2.1
# resources: None
@ -49,12 +49,30 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# print ('Test FAILED in case 5')
#
#---
#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.1')
@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()
try:
c.prepare('select count(*) from rdb$database where ? < (select count(*) from rdb$database)')
except:
pytest.fail('Test FAILED in case 1')
try:
c.prepare('select count(*) from rdb$database where (select count(*) from rdb$database) > ?')
except:
pytest.fail('Test FAILED in case 2')
try:
c.prepare('select count(*) from rdb$database where ? < cast ((select count(*) from rdb$database) as integer)')
except:
pytest.fail('Test FAILED in case 3')
try:
c.prepare('select count(*) from rdb$database where 0 < (select count(*) from rdb$database)')
except:
pytest.fail('Test FAILED in case 4')
try:
c.prepare('select count(*) from rdb$database where cast (? as integer) < (select count(*) from rdb$database)')
except:
pytest.fail('Test FAILED in case 5')

View File

@ -25,7 +25,7 @@
# qmid: bugs.core_1175
import pytest
from firebird.qa import db_factory, isql_act, Action
from firebird.qa import db_factory, python_act, Action
# version: 4.0
# resources: None
@ -64,15 +64,16 @@ db_1 = db_factory(sql_dialect=3, init=init_script_1)
# print( e )
#
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """
Test PASSED!
"""
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):
with act_1.db.connect() as con:
c = con.cursor()
try:
c.prepare('select 1 from rdb$database where UDR40_frac(?) != UDR40_div(?, ?) / ?')
except:
pytest.fail('Test FAILED')