Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
42d8d45
Initial check in
lwasylow Oct 6, 2018
2360ca4
First working stab. No messages defined.
lwasylow Oct 6, 2018
dd63970
Include matcher
lwasylow Oct 6, 2018
81240fb
Updated install and deinstall
lwasylow Oct 6, 2018
440670b
Update install
lwasylow Oct 10, 2018
a0ee195
Added tests for include
lwasylow Oct 11, 2018
314b998
Added test for to_contain
lwasylow Oct 11, 2018
6193ff3
Adding negated matcher
lwasylow Oct 11, 2018
f798e39
Added tests and negated code
lwasylow Oct 14, 2018
86276ec
Fixing test dependency on NLS settings.
jgebal Oct 19, 2018
7b037d4
Adding fix to avoid running sonar-scanner on external pull-requests.
jgebal Oct 19, 2018
b2f1b96
Updated project version after build [skip ci]
Oct 19, 2018
80ea7d7
Change CLI version to 3.1.0.
PhilippSalvisberg Oct 19, 2018
3d3a2e8
ignore temporary files created by actions described in CONTRIBUTING.md
PhilippSalvisberg Oct 19, 2018
7170cda
Updated project version after build [skip ci]
Oct 19, 2018
59b1ead
fix to unordered.
lwasylow Oct 20, 2018
4d2a890
Updated project version after build [skip ci]
Oct 20, 2018
29e1bf7
Moving uninstall tests to child job no 2 - (12.1) as it is now fastes…
jgebal Oct 20, 2018
45448ac
Disabling compilation with PLSQL compiler warnings.
jgebal Oct 21, 2018
add5ed8
Updated project version after build [skip ci]
Oct 21, 2018
f39b96a
Update not to include
lwasylow Oct 21, 2018
9557daa
Merge branch 'develop' of github.com:utPLSQL/utPLSQL into feature/mat…
lwasylow Oct 21, 2018
5aa19ea
Update some of the format
lwasylow Oct 21, 2018
03ad5ec
Update documentation
lwasylow Oct 27, 2018
18d89f6
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Nov 1, 2018
74c3648
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Nov 1, 2018
42563e9
Update documentation and added additional test.
lwasylow Nov 1, 2018
3e685e8
Merge branch 'feature/matcher_include' of https://github.com/utPLSQL/…
lwasylow Nov 1, 2018
2a133a1
Fix to issue #770 when the merge statement is run via current user wh…
lwasylow Oct 27, 2018
68d43d6
Added test for min user test
lwasylow Oct 28, 2018
afe9e2c
Update sqlcl download
lwasylow Oct 28, 2018
12edb2a
Squashed commit of the following:
lwasylow Nov 1, 2018
9dbb4e5
Update run test shell.
lwasylow Nov 1, 2018
8752509
Update shell
lwasylow Nov 1, 2018
4138d25
Added extra test for duplicate.
lwasylow Nov 1, 2018
8388276
First stab
lwasylow Nov 3, 2018
9741948
Added belt and braces for big cartesian
lwasylow Nov 4, 2018
be55366
Inserting only first max display rows
lwasylow Nov 5, 2018
ae3d34f
Remove clob transformation
lwasylow Nov 5, 2018
b4113fd
Check in progress of working version.
lwasylow Nov 6, 2018
816a1c1
Beautify sql generation
lwasylow Nov 6, 2018
e5de7d2
Tidy up
lwasylow Nov 6, 2018
9843e14
Code updates for pure sql
lwasylow Nov 8, 2018
ab593d9
Update code to consolidate compare sqls into one place where is gener…
lwasylow Nov 9, 2018
4d3dadc
Update for 11g where error about inline with was raised.
lwasylow Nov 9, 2018
d9ccc83
Fix to sql diff to resolve 11g optimizer rewrite error
lwasylow Nov 9, 2018
c009a86
Update code to bring all code into one place.
lwasylow Nov 10, 2018
ecaf48a
Add some bigger tests
lwasylow Nov 10, 2018
af8b49a
Update rownumber generated
lwasylow Nov 11, 2018
c633ff5
Update code with bug fixes
lwasylow Nov 11, 2018
ee7bdf2
Update order
lwasylow Nov 11, 2018
5b46ab0
Updated code for tests.
lwasylow Nov 12, 2018
c997616
Added cursor info code
lwasylow Nov 13, 2018
2b9d4f3
Capture cursor info and filter it out
lwasylow Nov 15, 2018
fc905ac
Saving progress
lwasylow Nov 16, 2018
107a30b
Updated progress by capturing a nested types in hierarchy structured …
lwasylow Nov 17, 2018
6726f1a
Saving progress
lwasylow Nov 18, 2018
e4043b5
Updates to include nested an collections
lwasylow Nov 19, 2018
6cb5fe7
Further deprecation of Xpath
lwasylow Nov 20, 2018
1356f39
Update to cursor comparision
lwasylow Nov 20, 2018
b094911
Update tests
lwasylow Nov 21, 2018
21dca2b
Resolve issue with nested table being join
lwasylow Nov 21, 2018
6e034bf
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Nov 21, 2018
9dc266e
Update test to be more generic
lwasylow Nov 21, 2018
d96d602
remove schema quantifier
lwasylow Nov 21, 2018
2b90c4b
remove schema quantifier
lwasylow Nov 21, 2018
416df70
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Nov 24, 2018
3759e90
Phase 2. Removal of x path and clean-up deprecated code
lwasylow Nov 26, 2018
35d200c
Merge branch 'develop' of https://github.com/utPLSQL/utPLSQL into fea…
lwasylow Nov 26, 2018
29fe2e1
Update stylecheck
lwasylow Nov 26, 2018
1c0582b
Update test time exec
lwasylow Nov 26, 2018
7837eb4
Anydata refactoring.
lwasylow Nov 28, 2018
e082b75
Improvements to extraction of cursor details using anydata to allow g…
lwasylow Dec 1, 2018
815deac
Updates to documentation
lwasylow Dec 2, 2018
cf0c592
Sorting out some duplicate code.
lwasylow Dec 2, 2018
c156852
Cleanup of code
lwasylow Dec 2, 2018
d8525d6
Change behaviour to compare columns regardless of column position in …
lwasylow Dec 2, 2018
48ad81e
Small fixes and updates regarding peer review.
lwasylow Dec 7, 2018
3ff1e27
Updated paths to venn diagram images
jgebal Dec 9, 2018
69da762
Fixed formatting of examples.
jgebal Dec 9, 2018
8697cea
Added missing synonyms for new matchers `contain / include`
jgebal Dec 9, 2018
1645445
Formatting fixes.
jgebal Dec 9, 2018
62c12cd
Removed unused variables.
jgebal Dec 9, 2018
ca9f8eb
Formatting fixes.
jgebal Dec 9, 2018
004b537
Refactoring recursive calls for resolving complex types in cursor.
jgebal Dec 10, 2018
ada957d
Fixed exception handling on `anytype.getpersistent`
jgebal Dec 10, 2018
2ff110d
Change cursor behaviour to be ordered columns by default.
lwasylow Dec 11, 2018
bd54710
Adding short-name for unordered columns option UC.
lwasylow Dec 11, 2018
6f830dc
Minor formatting and warnings fixed
jgebal Dec 12, 2018
a67b853
Merge branch 'develop' into feature/pure_sql
lwasylow Dec 12, 2018
45643e0
Tidy up code
lwasylow Dec 13, 2018
1e71c99
Adding a new expectation type to specialize unordered_columns only to…
lwasylow Dec 13, 2018
470bb32
A bit of code cleanup
jgebal Jan 3, 2019
b64443d
Fixed cleanup issues.
jgebal Jan 4, 2019
c2d52ae
resolved sonar violations
jgebal Jan 5, 2019
0c994a4
Merge branch 'develop' into feature/pure_sql
jgebal Jan 5, 2019
fab120e
Merge branch 'develop' into feature/pure_sql
jgebal Jan 12, 2019
4663e3b
Merge branch 'develop' into feature/pure_sql
jgebal Jan 13, 2019
9ddc332
Merge branch 'develop' into feature/pure_sql
jgebal Jan 31, 2019
b4483a7
Merge remote-tracking branch 'origin/develop' into feature/pure_sql
jgebal Feb 4, 2019
62e5d80
Fixed doc link
jgebal Feb 4, 2019
d7a2711
Fixed issue with spaces in column lists.
jgebal Feb 5, 2019
97cd079
Improved documentation for `unordered` and `unordered_columns` options.
jgebal Feb 12, 2019
94e58a0
Refactoring - to be continued.
jgebal Feb 14, 2019
08ed9ab
Refactoring - to be continued.
jgebal Feb 15, 2019
90aca9f
Refactoring - to be continued.
jgebal Feb 15, 2019
24c14f9
Refactoring - to be continued.
jgebal Feb 16, 2019
f850428
Fixed issue with DBMS_LOB.COMPARE when empty XML produced.
jgebal Feb 16, 2019
917828c
Refactoring.
jgebal Feb 17, 2019
80563f8
Refactoring.
jgebal Feb 19, 2019
faf3d12
Rework dynamic sql generation to more readible format.
lwasylow Feb 22, 2019
6306af6
Rework dynamic sql generation to more readible format.
lwasylow Feb 22, 2019
daa8ec3
fixing issue with order of data.
lwasylow Feb 23, 2019
ab55d12
fixing issue with order of data.
lwasylow Feb 23, 2019
7676a9a
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Feb 23, 2019
dd7e868
Renamed `ut_include` to `ut_contain`.
jgebal Feb 24, 2019
9fccd1d
Wrapping up anydata into cursor
lwasylow Feb 23, 2019
6421ec8
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Feb 24, 2019
061895a
Wrapping up anydata into cursor
lwasylow Feb 24, 2019
7bb5533
Fixing issue with null object and counts
lwasylow Feb 26, 2019
147a506
Fixing issues with null and empty objects / collections
lwasylow Mar 1, 2019
5dd4d42
Shorter tests names and removal of unused types files.
lwasylow Mar 2, 2019
01e93e7
Wrapping in the quota column name in cursor as it uses a type value w…
lwasylow Mar 2, 2019
2c8cd32
Fixing issue with refcursor in anydata.
lwasylow Mar 4, 2019
bbb9020
Adding cursor closure
lwasylow Mar 4, 2019
09b43da
Adding in out
lwasylow Mar 4, 2019
9961dbc
Testing fix for issue with cursors
lwasylow Mar 5, 2019
2534c96
fixing cursor issue
lwasylow Mar 5, 2019
dea6d3c
Refactoring.
lwasylow Mar 5, 2019
bf4a25a
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Mar 6, 2019
e32d700
Refactoring
lwasylow Mar 6, 2019
2dab607
Merge branch 'develop' into feature/pure_sql
lwasylow Mar 6, 2019
5c1ef69
Update sonar sh
lwasylow Mar 6, 2019
b91ea69
Fixing SONAR errors
lwasylow Mar 6, 2019
e8e5772
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Mar 6, 2019
7a77a7f
small improvments
lwasylow Mar 8, 2019
cfada15
Remove tests as its not replicating issue
lwasylow Mar 8, 2019
b823922
Merge branch 'develop' into feature/pure_sql
jgebal Mar 8, 2019
c583319
Adding extra tests for collection with join_by and unordered
lwasylow Mar 12, 2019
46fb8ff
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Mar 12, 2019
3aa872b
Updated docs/userguide/advanced_data_comparison.md
lwasylow Mar 12, 2019
3e4e1a8
Fixing a conversion of date when extracting XML DATE,TS, TS_TZ,TS_LTS…
lwasylow Mar 14, 2019
898bec2
Fixed support for different DATE NLS settings.
jgebal Mar 15, 2019
6590735
Merge remote-tracking branch 'origin/develop' into feature/pure_sql
jgebal Mar 15, 2019
05adfa2
Moving expectations for compound into single type and removing expect…
lwasylow Mar 15, 2019
ca64da8
Merge branch 'feature/pure_sql' of https://github.com/utPLSQL/utPLSQL…
lwasylow Mar 15, 2019
10a6bf7
Update docs
lwasylow Mar 15, 2019
76c068e
Merge branch 'develop' into feature/pure_sql
lwasylow Mar 15, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Change behaviour to compare columns regardless of column position in …
…ref cursor.
  • Loading branch information
lwasylow committed Dec 3, 2018
commit d8525d60c8bb94ef1a1ad2a11d274078a5035e3f
29 changes: 26 additions & 3 deletions docs/userguide/expectations.md
Original file line number Diff line number Diff line change
Expand Up @@ -680,13 +680,36 @@ utPLSQL is capable of comparing compound data-types including:

### Notes on comparison of compound data
- Compound data can contain elements of any data-type. This includes blob, clob, object type, nested table, varray or even a nested-cursor within a cursor.
- Cursors, nested table and varray types are compared as **ordered lists of elements**. If order of elements differ, expectation will fail.

- Nested table and varray types are compared as **ordered lists of elements**. If order of elements differ, expectation will fail.
Comment thread
lwasylow marked this conversation as resolved.
Outdated

- Cursors are compared as **unordered list of elements** by default. If order of elements is of importance the option has to be passed to enforce column order comparison `ordered_columns` e.g.
Comment thread
lwasylow marked this conversation as resolved.
Outdated

```sql
procedure ut_refcursors1 is
l_actual sys_refcursor;
l_expected sys_refcursor;
l_expected_message varchar2(32767);
l_actual_message varchar2(32767);
begin
open l_actual for select 1 user_id,'s' a_col,'test' username from dual;
open l_expected for select 'test' username,'s' a_col,1 user_id from dual;
--Act
ut3.ut.expect(l_actual).to_equal(l_expected).join_by('USER_ID').ordered_columns;
end;
```

- Comparison of compound data is data-type aware. So a column `ID NUMBER` in a cursor is not the same as `ID VARCHAR2(100)`, even if they both hold the same numeric values.

- Comparison of cursor columns containing `DATE` will only compare date part **and ignore time** by default. See [Comparing cursor data containing DATE fields](#comparing-cursor-data-containing-date-fields) to check how to enable date-time comparison in cursors.

- Comparison of cursor returning `TIMESTAMP` **columns** against cursor returning `TIMESTAMP` **bind variables** requires variables to be casted to proper precision. This is an Oracle SQL - PLSQL compatibility issue and usage of CAST is the only known workaround for now.
See [Comparing cursor data containing TIMESTAMP bind variables](#comparing-cursor-data-containing-timestamp-bind-variables) for examples.
See [Comparing cursor data containing TIMESTAMP bind variables](#comparing-cursor-data-containing-timestamp-bind-variables) for examples.

- To compare nested table/varray type you need to convert it to `anydata` by using `anydata.convertCollection()`

- To compare object type you need to convert it to `anydata` by using `anydata.convertObject()`

- It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and TABLE operator in SQL query
- On Oracle 11g Release 2 - pipelined table functions are needed (see section [Implicit (Shadow) Types in this artcile](https://oracle-base.com/articles/misc/pipelined-table-functions))
- On Oracle 12c and above - use [TABLE function on nested tables/varrays/associative arrays of PL/SQL records](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1)
Expand Down Expand Up @@ -768,7 +791,7 @@ create or replace package body test_cursor_compare as
from dual union all
select 'M' AS GENDER, 'LUKE' as FIRST_NAME, 'SKYWALKER' AS LAST_NAME, 2 as ID, '1000' AS SALARY
from dual;
ut.expect(l_actual).to_equal(l_expected);
ut.expect(l_actual).to_equal(l_expected).ordered_columns;
end;
end;
/
Expand Down
91 changes: 76 additions & 15 deletions source/expectations/data_values/ut_compound_data_helper.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ create or replace package body ut_compound_data_helper is
end if;
return l_filter;
end;

function get_columns_diff(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab)
function get_columns_diff_ordered(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab)
return tt_column_diffs is
l_column_filter varchar2(32767);
l_sql varchar2(32767);
Expand Down Expand Up @@ -88,6 +88,53 @@ create or replace package body ut_compound_data_helper is
return l_results;
end;

function get_columns_diff_unordered(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab)
return tt_column_diffs is
l_column_filter varchar2(32767);
l_sql varchar2(32767);
l_results tt_column_diffs;
begin
with
expected_cols as
(select access_path exp_column_name,column_position exp_col_pos,
replace(column_type,'VARCHAR2','CHAR') exp_col_type_compare, column_type exp_col_type
from table(a_expected)),
actual_cols as
(select access_path act_column_name,column_position act_col_pos,
replace(column_type,'VARCHAR2','CHAR') act_col_type_compare, column_type act_col_type
from table(a_actual)),
joined_cols as
(select e.*,a.*
from expected_cols e
full outer join actual_cols a on e.exp_column_name = a.act_column_name)
select case
when exp_col_pos is null and act_col_pos is not null then '+'
when exp_col_pos is not null and act_col_pos is null then '-'
when exp_col_type_compare != act_col_type_compare then 't'
else 'p'
end as diff_type,
exp_column_name, exp_col_type, exp_col_pos,
act_column_name, act_col_type, act_col_pos
bulk collect into l_results
from joined_cols
--column is unexpected (extra) or missing
where act_col_pos is null or exp_col_pos is null
--column type is not matching (except CHAR/VARCHAR2)
or act_col_type_compare != exp_col_type_compare
order by exp_col_pos, act_col_pos;
return l_results;
end;

function get_columns_diff(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab,a_order_enforced boolean := false)
return tt_column_diffs is
begin
if a_order_enforced then
return get_columns_diff_ordered(a_expected,a_actual);
else
return get_columns_diff_unordered(a_expected,a_actual);
end if;
end;

function get_pk_value (a_join_by_xpath varchar2,a_item_data xmltype) return clob is
l_pk_value clob;
begin
Expand Down Expand Up @@ -218,10 +265,10 @@ create or replace package body ut_compound_data_helper is
ut_utils.append_to_clob(a_sql_stmt, l_sql_stmt);
end;

procedure gen_sql_pieces_out_of_cursor(a_data_info ut_data_value_refcursor,a_pk_table ut_varchar2_list, a_xml_stmt out nocopy clob,
procedure gen_sql_pieces_out_of_cursor(a_data_info ut_cursor_column_tab,a_pk_table ut_varchar2_list, a_xml_stmt out nocopy clob,
a_select_stmt out nocopy clob ,a_partition_stmt out nocopy clob, a_equal_stmt out nocopy clob, a_join_by_stmt out nocopy clob,
a_not_equal_stmt out nocopy clob) is
l_cursor_info ut_cursor_column_tab := a_data_info.cursor_details.cursor_info;
l_cursor_info ut_cursor_column_tab := a_data_info;
l_partition_tmp clob;
l_col_name varchar2(100);
begin
Expand Down Expand Up @@ -305,7 +352,7 @@ create or replace package body ut_compound_data_helper is

begin
dbms_lob.createtemporary(l_compare_sql, true);
gen_sql_pieces_out_of_cursor(a_other, a_join_by_list,
gen_sql_pieces_out_of_cursor(a_other.cursor_details.cursor_info, a_join_by_list,
l_xmltable_stmt, l_select_stmt, l_partition_stmt, l_equal_stmt,
l_join_on_stmt, l_not_equal_stmt);

Expand Down Expand Up @@ -374,9 +421,8 @@ create or replace package body ut_compound_data_helper is

function get_rows_diff_by_sql(a_act_cursor_info ut_cursor_column_tab,a_exp_cursor_info ut_cursor_column_tab,
a_expected_dataset_guid raw, a_actual_dataset_guid raw, a_diff_id raw,
a_join_by_list ut_varchar2_list, a_unordered boolean
a_join_by_list ut_varchar2_list, a_unordered boolean, a_enforce_column_order boolean := false
) return tt_row_diffs is

l_act_col_filter varchar2(32767);
l_exp_col_filter varchar2(32767);
l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info));
Expand Down Expand Up @@ -412,25 +458,28 @@ create or replace package body ut_compound_data_helper is
select rn, diff_type, diffed_row, pk_value
,case when diff_type = 'Actual:' then 1 else 2 end rnk
,1 final_order
,col_name
from ( ]';

if a_unordered then
l_sql := l_sql || q'[select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, pk_value pk_value
l_sql := l_sql || q'[select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, pk_value,col_name
from
(select nvl(exp.rn, act.rn) rn, nvl(exp.pk_value, act.pk_value) pk_value, exp.col exp_item, act.col act_item
(select nvl(exp.rn, act.rn) rn, nvl(exp.pk_value, act.pk_value) pk_value, exp.col exp_item, act.col act_item ,
nvl(exp.col_name,act.col_name) col_name
from exp join act on exp.rn = act.rn and exp.col_name = act.col_name
where dbms_lob.compare(exp.col_val, act.col_val) != 0)
unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:')
))]';
else
l_sql := l_sql || q'[ select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value
l_sql := l_sql || q'[ select rn, diff_type, xmlserialize(content data_item no indent) diffed_row, null pk_value,col_name
from
(select nvl(exp.rn, act.rn) rn,
xmlagg(exp.col order by exp.col_no) exp_item,
xmlagg(act.col order by act.col_no) act_item
xmlagg(act.col order by act.col_no) act_item,
max(nvl(exp.col_name,act.col_name)) col_name
from exp exp join act act on exp.rn = act.rn and exp.col_name = act.col_name
where dbms_lob.compare(exp.col_val, act.col_val) != 0
group by exp.rn, act.rn
group by (exp.rn, act.rn)
)
unpivot ( data_item for diff_type in (exp_item as 'Expected:', act_item as 'Actual:'))
)]';
Expand All @@ -443,14 +492,26 @@ create or replace package body ut_compound_data_helper is
nvl2(:join_by,ut_compound_data_helper.get_pk_value(:join_by,case when exp_data_id is null then act_item_data else exp_item_data end),null) pk_value
,case when exp_data_id is null then 1 else 2 end rnk
,2 final_order
,null col_name
from ut_compound_data_diff_tmp i
where diff_id = :diff_id
and act_data_id is null or exp_data_id is null
)
order by final_order,
case when final_order = 1 then rn else rnk end,
case when final_order = 1 then rnk else rn end ]';
order by final_order,]';

if a_enforce_column_order then
l_sql := l_sql ||q'[case when final_order = 1 then rn else rnk end,
case when final_order = 1 then rnk else rn end ]';
elsif not(a_enforce_column_order) and not(a_unordered) then
l_sql := l_sql ||q'[case when final_order = 1 then rn else rnk end,
case when final_order = 1 then rnk else rn end ]';
elsif a_unordered then
l_sql := l_sql ||q'[case when final_order = 1 then col_name else to_char(rnk) end,
case when final_order = 1 then to_char(rn) else col_name end,
case when final_order = 1 then to_char(rnk) else col_name end
]';
end if;

execute immediate l_sql
bulk collect into l_results
using l_exp_extract_xpath,l_join_xpath,a_diff_id, a_expected_dataset_guid,
Expand Down
6 changes: 3 additions & 3 deletions source/expectations/data_values/ut_compound_data_helper.pks
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ create or replace package ut_compound_data_helper authid definer is
);

type t_diff_tab is table of t_diff_rec;

function get_columns_filter(
a_exclude_xpath varchar2, a_include_xpath varchar2,
a_table_alias varchar2 := 'ucd', a_column_alias varchar2 := 'item_data'
) return varchar2;

function get_columns_diff(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab)
function get_columns_diff(a_expected ut_cursor_column_tab, a_actual ut_cursor_column_tab,a_order_enforced boolean := false)
return tt_column_diffs;

function get_pk_value (a_join_by_xpath varchar2,a_item_data xmltype) return clob;
Expand All @@ -75,7 +75,7 @@ create or replace package ut_compound_data_helper authid definer is

function get_rows_diff_by_sql(a_act_cursor_info ut_cursor_column_tab,a_exp_cursor_info ut_cursor_column_tab,
a_expected_dataset_guid raw, a_actual_dataset_guid raw, a_diff_id raw,
a_join_by_list ut_varchar2_list, a_unordered boolean
a_join_by_list ut_varchar2_list, a_unordered boolean, a_enforce_column_order boolean := false
) return tt_row_diffs;

subtype t_hash is raw(128);
Expand Down
2 changes: 1 addition & 1 deletion source/expectations/data_values/ut_compound_data_value.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ create or replace type body ut_compound_data_value as
end loop;

ut_compound_data_helper.set_rows_diff(l_sql_rowcount);
--result is OK only if both are same
--result is OK only if both are same
if l_sql_rowcount = 0 and ( self.elements_count = l_other.elements_count or a_inclusion_compare )then
l_result := 0;
else
Expand Down
27 changes: 20 additions & 7 deletions source/expectations/data_values/ut_cursor_details.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@ create or replace type body ut_cursor_details as

order member function compare(a_other ut_cursor_details) return integer is
l_diffs integer;
begin
select count(1) into l_diffs
from table(self.cursor_info) a full outer join table(a_other.cursor_info) e
on ( decode(a.parent_name,e.parent_name,1,0)= 1 and a.column_name = e.column_name and
REPLACE(a.column_type,'VARCHAR2','CHAR') = REPLACE(e.column_type,'VARCHAR2','CHAR')
and a.column_position = e.column_position )
where a.column_name is null or e.column_name is null;
begin
if self.is_column_order_enforced = 1 then
select count(1) into l_diffs
from table(self.cursor_info) a full outer join table(a_other.cursor_info) e
on ( decode(a.parent_name,e.parent_name,1,0)= 1 and a.column_name = e.column_name and
REPLACE(a.column_type,'VARCHAR2','CHAR') = REPLACE(e.column_type,'VARCHAR2','CHAR')
and a.column_position = e.column_position )
where a.column_name is null or e.column_name is null;
else
select count(1) into l_diffs
from table(self.cursor_info) a full outer join table(a_other.cursor_info) e
on ( decode(a.parent_name,e.parent_name,1,0)= 1 and a.column_name = e.column_name and
REPLACE(a.column_type,'VARCHAR2','CHAR') = REPLACE(e.column_type,'VARCHAR2','CHAR'))
where a.column_name is null or e.column_name is null;
end if;
return l_diffs;
end;

Expand Down Expand Up @@ -221,5 +229,10 @@ create or replace type body ut_cursor_details as
return;
end;

member procedure ordered_columns(self in out nocopy ut_cursor_details,a_ordered_columns boolean := false) is
begin
self.is_column_order_enforced := ut_utils.boolean_to_int(a_ordered_columns);
end;

end;
/
4 changes: 3 additions & 1 deletion source/expectations/data_values/ut_cursor_details.tps
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
create or replace type ut_cursor_details force authid current_user as object
(
cursor_info ut_cursor_column_tab,
Comment thread
lwasylow marked this conversation as resolved.
Outdated
is_column_order_enforced number(1,0),
order member function compare(a_other ut_cursor_details) return integer,
member procedure get_anytype_members_info(a_anytype anytype, a_attribute_typecode out pls_integer,
a_schema_name out varchar2, a_type_name out varchar2, a_len out pls_integer,a_elements_count out pls_integer),
Expand All @@ -15,6 +16,7 @@ create or replace type ut_cursor_details force authid current_user as object
member function get_user_defined_type(a_data anydata) return anytype,
constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result,
constructor function ut_cursor_details(self in out nocopy ut_cursor_details,a_cursor_number in number)
return self as result
return self as result,
member procedure ordered_columns(self in out nocopy ut_cursor_details,a_ordered_columns boolean := false)
)
/
15 changes: 9 additions & 6 deletions source/expectations/data_values/ut_data_value_refcursor.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ create or replace type body ut_data_value_refcursor as
l_row_diffs ut_compound_data_helper.tt_row_diffs;
l_message varchar2(32767);

l_column_order_enforce boolean := ut_utils.int_to_boolean(self.cursor_details.is_column_order_enforced);

function get_col_diff_text(a_col ut_compound_data_helper.t_column_diffs) return varchar2 is
begin
return
Expand Down Expand Up @@ -208,8 +210,8 @@ create or replace type body ut_data_value_refcursor as
dbms_lob.createtemporary(l_result,true);
--diff columns
if not self.is_null and not l_actual.is_null then
l_column_diffs := ut_compound_data_helper.get_columns_diff(self.cursor_details.cursor_info,l_actual.cursor_details.cursor_info);

l_column_diffs := ut_compound_data_helper.get_columns_diff(self.cursor_details.cursor_info,l_actual.cursor_details.cursor_info,l_column_order_enforce);
if l_column_diffs.count > 0 then
ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10));
end if;
Expand All @@ -234,9 +236,9 @@ create or replace type body ut_data_value_refcursor as
-- First tell how many rows are different
l_diff_row_count := ut_compound_data_helper.get_rows_diff_count;
l_results := ut_utils.t_clob_tab();
if l_diff_row_count > 0 then
if l_diff_row_count > 0 then
l_row_diffs := ut_compound_data_helper.get_rows_diff_by_sql(
l_exp_cols,l_act_cols, self.data_id, l_actual.data_id, l_diff_id,a_join_by_list , a_unordered);
l_exp_cols,l_act_cols, self.data_id, l_actual.data_id, l_diff_id,a_join_by_list , a_unordered, l_column_order_enforce);
l_message := chr(10)
||'Rows: [ ' || l_diff_row_count ||' differences'
|| case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end
Expand All @@ -248,7 +250,7 @@ create or replace type body ut_data_value_refcursor as
end loop;
ut_utils.append_to_clob(l_result,l_results);
else
l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns are not matching.';
l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.';
ut_utils.append_to_clob( l_result, l_message );
end if;
else
Expand Down Expand Up @@ -304,11 +306,12 @@ create or replace type body ut_data_value_refcursor as
return self.elements_count = 0;
end;

member function filter_cursor (a_exclude_xpath ut_varchar2_list, a_include_xpath ut_varchar2_list) return ut_data_value_refcursor is
member function update_cursor_details (a_exclude_xpath ut_varchar2_list, a_include_xpath ut_varchar2_list,a_ordered_columns boolean := false) return ut_data_value_refcursor is
l_result ut_data_value_refcursor := self;
begin
if l_result.cursor_details.cursor_info is not null then
l_result.cursor_details.cursor_info := ut_compound_data_helper.inc_exc_columns_from_cursor(l_result.cursor_details.cursor_info,a_exclude_xpath,a_include_xpath);
l_result.cursor_details.ordered_columns(a_ordered_columns);
end if;
return l_result;
end;
Expand Down
3 changes: 2 additions & 1 deletion source/expectations/data_values/ut_data_value_refcursor.tps
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@ create or replace type ut_data_value_refcursor under ut_compound_data_value(
overriding member function compare_implementation(a_other ut_data_value, a_unordered boolean, a_inclusion_compare boolean := false, a_is_negated boolean := false,
a_join_by_list ut_varchar2_list:=ut_varchar2_list()) return integer,
overriding member function is_empty return boolean,
member function filter_cursor (a_exclude_xpath ut_varchar2_list, a_include_xpath ut_varchar2_list) return ut_data_value_refcursor)
member function update_cursor_details (a_exclude_xpath ut_varchar2_list, a_include_xpath ut_varchar2_list,a_ordered_columns boolean := false) return ut_data_value_refcursor
)
/
Loading