DBUpgrade kann jetzt auch dollar quoting in SQL.
authorSven Schöling <s.schoeling@linet-services.de>
Mon, 17 Sep 2012 12:33:06 +0000 (14:33 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Mon, 17 Sep 2012 13:18:32 +0000 (15:18 +0200)
SL/DBUpgrade2.pm

index be7c54f..a74e8ae 100644 (file)
@@ -162,13 +162,26 @@ sub process_query {
       if (@quote_chars) {
         if ($char eq $quote_chars[-1]) {
           pop(@quote_chars);
+        } elsif (length $quote_chars[-1] > 1
+             &&  substr($quote_chars[-1], 0, 1) eq $char
+             &&  substr($_, $i, length $quote_chars[-1]) eq $quote_chars[-1]) {
+          $i   += length $quote_chars[-1] - 1;
+          $char = $quote_chars[-1];
+          pop(@quote_chars);
         }
         $query .= $char;
 
       } else {
+        my ($tag, $tag_end);
         if (($char eq "'") || ($char eq "\"")) {
           push(@quote_chars, $char);
 
+        } elsif ($char eq '$'                                      # start of dollar quoting
+             && ($tag_end = index($_, '$', $i + 1)) > -1           # ends on same line
+             && (do { substr($_, $i + 1, $tag_end - $i - 1); 1 })  # extract tag
+             &&  $tag =~ /^ (?= [A-Za-z_] [A-Za-z0-9_]* | ) $/x) { # tag is identifier
+          push @quote_chars, $char = '$' . $tag . '$';
+          $i = $tag_end;
         } elsif ($char eq ";") {
 
           # Query is complete. Send it.