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:
parent
8166fbdb36
commit
7eb6992fd5
@ -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()
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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']
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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")
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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')
|
||||
|
||||
|
||||
|
||||
|
@ -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.')
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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',)]
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
||||
|
||||
|
@ -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')
|
||||
|
@ -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')
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user