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 16 in file /var/tmp/qa_2024/test_11665/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-26 05:22:06.181
2025-06-26 05:22:06.186 act = <firebird.qa.plugin.Action object at [hex]>
2025-06-26 05:22:06.192 tmp_sql = PosixPath('/var/tmp/qa_2024/test_11665/gh_8061.tmp.sql')
2025-06-26 05:22:06.199 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-26 05:22:06.207
2025-06-26 05:22:06.219 @pytest.mark.version('>=5.0.1')
2025-06-26 05:22:06.228 def test_1(act: Action, tmp_sql: Path, capsys):
2025-06-26 05:22:06.235 employee_data_sql = zipfile.Path(act.files_dir / 'standard_sample_databases.zip', at='sample-DB_-_firebird.sql')
2025-06-26 05:22:06.245 tmp_sql.write_bytes(employee_data_sql.read_bytes())
2025-06-26 05:22:06.254
2025-06-26 05:22:06.262 act.isql(switches = ['-q'], charset='utf8', input_file = tmp_sql, combine_output = True)
2025-06-26 05:22:06.273
2025-06-26 05:22:06.281 if act.return_code == 0:
2025-06-26 05:22:06.293
2025-06-26 05:22:06.304 srv_cfg = driver_config.register_server(name = f'srv_cfg_8061_addi', config = '')
2025-06-26 05:22:06.313 db_cfg_name = f'db_cfg_8061_addi'
2025-06-26 05:22:06.320 db_cfg_object = driver_config.register_database(name = db_cfg_name)
2025-06-26 05:22:06.328 db_cfg_object.server.value = srv_cfg.name
2025-06-26 05:22:06.335 db_cfg_object.database.value = str(act.db.db_path)
2025-06-26 05:22:06.345 if act.is_version('<6'):
2025-06-26 05:22:06.353 db_cfg_object.config.value = f"""
2025-06-26 05:22:06.365 SubQueryConversion = true
2025-06-26 05:22:06.376 """
2025-06-26 05:22:06.384
2025-06-26 05:22:06.390 with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con:
2025-06-26 05:22:06.398 cur = con.cursor()
2025-06-26 05:22:06.405 for q_idx, q_tuple in query_map.items():
2025-06-26 05:22:06.411 test_sql, qry_comment = q_tuple[:2]
2025-06-26 05:22:06.416 ps = cur.prepare(test_sql)
2025-06-26 05:22:06.423 print(q_idx)
2025-06-26 05:22:06.433 print(test_sql)
2025-06-26 05:22:06.441 print(qry_comment)
2025-06-26 05:22:06.452 print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
2025-06-26 05:22:06.461 ps.free()
2025-06-26 05:22:06.468
2025-06-26 05:22:06.473 else:
2025-06-26 05:22:06.478 # If retcode !=0 then we can print the whole output of failed gbak:
2025-06-26 05:22:06.483 print('Initial script failed, check output:')
2025-06-26 05:22:06.488 for line in act.clean_stdout.splitlines():
2025-06-26 05:22:06.492 print(line)
2025-06-26 05:22:06.497 act.reset()
2025-06-26 05:22:06.502
2025-06-26 05:22:06.507 act.expected_stdout = f"""
2025-06-26 05:22:06.514 1000
2025-06-26 05:22:06.525 {query_map[1000][0]}
2025-06-26 05:22:06.533 {query_map[1000][1]}
2025-06-26 05:22:06.540 Sub-query
2025-06-26 05:22:06.547 ....-> Filter
2025-06-26 05:22:06.554 ........-> Table "EMPLOYEE" as "X" Full Scan
2025-06-26 05:22:06.562 Sub-query
2025-06-26 05:22:06.568 ....-> Filter (preliminary)
2025-06-26 05:22:06.573 ........-> Filter
2025-06-26 05:22:06.579 ............-> Table "SALES" as "S3" Access By ID
2025-06-26 05:22:06.588 ................-> Bitmap
2025-06-26 05:22:06.594 ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-26 05:22:06.600 Select Expression
2025-06-26 05:22:06.605 ....-> Filter
2025-06-26 05:22:06.611 ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-26 05:22:06.617
2025-06-26 05:22:06.622 2000
2025-06-26 05:22:06.628 {query_map[2000][0]}
2025-06-26 05:22:06.635 {query_map[2000][1]}
2025-06-26 05:22:06.643 Sub-query
2025-06-26 05:22:06.655 ....-> Aggregate
2025-06-26 05:22:06.661 ........-> Filter
2025-06-26 05:22:06.673 ............-> Table "SALES" as "S3" Access By ID
2025-06-26 05:22:06.681 ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-26 05:22:06.689 Select Expression
2025-06-26 05:22:06.695 ....-> Filter
2025-06-26 05:22:06.702 ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-26 05:22:06.707
2025-06-26 05:22:06.713 3000
2025-06-26 05:22:06.719 {query_map[3000][0]}
2025-06-26 05:22:06.724 {query_map[3000][1]}
2025-06-26 05:22:06.730 Sub-query
2025-06-26 05:22:06.737 ....-> Union
2025-06-26 05:22:06.748 ........-> Filter
2025-06-26 05:22:06.757 ............-> Table "CUSTOMER" as "C1" Access By ID
2025-06-26 05:22:06.769 ................-> Bitmap
2025-06-26 05:22:06.779 ....................-> Index "CUSTOMER_PK" Unique Scan
2025-06-26 05:22:06.788 ........-> Filter
2025-06-26 05:22:06.795 ............-> Table "EMPLOYEE" as "X1" Access By ID
2025-06-26 05:22:06.802 ................-> Bitmap
2025-06-26 05:22:06.812 ....................-> Index "EMPLOYEE_PK" Unique Scan
2025-06-26 05:22:06.820 Select Expression
2025-06-26 05:22:06.828 ....-> Filter
2025-06-26 05:22:06.834 ........-> Table "SALES" as "S1" Full Scan
2025-06-26 05:22:06.844
2025-06-26 05:22:06.854 4000
2025-06-26 05:22:06.864 {query_map[4000][0]}
2025-06-26 05:22:06.872 {query_map[4000][1]}
2025-06-26 05:22:06.878 Sub-query
2025-06-26 05:22:06.884 ....-> Filter
2025-06-26 05:22:06.889 ........-> Table "SALES" as "S1" Access By ID
2025-06-26 05:22:06.895 ............-> Bitmap
2025-06-26 05:22:06.901 ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
2025-06-26 05:22:06.907 Select Expression
2025-06-26 05:22:06.915 ....-> Filter
2025-06-26 05:22:06.921 ........-> Table "EMPLOYEE" as "X1" Full Scan
2025-06-26 05:22:06.927 """
2025-06-26 05:22:06.933 act.stdout = capsys.readouterr().out
2025-06-26 05:22:06.939 > assert act.clean_stdout == act.clean_expected_stdout
2025-06-26 05:22:06.944 E assert
2025-06-26 05:22:06.950 E + Initial script failed, check output:
2025-06-26 05:22:06.956 E + Statement failed, SQLSTATE = 22021
2025-06-26 05:22:06.963 E + unsuccessful metadata update
2025-06-26 05:22:06.971 E + -ALTER CHARACTER SET "SYSTEM"."UTF8" failed
2025-06-26 05:22:06.984 E + -COLLATION "SYSTEM"."CI_COLL" for CHARACTER SET "SYSTEM"."UTF8" is not defined
2025-06-26 05:22:06.995 E + After line 16 in file /var/tmp/qa_2024/test_11665/gh_8061.tmp.sql
2025-06-26 05:22:07.003 E - 1000
2025-06-26 05:22:07.010 E - select c3.cust_no
2025-06-26 05:22:07.019 E - from customer c3
2025-06-26 05:22:07.029 E - where exists (
2025-06-26 05:22:07.041 E - select s3.cust_no
2025-06-26 05:22:07.052 E - from sales s3
2025-06-26 05:22:07.061 E - where s3.cust_no = c3.cust_no and
2025-06-26 05:22:07.069 E - exists (
2025-06-26 05:22:07.075 E - select x.emp_no
2025-06-26 05:22:07.081 E - from employee x
2025-06-26 05:22:07.086 E - where
2025-06-26 05:22:07.098 E - x.job_country = c3.country
2025-06-26 05:22:07.106 E - )
2025-06-26 05:22:07.113 E - )
2025-06-26 05:22:07.118 E - Subqueries that are correlated to non-parent; for example,
2025-06-26 05:22:07.124 E - subquery SQ3 is contained by SQ2 (parent of SQ3) and SQ2 in turn is contained
2025-06-26 05:22:07.131 E - by SQ1 and SQ3 is correlated to tables defined in SQ1.
2025-06-26 05:22:07.142 E - Sub-query
2025-06-26 05:22:07.150 E - ....-> Filter
2025-06-26 05:22:07.156 E - ........-> Table "EMPLOYEE" as "X" Full Scan
2025-06-26 05:22:07.162 E - Sub-query
2025-06-26 05:22:07.173 E - ....-> Filter (preliminary)
2025-06-26 05:22:07.182 E - ........-> Filter
2025-06-26 05:22:07.194 E - ............-> Table "SALES" as "S3" Access By ID
2025-06-26 05:22:07.206 E - ................-> Bitmap
2025-06-26 05:22:07.218 E - ....................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-26 05:22:07.226 E - Select Expression
2025-06-26 05:22:07.233 E - ....-> Filter
2025-06-26 05:22:07.238 E - ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-26 05:22:07.250 E - 2000
2025-06-26 05:22:07.261 E - select c3.cust_no
2025-06-26 05:22:07.272 E - from customer c3
2025-06-26 05:22:07.283 E - where exists (
2025-06-26 05:22:07.290 E - select s3.cust_no
2025-06-26 05:22:07.297 E - from sales s3
2025-06-26 05:22:07.304 E - where s3.cust_no = c3.cust_no
2025-06-26 05:22:07.310 E - group by s3.cust_no
2025-06-26 05:22:07.316 E - )
2025-06-26 05:22:07.321 E - A group-by subquery is correlated; in this case, unnesting implies doing join
2025-06-26 05:22:07.328 E - after group-by. Changing the given order of the two operations may not be always legal.
2025-06-26 05:22:07.334 E - Sub-query
2025-06-26 05:22:07.340 E - ....-> Aggregate
2025-06-26 05:22:07.346 E - ........-> Filter
2025-06-26 05:22:07.351 E - ............-> Table "SALES" as "S3" Access By ID
2025-06-26 05:22:07.355 E - ................-> Index "SALES_CUSTOMER_FK_CUST_NO" Range Scan (full match)
2025-06-26 05:22:07.359 E - Select Expression
2025-06-26 05:22:07.364 E - ....-> Filter
2025-06-26 05:22:07.368 E - ........-> Table "CUSTOMER" as "C3" Full Scan
2025-06-26 05:22:07.373 E - 3000
2025-06-26 05:22:07.378 E - select s1.cust_no
2025-06-26 05:22:07.382 E - from sales s1
2025-06-26 05:22:07.388 E - where exists (
2025-06-26 05:22:07.393 E - select 1 from customer c1 where s1.cust_no = c1.cust_no
2025-06-26 05:22:07.399 E - union all
2025-06-26 05:22:07.404 E - select 1 from employee x1 where s1.sales_rep = x1.emp_no
2025-06-26 05:22:07.410 E - )
2025-06-26 05:22:07.416 E - For disjunctive subqueries, the outer columns in the connecting
2025-06-26 05:22:07.422 E - or correlating conditions are not the same.
2025-06-26 05:22:07.432 E - Sub-query
2025-06-26 05:22:07.440 E - ....-> Union
2025-06-26 05:22:07.447 E - ........-> Filter
2025-06-26 05:22:07.454 E - ............-> Table "CUSTOMER" as "C1" Access By ID
2025-06-26 05:22:07.460 E - ................-> Bitmap
2025-06-26 05:22:07.466 E - ....................-> Index "CUSTOMER_PK" Unique Scan
2025-06-26 05:22:07.473 E - ........-> Filter
2025-06-26 05:22:07.480 E - ............-> Table "EMPLOYEE" as "X1" Access By ID
2025-06-26 05:22:07.486 E - ................-> Bitmap
2025-06-26 05:22:07.493 E - ....................-> Index "EMPLOYEE_PK" Unique Scan
2025-06-26 05:22:07.498 E - Select Expression
2025-06-26 05:22:07.503 E - ....-> Filter
2025-06-26 05:22:07.509 E - ........-> Table "SALES" as "S1" Full Scan
2025-06-26 05:22:07.514 E - 4000
2025-06-26 05:22:07.524 E - select x1.emp_no
2025-06-26 05:22:07.533 E - from employee x1
2025-06-26 05:22:07.540 E - where
2025-06-26 05:22:07.546 E - (
2025-06-26 05:22:07.553 E - x1.job_country = 'USA' or
2025-06-26 05:22:07.558 E - exists (
2025-06-26 05:22:07.569 E - select 1
2025-06-26 05:22:07.577 E - from sales s1
2025-06-26 05:22:07.584 E - where s1.sales_rep = x1.emp_no
2025-06-26 05:22:07.590 E - )
2025-06-26 05:22:07.599 E - )
2025-06-26 05:22:07.608 E - An `OR` condition in compound WHERE expression, see https://jonathanlewis.wordpress.com/2007/02/26/subquery-with-or/
2025-06-26 05:22:07.617 E - Sub-query
2025-06-26 05:22:07.623 E - ....-> Filter
2025-06-26 05:22:07.629 E - ........-> Table "SALES" as "S1" Access By ID
2025-06-26 05:22:07.634 E - ............-> Bitmap
2025-06-26 05:22:07.641 E - ................-> Index "SALES_EMPLOYEE_FK_SALES_REP" Range Scan (full match)
2025-06-26 05:22:07.647 E - Select Expression
2025-06-26 05:22:07.655 E - ....-> Filter
2025-06-26 05:22:07.667 E - ........-> Table "EMPLOYEE" as "X1" Full Scan
2025-06-26 05:22:07.676
2025-06-26 05:22:07.682 tests/bugs/gh_8061_addi_test.py:225: AssertionError
2025-06-26 05:22:07.691 ---------------------------- Captured stdout setup -----------------------------
2025-06-26 05:22:07.699 Creating db: localhost:/var/tmp/qa_2024/test_11665/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 = PosixPath('/var/tmp/qa_2024/test_11665/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 16 in file /var/tmp/qa_2024/test_11665/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
|