Check firebird.log [no messages found for interval when this test was running]
Jump to: output_first_mismatch    outcomes_full_history    elapsed_time_chart
Show cross-report outcomes.

Annotation type Annotation details
2 @message
firebird.driver.types.DatabaseError: feature is not supported

LOG DETAILS:

2025-04-03 13:12:14.797
2025-04-03 13:12:14.797 act = <firebird.qa.plugin.Action object at [hex]>
2025-04-03 13:12:14.797 tmp_blob_file = WindowsPath('H:/QA/temp/qa2024.tmp/fbqa/test_11855/tmp_small_blob.dat')
2025-04-03 13:12:14.797 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-04-03 13:12:14.797
2025-04-03 13:12:14.797     @pytest.mark.version('>=5.0.3')
2025-04-03 13:12:14.797     def test_1(act: Action, tmp_blob_file: Path, capsys):
2025-04-03 13:12:14.797         with act.db.connect() as con:
2025-04-03 13:12:14.797             cur1 = con.cursor()
2025-04-03 13:12:14.797             cur1.execute("select rdb$get_context('SYSTEM', 'CLIENT_VERSION') as client_version from rdb$database")
2025-04-03 13:12:14.797             hdr=cur1.description
2025-04-03 13:12:14.797             for r in cur1:
2025-04-03 13:12:14.797                 for i in range(0,len(hdr)):
2025-04-03 13:12:14.798                     print( hdr[i][0],':', r[i] )
2025-04-03 13:12:14.798             print(f'{con.info.version=}, {con.info.get_info(DbInfoCode.PROTOCOL_VERSION)=}')
2025-04-03 13:12:14.798
2025-04-03 13:12:14.798             failed_count = 0
2025-04-03 13:12:14.798             for b_range_mnemona, b_len_checked_range in CHECKED_LEN_RANGES.items():
2025-04-03 13:12:14.798                 print(f'Preparing data, {b_range_mnemona=}, {b_len_checked_range=}')
2025-04-03 13:12:14.798                 for b_gen_size in range(b_len_checked_range[0], b_len_checked_range[1]+1):
2025-04-03 13:12:14.798                     print(f'\nGenerate file with data to be stored further in blob field, {b_len_checked_range=}, {b_gen_size=}')
2025-04-03 13:12:14.798                     with open(tmp_blob_file, 'wb') as f_binary_data:
2025-04-03 13:12:14.798                         f_binary_data.write( bytearray( ''.join(random.choices(string.ascii_letters + string.digits, k = b_gen_size)).encode('ascii') ) )
2025-04-03 13:12:14.798
2025-04-03 13:12:14.798                     with open(tmp_blob_file, 'rb') as f_binary_data:
2025-04-03 13:12:14.798                         cur1.execute("delete from bdata")
2025-04-03 13:12:14.798                         cur1.execute("insert into bdata(blob_fld) values (?)", (f_binary_data,))
2025-04-03 13:12:14.798                         con.commit()
2025-04-03 13:12:14.798
2025-04-03 13:12:14.798                         cur1.stream_blobs.append('BLOB_FLD')
2025-04-03 13:12:14.798                         cur1.execute('select blob_fld from bdata')
2025-04-03 13:12:14.798                         blob_reader_1 = cur1.fetchone()[0]
2025-04-03 13:12:14.799
2025-04-03 13:12:14.799                         pos_beg, pos_end = b_len_checked_range[:2]
2025-04-03 13:12:14.799                         b_read_cnt = 0
2025-04-03 13:12:14.799                         for i_pos in range(pos_beg, pos_end+1):
2025-04-03 13:12:14.799                             print(f'\n{i_pos=}', ' - *NOTE* WORK BEYOND EOF:' if i_pos > b_gen_size else '')
2025-04-03 13:12:14.799                             for whence in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END):
2025-04-03 13:12:14.799                                 print(f'\n  Start loop for whence in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END): {f_binary_data.tell()=}, {blob_reader_1.tell()=}')
2025-04-03 13:12:14.799                                 if whence == os.SEEK_CUR:
2025-04-03 13:12:14.799                                     f_binary_data.seek( -min(b_gen_size, (i_pos + b_read_cnt)), os.SEEK_CUR)
2025-04-03 13:12:14.799                                     blob_reader_1.seek( -min(b_gen_size, (i_pos + b_read_cnt)), os.SEEK_CUR)
2025-04-03 13:12:14.799                                     print(f'    whence == os.SEEK_CUR --> move back for {-min(b_gen_size, (i_pos + b_read_cnt))=}. Result: {f_binary_data.tell()=}, {blob_reader_1.tell()=}')
2025-04-03 13:12:14.799                                 elif whence == os.SEEK_END:
2025-04-03 13:12:14.799                                     b_read_pos = -(pos_end+1 - i_pos)
2025-04-03 13:12:14.799                                     print(f'    whence == os.SEEK_END: {b_read_pos=}')
2025-04-03 13:12:14.799                                     if -b_read_pos > b_gen_size:
2025-04-03 13:12:14.799                                         print(f'    Can not use negative {b_read_pos=} for {whence=} and {b_gen_size=}')
2025-04-03 13:12:14.799                                         continue
2025-04-03 13:12:14.799                                 else:
2025-04-03 13:12:14.799                                     b_read_pos = i_pos
2025-04-03 13:12:14.800                                     print(f'    whence == os.SEEK_SET: {b_read_pos=}')
2025-04-03 13:12:14.800
2025-04-03 13:12:14.800                                 print(f'    FILE: f_binary_data.seek({b_read_pos}, {whence=})')
2025-04-03 13:12:14.800                                 f_binary_data.seek(b_read_pos, whence)
2025-04-03 13:12:14.800                                 b_read_cnt = pos_end+1 - i_pos
2025-04-03 13:12:14.800                                 print(f'    FILE: {f_binary_data.tell()=}, attempt to read {b_read_cnt=} bytes starting from {i_pos=} using {whence=}')
2025-04-03 13:12:14.800                                 b_data_in_file = f_binary_data.read(b_read_cnt)
2025-04-03 13:12:14.800                                 print(f'    FILE: completed read {b_read_cnt=} bytes starting from {i_pos=} using {whence=}. Result: {f_binary_data.tell()=}, {len(b_data_in_file)=}')
2025-04-03 13:12:14.800
2025-04-03 13:12:14.800                                 # Now do the same against DB (stream blob):
2025-04-03 13:12:14.800                                 print(f'    BLOB: blob_reader_1.seek({b_read_pos}, {whence=})')
2025-04-03 13:12:14.800 >                               blob_reader_1.seek(b_read_pos, whence)
2025-04-03 13:12:14.800
2025-04-03 13:12:14.800 tests\functional\blob\test_small_blob_caching.py:162:
2025-04-03 13:12:14.800 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-04-03 13:12:14.800
2025-04-03 13:12:14.800 self = BlobReader[size=0], offset = 0, whence = 0
2025-04-03 13:12:14.800
2025-04-03 13:12:14.800     def seek(self, offset: int, whence: int=os.SEEK_SET) -> None:
2025-04-03 13:12:14.801         """Set the files current position, like stdios `fseek()`.
2025-04-03 13:12:14.801
2025-04-03 13:12:14.801         See:
2025-04-03 13:12:14.801             :meth:`io.IOBase.seek()` for details.
2025-04-03 13:12:14.801
2025-04-03 13:12:14.801         Arguments:
2025-04-03 13:12:14.801             offset: Offset from specified position.
2025-04-03 13:12:14.801             whence: Context for offset. Accepted values: os.SEEK_SET, os.SEEK_CUR or os.SEEK_END
2025-04-03 13:12:14.801
2025-04-03 13:12:14.801         Warning:
2025-04-03 13:12:14.801            If BLOB was NOT CREATED as `stream` BLOB, this method raises `DatabaseError`
2025-04-03 13:12:14.801            exception. This constraint is set by Firebird.
2025-04-03 13:12:14.801         """
2025-04-03 13:12:14.801         assert self._blob is not None
2025-04-03 13:12:14.801 >       self.__pos = self._blob.seek(whence, offset)
2025-04-03 13:12:14.801
2025-04-03 13:12:14.801 C:\Python3x\Lib\site-packages\firebird\driver\core.py:3066:
2025-04-03 13:12:14.801 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-04-03 13:12:14.801
2025-04-03 13:12:14.801 self = <firebird.driver.interfaces.iBlob object at [hex]>, mode = 0
2025-04-03 13:12:14.802 offset = 0
2025-04-03 13:12:14.802
2025-04-03 13:12:14.802     def seek(self, mode: int, offset: int) -> int:
2025-04-03 13:12:14.802         "Replaces isc_seek_blob()"
2025-04-03 13:12:14.802         result = self.vtable.seek(self, self.status, mode, offset)
2025-04-03 13:12:14.802 >       self._check()
2025-04-03 13:12:14.802
2025-04-03 13:12:14.802 C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:383:
2025-04-03 13:12:14.802 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-04-03 13:12:14.802
2025-04-03 13:12:14.802 self = <firebird.driver.interfaces.iBlob object at [hex]>
2025-04-03 13:12:14.802
2025-04-03 13:12:14.802     def _check(self) -> None:
2025-04-03 13:12:14.802         state = self.status.get_state()
2025-04-03 13:12:14.802         if StateFlag.ERRORS in state:
2025-04-03 13:12:14.802 >           raise self.__report(DatabaseError, self.status.get_errors())
2025-04-03 13:12:14.802 E           firebird.driver.types.DatabaseError: feature is not supported
2025-04-03 13:12:14.802
2025-04-03 13:12:14.802 C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:113: DatabaseError
2025-04-03 13:12:14.802 ---------------------------- Captured stdout setup ----------------------------
2025-04-03 13:12:14.803 Creating db: localhost:H:\QA\temp\qa2024.tmp\fbqa\test_11855\test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
2025-04-03 13:12:14.803 ---------------------------- Captured stdout call -----------------------------
2025-04-03 13:12:14.803 CLIENT_VERSION : WI-V5.0.3.1635 Firebird 5.0 HQbird
2025-04-03 13:12:14.803 con.info.version='5.0.3.1635', con.info.get_info(DbInfoCode.PROTOCOL_VERSION)=19
2025-04-03 13:12:14.803 Preparing data, b_range_mnemona='about_00k', b_len_checked_range=(0, 5)
2025-04-03 13:12:14.803
2025-04-03 13:12:14.803 Generate file with data to be stored further in blob field, b_len_checked_range=(0, 5), b_gen_size=0
2025-04-03 13:12:14.803
2025-04-03 13:12:14.803 i_pos=0
2025-04-03 13:12:14.803
2025-04-03 13:12:14.803   Start loop for whence in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END): f_binary_data.tell()=0, blob_reader_1.tell()=0
2025-04-03 13:12:14.803     whence == os.SEEK_SET: b_read_pos=0
2025-04-03 13:12:14.803     FILE: f_binary_data.seek(0, whence=0)
2025-04-03 13:12:14.803     FILE: f_binary_data.tell()=0, attempt to read b_read_cnt=6 bytes starting from i_pos=0 using whence=0
2025-04-03 13:12:14.803     FILE: completed read b_read_cnt=6 bytes starting from i_pos=0 using whence=0. Result: f_binary_data.tell()=0, len(b_data_in_file)=0
2025-04-03 13:12:14.803     BLOB: blob_reader_1.seek(0, whence=0)
3 #text
act = <firebird.qa.plugin.Action pytest object at [hex]>
tmp_blob_file = WindowsPath('H:/QA/temp/qa2024.tmp/fbqa/test_11855/tmp_small_blob.dat')
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>

    @pytest.mark.version('>=5.0.3')
    def test_1(act: Action, tmp_blob_file: Path, capsys):
        with act.db.connect() as con:
            cur1 = con.cursor()
            cur1.execute("select rdb$get_context('SYSTEM', 'CLIENT_VERSION') as client_version from rdb$database")
            hdr=cur1.description
            for r in cur1:
                for i in range(0,len(hdr)):
                    print( hdr[i][0],':', r[i] )
            print(f'{con.info.version=}, {con.info.get_info(DbInfoCode.PROTOCOL_VERSION)=}')
    
            failed_count = 0
            for b_range_mnemona, b_len_checked_range in CHECKED_LEN_RANGES.items():
                print(f'Preparing data, {b_range_mnemona=}, {b_len_checked_range=}')
                for b_gen_size in range(b_len_checked_range[0], b_len_checked_range[1]+1):
                    print(f'\nGenerate file with data to be stored further in blob field, {b_len_checked_range=}, {b_gen_size=}')
                    with open(tmp_blob_file, 'wb') as f_binary_data:
                        f_binary_data.write( bytearray( ''.join(random.choices(string.ascii_letters + string.digits, k = b_gen_size)).encode('ascii') ) )
    
                    with open(tmp_blob_file, 'rb') as f_binary_data:
                        cur1.execute("delete from bdata")
                        cur1.execute("insert into bdata(blob_fld) values (?)", (f_binary_data,))
                        con.commit()
    
                        cur1.stream_blobs.append('BLOB_FLD')
                        cur1.execute('select blob_fld from bdata')
                        blob_reader_1 = cur1.fetchone()[0]
    
                        pos_beg, pos_end = b_len_checked_range[:2]
                        b_read_cnt = 0
                        for i_pos in range(pos_beg, pos_end+1):
                            print(f'\n{i_pos=}', ' - *NOTE* WORK BEYOND EOF:' if i_pos > b_gen_size else '')
                            for whence in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END):
                                print(f'\n  Start loop for whence in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END): {f_binary_data.tell()=}, {blob_reader_1.tell()=}')
                                if whence == os.SEEK_CUR:
                                    f_binary_data.seek( -min(b_gen_size, (i_pos + b_read_cnt)), os.SEEK_CUR)
                                    blob_reader_1.seek( -min(b_gen_size, (i_pos + b_read_cnt)), os.SEEK_CUR)
                                    print(f'    whence == os.SEEK_CUR --> move back for {-min(b_gen_size, (i_pos + b_read_cnt))=}. Result: {f_binary_data.tell()=}, {blob_reader_1.tell()=}')
                                elif whence == os.SEEK_END:
                                    b_read_pos = -(pos_end+1 - i_pos)
                                    print(f'    whence == os.SEEK_END: {b_read_pos=}')
                                    if -b_read_pos > b_gen_size:
                                        print(f'    Can not use negative {b_read_pos=} for {whence=} and {b_gen_size=}')
                                        continue
                                else:
                                    b_read_pos = i_pos
                                    print(f'    whence == os.SEEK_SET: {b_read_pos=}')
    
                                print(f'    FILE: f_binary_data.seek({b_read_pos}, {whence=})')
                                f_binary_data.seek(b_read_pos, whence)
                                b_read_cnt = pos_end+1 - i_pos
                                print(f'    FILE: {f_binary_data.tell()=}, attempt to read {b_read_cnt=} bytes starting from {i_pos=} using {whence=}')
                                b_data_in_file = f_binary_data.read(b_read_cnt)
                                print(f'    FILE: completed read {b_read_cnt=} bytes starting from {i_pos=} using {whence=}. Result: {f_binary_data.tell()=}, {len(b_data_in_file)=}')
    
                                # Now do the same against DB (stream blob):
                                print(f'    BLOB: blob_reader_1.seek({b_read_pos}, {whence=})')
>                               blob_reader_1.seek(b_read_pos, whence)

tests\functional\blob\test_small_blob_caching.py:162: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = BlobReader[size=0], offset = 0, whence = 0

    def seek(self, offset: int, whence: int=os.SEEK_SET) -> None:
        """Set the file’s current position, like stdio‘s `fseek()`.
    
        See:
            :meth:`io.IOBase.seek()` for details.
    
        Arguments:
            offset: Offset from specified position.
            whence: Context for offset. Accepted values: os.SEEK_SET, os.SEEK_CUR or os.SEEK_END
    
        Warning:
           If BLOB was NOT CREATED as `stream` BLOB, this method raises `DatabaseError`
           exception. This constraint is set by Firebird.
        """
        assert self._blob is not None
>       self.__pos = self._blob.seek(whence, offset)

C:\Python3x\Lib\site-packages\firebird\driver\core.py:3066: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <firebird.driver.interfaces.iBlob pytest object at [hex]>, mode = 0
offset = 0

    def seek(self, mode: int, offset: int) -> int:
        "Replaces isc_seek_blob()"
        result = self.vtable.seek(self, self.status, mode, offset)
>       self._check()

C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:383: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <firebird.driver.interfaces.iBlob pytest object at [hex]>

    def _check(self) -> None:
        state = self.status.get_state()
        if StateFlag.ERRORS in state:
>           raise self.__report(DatabaseError, self.status.get_errors())
E           firebird.driver.types.DatabaseError: feature is not supported

C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:113: DatabaseError
Full history of outcomes and elapsed time, ms:
NN SNAP_INFO CS_outcome SS_outcome CS_run_time SS_run_time CS_run_beg CS_run_end SS_run_beg SS_run_end
1 5.0.3.1657 2025.06.26 dcb8a P P 894 593 2025.06.27 11:10:51.745 2025.06.27 11:10:52.639 2025.06.27 10:08:54.467 2025.06.27 10:08:55.060
2 5.0.3.1657 2025.06.20 8b4d2 P P 879 623 2025.06.26 11:25:15.018 2025.06.26 11:25:15.897 2025.06.26 10:23:10.958 2025.06.26 10:23:11.581
3 5.0.3.1657 2025.06.19 4bd4c P P 935 591 2025.06.20 05:29:34.755 2025.06.20 05:29:35.690 2025.06.20 04:27:29.792 2025.06.20 04:27:30.383
4 5.0.3.1657 2025.06.11 dae6f P P 883 611 2025.06.19 11:00:57.048 2025.06.19 11:00:57.931 2025.06.19 09:58:53.788 2025.06.19 09:58:54.399
5 5.0.3.1657 2025.06.10 dbc92 P P 925 617 2025.06.11 08:47:21.297 2025.06.11 08:47:22.222 2025.06.11 07:44:51.097 2025.06.11 07:44:51.714
6 5.0.3.1656 2025.06.05 00512 P P 879 600 2025.06.10 10:02:37.374 2025.06.10 10:02:38.253 2025.06.10 08:59:56.331 2025.06.10 08:59:56.931
7 5.0.3.1656 2025.05.20 c4b11 P P 850 587 2025.06.03 09:49:27.954 2025.06.03 09:49:28.804 2025.06.03 08:47:58.883 2025.06.03 08:47:59.470
8 5.0.3.1652 2025.05.13 f51c6 P P 848 597 2025.05.21 06:30:26.454 2025.05.21 06:30:27.302 2025.05.21 05:29:13.808 2025.05.21 05:29:14.405
9 5.0.3.1651 2025.05.08 ee9d2 P E 859 2422 2025.05.13 06:43:07.174 2025.05.13 06:43:08.033 2025.05.13 05:27:58.424 2025.05.13 05:28:00.846
10 5.0.3.1651 2025.05.04 3d914 P E 892 2429 2025.05.09 04:32:09.887 2025.05.09 04:32:10.779 2025.05.09 03:16:56.572 2025.05.09 03:16:59.001
11 5.0.3.1651 2025.04.30 141ef P E 851 2399 2025.05.02 04:39:46.384 2025.05.02 04:39:47.235 2025.05.02 03:24:49.530 2025.05.02 03:24:51.929
12 5.0.3.1650 2025.04.30 6253f P E 844 2402 2025.05.01 04:38:48.906 2025.05.01 04:38:49.750 2025.05.01 03:23:46.307 2025.05.01 03:23:48.709
13 5.0.3.1650 2025.04.28 4cbff P E 841 2458 2025.04.30 04:37:49.990 2025.04.30 04:37:50.831 2025.04.30 03:22:59.184 2025.04.30 03:23:01.642
14 5.0.3.1649 2025.04.21 5b2d0 P E 889 2425 2025.04.26 10:11:50.029 2025.04.26 10:11:50.918 2025.04.26 08:56:00.129 2025.04.26 08:56:02.554
15 5.0.3.1648 2025.04.18 2f4c5 P P 892 600 2025.04.20 04:23:04.740 2025.04.20 04:23:05.632 2025.04.20 03:20:49.571 2025.04.20 03:20:50.171
16 5.0.3.1635 2025.04.03 f6bd1 F E 871 2393 2025.04.18 06:50:47.559 2025.04.18 06:50:48.430 2025.04.18 05:35:11.503 2025.04.18 05:35:13.896
17 5.0.3.1635 2025.03.31 22ec6 F E 855 2398 2025.04.03 09:56:35.423 2025.04.03 09:56:36.278 2025.04.03 08:40:37.687 2025.04.03 08:40:40.085

Elapsed time, ms. Chart for last 17 runs:

Last commits information (all timestamps in UTC):