Skip to content

Commit 683eef3

Browse files
authored
Merge pull request #940 from utPLSQL/feature/fix_ddl_triger_parser
Fixed issue with parsing via trigger source with leading comments
2 parents 8fd5eb9 + b8de3ed commit 683eef3

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

source/core/annotations/ut_annotation_manager.pkb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,17 @@ create or replace package body ut_annotation_manager as
264264
l_sql_clob clob;
265265
l_sql_lines ut_varchar2_rows := ut_varchar2_rows();
266266
l_result sys_refcursor;
267-
l_sql_text ora_name_list_t := a_sql_text;
268267
begin
269268
if a_parts > 0 then
270-
l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable)){0,1}\s+{0,1}', modifier => 'i');
271269
for i in 1..a_parts loop
272-
ut_utils.append_to_clob(l_sql_clob, l_sql_text(i));
270+
ut_utils.append_to_clob(l_sql_clob, a_sql_text(i));
273271
end loop;
272+
l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob);
273+
-- replace comment lines that contain "-- create or replace"
274+
l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modifier => 'mi');
275+
-- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing
276+
-- needed for dbms_preprocessor
277+
l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni');
274278
l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) );
275279
end if;
276280
open l_result for

source/core/ut_utils.pkb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,9 @@ create or replace package body ut_utils is
241241
begin
242242
while l_offset <= l_length loop
243243
l_amount := a_max_amount - coalesce( length(l_last_line), 0 );
244-
dbms_lob.read(a_clob, l_amount, l_offset, l_buffer);
244+
-- dbms_lob.read(a_clob, l_amount, l_offset, l_buffer);
245+
l_buffer := substr(a_clob, l_offset, l_amount);
246+
l_amount := length(l_buffer);
245247
l_offset := l_offset + l_amount;
246248

247249
l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter );

test/ut3_tester/core/annotations/test_annotation_manager.pkb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,19 @@ create or replace package body test_annotation_manager is
3939
procedure create_dummy_test_package is
4040
pragma autonomous_transaction;
4141
begin
42-
execute immediate q'[create or replace package dummy_test_package as
42+
execute immediate q'[
43+
/*
44+
* Some multiline comments before package spec
45+
create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code
46+
*/
47+
-- create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code
48+
--Some single-line comment before package spec
49+
create or replace package dummy_test_package as
4350
--%suite(dummy_test_suite)
4451
--%rollback(manual)
4552

53+
--create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code
54+
4655
--%test(dummy_test)
4756
--%beforetest(some_procedure)
4857
procedure some_dummy_test_procedure;
@@ -142,9 +151,9 @@ create or replace package body test_annotation_manager is
142151
from dual union all
143152
select 3, 'rollback' , 'manual', '' as subobject_name
144153
from dual union all
145-
select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name
154+
select 7, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name
146155
from dual union all
147-
select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name
156+
select 8, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name
148157
from dual;
149158

150159
ut.expect(l_actual).to_equal(l_expected);

0 commit comments

Comments
 (0)