From e0d6768ea76f6134ce1bafeac6bce410b8d235b5 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 13:26:22 +0100 Subject: [PATCH 1/5] Fixed issue with parsing by trigger when source contains leading comments. --- source/core/annotations/ut_annotation_manager.pkb | 3 ++- .../core/annotations/test_annotation_manager.pkb | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 70abafef7..3a6c5c950 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -267,10 +267,11 @@ create or replace package body ut_annotation_manager as l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then - 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'); for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; + l_sql_clob := ut3.ut_utils.replace_multiline_comments(l_sql_clob); + l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index 4778117c5..e64adc861 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -39,10 +39,19 @@ create or replace package body test_annotation_manager is procedure create_dummy_test_package is pragma autonomous_transaction; begin - execute immediate q'[create or replace package dummy_test_package as + execute immediate q'[ + /* + * Some multiline comments before package spec + create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + */ + -- create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + --Some single-line comment before package spec + create or replace package dummy_test_package as --%suite(dummy_test_suite) --%rollback(manual) + --create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + --%test(dummy_test) --%beforetest(some_procedure) procedure some_dummy_test_procedure; @@ -142,9 +151,9 @@ create or replace package body test_annotation_manager is from dual union all select 3, 'rollback' , 'manual', '' as subobject_name from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + select 7, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name + select 8, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name from dual; ut.expect(l_actual).to_equal(l_expected); From 69c2393248625b1f90aed4bba073003c3d954d6b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 13:44:34 +0100 Subject: [PATCH 2/5] Fixed typo. --- source/core/annotations/ut_annotation_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 3a6c5c950..b5d12187b 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -270,7 +270,7 @@ create or replace package body ut_annotation_manager as for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; - l_sql_clob := ut3.ut_utils.replace_multiline_comments(l_sql_clob); + l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; From a0e98ed19f15217b57e5eba575be15e86b812921 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:39:35 +0100 Subject: [PATCH 3/5] Improved time needed for clob-to-table conversion. Timing before change (with dbms_lob.read): `clob_to_table - Took:+000000000 00:00:00.012957000` After change: `clob_to_table - Took:+000000000 00:00:00.001236000` Speed improved by order of magnitude. --- source/core/ut_utils.pkb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 3b6a09ddf..44fab2ad8 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -241,7 +241,9 @@ create or replace package body ut_utils is begin while l_offset <= l_length loop l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); - dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); +-- dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); + l_buffer := substr(a_clob, l_offset, l_amount); + l_amount := length(l_buffer); l_offset := l_offset + l_amount; l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); From 8defe567d102c6d92ee56eb3be4263de8e984e61 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:42:19 +0100 Subject: [PATCH 4/5] Resolved issues with regex for DDL trigger processing. --- source/core/annotations/ut_annotation_manager.pkb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index b5d12187b..8ab115856 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -264,14 +264,17 @@ create or replace package body ut_annotation_manager as l_sql_clob clob; l_sql_lines ut_varchar2_rows := ut_varchar2_rows(); l_result sys_refcursor; - l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then for i in 1..a_parts loop - ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); + ut_utils.append_to_clob(l_sql_clob, a_sql_text(i)); end loop; l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); - l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); + -- replace comment lines that contain "-- create or replace" + l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modiafier => 'mi'); + -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing + -- needed for dbms_preprocessor + l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for From 780cfc0c535afc5ad599509ffaaea7c7dc534066 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:59:25 +0100 Subject: [PATCH 5/5] Fixed typo. --- source/core/annotations/ut_annotation_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 8ab115856..013e271c1 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -271,7 +271,7 @@ create or replace package body ut_annotation_manager as end loop; l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); -- replace comment lines that contain "-- create or replace" - l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modiafier => 'mi'); + l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modifier => 'mi'); -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing -- needed for dbms_preprocessor l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni');