File Coverage

blib/lib/TSQL/SplitStatement.pm
Criterion Covered Total %
statement 176 236 74.5
branch 11 30 36.6
condition 2 6 33.3
subroutine 15 15 100.0
pod 3 3 100.0
total 207 290 71.3


line stmt bran cond sub pod time code
1             package TSQL::SplitStatement;
2            
3 2     2   75882 use 5.010;
  2         7  
  2         72  
4 2     2   11 use strict;
  2         3  
  2         59  
5 2     2   11 use warnings;
  2         18  
  2         63  
6            
7 2     2   1663 use English ;
  2         8539  
  2         13  
8            
9 2     2   1185 use List::Util qw(first max maxstr min minstr reduce shuffle sum);
  2         6  
  2         293  
10 2     2   46055 use List::MoreUtils qw(indexes all any);
  2         36671  
  2         244  
11             #use Data::Dumper;
12             #use Data::Dump 'pp';
13 2     2   3116 use autodie qw(:all);
  2         46756  
  2         13  
14 2     2   54291 use Clone;
  2         19131  
  2         133  
15 2     2   20 use base qw(Clone) ;
  2         4  
  2         244  
16            
17 2     2   2244 use TSQL::Common::Regexp;
  2         1124  
  2         3100  
18            
19             ## TODO :- 1 stop this warning Variable "$NestedBracketsRE" will not stay shared at (re_eval 215) line 2.
20            
21             =head1 NAME
22            
23             TSQL::SplitStatement - Implements similar functionality to SQL::SplitStatement, but for TSQL.
24            
25             =head1 VERSION
26            
27             Version 0.15
28            
29             =cut
30            
31             our $VERSION = '0.15';
32            
33            
34            
35             # -- **********************************************************
36            
37             sub new {
38 1     1 1 985 local $_ = undef ;
39 1         2 my $invocant = shift ;
40 1   33     8 my $class = ref($invocant) || $invocant ;
41 1         4 my $self = bless {}, $class ;
42            
43 1         3 return $self ;
44             }
45            
46            
47             sub splitSQL {
48            
49 1     1 1 7 local $_ = undef ;
50            
51 1         2 my $invocant = shift ;
52 1   33     4 my $class = ref($invocant) || $invocant ;
53            
54 1         2 my $input = shift ;
55            
56            
57            
58 1         3 my $CommentIndex = -1 ;
59            
60 1         2 my $QIndex = -1 ;
61 1         3 my $SIndex = -1 ;
62 1         3 my $UnionIndex = -1 ;
63 1         2 my $SubqueryIndex = -1 ;
64 1         2 my $BracketsIndex = -1 ;
65 1         2 my $CaseEndIndex = -1 ;
66 1         2 my $InsertsIndex = -1 ;
67 1         1 my $UpdatesIndex = -1 ;
68            
69 1         2 my $GrantOptionsIndex = -1 ;
70 1         1 my $GrantsIndex = -1 ;
71 1         26 my $DenysIndex = -1 ;
72 1         2 my $RevokesIndex = -1 ;
73            
74 1         1 my $CursorSelectsIndex = -1 ;
75 1         2 my $CursorForUpdatesIndex = -1 ;
76            
77 1         1 my $TerminatorIndex = -1 ;
78            
79            
80 1         2 my $CommentRepl = '____COMMENT_';
81            
82 1         1 my $QRepl = '____QUOTEDID_';
83 1         2 my $SRepl = '____STRING_';
84 1         1 my $UnionRepl = '____UNION_';
85 1         3 my $SubqueryRepl = '____SUBQUERY_';
86 1         1 my $BracketsRepl = '____BRACKETS_';
87 1         1 my $CaseEndRepl = '____CASE_END_';
88 1         1 my $InsertsRepl = '____INSERTS_SELECT_';
89 1         2 my $UpdatesRepl = '____UPDATES_SET_';
90            
91 1         1 my $GrantOptionsRepl = '____GRANT_OPTION_';
92 1         2 my $GrantsRepl = '____GRANT_SET_';
93 1         2 my $DenysRepl = '____DENY_SET_';
94 1         1 my $RevokesRepl = '____REVOKE_SET_';
95            
96 1         2 my $CursorSelectsRepl = '____CURSOR_FOR_SELECT_';
97 1         2 my $CursorForUpdatesRepl = '____CURSOR_FOR_UPDATES_';
98            
99            
100 1         2 my $TerminatorRepl = '____SEPARATOR_TOKEN_';
101            
102            
103 1         1 my @Comment_positions = ();
104 1         2 my @Comment_replaces = ();
105            
106 1         3 my @Q_replaces = ();
107 1         2 my @S_replaces = ();
108 1         2 my @Union_replaces = ();
109 1         1 my @Subquery_replaces = ();
110 1         8 my @Brackets_replaces = ();
111 1         7 my @CaseEnd_replaces = ();
112 1         3 my @Inserts_replaces = ();
113 1         1 my @Updates_replaces = ();
114            
115 1         2 my @GrantOptions_replaces = ();
116 1         2 my @Grants_replaces = ();
117 1         2 my @Denys_replaces = ();
118 1         2 my @Revokes_replaces = ();
119            
120 1         2 my @CursorSelects_replaces = ();
121 1         2 my @CursorForUpdates_replaces = ();
122 1         1 my @Terminator_replaces = ();
123            
124            
125            
126             #my $qr_Id = qr{[#_\w$@][#$:_.\w]*}x ;
127 1         9 my $qr_Id = TSQL::Common::Regexp->qr_id();
128            
129 1         4 my $s = $input ;
130            
131             # replace comments only .............
132            
133             ## Beware this is a valid name [abc[]]def]
134            
135 1         15 $s =~ s!(? [N]?'(?:(?:[^']) | (?:''))*' )
136             |
137             (?"(?:(?:[^"]) | (?:""))*" )
138             |
139             (?\[ .*? \] )
140             |
141             (?(?:(?:--.*?$)
142             |
143             (?:/[*].*?[*]/)\s*)+
144             )
145 3 50       51 ! if (defined($+{string})) {"$+{string}"} elsif (defined($+{doublequoted})) {"$+{doublequoted}"} elsif (defined($+{bracketquoted})) {"$+{bracketquoted}"} elsif (defined($+{comment})) {${CommentIndex}++; $Comment_replaces[${CommentIndex}] = $+{comment} ; " ${CommentRepl}${CommentIndex} "} else {'z'}
  0 50       0  
  0 50       0  
  0 50       0  
  3         4  
  3         13  
  3         210  
  0         0  
146             !xigems ;
147            
148             #print $s ;
149             #exit;
150             # '
151            
152            
153 1         6 $CommentIndex = -1 ;
154 1         2 $QIndex = -1 ;
155 1         2 $SIndex = -1 ;
156            
157             # replace everything else ..............
158             #'
159             # hack around broken ? ^PREMATCH handling in 5.17
160             # and fixed $` handling
161 1 50       20 if ( $PERL_VERSION >= v5.17.0 ) {
162 1         6 $s =~ s!(?(?p) [N]?'(?:(?:[^']) | (?:''))*' )
163             |
164             (?"(?:(?:[^"]) | (?:""))*" )
165             |
166             (?\[ .*? \] )
167             |
168             (? \s____COMMENT_(?:\d)+\s
169             )
170 3 50       46 ! if (defined($+{string})) {${SIndex}++; $S_replaces[${SIndex}] = $+{string} ; " ${SRepl}${SIndex} "} elsif (defined($+{doublequoted})) {${QIndex}++; $Q_replaces[${QIndex}] = $+{doublequoted}; " ${QRepl}${QIndex} "} elsif (defined($+{bracketquoted})) {${QIndex}++; $Q_replaces[${QIndex}] = $+{bracketquoted}; " ${QRepl}${QIndex} "} elsif (defined($+{comment})) {$CommentIndex++; $Comment_positions[$CommentIndex]=length($`); ' ';} else {'z'}
  0 50       0  
  0 50       0  
  0 50       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  3         3  
  3         10  
  3         139  
  0         0  
171             !xigems ;
172             }
173             else {
174 0         0 $s =~ s!(?(?p) [N]?'(?:(?:[^']) | (?:''))*' )
175             |
176             (?"(?:(?:[^"]) | (?:""))*" )
177             |
178             (?\[ .*? \] )
179             |
180             (? \s____COMMENT_(?:\d)+\s
181             )
182 0 0       0 ! if (defined($+{string})) {${SIndex}++; $S_replaces[${SIndex}] = $+{string} ; " ${SRepl}${SIndex} "} elsif (defined($+{doublequoted})) {${QIndex}++; $Q_replaces[${QIndex}] = $+{doublequoted}; " ${QRepl}${QIndex} "} elsif (defined($+{bracketquoted})) {${QIndex}++; $Q_replaces[${QIndex}] = $+{bracketquoted}; " ${QRepl}${QIndex} "} elsif (defined($+{comment})) {$CommentIndex++; $Comment_positions[$CommentIndex]=length(${^PREMATCH}); ' ';} else {'z'}
  0 0       0  
  0 0       0  
  0 0       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
183             !xigems ;
184             }
185            
186             # ! if (defined($1)) {${SIndex}++; $S_replaces[${SIndex}] = $1 ; " ${SRepl}${SIndex} "} elsif (defined($2)) {${QIndex}++; $Q_replaces[${QIndex}] = $2; " ${QRepl}${QIndex} "} elsif (defined($3)) {${QIndex}++; $Q_replaces[${QIndex}] = $3; " ${QRepl}${QIndex} "} elsif (defined($4)) {$CommentIndex++; $Comment_positions[$CommentIndex]=length(${^PREMATCH}); ' ';} else {'z'}
187             # '
188            
189             #$s =~ s!([N]?'(?:(?:[^'])|(?:''))*')
190             # ! if (defined($1)) {'a'} else {'z'}
191             # !xgei ;
192            
193             #pp @Comment_replaces ;
194            
195             #print $s ;
196             #exit;
197            
198            
199 1         37 $s =~ s!(\b(?:union|intersect|minus)(?:\s+all)?\s+select\b)
200 1         2 ! ${UnionIndex}++; $Union_replaces[${UnionIndex}] = $1 ; " ${UnionRepl}${UnionIndex} ";
  1         5  
  1         17  
201             !xigems ;
202            
203             #warn Dumper @Union_replaces ;
204            
205 2     2   16 no warnings ;
  2         3  
  2         395  
206 1         7 my $NestedBracketsRE = qr{
207             ( # start of capture buffer 1
208             \( # match an opening bracket
209             (?:
210             [^()]++ # one or more non brackets, non back+tracking
211             |
212             (?1) # found ( or ), so recurse to capture buffer 1
213             )*
214             \) # match a closing bracket
215             ) # end of capture buffer 1
216             }ixms;
217             my $OuterSubQueryRE = qr{
218             (?: # start of capture buffer 1
219             \( # match an opening bracket
220             \s*select\b # match select
221             (?:
222             [^()]++ # one or more non brackets, non back+tracking
223             |
224             (??{$NestedBracketsRE}) # found ( or ), so recurse to $NestedBracketsRE
225             )*
226             \) # match a closing bracket
227             ) # end of capture buffer 1
228 1         15 }ixms;
229            
230 2     2   17 use warnings ;
  2         3  
  2         13083  
231            
232 1         65 $s =~ s!(${OuterSubQueryRE})
233 2         3 ! ${SubqueryIndex}++; $Subquery_replaces[${SubqueryIndex}] = $1 ; " ${SubqueryRepl}${SubqueryIndex} ";
  2         6  
  2         12  
234             !xigems ;
235            
236 1         45 $s =~ s!(${NestedBracketsRE})
237 0         0 ! ${BracketsIndex}++; $Brackets_replaces[${BracketsIndex}] = $1 ; " ${BracketsRepl}${BracketsIndex} ";
  0         0  
  0         0  
238             !xigems ;
239            
240 1         5 my $CaseEndRE = qr{
241             ( # start of capture buffer 1
242             (?: \b case \b) # match an opening case
243             (?:
244             .*? (?= \b (?:case|end) \b ) # minimal match up to case or end
245             |
246             (?1) # found case or end, so recurse to capture buffer 1
247             )*
248             (?: \b end \b) # match a closing end
249             ) # end of capture buffer 1
250             }ixms;
251            
252 1         63 $s =~ s!(${CaseEndRE})
253 1         2 ! ${CaseEndIndex}++; $CaseEnd_replaces[${CaseEndIndex}] = $1 ; " ${CaseEndRepl}${CaseEndIndex} ";
  1         3  
  1         22  
254             !xigems ;
255            
256 1         132 $s =~ s!\b
257             ( DECLARE\s+ (?:${qr_Id}) (?:\s+ (?: (?:(?:INSENSITIVE|SCROLL) \s+ CURSOR)
258             |
259             (?:CURSOR \s+ (?: (?:LOCAL|GLOBAL) \s+)? )
260             (?:\w+)
261             )
262             )
263             )
264             \s+(for\s+select)
265             \b
266 0         0 ! ${CursorSelectsIndex}++; $CursorSelects_replaces[${CursorSelectsIndex}] = $2 ; "${1} ${CursorSelectsRepl}${CursorSelectsIndex} ";
  0         0  
  0         0  
267             !xigems ;
268            
269 1         15 $s =~ s!\b(FOR\s+UPDATE(?:\s+OF\b)?)
270 0         0 ! ${CursorForUpdatesIndex}++; $CursorForUpdates_replaces[${CursorForUpdatesIndex}] = $1 ; " ${CursorForUpdatesRepl}${CursorForUpdatesIndex} ";
  0         0  
  0         0  
271             !xigems ;
272            
273 1         16 $s =~ s! \b( insert (?:\s+into)? \s+ \S+ \s* (?: with \s* ____BRACKETS_\d+ )? \s* (?: ____BRACKETS_\d+ )? \s* )
274             (
275             (?:select)
276             |
277             (?:values)
278             |
279             (?:exec(?:ute)?)
280             )
281 0         0 ! ${InsertsIndex}++; $Inserts_replaces[${InsertsIndex}] = $2 ; "${1} ${InsertsRepl}${InsertsIndex} ";
  0         0  
  0         0  
282             !xigems ;
283            
284 1         14 $s =~ s!(\bupdate\b.*?)\b(set)\b
285 0         0 ! ${UpdatesIndex}++; $Updates_replaces[${UpdatesIndex}] = $2 ; "${1} ${UpdatesRepl}${UpdatesIndex} ";
  0         0  
  0         0  
286             !xigems ;
287            
288             # do grant option first as it contains the word grant then ..............
289 1         19 $s =~ s!\b((?:(?:WITH\s+GRANT\s+OPTION)|(?:GRANT\s+OPTION\s+FOR)))\b
290 0         0 ! ${GrantOptionsIndex}++; $GrantOptions_replaces[${GrantOptionsIndex}] = $2 ; "${1} ${GrantOptionsRepl}${GrantOptionsIndex} ";
  0         0  
  0         0  
291             !xigems ;
292             # do revoke next as it contains the word grant
293 1         18 $s =~ s!(\brevoke\b)( .*? \b (?:to|from) \b)
294 0         0 ! ${RevokesIndex}++; $Revokes_replaces[${RevokesIndex}] = $2 ; "${1} ${RevokesRepl}${RevokesIndex} ";
  0         0  
  0         0  
295             !xigems ;
296            
297 1         15 $s =~ s!(\bdeny\b)( .*? \b on \b)
298 0         0 ! ${DenysIndex}++; $Denys_replaces[${DenysIndex}] = $2 ; "${1} ${DenysRepl}${DenysIndex} ";
  0         0  
  0         0  
299             !xigems ;
300            
301 1         15 $s =~ s!(\bgrant\b)( .*? \b to \b)
302 0         0 ! ${GrantsIndex}++; $Grants_replaces[${GrantsIndex}] = $2 ; "${1} ${GrantsRepl}${GrantsIndex} ";
  0         0  
  0         0  
303             !xigems ;
304            
305             #print $s ;
306            
307             #print "!!\n";
308            
309             #warn Dumper @S_replaces ;
310             #warn Dumper @Q_replaces ;
311             #warn Dumper @Subquery_replaces ;
312             #warn Dumper @Brackets_replaces ;
313             #warn Dumper @Inserts_replaces ;
314             #warn Dumper @Updates_replaces ;
315             #warn Dumper @CursorForUpdates_replaces ;
316             #warn Dumper @CursorSelects_replaces ;
317             #warn Dumper @GrantOptions_replaces ;
318             #warn Dumper @Revokes_replaces ;
319             #warn Dumper @Denys_replaces ;
320             #warn Dumper @Grants_replaces ;
321            
322             #my ($TokeniserPos,$TokeniserNext) = TSQL::SplitStatement->tokeniser() ;
323             # cache this variable for efficiency
324 1         2 state $TokeniserPos ;
325 1 50       6 if ( ! defined $TokeniserPos ) { $TokeniserPos = TSQL::SplitStatement->tokeniser() ; }
  1         5  
326            
327 1         6 my @TokenPositions = () ;
328             #$s =~ s!( ${Tokeniser} )
329             # ! ${TerminatorIndex}++; $Terminator_replaces[${TerminatorIndex}] = $2 ; "${1} ${TerminatorRepl}${TerminatorIndex} \n";
330             # !xigems ;
331            
332             #need to find places, in sweep 1 and replace backwards in sweep2
333             #$s =~ s! ( ${Tokeniser} )
334             # ! " ____SEPARATOR_TOKEN\n $1 "
335             # !xigems ;
336            
337             # hack around broken ? ^PREMATCH handling in 5.17
338             # and fixed $` handling
339 1 50       28 if ( $PERL_VERSION >= v5.17.0 ) {
340 1         92 while ( $s =~ m{${TokeniserPos}}xigms ) {
341 33         2380 push @TokenPositions, length($`) ;
342             }
343 1         5 foreach my $tokPos ( reverse @TokenPositions ) {
344 33         89 substr($s, $tokPos, 0) = " ____SEPARATOR_TOKEN\n " ;
345             }
346             }
347             else {
348 0         0 while ( $s =~ m{${TokeniserPos}}xigms ) {
349 0         0 push @TokenPositions, length(${^PREMATCH}) ;
350             }
351 0         0 foreach my $tokPos ( reverse @TokenPositions ) {
352 0         0 substr($s, $tokPos, 0) = " ____SEPARATOR_TOKEN\n " ;
353             }
354             }
355            
356             #print $s ;
357            
358            
359 1         10 $s =~ s!\s____GRANT_SET_([\d]+)\s!$Grants_replaces[$1]!gx ;
360 1         6 $s =~ s!\s____DENY_SET_([\d]+)\s!$Denys_replaces[$1]!gx ;
361 1         5 $s =~ s!\s____REVOKE_SET_([\d]+)\s!$Revokes_replaces[$1]!gx ;
362 1         4 $s =~ s!\s____GRANT_OPTION_([\d]+)\s!$GrantOptions_replaces[$1]!gx ;
363            
364 1         4 $s =~ s!\s____UPDATES_SET_([\d]+)\s!$Updates_replaces[$1]!gx ;
365 1         4 $s =~ s!\s____INSERTS_SELECT_([\d]+)\s!$Inserts_replaces[$1]!gx ;
366            
367 1         3 $s =~ s!\s____CURSOR_FOR_UPDATES_([\d]+)\s!$CursorForUpdates_replaces[$1]!gx ;
368 1         3 $s =~ s!\s____CURSOR_FOR_SELECT_([\d]+)\s!$CursorSelects_replaces[$1]!gx ;
369            
370 1         16 $s =~ s!\s____CASE_END_([\d]+)\s!$CaseEnd_replaces[$1]!gx ;
371            
372 1         4 $s =~ s!\s____BRACKETS_([\d]+)\s!$Brackets_replaces[$1]!gx ;
373 1         11 $s =~ s!\s____SUBQUERY_([\d]+)\s!$Subquery_replaces[$1]!gx ;
374 1         8 $s =~ s!\s____UNION_([\d]+)\s!$Union_replaces[$1]!gx ;
375 1         4 $s =~ s!\s____STRING_([\d]+)\s!$S_replaces[$1]!gx ;
376 1         3 $s =~ s!\s____QUOTEDID_([\d]+)\s!$Q_replaces[$1]!gx ;
377            
378            
379             #print $s;
380            
381             #my $idx = 0 ;
382             #for my $comment_pos ( @Comment_positions ) {
383             # substr($s, $comment_pos, 1," ____COMMENT_${idx} ") ;
384             # $idx++;
385             #}
386             #
387             #$s =~ s!\s____COMMENT_([\d]+)\s!$Comment_replaces[$1]!gx ;
388            
389             #print $s;
390            
391 1         40 my @parsedInput = grep { $_ !~ /\A\s*\z/msx } split /\s*____SEPARATOR_TOKEN\s*/x,$s;
  33         76  
392            
393             #pp @parsedInput ;
394             #
395             #my @tryblocks = () ;
396             #my @blocks = () ;
397             #my @ifs = () ;
398             #my @whiles = () ;
399             #
400             #
401             #my @begintryblocks = indexes {/\Abegin\s+try\z/ims} @parsedInput ;
402             #my @endtryblocks = indexes {/\Aend\s+try\z/ims} @parsedInput ;
403             #
404             #my @beginblocks = indexes {/\Abegin\z/ims} @parsedInput ;
405             #my @endblocks = indexes {/\Aend\z/ims} @parsedInput ;
406             #my @begincatchblocks = indexes {/\Abegin\s+catch\z/ims} @parsedInput ;
407             #my @endcatchblocks = indexes {/\Aend\s+catch\z/ims} @parsedInput ;
408             #my @ifstatements = indexes {/\Aif\b/ims} @parsedInput ;
409             #my @elsestatements = indexes {/\Aelse\z/ims} @parsedInput ;
410             #my @whilestatements = indexes {/\Awhile\b/ims} @parsedInput ;
411             #
412             #pp 'begin', @beginblocks ;
413             #pp 'end', @endblocks ;
414             #pp 'begin try', @begintryblocks ;
415             #pp 'end try', @endtryblocks ;
416             #pp 'begin catch', @begincatchblocks ;
417             #pp 'end catch', @endcatchblocks ;
418             #
419             #pp 'ifstatements',@ifstatements ;
420             #pp 'elsestatements',@elsestatements ;
421             #pp 'whilestatements',@whilestatements ;
422            
423 1         9 my @cp_parsedInput = @parsedInput;
424            
425             #my $blockCount = scalar @beginblocks ;
426             #my @bl = () ;
427             #while ( $blockCount > 0 ) {
428             # foreach my $i (@beginblocks) {
429             # }
430             #}
431             #my $done = 0 ;
432             ##while (! $done ) {
433             # my @blocks = grep { my $b = $_; #my $e = first { my $e = $_ ; $e > $b and none { my $b2 = $_; $b2 > $b and $b2 < $e
434             # # } @beginblocks
435             # # } @endblocks
436             # ; [$b] ; #,$e]
437             # } @beginblocks ;
438             # $done = 1;
439             ##}
440             #
441             #pp @blocks;
442            
443 1         33 return @parsedInput ;
444             }
445            
446            
447             sub tokeniser {
448             #
449             #my $qr_Id = q{(?:[#_\w$@][#$:_.\w]*)} ;
450 1     1 1 5 my $qr_Id = TSQL::Common::Regexp->qr_id();
451             #my $qr_label = q{(?:[#_\w$@][#$:_.\w]*[:])};
452 1         6 my $qr_label = TSQL::Common::Regexp->qr_label();
453            
454             ## add a backup create/drop/alter generic statement
455             ## to cater for create xml index ???
456            
457 1         195 my @Phrases =
458             ( [q{(?:\b(?
459             , [q{(?:\b(?
460             , [q{(?:\b(?
461             , [qq{(?:\\b(?
462             , [q{(?:\b(?
463             , [q{(?:\b(?
464             , [q{(?:\b(?
465             , [q{(?:\b(?
466             , [q{(?:\b(?
467             , [q{(?:\b(?
468             , [q{(?:\b(?
469             , [q{(?:\b(?
470             , [q{(?:\b(?
471             , [q{(?:\b(?
472             , [q{(?:\b(?
473             , [q{(?:\b(?
474             , [q{(?:\b(?
475             , [q{(?:\b(?
476             , [q{(?:\b(?
477             , [q{(?:\b(?
478             , [q{(?:\b(?
479             , [q{(?:\b(?
480             , [q{(?:\b(?
481             , [q{(?:\b(?
482             , [q{(?:\b(?
483             , [q{(?:\b(?
484             , [q{(?:\b(?
485             , [q{(?:\b(?
486             , [q{(?:\b(?
487             , [q{(?:\b(?
488             , [q{(?:\b(?
489             , [q{(?:\b(?
490             , [q{(?:\b(?
491             , [q{(?:\b(?
492             , [q{(?:\b(?
493             , [q{(?:\b(?
494             , [q{(?:\b(?
495             , [q{(?:\b(?
496             , [q{(?:\b(?
497             , [q{(?:\b(?
498             , [q{(?:\b(?
499             , [q{(?:\b(?
500             , [q{(?:\b(?
501             , [q{(?:\b(?
502             , [q{(?:\b(?
503             , [q{(?:\b(?
504             , [q{(?:\b(?
505             , [q{(?:\b(?
506             , [q{(?:\b(?
507             , [q{(?:\b(?
508             , [q{(?:\b(?
509             , [q{(?:\b(?
510             , [q{(?:\b(?
511             , [q{(?:\b(?
512             , [q{(?:\b(?
513             , [q{(?:\b(?
514             , [q{(?:\b(?
515             , [q{(?:\b(?
516             , [q{(?:\b(?
517             , [q{(?:\b(?
518             , [q{(?:\b(?
519             , [q{(?:\b(?
520             , [q{(?:\b(?
521             , [q{(?:\b(?
522             , [q{(?:\b(?
523             , [q{(?:\b(?
524             , [q{(?:\b(?
525             , [q{(?:\b(?
526             , [q{(?:\b(?
527             , [q{(?:\b(?
528             , [q{(?:\b(?
529             , [q{(?:\b(?
530             , [q{(?:\b(?
531             , [q{(?:\b(?
532             , [q{(?:\b(?
533             , [q{(?:\b(?
534             , [q{(?:\b(?
535             , [q{(?:\b(?
536             , [q{(?:\b(?
537             , [q{(?:\b(?
538             , [q{(?:\b(?
539             , [q{(?:\b(?
540             , [q{(?:\b(?
541             , [q{(?:\b(?
542             , [q{(?:\b(?
543             , [q{(?:\b(?
544             , [q{(?:\b(?
545             , [q{(?:\b(?
546             , [q{(?:\b(?
547             , [q{(?:\b(?
548             , [q{(?:\b(?
549             , [q{(?:\b(?
550             , [q{(?:\b(?
551             , [q{(?:\b(?
552             , [q{(?:\b(?
553             , [q{(?:\b(?
554             , [q{(?:\b(?
555             , [q{(?:\b(?
556             , [q{(?:\b(?
557            
558             , [q{(?:\b(?
559            
560             , [q{(?:\b(?
561             , [q{(?:\b(?
562             , [q{(?:\b(?
563             , [q{(?:\b(?
564            
565             , [q{(?:\b(?
566             , [q{(?:\b(?
567             , [qq{(?:\\b(?
568             , q{DECLARE_CURSOR} ]
569            
570             , [q{(?:\b(?
571             , [q{(?:\b(?
572             , [q{(?:\b(?
573             , [q{(?:\b(?
574             , [q{(?:\b(?
575             , [q{(?:\b(?
576             , [q{(?:\b(?
577             , [q{(?:\b(?
578             , [q{(?:\b(?
579             , [q{(?:\b(?
580             , [q{(?:\b(?
581             , [q{(?:\b(?
582             , [q{(?:\b(?
583             , [q{(?:\b(?
584             , [q{(?:\b(?
585             , [q{(?:\b(?
586             , [q{(?:\b(?
587             , [q{(?:\b(?
588             , [q{(?:\b(?
589             , [q{(?:\b(?
590             , [q{(?:\b(?
591             , [q{(?:\b(?
592             , [q{(?:\b(?
593             , [q{(?:\b(?
594             , [q{(?:\b(?
595             , [q{(?:\b(?
596             , [q{(?:\b(?
597             , [q{(?:\b(?
598             , [q{(?:\b(?
599             , [q{(?:\b(?
600             , [q{(?:\b(?
601             , [q{(?:\b(?
602             , [q{(?:\b(?
603             , [q{(?:\b(?
604             , [q{(?:\b(?
605             , [q{(?:\b(?
606             , [q{(?:\b(?
607             , [q{(?:\b(?
608             , [q{(?:\b(?
609             , [q{(?:\b(?
610             , [q{(?:\b(?
611             , [q{(?:\b(?
612             , [q{(?:\b(?
613             , [q{(?:\b(?
614             , [q{(?:\b(?
615             , [q{(?:\b(?
616             , [q{(?:\b(?
617             , [q{(?:\b(?
618             , [q{(?:\b(?
619             , [q{(?:\b(?
620             , [q{(?:\b(?
621             , [q{(?:\b(?
622             , [q{(?:\b(?
623             , [q{(?:\b(?
624             , [q{(?:\b(?
625             , [q{(?:\b(?
626             , [q{(?:\b(?
627             , [q{(?:\b(?
628             , [q{(?:\b(?
629             , [q{(?:\b(?
630             , [q{(?:\b(?
631             , [q{(?:\b(?
632             , [q{(?:\b(?
633             , [q{(?:\b(?
634             , [q{(?:\b(?
635             , [q{(?:\b(?
636             , [q{(?:\b(?
637             , [q{(?:\b(?
638             , [q{(?:\b(?
639             , [q{(?:\b(?
640             , [q{(?:\b(?
641             , [q{(?:\b(?
642             , [q{(?:\b(?
643             , [q{(?:\b(?
644             , [q{(?:\b(?
645             , [q{(?:\b(?
646             , [qq{(?:\\b(?
647             , [q{(?:\b(?
648             , [q{(?:\b(?
649             , [qq{(?:\\b(?
650             , [q{(?:\b(?
651             , , q{SET_TRANSACTION_ISOLATION_LEVEL} ]
652             , [q{(?:\b(?
653             , [q{(?:\b(?
654             , [q{(?:\b(?
655             , [q{(?:\b(?
656             , [q{(?:\b(?
657             , [q{(?:\b(?
658             , [q{(?:\b(?
659            
660             #, [qq{(?:\\b(?
661             # , q{WITH} ]
662            
663             , [qq{(?:\\b(?
664             , q{WITH} ]
665            
666             , [q{(?:\b(?
667             , q{WITH_XMLNAMESPACES} ]
668             , [q{(?:\b(?
669             , q{OPEN__KEY} ]
670             , [q{(?:\b(?
671             , q{OPEN_SYMMETRIC_KEY} ]
672             , [q{(?:\b(?
673             , [q{\z} , q{} ]
674             ) ;
675            
676 1         6 my %TERM_RE = () ;
677 1         2 %TERM_RE = map { my $key = $_->[0];
  201         186  
678 201         166 my $val = $_->[0] ;
679 201         408 $key =~ s{^[^A-Z]*}{}x;
680 201         579 ($key => $val);
681             } @Phrases ;
682            
683             #my $TERM_RE = join '|', map { qr{$TERM_RE{$_}}xmsi} reverse sort keys %TERM_RE ;
684 1         236 my $TERM_RE = qr{${qr_label}}xmsi . '|' . join '|', map { qr{$TERM_RE{$_}}xmsi} reverse sort keys %TERM_RE ;
  201         3546  
685            
686            
687            
688             #patch these in first - nasty hack on top of a hack
689             #with .......... infect everything, is there any other DDL it can find its way into ?
690             #also need to patch trigger creation so as not let the main parser incorrectly parse things before the AS
691            
692 1         203 $TERM_RE = qr{(?: \b(?:ALTER|CREATE)\b \s+ \bVIEW\b \s+ \b(?:${qr_Id})\b (?:\s*____BRACKETS_\\d+)? (?: \s* \bAS\b \s+(?: \bSELECT\b | (?: \bWITH\b .*? \bSELECT\b )))) }xmsi . "|" .
693             qr{(?: \b(?:ALTER|CREATE)\b \s+ \bTRIGGER\b (?:.*?) \bAS\b ) }xmsi . "|" .
694             qr{(?: \b(?:ALTER|CREATE)\b \s+ \bPROC(?:EDURE)?\b (?:.*?) \bAS\b ) }xmsi . "|" .
695             "${TERM_RE}" ;
696            
697            
698            
699 1         7147 my $LBL_TERM_RE = qr{ (?: (?: ${TERM_RE} ) .*?) (?= (?: (?: \b ${qr_label} \s+ )? (?: ${TERM_RE} ) ) ) }xmsi;
700            
701 1         2822 my $LBL_TERM_RE_OTHER = qr{ \G (?: (?: \b ${qr_label} \s+ )? (?: ${TERM_RE} ) ) }xmsi;
702            
703             #warn $LBL_TERM_RE ;
704            
705             #return ($LBL_TERM_RE,$LBL_TERM_RE_OTHER) ;
706 1         256 return $LBL_TERM_RE ;
707            
708             }
709            
710             1;
711            
712             __DATA__