@@ -104,24 +104,24 @@ create or replace package body ut_coverage_extended is
104104 if l_result_block.total_lines > 0 or l_result_profiler.total_lines > 0 then
105105 --update total stats
106106 l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
107- l_result.total_blocks := l_result_block.total_blocks;
108- l_result.uncovered_blocks := l_result_block.uncovered_blocks;
109- l_result.covered_blocks := l_result_block.covered_blocks;
110- l_result.partcovered_lines := l_result_block.partcovered_lines;
107+ l_result.total_blocks := nvl( l_result_block.total_blocks,0) ;
108+ l_result.uncovered_blocks := nvl( l_result_block.uncovered_blocks,0) ;
109+ l_result.covered_blocks := nvl( l_result_block.covered_blocks,0) ;
110+ l_result.partcovered_lines := nvl( l_result_block.partcovered_lines,0) ;
111111
112112 --populate object level coverage stats
113113 if not l_result.objects.exists(l_source_object.full_name) then
114114 l_result.objects(l_source_object.full_name) := l_new_unit;
115115 l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
116- l_result.objects(l_source_object.full_name).name := l_source_object.name;
116+ l_result.objects(l_source_object.full_name).name := l_source_object.name;
117117 l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
118- l_result.objects(l_source_object.full_name).total_blocks := l_result_block.objects(l_source_object.full_name).total_blocks;
119- l_result.objects(l_source_object.full_name).uncovered_blocks := l_result_block.objects(l_source_object.full_name).uncovered_blocks;
120- l_result.objects(l_source_object.full_name).covered_blocks := l_result_block.objects(l_source_object.full_name).covered_blocks;
121- l_result.objects(l_source_object.full_name).partcovered_lines := l_result_block.objects(l_source_object.full_name).partcovered_lines;
118+ l_result.objects(l_source_object.full_name).total_blocks := nvl( l_result_block.objects(l_source_object.full_name).total_blocks,0) ;
119+ l_result.objects(l_source_object.full_name).uncovered_blocks := nvl( l_result_block.objects(l_source_object.full_name).uncovered_blocks,0) ;
120+ l_result.objects(l_source_object.full_name).covered_blocks := nvl( l_result_block.objects(l_source_object.full_name).covered_blocks,0) ;
121+ l_result.objects(l_source_object.full_name).partcovered_lines := nvl( l_result_block.objects(l_source_object.full_name).partcovered_lines,0) ;
122122 end if;
123123
124- l_line_no := coalesce (l_result_block.objects(l_source_object.full_name).lines.first,
124+ l_line_no := least (l_result_block.objects(l_source_object.full_name).lines.first,
125125 l_result_profiler.objects(l_source_object.full_name).lines.first);
126126
127127 if l_line_no is null then
@@ -130,24 +130,36 @@ create or replace package body ut_coverage_extended is
130130 else
131131 loop
132132 exit when l_line_no is null;
133- -- object level stats
134-
135- -- Failing on non existing data for block objects.Check if exists and then use it
136- l_result.objects(l_source_object.full_name).lines(l_line_no).executions := greatest(l_result_block.objects(l_source_object.full_name).lines(l_line_no).executions,
137- l_result_profiler.objects(l_source_object.full_name).lines(l_line_no).executions);
138- l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).no_blocks,0);
139- l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).covered_blocks,0);
140- l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := l_result_block.objects(l_source_object.full_name).lines(l_line_no).partcove;
141- -- total level stats
133+
134+ -- Set executions to zero at beginning, specific coverage will overwrite if exists.
135+ l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 0;
136+ l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := 0;
137+ l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := 0;
138+ l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := 0;
139+
140+ -- we need to check if given index exists for that coverage type or we get no data found
141+ if l_result_block.objects(l_source_object.full_name).lines.exists(l_line_no) then
142+ l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).no_blocks,0);
143+ l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).covered_blocks,0);
144+ l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).partcove,0);
145+ --We capture block executions here, since block coverage do not capture more than 1
146+ --if profiler executions exists we will use that number as profiler shows hits correctly
147+
148+ l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_block.objects(l_source_object.full_name).lines(l_line_no).executions;
149+ end if;
150+
151+ if l_result_profiler.objects(l_source_object.full_name).lines.exists(l_line_no) then
152+ l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_profiler.objects(l_source_object.full_name).lines(l_line_no).executions;
153+ end if;
142154
143155 -- Recalculate total lines
144156 if l_result.objects(l_source_object.full_name).lines(l_line_no).executions > 0 then
145157 -- total level stats
146158 l_result.executions := l_result.executions + l_result.objects(l_source_object.full_name).lines(l_line_no).executions;
147159 l_result.covered_lines := l_result.covered_lines + 1;
148160 -- object level stats
149- l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
150- .uncovered_lines + 1;
161+ l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
162+ .covered_lines + 1;
151163 elsif l_result.objects(l_source_object.full_name).lines(l_line_no).executions = 0 then
152164 -- total level stats
153165 l_result.uncovered_lines := l_result.uncovered_lines + 1;
@@ -156,7 +168,7 @@ create or replace package body ut_coverage_extended is
156168 .uncovered_lines + 1;
157169 end if;
158170
159- l_line_no := coalesce (l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
171+ l_line_no := least (l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
160172 l_result_profiler.objects(l_source_object.full_name).lines.next(l_line_no));
161173
162174 end loop;
0 commit comments