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
assert   
    Select Expression (line 5, column 12)
    ....-> Singularity Check
    ........-> First N Records
    ............-> Filter
    ................-> Hash Join (semi)
    ....................-> Sort (record length: NN, key length: NN)
  - ........................-> Table "T1" Full Scan
  + ........................-> Table "PUBLIC"."T1" Full Scan
    ....................-> Record Buffer (record length: NN)
  - ........................-> Table "T2" Full Scan
  + ........................-> Table "PUBLIC"."T2" Full Scan
    3

LOG DETAILS:

2025-06-28 06:38:16.979
2025-06-28 06:38:16.979 act = <firebird.qa.plugin.Action object at [hex]>
2025-06-28 06:38:16.979 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-28 06:38:16.979
2025-06-28 06:38:16.979     @pytest.mark.version('>=5.0.2')
2025-06-28 06:38:16.979     def test_1(act: Action, capsys):
2025-06-28 06:38:16.979
2025-06-28 06:38:16.979         test_sql = """
2025-06-28 06:38:16.979             execute block returns (res int)
2025-06-28 06:38:16.980             as
2025-06-28 06:38:16.980             begin
2025-06-28 06:38:16.980                select first 1 id from t1
2025-06-28 06:38:16.980                  where exists (select 1 from t2 where t1.id = t2.id)
2025-06-28 06:38:16.980                  order by t1.id
2025-06-28 06:38:16.980                  into :res;
2025-06-28 06:38:16.980                suspend;
2025-06-28 06:38:16.980             end
2025-06-28 06:38:16.980         """
2025-06-28 06:38:16.980
2025-06-28 06:38:16.980         srv_cfg = driver_config.register_server(name = f'srv_cfg_8233', config = '')
2025-06-28 06:38:16.980         db_cfg_name = f'db_cfg_8233'
2025-06-28 06:38:16.980         db_cfg_object = driver_config.register_database(name = db_cfg_name)
2025-06-28 06:38:16.980         db_cfg_object.server.value = srv_cfg.name
2025-06-28 06:38:16.980         db_cfg_object.database.value = str(act.db.db_path)
2025-06-28 06:38:16.980         if act.is_version('<6'):
2025-06-28 06:38:16.980             db_cfg_object.config.value = f"""
2025-06-28 06:38:16.980                 SubQueryConversion = true
2025-06-28 06:38:16.980             """
2025-06-28 06:38:16.980
2025-06-28 06:38:16.980         with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con:
2025-06-28 06:38:16.981             ps, rs =  None, None
2025-06-28 06:38:16.981             try:
2025-06-28 06:38:16.981                 cur = con.cursor()
2025-06-28 06:38:16.981                 ps = cur.prepare(test_sql)
2025-06-28 06:38:16.981
2025-06-28 06:38:16.981                 # Print explained plan with padding eash line by dots in order to see indentations:
2025-06-28 06:38:16.981                 print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
2025-06-28 06:38:16.981
2025-06-28 06:38:16.981                 # ::: NB ::: 'ps' returns data, i.e. this is SELECTABLE expression.
2025-06-28 06:38:16.981                 # We have to store result of cur.execute(<psInstance>) in order to
2025-06-28 06:38:16.981                 # close it explicitly.
2025-06-28 06:38:16.981                 # Otherwise AV can occur during Python garbage collection and this
2025-06-28 06:38:16.981                 # causes pytest to hang on its final point.
2025-06-28 06:38:16.981                 # Explained by hvlad, email 26.10.24 17:42
2025-06-28 06:38:16.981                 rs = cur.execute(ps)
2025-06-28 06:38:16.981                 for r in rs:
2025-06-28 06:38:16.981                     print(r[0])
2025-06-28 06:38:16.981             except DatabaseError as e:
2025-06-28 06:38:16.981                 print(e.__str__())
2025-06-28 06:38:16.981                 print(e.gds_codes)
2025-06-28 06:38:16.981             finally:
2025-06-28 06:38:16.981                 if rs:
2025-06-28 06:38:16.982                     rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
2025-06-28 06:38:16.982                 if ps:
2025-06-28 06:38:16.982                     ps.free()
2025-06-28 06:38:16.982
2025-06-28 06:38:16.982         act.expected_stdout = f"""
2025-06-28 06:38:16.982             Select Expression (line 5, column 12)
2025-06-28 06:38:16.982             ....-> Singularity Check
2025-06-28 06:38:16.982             ........-> First N Records
2025-06-28 06:38:16.982             ............-> Filter
2025-06-28 06:38:16.982             ................-> Hash Join (semi)
2025-06-28 06:38:16.982             ....................-> Sort (record length: 28, key length: 8)
2025-06-28 06:38:16.982             ........................-> Table "T1" Full Scan
2025-06-28 06:38:16.982             ....................-> Record Buffer (record length: 25)
2025-06-28 06:38:16.982             ........................-> Table "T2" Full Scan
2025-06-28 06:38:16.982             3
2025-06-28 06:38:16.982         """
2025-06-28 06:38:16.982         act.stdout = capsys.readouterr().out
2025-06-28 06:38:16.982 >       assert act.clean_stdout == act.clean_expected_stdout
2025-06-28 06:38:16.982 E       assert
2025-06-28 06:38:16.982 E           Select Expression (line 5, column 12)
2025-06-28 06:38:16.982 E           ....-> Singularity Check
2025-06-28 06:38:16.983 E           ........-> First N Records
2025-06-28 06:38:16.983 E           ............-> Filter
2025-06-28 06:38:16.983 E           ................-> Hash Join (semi)
2025-06-28 06:38:16.983 E           ....................-> Sort (record length: NN, key length: NN)
2025-06-28 06:38:16.983 E         - ........................-> Table "T1" Full Scan
2025-06-28 06:38:16.983 E         + ........................-> Table "PUBLIC"."T1" Full Scan
2025-06-28 06:38:16.983 E           ....................-> Record Buffer (record length: NN)
2025-06-28 06:38:16.983 E         - ........................-> Table "T2" Full Scan
2025-06-28 06:38:16.983 E         + ........................-> Table "PUBLIC"."T2" Full Scan
2025-06-28 06:38:16.983 E           3
2025-06-28 06:38:16.983
2025-06-28 06:38:16.983 tests\bugs\gh_8233_test.py:134: AssertionError
2025-06-28 06:38:16.983 ---------------------------- Captured stdout setup ----------------------------
2025-06-28 06:38:16.983 Creating db: localhost:H:\QA\temp\qa2024.tmp\fbqa\test_11732\test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
3 #text
act = <firebird.qa.plugin.Action pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>

    @pytest.mark.version('>=5.0.2')
    def test_1(act: Action, capsys):
    
        test_sql = """
            execute block returns (res int)
            as
            begin
               select first 1 id from t1
                 where exists (select 1 from t2 where t1.id = t2.id)
                 order by t1.id
                 into :res;
               suspend;
            end
        """
    
        srv_cfg = driver_config.register_server(name = f'srv_cfg_8233', config = '')
        db_cfg_name = f'db_cfg_8233'
        db_cfg_object = driver_config.register_database(name = db_cfg_name)
        db_cfg_object.server.value = srv_cfg.name
        db_cfg_object.database.value = str(act.db.db_path)
        if act.is_version('<6'):
            db_cfg_object.config.value = f"""
                SubQueryConversion = true
            """
    
        with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con:
            ps, rs =  None, None
            try:
                cur = con.cursor()
                ps = cur.prepare(test_sql)
    
                # Print explained plan with padding eash line by dots in order to see indentations:
                print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
    
                # ::: NB ::: 'ps' returns data, i.e. this is SELECTABLE expression.
                # We have to store result of cur.execute(<psInstance>) in order to
                # close it explicitly.
                # Otherwise AV can occur during Python garbage collection and this
                # causes pytest to hang on its final point.
                # Explained by hvlad, email 26.10.24 17:42
                rs = cur.execute(ps)
                for r in rs:
                    print(r[0])
            except DatabaseError as e:
                print(e.__str__())
                print(e.gds_codes)
            finally:
                if rs:
                    rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
                if ps:
                    ps.free()
    
        act.expected_stdout = f"""
            Select Expression (line 5, column 12)
            ....-> Singularity Check
            ........-> First N Records
            ............-> Filter
            ................-> Hash Join (semi)
            ....................-> Sort (record length: 28, key length: 8)
            ........................-> Table "T1" Full Scan
            ....................-> Record Buffer (record length: 25)
            ........................-> Table "T2" Full Scan
            3
        """
        act.stdout = capsys.readouterr().out
>       assert act.clean_stdout == act.clean_expected_stdout
E       assert   
E           Select Expression (line 5, column 12)
E           ....-> Singularity Check
E           ........-> First N Records
E           ............-> Filter
E           ................-> Hash Join (semi)
E           ....................-> Sort (record length: NN, key length: NN)
E         - ........................-> Table "T1" Full Scan
E         + ........................-> Table "PUBLIC"."T1" Full Scan
E           ....................-> Record Buffer (record length: NN)
E         - ........................-> Table "T2" Full Scan
E         + ........................-> Table "PUBLIC"."T2" Full Scan
E           3

tests\bugs\gh_8233_test.py:134: AssertionError
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 6.0.0.881 2025.06.27 7035d F F 643 452 2025.06.28 03:14:27.954 2025.06.28 03:14:28.597 2025.06.28 01:30:43.017 2025.06.28 01:30:43.469
2 6.0.0.877 2025.06.26 8e38f F F 672 456 2025.06.27 03:13:24.349 2025.06.27 03:13:25.021 2025.06.27 01:30:57.269 2025.06.27 01:30:57.725
3 6.0.0.876 2025.06.25 b1bec F F 655 454 2025.06.26 03:18:42.772 2025.06.26 03:18:43.427 2025.06.26 01:36:36.193 2025.06.26 01:36:36.647
4 6.0.0.863 2025.06.24 c3c20 F F 664 454 2025.06.25 08:02:52.241 2025.06.25 08:02:52.905 2025.06.25 01:30:37.665 2025.06.25 01:30:38.119
5 6.0.0.858 2025.06.24 cbbbf F F 703 435 2025.06.24 17:45:24.536 2025.06.24 17:45:25.239 2025.06.24 16:02:35.467 2025.06.24 16:02:35.902
6 6.0.0.858 2025.06.23 d377c F F 671 457 2025.06.24 08:57:26.209 2025.06.24 08:57:26.880 2025.06.24 07:14:57.862 2025.06.24 07:14:58.319
7 6.0.0.854 2025.06.23 10b58 F F 656 454 2025.06.23 15:38:18.281 2025.06.23 15:38:18.937 2025.06.23 13:54:30.574 2025.06.23 13:54:31.028
8 6.0.0.849 2025.06.20 7b79c F F 653 437 2025.06.21 03:16:37.081 2025.06.21 03:16:37.734 2025.06.21 01:31:10.158 2025.06.21 01:31:10.595
9 6.0.0.848 2025.06.19 c483c F F 655 459 2025.06.20 03:16:14.661 2025.06.20 03:16:15.316 2025.06.20 01:30:55.468 2025.06.20 01:30:55.927
10 6.0.0.845 2025.06.18 20191 F F 651 450 2025.06.19 03:15:52.746 2025.06.19 03:15:53.397 2025.06.19 01:30:42.864 2025.06.19 01:30:43.314
11 6.0.0.843 2025.06.16 995f4 F F 640 442 2025.06.18 03:15:39.998 2025.06.18 03:15:40.638 2025.06.18 01:30:25.013 2025.06.18 01:30:25.455
12 6.0.0.840 2025.06.14 29bca F F 666 458 2025.06.15 03:24:10.126 2025.06.15 03:24:10.792 2025.06.15 01:33:28.315 2025.06.15 01:33:28.773
13 6.0.0.838 2025.06.13 0e28a F F 688 459 2025.06.14 03:21:53.728 2025.06.14 03:21:54.416 2025.06.14 01:31:47.553 2025.06.14 01:31:48.012
14 6.0.0.834 2025.06.11 e889f F F 679 450 2025.06.12 03:19:25.839 2025.06.12 03:19:26.518 2025.06.12 01:32:18.889 2025.06.12 01:32:19.339
15 6.0.0.800 2025.06.10 1f226 P P 611 401 2025.06.11 02:04:23.843 2025.06.11 02:04:24.454 2025.06.11 00:55:34.539 2025.06.11 00:55:34.940
16 6.0.0.799 2025.06.07 be644 P P 611 406 2025.06.10 02:04:02.398 2025.06.10 02:04:03.009 2025.06.10 00:55:11.723 2025.06.10 00:55:12.129
17 6.0.0.797 2025.06.06 303e8 P P 610 398 2025.06.07 02:02:51.088 2025.06.07 02:02:51.698 2025.06.07 00:54:59.800 2025.06.07 00:55:00.198
18 6.0.0.795 2025.05.29 7a71a P P 619 408 2025.06.06 02:02:41.381 2025.06.06 02:02:42.000 2025.06.06 00:54:57.764 2025.06.06 00:54:58.172
19 6.0.0.792 2025.05.28 ee5a8 P P 607 410 2025.05.29 02:01:47.247 2025.05.29 02:01:47.854 2025.05.29 00:55:04.103 2025.05.29 00:55:04.513
20 6.0.0.791 2025.05.27 02db8 P P 611 405 2025.05.28 02:02:16.187 2025.05.28 02:02:16.798 2025.05.28 00:54:47.030 2025.05.28 00:54:47.435
21 6.0.0.789 2025.05.21 64051 P P 610 408 2025.05.25 02:01:59.142 2025.05.25 02:01:59.752 2025.05.25 00:55:12.564 2025.05.25 00:55:12.972
22 6.0.0.787 2025.05.20 230ad P P 598 418 2025.05.21 02:00:55.220 2025.05.21 02:00:55.818 2025.05.21 00:54:22.033 2025.05.21 00:54:22.451
23 6.0.0.783 2025.05.12 37320 P P 612 414 2025.05.19 02:00:41.692 2025.05.19 02:00:42.304 2025.05.19 00:54:29.203 2025.05.19 00:54:29.617
24 6.0.0.779 2025.05.11 136fa P P 615 408 2025.05.12 02:02:49.990 2025.05.12 02:02:50.605 2025.05.12 00:55:06.871 2025.05.12 00:55:07.279
25 6.0.0.778 2025.05.07 d735e P P 592 405 2025.05.11 02:02:14.613 2025.05.11 02:02:15.205 2025.05.11 00:55:20.564 2025.05.11 00:55:20.969
26 6.0.0.776 2025.05.06 007cd P P 610 410 2025.05.07 02:01:28.741 2025.05.07 02:01:29.351 2025.05.07 00:54:57.991 2025.05.07 00:54:58.401
27 6.0.0.770 2025.05.05 82c4a P P 608 398 2025.05.06 02:01:47.420 2025.05.06 02:01:48.028 2025.05.06 00:55:04.501 2025.05.06 00:55:04.899
28 6.0.0.767 2025.05.01 cdd29 P P 603 403 2025.05.02 02:02:23.634 2025.05.02 02:02:24.237 2025.05.02 00:55:54.940 2025.05.02 00:55:55.343
29 6.0.0.762 2025.04.30 5cb15 P P 655 408 2025.05.01 02:00:50.561 2025.05.01 02:00:51.216 2025.05.01 00:55:16.158 2025.05.01 00:55:16.566
30 6.0.0.755 2025.04.29 739c6 P P 637 391 2025.04.30 02:01:03.762 2025.04.30 02:01:04.399 2025.04.30 00:54:58.581 2025.04.30 00:54:58.972
31 6.0.0.753 2025.04.27 29ab3 P P 608 430 2025.04.29 02:01:14.128 2025.04.29 02:01:14.736 2025.04.29 00:55:06.952 2025.04.29 00:55:07.382
32 6.0.0.745 2025.04.21 78ad8 P P 605 409 2025.04.26 02:02:39.844 2025.04.26 02:02:40.449 2025.04.26 00:55:23.560 2025.04.26 00:55:23.969
33 6.0.0.744 2025.04.19 e883a P P 607 407 2025.04.20 02:02:06.682 2025.04.20 02:02:07.289 2025.04.20 00:55:16.334 2025.04.20 00:55:16.741
34 6.0.0.742 2025.04.17 abc3b P P 618 405 2025.04.19 02:01:34.705 2025.04.19 02:01:35.323 2025.04.19 00:54:50.787 2025.04.19 00:54:51.192
35 6.0.0.737 2025.04.16 fe52b P P 605 398 2025.04.17 02:01:58.469 2025.04.17 02:01:59.074 2025.04.17 00:55:04.279 2025.04.17 00:55:04.677

Elapsed time, ms. Chart for last 35 runs:

Last commits information (all timestamps in UTC):