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   
  + Initial script failed, check output:
  + Statement failed, SQLSTATE = 22021
  + unsuccessful metadata update
  + -ALTER CHARACTER SET "SYSTEM"."UTF8" failed
  + -COLLATION "SYSTEM"."CI_COLL" for CHARACTER SET "SYSTEM"."UTF8" is not defined
  + After line 8 in file H:\QA\temp\qa2024.tmp\fbqa\test_11691\gh_8061.tmp.sql
  - 1000
  - select c3.cust_no
  - from customer c3
  - where exists (
  - select  s3.cust_no
  - from sales s3
  - where s3.cust_no = c3.cust_no and
  - exists (
  - select x.emp_no
  - from employee x
  - where
  - x.job_country = c3.country
  - )
  - )
  - Subqueries that are correlated to non-parent; for example,
  - subquery SQ3 is contained by SQ2 (parent of SQ3) and SQ2 in turn is contained
  - by SQ1 and SQ3 is correlated to tables defined in SQ1.
  - Sub-query
  - ....-> Filter
  - ........-> Table "EMPLOYEE" as "X" Full Scan
  - Sub-query
  - ....-> Filter (preliminary)
  - ........-> Filter
  - ............-> Table "SALES" as "S3" Access By ID
  - ................-> Bitmap
  - ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
  - Select Expression
  - ....-> Filter
  - ........-> Table "CUSTOMER" as "C3" Full Scan
  - 2000
  - select c3.cust_no
  - from customer c3
  - where exists (
  - select s3.cust_no
  - from sales s3
  - where s3.cust_no = c3.cust_no
  - group by s3.cust_no
  - )
  - A group-by subquery is correlated; in this case, unnesting implies doing join
  - after group-by. Changing the given order of the two operations may not be always legal.
  - Sub-query
  - ....-> Aggregate
  - ........-> Filter
  - ............-> Table "SALES" as "S3" Access By ID
  - ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
  - Select Expression
  - ....-> Filter
  - ........-> Table "CUSTOMER" as "C3" Full Scan
  - 3000
  - select s1.cust_no
  - from sales s1
  - where exists (
  - select 1 from customer c1 where s1.cust_no = c1.cust_no
  - union all
  - select 1 from employee x1 where s1.sales_rep = x1.emp_no
  - )
  - For disjunctive subqueries, the outer columns in the connecting
  - or correlating conditions are not the same.
  - Sub-query
  - ....-> Union
  - ........-> Filter
  - ............-> Table "CUSTOMER" as "C1" Access By ID
  - ................-> Bitmap
  - ....................-> Index "CUSTOMER_PK" Unique Scan
  - ........-> Filter
  - ............-> Table "EMPLOYEE" as "X1" Access By ID
  - ................-> Bitmap
  - ....................-> Index "EMPLOYEE_PK" Unique Scan
  - Select Expression
  - ....-> Filter
  - ........-> Table "SALES" as "S1" Full Scan
  - 4000
  - select x1.emp_no
  - from employee x1
  - where
  - (
  - x1.job_country = 'USA' or
  - exists (
  - select 1
  - from sales s1
  - where s1.sales_rep = x1.emp_no
  - )
  - )
  - An `OR` condition in compound WHERE expression, see https://jonathanlewis.wordpress.com/2007/02/26/subquery-with-or/
  - Sub-query
  - ....-> Filter
  - ........-> Table "SALES" as "S1" Access By ID
  - ............-> Bitmap
  - ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
  - Select Expression
  - ....-> Filter
  - ........-> Table "EMPLOYEE" as "X1" Full Scan

LOG DETAILS:

2025-06-28 06:38:16.877
2025-06-28 06:38:16.877 act = <firebird.qa.plugin.Action object at [hex]>
2025-06-28 06:38:16.877 tmp_sql = WindowsPath('H:/QA/temp/qa2024.tmp/fbqa/test_11691/gh_8061.tmp.sql')
2025-06-28 06:38:16.877 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-28 06:38:16.877
2025-06-28 06:38:16.877     @pytest.mark.version('>=5.0.1')
2025-06-28 06:38:16.877     def test_1(act: Action, tmp_sql: Path, capsys):
2025-06-28 06:38:16.877         employee_data_sql = zipfile.Path(act.files_dir / 'standard_sample_databases.zip', at='sample-DB_-_firebird.sql')
2025-06-28 06:38:16.877         tmp_sql.write_bytes(employee_data_sql.read_bytes())
2025-06-28 06:38:16.877
2025-06-28 06:38:16.877         act.isql(switches = ['-q'], charset='utf8', input_file = tmp_sql, combine_output = True)
2025-06-28 06:38:16.877
2025-06-28 06:38:16.877         if act.return_code == 0:
2025-06-28 06:38:16.878
2025-06-28 06:38:16.878             srv_cfg = driver_config.register_server(name = f'srv_cfg_8061_addi', config = '')
2025-06-28 06:38:16.878             db_cfg_name = f'db_cfg_8061_addi'
2025-06-28 06:38:16.878             db_cfg_object = driver_config.register_database(name = db_cfg_name)
2025-06-28 06:38:16.878             db_cfg_object.server.value = srv_cfg.name
2025-06-28 06:38:16.878             db_cfg_object.database.value = str(act.db.db_path)
2025-06-28 06:38:16.878             if act.is_version('<6'):
2025-06-28 06:38:16.878                 db_cfg_object.config.value = f"""
2025-06-28 06:38:16.878                     SubQueryConversion = true
2025-06-28 06:38:16.878                 """
2025-06-28 06:38:16.878
2025-06-28 06:38:16.878             with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con:
2025-06-28 06:38:16.878                 cur = con.cursor()
2025-06-28 06:38:16.878                 for q_idx, q_tuple in query_map.items():
2025-06-28 06:38:16.878                     test_sql, qry_comment = q_tuple[:2]
2025-06-28 06:38:16.878                     ps = cur.prepare(test_sql)
2025-06-28 06:38:16.878                     print(q_idx)
2025-06-28 06:38:16.878                     print(test_sql)
2025-06-28 06:38:16.878                     print(qry_comment)
2025-06-28 06:38:16.878                     print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
2025-06-28 06:38:16.879                     ps.free()
2025-06-28 06:38:16.879
2025-06-28 06:38:16.879         else:
2025-06-28 06:38:16.879             # If retcode !=0 then we can print the whole output of failed gbak:
2025-06-28 06:38:16.879             print('Initial script failed, check output:')
2025-06-28 06:38:16.879             for line in act.clean_stdout.splitlines():
2025-06-28 06:38:16.879                 print(line)
2025-06-28 06:38:16.879         act.reset()
2025-06-28 06:38:16.879
2025-06-28 06:38:16.879         act.expected_stdout = f"""
2025-06-28 06:38:16.879             1000
2025-06-28 06:38:16.879             {query_map[1000][0]}
2025-06-28 06:38:16.879             {query_map[1000][1]}
2025-06-28 06:38:16.879             Sub-query
2025-06-28 06:38:16.879             ....-> Filter
2025-06-28 06:38:16.879             ........-> Table "EMPLOYEE" as "X" Full Scan
2025-06-28 06:38:16.879             Sub-query
2025-06-28 06:38:16.879             ....-> Filter (preliminary)
2025-06-28 06:38:16.879             ........-> Filter
2025-06-28 06:38:16.879             ............-> Table "SALES" as "S3" Access By ID
2025-06-28 06:38:16.880             ................-> Bitmap
2025-06-28 06:38:16.880             ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-28 06:38:16.880             Select Expression
2025-06-28 06:38:16.880             ....-> Filter
2025-06-28 06:38:16.880             ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-28 06:38:16.880
2025-06-28 06:38:16.880             2000
2025-06-28 06:38:16.880             {query_map[2000][0]}
2025-06-28 06:38:16.880             {query_map[2000][1]}
2025-06-28 06:38:16.880             Sub-query
2025-06-28 06:38:16.880             ....-> Aggregate
2025-06-28 06:38:16.880             ........-> Filter
2025-06-28 06:38:16.880             ............-> Table "SALES" as "S3" Access By ID
2025-06-28 06:38:16.880             ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-28 06:38:16.880             Select Expression
2025-06-28 06:38:16.880             ....-> Filter
2025-06-28 06:38:16.880             ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-28 06:38:16.880
2025-06-28 06:38:16.880             3000
2025-06-28 06:38:16.880             {query_map[3000][0]}
2025-06-28 06:38:16.881             {query_map[3000][1]}
2025-06-28 06:38:16.881             Sub-query
2025-06-28 06:38:16.881             ....-> Union
2025-06-28 06:38:16.881             ........-> Filter
2025-06-28 06:38:16.881             ............-> Table "CUSTOMER" as "C1" Access By ID
2025-06-28 06:38:16.881             ................-> Bitmap
2025-06-28 06:38:16.881             ....................-> Index "CUSTOMER_PK" Unique Scan
2025-06-28 06:38:16.881             ........-> Filter
2025-06-28 06:38:16.881             ............-> Table "EMPLOYEE" as "X1" Access By ID
2025-06-28 06:38:16.881             ................-> Bitmap
2025-06-28 06:38:16.882             ....................-> Index "EMPLOYEE_PK" Unique Scan
2025-06-28 06:38:16.882             Select Expression
2025-06-28 06:38:16.882             ....-> Filter
2025-06-28 06:38:16.882             ........-> Table "SALES" as "S1" Full Scan
2025-06-28 06:38:16.883
2025-06-28 06:38:16.883             4000
2025-06-28 06:38:16.883             {query_map[4000][0]}
2025-06-28 06:38:16.883             {query_map[4000][1]}
2025-06-28 06:38:16.883             Sub-query
2025-06-28 06:38:16.883             ....-> Filter
2025-06-28 06:38:16.883             ........-> Table "SALES" as "S1" Access By ID
2025-06-28 06:38:16.883             ............-> Bitmap
2025-06-28 06:38:16.883             ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
2025-06-28 06:38:16.883             Select Expression
2025-06-28 06:38:16.883             ....-> Filter
2025-06-28 06:38:16.883             ........-> Table "EMPLOYEE" as "X1" Full Scan
2025-06-28 06:38:16.883         """
2025-06-28 06:38:16.883         act.stdout = capsys.readouterr().out
2025-06-28 06:38:16.883 >       assert act.clean_stdout == act.clean_expected_stdout
2025-06-28 06:38:16.883 E       assert
2025-06-28 06:38:16.883 E         + Initial script failed, check output:
2025-06-28 06:38:16.883 E         + Statement failed, SQLSTATE = 22021
2025-06-28 06:38:16.883 E         + unsuccessful metadata update
2025-06-28 06:38:16.883 E         + -ALTER CHARACTER SET "SYSTEM"."UTF8" failed
2025-06-28 06:38:16.883 E         + -COLLATION "SYSTEM"."CI_COLL" for CHARACTER SET "SYSTEM"."UTF8" is not defined
2025-06-28 06:38:16.883 E         + After line 8 in file H:\QA\temp\qa2024.tmp\fbqa\test_11691\gh_8061.tmp.sql
2025-06-28 06:38:16.884 E         - 1000
2025-06-28 06:38:16.884 E         - select c3.cust_no
2025-06-28 06:38:16.884 E         - from customer c3
2025-06-28 06:38:16.884 E         - where exists (
2025-06-28 06:38:16.884 E         - select  s3.cust_no
2025-06-28 06:38:16.884 E         - from sales s3
2025-06-28 06:38:16.884 E         - where s3.cust_no = c3.cust_no and
2025-06-28 06:38:16.884 E         - exists (
2025-06-28 06:38:16.884 E         - select x.emp_no
2025-06-28 06:38:16.884 E         - from employee x
2025-06-28 06:38:16.884 E         - where
2025-06-28 06:38:16.884 E         - x.job_country = c3.country
2025-06-28 06:38:16.884 E         - )
2025-06-28 06:38:16.884 E         - )
2025-06-28 06:38:16.884 E         - Subqueries that are correlated to non-parent; for example,
2025-06-28 06:38:16.884 E         - subquery SQ3 is contained by SQ2 (parent of SQ3) and SQ2 in turn is contained
2025-06-28 06:38:16.884 E         - by SQ1 and SQ3 is correlated to tables defined in SQ1.
2025-06-28 06:38:16.884 E         - Sub-query
2025-06-28 06:38:16.884 E         - ....-> Filter
2025-06-28 06:38:16.884 E         - ........-> Table "EMPLOYEE" as "X" Full Scan
2025-06-28 06:38:16.885 E         - Sub-query
2025-06-28 06:38:16.885 E         - ....-> Filter (preliminary)
2025-06-28 06:38:16.885 E         - ........-> Filter
2025-06-28 06:38:16.885 E         - ............-> Table "SALES" as "S3" Access By ID
2025-06-28 06:38:16.885 E         - ................-> Bitmap
2025-06-28 06:38:16.885 E         - ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-28 06:38:16.885 E         - Select Expression
2025-06-28 06:38:16.885 E         - ....-> Filter
2025-06-28 06:38:16.885 E         - ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-28 06:38:16.885 E         - 2000
2025-06-28 06:38:16.885 E         - select c3.cust_no
2025-06-28 06:38:16.885 E         - from customer c3
2025-06-28 06:38:16.885 E         - where exists (
2025-06-28 06:38:16.885 E         - select s3.cust_no
2025-06-28 06:38:16.885 E         - from sales s3
2025-06-28 06:38:16.885 E         - where s3.cust_no = c3.cust_no
2025-06-28 06:38:16.885 E         - group by s3.cust_no
2025-06-28 06:38:16.885 E         - )
2025-06-28 06:38:16.885 E         - A group-by subquery is correlated; in this case, unnesting implies doing join
2025-06-28 06:38:16.885 E         - after group-by. Changing the given order of the two operations may not be always legal.
2025-06-28 06:38:16.885 E         - Sub-query
2025-06-28 06:38:16.886 E         - ....-> Aggregate
2025-06-28 06:38:16.886 E         - ........-> Filter
2025-06-28 06:38:16.886 E         - ............-> Table "SALES" as "S3" Access By ID
2025-06-28 06:38:16.886 E         - ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-28 06:38:16.886 E         - Select Expression
2025-06-28 06:38:16.886 E         - ....-> Filter
2025-06-28 06:38:16.886 E         - ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-28 06:38:16.886 E         - 3000
2025-06-28 06:38:16.886 E         - select s1.cust_no
2025-06-28 06:38:16.886 E         - from sales s1
2025-06-28 06:38:16.886 E         - where exists (
2025-06-28 06:38:16.886 E         - select 1 from customer c1 where s1.cust_no = c1.cust_no
2025-06-28 06:38:16.886 E         - union all
2025-06-28 06:38:16.886 E         - select 1 from employee x1 where s1.sales_rep = x1.emp_no
2025-06-28 06:38:16.886 E         - )
2025-06-28 06:38:16.886 E         - For disjunctive subqueries, the outer columns in the connecting
2025-06-28 06:38:16.886 E         - or correlating conditions are not the same.
2025-06-28 06:38:16.886 E         - Sub-query
2025-06-28 06:38:16.886 E         - ....-> Union
2025-06-28 06:38:16.886 E         - ........-> Filter
2025-06-28 06:38:16.887 E         - ............-> Table "CUSTOMER" as "C1" Access By ID
2025-06-28 06:38:16.887 E         - ................-> Bitmap
2025-06-28 06:38:16.887 E         - ....................-> Index "CUSTOMER_PK" Unique Scan
2025-06-28 06:38:16.887 E         - ........-> Filter
2025-06-28 06:38:16.887 E         - ............-> Table "EMPLOYEE" as "X1" Access By ID
2025-06-28 06:38:16.887 E         - ................-> Bitmap
2025-06-28 06:38:16.887 E         - ....................-> Index "EMPLOYEE_PK" Unique Scan
2025-06-28 06:38:16.887 E         - Select Expression
2025-06-28 06:38:16.887 E         - ....-> Filter
2025-06-28 06:38:16.887 E         - ........-> Table "SALES" as "S1" Full Scan
2025-06-28 06:38:16.887 E         - 4000
2025-06-28 06:38:16.887 E         - select x1.emp_no
2025-06-28 06:38:16.887 E         - from employee x1
2025-06-28 06:38:16.887 E         - where
2025-06-28 06:38:16.887 E         - (
2025-06-28 06:38:16.887 E         - x1.job_country = 'USA' or
2025-06-28 06:38:16.887 E         - exists (
2025-06-28 06:38:16.887 E         - select 1
2025-06-28 06:38:16.887 E         - from sales s1
2025-06-28 06:38:16.887 E         - where s1.sales_rep = x1.emp_no
2025-06-28 06:38:16.888 E         - )
2025-06-28 06:38:16.888 E         - )
2025-06-28 06:38:16.888 E         - An `OR` condition in compound WHERE expression, see https://jonathanlewis.wordpress.com/2007/02/26/subquery-with-or/
2025-06-28 06:38:16.888 E         - Sub-query
2025-06-28 06:38:16.888 E         - ....-> Filter
2025-06-28 06:38:16.888 E         - ........-> Table "SALES" as "S1" Access By ID
2025-06-28 06:38:16.888 E         - ............-> Bitmap
2025-06-28 06:38:16.888 E         - ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
2025-06-28 06:38:16.888 E         - Select Expression
2025-06-28 06:38:16.888 E         - ....-> Filter
2025-06-28 06:38:16.888 E         - ........-> Table "EMPLOYEE" as "X1" Full Scan
2025-06-28 06:38:16.888
2025-06-28 06:38:16.888 tests\bugs\gh_8061_addi_test.py:225: AssertionError
2025-06-28 06:38:16.888 ---------------------------- Captured stdout setup ----------------------------
2025-06-28 06:38:16.888 Creating db: localhost:H:\QA\temp\qa2024.tmp\fbqa\test_11691\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]>
tmp_sql = WindowsPath('H:/QA/temp/qa2024.tmp/fbqa/test_11691/gh_8061.tmp.sql')
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>

    @pytest.mark.version('>=5.0.1')
    def test_1(act: Action, tmp_sql: Path, capsys):
        employee_data_sql = zipfile.Path(act.files_dir / 'standard_sample_databases.zip', at='sample-DB_-_firebird.sql')
        tmp_sql.write_bytes(employee_data_sql.read_bytes())
    
        act.isql(switches = ['-q'], charset='utf8', input_file = tmp_sql, combine_output = True)
    
        if act.return_code == 0:
    
            srv_cfg = driver_config.register_server(name = f'srv_cfg_8061_addi', config = '')
            db_cfg_name = f'db_cfg_8061_addi'
            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:
                cur = con.cursor()
                for q_idx, q_tuple in query_map.items():
                    test_sql, qry_comment = q_tuple[:2]
                    ps = cur.prepare(test_sql)
                    print(q_idx)
                    print(test_sql)
                    print(qry_comment)
                    print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
                    ps.free()
    
        else:
            # If retcode !=0 then we can print the whole output of failed gbak:
            print('Initial script failed, check output:')
            for line in act.clean_stdout.splitlines():
                print(line)
        act.reset()
    
        act.expected_stdout = f"""
            1000
            {query_map[1000][0]}
            {query_map[1000][1]}
            Sub-query
            ....-> Filter
            ........-> Table "EMPLOYEE" as "X" Full Scan
            Sub-query
            ....-> Filter (preliminary)
            ........-> Filter
            ............-> Table "SALES" as "S3" Access By ID
            ................-> Bitmap
            ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
            Select Expression
            ....-> Filter
            ........-> Table "CUSTOMER" as "C3" Full Scan
    
            2000
            {query_map[2000][0]}
            {query_map[2000][1]}
            Sub-query
            ....-> Aggregate
            ........-> Filter
            ............-> Table "SALES" as "S3" Access By ID
            ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
            Select Expression
            ....-> Filter
            ........-> Table "CUSTOMER" as "C3" Full Scan
    
            3000
            {query_map[3000][0]}
            {query_map[3000][1]}
            Sub-query
            ....-> Union
            ........-> Filter
            ............-> Table "CUSTOMER" as "C1" Access By ID
            ................-> Bitmap
            ....................-> Index "CUSTOMER_PK" Unique Scan
            ........-> Filter
            ............-> Table "EMPLOYEE" as "X1" Access By ID
            ................-> Bitmap
            ....................-> Index "EMPLOYEE_PK" Unique Scan
            Select Expression
            ....-> Filter
            ........-> Table "SALES" as "S1" Full Scan
    
            4000
            {query_map[4000][0]}
            {query_map[4000][1]}
            Sub-query
            ....-> Filter
            ........-> Table "SALES" as "S1" Access By ID
            ............-> Bitmap
            ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
            Select Expression
            ....-> Filter
            ........-> Table "EMPLOYEE" as "X1" Full Scan
        """
        act.stdout = capsys.readouterr().out
>       assert act.clean_stdout == act.clean_expected_stdout
E       assert   
E         + Initial script failed, check output:
E         + Statement failed, SQLSTATE = 22021
E         + unsuccessful metadata update
E         + -ALTER CHARACTER SET "SYSTEM"."UTF8" failed
E         + -COLLATION "SYSTEM"."CI_COLL" for CHARACTER SET "SYSTEM"."UTF8" is not defined
E         + After line 8 in file H:\QA\temp\qa2024.tmp\fbqa\test_11691\gh_8061.tmp.sql
E         - 1000
E         - select c3.cust_no
E         - from customer c3
E         - where exists (
E         - select  s3.cust_no
E         - from sales s3
E         - where s3.cust_no = c3.cust_no and
E         - exists (
E         - select x.emp_no
E         - from employee x
E         - where
E         - x.job_country = c3.country
E         - )
E         - )
E         - Subqueries that are correlated to non-parent; for example,
E         - subquery SQ3 is contained by SQ2 (parent of SQ3) and SQ2 in turn is contained
E         - by SQ1 and SQ3 is correlated to tables defined in SQ1.
E         - Sub-query
E         - ....-> Filter
E         - ........-> Table "EMPLOYEE" as "X" Full Scan
E         - Sub-query
E         - ....-> Filter (preliminary)
E         - ........-> Filter
E         - ............-> Table "SALES" as "S3" Access By ID
E         - ................-> Bitmap
E         - ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
E         - Select Expression
E         - ....-> Filter
E         - ........-> Table "CUSTOMER" as "C3" Full Scan
E         - 2000
E         - select c3.cust_no
E         - from customer c3
E         - where exists (
E         - select s3.cust_no
E         - from sales s3
E         - where s3.cust_no = c3.cust_no
E         - group by s3.cust_no
E         - )
E         - A group-by subquery is correlated; in this case, unnesting implies doing join
E         - after group-by. Changing the given order of the two operations may not be always legal.
E         - Sub-query
E         - ....-> Aggregate
E         - ........-> Filter
E         - ............-> Table "SALES" as "S3" Access By ID
E         - ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
E         - Select Expression
E         - ....-> Filter
E         - ........-> Table "CUSTOMER" as "C3" Full Scan
E         - 3000
E         - select s1.cust_no
E         - from sales s1
E         - where exists (
E         - select 1 from customer c1 where s1.cust_no = c1.cust_no
E         - union all
E         - select 1 from employee x1 where s1.sales_rep = x1.emp_no
E         - )
E         - For disjunctive subqueries, the outer columns in the connecting
E         - or correlating conditions are not the same.
E         - Sub-query
E         - ....-> Union
E         - ........-> Filter
E         - ............-> Table "CUSTOMER" as "C1" Access By ID
E         - ................-> Bitmap
E         - ....................-> Index "CUSTOMER_PK" Unique Scan
E         - ........-> Filter
E         - ............-> Table "EMPLOYEE" as "X1" Access By ID
E         - ................-> Bitmap
E         - ....................-> Index "EMPLOYEE_PK" Unique Scan
E         - Select Expression
E         - ....-> Filter
E         - ........-> Table "SALES" as "S1" Full Scan
E         - 4000
E         - select x1.emp_no
E         - from employee x1
E         - where
E         - (
E         - x1.job_country = 'USA' or
E         - exists (
E         - select 1
E         - from sales s1
E         - where s1.sales_rep = x1.emp_no
E         - )
E         - )
E         - An `OR` condition in compound WHERE expression, see https://jonathanlewis.wordpress.com/2007/02/26/subquery-with-or/
E         - Sub-query
E         - ....-> Filter
E         - ........-> Table "SALES" as "S1" Access By ID
E         - ............-> Bitmap
E         - ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
E         - Select Expression
E         - ....-> Filter
E         - ........-> Table "EMPLOYEE" as "X1" Full Scan

tests\bugs\gh_8061_addi_test.py:225: 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 635 438 2025.06.28 03:13:29.240 2025.06.28 03:13:29.875 2025.06.28 01:29:45.011 2025.06.28 01:29:45.449
2 6.0.0.877 2025.06.26 8e38f F F 683 440 2025.06.27 03:12:25.085 2025.06.27 03:12:25.768 2025.06.27 01:29:59.140 2025.06.27 01:29:59.580
3 6.0.0.876 2025.06.25 b1bec F F 660 441 2025.06.26 03:17:43.359 2025.06.26 03:17:44.019 2025.06.26 01:35:37.585 2025.06.26 01:35:38.026
4 6.0.0.863 2025.06.24 c3c20 F F 680 445 2025.06.25 08:01:53.339 2025.06.25 08:01:54.019 2025.06.25 01:29:39.812 2025.06.25 01:29:40.257
5 6.0.0.858 2025.06.24 cbbbf F F 654 438 2025.06.24 17:44:24.888 2025.06.24 17:44:25.542 2025.06.24 16:01:37.630 2025.06.24 16:01:38.068
6 6.0.0.858 2025.06.23 d377c F F 682 440 2025.06.24 08:56:25.868 2025.06.24 08:56:26.550 2025.06.24 07:13:59.697 2025.06.24 07:14:00.137
7 6.0.0.854 2025.06.23 10b58 F F 629 440 2025.06.23 15:37:18.860 2025.06.23 15:37:19.489 2025.06.23 13:53:32.698 2025.06.23 13:53:33.138
8 6.0.0.849 2025.06.20 7b79c F F 625 442 2025.06.21 03:15:38.741 2025.06.21 03:15:39.366 2025.06.21 01:30:12.344 2025.06.21 01:30:12.786
9 6.0.0.848 2025.06.19 c483c F F 706 438 2025.06.20 03:15:16.066 2025.06.20 03:15:16.772 2025.06.20 01:29:57.029 2025.06.20 01:29:57.467
10 6.0.0.845 2025.06.18 20191 F F 637 436 2025.06.19 03:14:53.514 2025.06.19 03:14:54.151 2025.06.19 01:29:43.979 2025.06.19 01:29:44.415
11 6.0.0.843 2025.06.16 995f4 F F 639 440 2025.06.18 03:14:41.438 2025.06.18 03:14:42.077 2025.06.18 01:29:27.274 2025.06.18 01:29:27.714
12 6.0.0.840 2025.06.14 29bca F F 649 439 2025.06.15 03:23:10.754 2025.06.15 03:23:11.403 2025.06.15 01:32:30.444 2025.06.15 01:32:30.883
13 6.0.0.838 2025.06.13 0e28a F F 640 440 2025.06.14 03:20:54.401 2025.06.14 03:20:55.041 2025.06.14 01:30:49.823 2025.06.14 01:30:50.263
14 6.0.0.834 2025.06.11 e889f F F 641 443 2025.06.12 03:18:26.402 2025.06.12 03:18:27.043 2025.06.12 01:31:21.201 2025.06.12 01:31:21.644
15 6.0.0.800 2025.06.10 1f226 P P 898 661 2025.06.11 02:02:32.791 2025.06.11 02:02:33.689 2025.06.11 00:54:08.729 2025.06.11 00:54:09.390
16 6.0.0.799 2025.06.07 be644 P P 892 661 2025.06.10 02:02:08.674 2025.06.10 02:02:09.566 2025.06.10 00:53:45.815 2025.06.10 00:53:46.476
17 6.0.0.797 2025.06.06 303e8 P P 876 662 2025.06.07 02:01:01.055 2025.06.07 02:01:01.931 2025.06.07 00:53:34.281 2025.06.07 00:53:34.943
18 6.0.0.795 2025.05.29 7a71a P P 869 656 2025.06.06 02:00:51.779 2025.06.06 02:00:52.648 2025.06.06 00:53:32.130 2025.06.06 00:53:32.786
19 6.0.0.792 2025.05.28 ee5a8 P P 868 664 2025.05.29 01:59:57.594 2025.05.29 01:59:58.462 2025.05.29 00:53:38.554 2025.05.29 00:53:39.218
20 6.0.0.791 2025.05.27 02db8 P P 895 651 2025.05.28 02:00:26.399 2025.05.28 02:00:27.294 2025.05.28 00:53:21.568 2025.05.28 00:53:22.219
21 6.0.0.789 2025.05.21 64051 P P 910 657 2025.05.25 02:00:09.839 2025.05.25 02:00:10.749 2025.05.25 00:53:46.418 2025.05.25 00:53:47.075
22 6.0.0.787 2025.05.20 230ad P P 886 672 2025.05.21 01:59:05.264 2025.05.21 01:59:06.150 2025.05.21 00:52:56.118 2025.05.21 00:52:56.790
23 6.0.0.783 2025.05.12 37320 P P 928 668 2025.05.19 01:58:52.771 2025.05.19 01:58:53.699 2025.05.19 00:53:03.849 2025.05.19 00:53:04.517
24 6.0.0.779 2025.05.11 136fa P P 937 680 2025.05.12 02:00:59.632 2025.05.12 02:01:00.569 2025.05.12 00:53:40.787 2025.05.12 00:53:41.467
25 6.0.0.778 2025.05.07 d735e P P 916 680 2025.05.11 02:00:24.201 2025.05.11 02:00:25.117 2025.05.11 00:53:54.941 2025.05.11 00:53:55.621
26 6.0.0.776 2025.05.06 007cd P P 860 676 2025.05.07 01:59:38.925 2025.05.07 01:59:39.785 2025.05.07 00:53:31.868 2025.05.07 00:53:32.544
27 6.0.0.770 2025.05.05 82c4a P P 860 669 2025.05.06 01:59:58.145 2025.05.06 01:59:59.005 2025.05.06 00:53:38.048 2025.05.06 00:53:38.717
28 6.0.0.767 2025.05.01 cdd29 P P 875 670 2025.05.02 02:00:33.936 2025.05.02 02:00:34.811 2025.05.02 00:54:29.129 2025.05.02 00:54:29.799
29 6.0.0.762 2025.04.30 5cb15 P P 865 656 2025.05.01 01:59:01.136 2025.05.01 01:59:02.001 2025.05.01 00:53:50.909 2025.05.01 00:53:51.565
30 6.0.0.755 2025.04.29 739c6 P P 862 694 2025.04.30 01:59:14.496 2025.04.30 01:59:15.358 2025.04.30 00:53:33.507 2025.04.30 00:53:34.201
31 6.0.0.753 2025.04.27 29ab3 P P 872 671 2025.04.29 01:59:24.757 2025.04.29 01:59:25.629 2025.04.29 00:53:36.802 2025.04.29 00:53:37.473
32 6.0.0.745 2025.04.21 78ad8 P P 885 686 2025.04.26 02:00:48.819 2025.04.26 02:00:49.704 2025.04.26 00:53:55.504 2025.04.26 00:53:56.190
33 6.0.0.744 2025.04.19 e883a P P 867 667 2025.04.20 02:00:16.317 2025.04.20 02:00:17.184 2025.04.20 00:53:48.548 2025.04.20 00:53:49.215
34 6.0.0.742 2025.04.17 abc3b P P 896 658 2025.04.19 01:59:43.745 2025.04.19 01:59:44.641 2025.04.19 00:53:23.738 2025.04.19 00:53:24.396

Elapsed time, ms. Chart for last 34 runs:

Last commits information (all timestamps in UTC):