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

Added/Updated tests\bugs\gh_8255_test.py: Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156

This commit is contained in:
pavel-zotov 2024-09-23 18:07:17 +03:00
parent cb6ed4b2eb
commit 6c67c080a4

View File

@ -0,0 +1,54 @@
#coding:utf-8
"""
ID: issue-8255
ISSUE: https://github.com/FirebirdSQL/firebird/issues/8255
TITLE: Catch possible stack overflow when preparing and compiling user statements
DESCRIPTION:
Test generates SQL like 'select 1+1+1....+1 from rdb$database' and tries to execte it.
Exception 'SQLSTATE = HY001 / Stack overflow' must raise instead of crash (that was before fix).
Commits:
* 4.x: https://github.com/FirebirdSQL/firebird/commit/04c586d4ea4bafb50818bcf7f46188afc67ab1c5 (20-sep-2024)
* 5.x: https://github.com/FirebirdSQL/firebird/commit/f0670f90cc7d1fc93db22336fd43abc6d348e31e (18-sep-2024)
* 6.x: https://github.com/FirebirdSQL/firebird/commit/6b445c0dc53f1c5778258bd673c0b61f6dd93a69 (20-sep-2024)
NOTES:
[23.09.2024] pzotov
Initially query containing 15'000 terms in "+1+1...+1" expression used to check.
This query causes 'stack overflow' only in FB 5.x and 6.x.
But in FB 4.0.6.3156 it successfully COMPLETES calculation and issues result.
For FB 4.x this 'threshold' is 16'287 (last number of terms where FB can evaluate result w/o 'stack overflow').
Because of this, it was decided to increase number of terms to 50'000.
Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156
"""
from pathlib import Path
import pytest
from firebird.qa import *
db = db_factory()
act = python_act('db', substitutions=[('[ \t]+', ' '), ('After line \\d+.*', '')])
tmp_sql = temp_file('tmp_8255_non_ascii_ddl.sql')
@pytest.mark.version('>=4.0.6')
def test_1(act: Action, tmp_sql: Path, capsys):
long_expr = '\n'.join( (
'select'
,'+'.join( ('1') * 100000 )
,'from rdb$database;'
)
)
tmp_sql.write_bytes(long_expr.encode('utf-8'))
act.isql(switches=['-q'], input_file=tmp_sql, combine_output = True, charset='win1251')
act.expected_stdout = f"""
Statement failed, SQLSTATE = HY001
Stack overflow. The resource requirements of the runtime stack have exceeded the memory available to it.
"""
assert act.clean_stdout == act.clean_expected_stdout