◐ Shell
clean mode source ↗

Bad results for failing standalone expectations on compound data

Describe the bug
When running standalone expectations in a single session and having more than one failing expectation, the results returned by report are wrong.
This is probably also observable in regular run,when running more than one cursor/object comparison in single test.

Provide version info
utPLSQL v3.1.8

To Reproduce

clear screen
set serverout on
declare
  l_actual   sys_refcursor;
  l_expected sys_refcursor;
begin
  open l_actual   for select rownum rn from dual connect by level < 5;
  open l_expected for select rownum rn from dual connect by level = 1;
  ut.expect(l_actual).to_equal(l_expected);
  open l_actual   for select rownum rn from dual connect by level < 3;
  open l_expected for select * from (select rownum rn from dual connect by level < 3) order by 1 desc;
  ut.expect(l_actual).to_equal(l_expected);
end;
/
rollback;

This produces output:

FAILURE
  Actual: refcursor [ count = 4 ] was expected to equal: refcursor [ count = 1 ]
  Diff:
  Rows: [ 3 differences ]
    Row No. 2 - Extra:    <RN>2</RN>
    Row No. 3 - Extra:    <RN>3</RN>
    Row No. 4 - Extra:    <RN>4</RN>
  at "anonymous block", line 7
FAILURE
  Actual: refcursor [ count = 2 ] was expected to equal: refcursor [ count = 2 ]
  Diff:
  Rows: [ 2 differences ]
    Row No. 1 - Actual:   <RN>1</RN>
    Row No. 1 - Expected: <RN>2</RN>
    Row No. 2 - Actual:   <RN>2</RN>
    Row No. 2 - Expected: <RN>1</RN>
    Row No. 2 - Extra:    <RN>2</RN>
    Row No. 3 - Extra:    <RN>3</RN>
    Row No. 4 - Extra:    <RN>4</RN>
  at "anonymous block", line 10

However adding a commit or rollback in between expectations fixes the issue.

clear screen
set serverout on
declare
  l_actual   sys_refcursor;
  l_expected sys_refcursor;
begin
  open l_actual   for select rownum rn from dual connect by level < 5;
  open l_expected for select rownum rn from dual connect by level = 1;
  ut.expect(l_actual).to_equal(l_expected);
  rollback;
  open l_actual   for select rownum rn from dual connect by level < 3;
  open l_expected for select * from (select rownum rn from dual connect by level < 3) order by 1 desc;
  ut.expect(l_actual).to_equal(l_expected);
end;
/
rollback;
FAILURE
  Actual: refcursor [ count = 4 ] was expected to equal: refcursor [ count = 1 ]
  Diff:
  Rows: [ 3 differences ]
    Row No. 2 - Extra:    <RN>2</RN>
    Row No. 3 - Extra:    <RN>3</RN>
    Row No. 4 - Extra:    <RN>4</RN>
  at "anonymous block", line 7
FAILURE
  Actual: refcursor [ count = 2 ] was expected to equal: refcursor [ count = 2 ]
  Diff:
  Rows: [ 2 differences ]
    Row No. 1 - Actual:   <RN>1</RN>
    Row No. 1 - Expected: <RN>2</RN>
    Row No. 2 - Actual:   <RN>2</RN>
    Row No. 2 - Expected: <RN>1</RN>
  at "anonymous block", line 11

Expected behavior
Diff reports should always provide valid outputs.

To fix this, we can delete the diff table as part of diff cleanup.