Fix parsing quoted strings with leading spaces
Dagfinn Ilmari Mannsåker [Mon, 7 Sep 2015 16:49:27 +0000 (17:49 +0100)]
Changes
lib/SQL/Translator/Parser/MySQL.pm
lib/SQL/Translator/Parser/Oracle.pm
lib/SQL/Translator/Parser/PostgreSQL.pm
lib/SQL/Translator/Parser/SQLServer.pm
lib/SQL/Translator/Parser/SQLite.pm
t/data/roundtrip.xml

diff --git a/Changes b/Changes
index 4198719..d7b98a5 100644 (file)
--- a/Changes
+++ b/Changes
@@ -11,6 +11,8 @@ Changes for SQL::Translator
  * Declare dependencies in deterministic order (RT#102859)
  * Multiple speedups of naive internal debugging mechanism (GH#54)
  * Remove dependency on List::MoreUtils ( http://is.gd/lmu_cac_debacle )
+ * Fix parsing of strings with leading whitespace for MySQL, Oracle, PostgreSQL,
+   SQLServer and SQLite
 
 0.11021 2015-01-29
 
index 4b1fcec..8cdd794 100644 (file)
@@ -853,14 +853,14 @@ QUOTED_NAME : BQSTRING
 
 # MySQL strings, unlike common SQL strings, can have the delmiters
 # escaped either by doubling or by backslashing.
-BQSTRING: BACKTICK /(?:[^\\`]|``|\\.)*/ BACKTICK
-    { ($return = $item[2]) =~ s/(\\[\\`]|``)/substr($1,1)/ge }
+BQSTRING: BACKTICK <skip: ''> /(?:[^\\`]|``|\\.)*/ BACKTICK
+    { ($return = $item[3]) =~ s/(\\[\\`]|``)/substr($1,1)/ge }
 
-DQSTRING: DOUBLE_QUOTE /(?:[^\\"]|""|\\.)*/ DOUBLE_QUOTE
-    { ($return = $item[2]) =~ s/(\\[\\"]|"")/substr($1,1)/ge }
+DQSTRING: DOUBLE_QUOTE <skip: ''> /(?:[^\\"]|""|\\.)*/ DOUBLE_QUOTE
+    { ($return = $item[3]) =~ s/(\\[\\"]|"")/substr($1,1)/ge }
 
-SQSTRING: SINGLE_QUOTE /(?:[^\\']|''|\\.)*/ SINGLE_QUOTE
-    { ($return = $item[2]) =~ s/(\\[\\']|'')/substr($1,1)/ge }
+SQSTRING: SINGLE_QUOTE <skip: ''> /(?:[^\\']|''|\\.)*/ SINGLE_QUOTE
+    { ($return = $item[3]) =~ s/(\\[\\']|'')/substr($1,1)/ge }
 
 
 NAME: QUOTED_NAME
index 7a3bb23..12e7fdf 100644 (file)
@@ -605,11 +605,11 @@ NAME : /\w+/ { $item[1] }
 
 TABLE : /table/i
 
-DQSTRING : '"' /((?:[^"]|"")+)/ '"'
-    { ($return = $item[2]) =~ s/""/"/g; }
+DQSTRING : '"' <skip: ''> /((?:[^"]|"")+)/ '"'
+    { ($return = $item[3]) =~ s/""/"/g; }
 
-SQSTRING : "'" /((?:[^']|'')*)/ "'"
-    { ($return = $item[2]) =~ s/''/'/g }
+SQSTRING : "'" <skip: ''> /((?:[^']|'')*)/ "'"
+    { ($return = $item[3]) =~ s/''/'/g }
 
 VALUE : /[-+]?\d*\.?\d+(?:[eE]\d+)?/
     | SQSTRING
index 504d365..ad4ec64 100644 (file)
@@ -1006,11 +1006,11 @@ SET : /set/i
 NAME : DQSTRING
     | /\w+/
 
-DQSTRING : '"' /((?:[^"]|"")+)/ '"'
-    { ($return = $item[2]) =~ s/""/"/g; }
+DQSTRING : '"' <skip: ''> /((?:[^"]|"")+)/ '"'
+    { ($return = $item[3]) =~ s/""/"/g; }
 
-SQSTRING : "'" /((?:[^']|'')*)/ "'"
-    { ($return = $item[2]) =~ s/''/'/g }
+SQSTRING : "'" <skip: ''> /((?:[^']|'')*)/ "'"
+    { ($return = $item[3]) =~ s/''/'/g }
 
 VALUE : /[-+]?\d*\.?\d+(?:[eE]\d+)?/
     | SQSTRING
index 3834de1..c4191fd 100644 (file)
@@ -440,14 +440,14 @@ DIGITS : /\d+/
 
 COMMA : ','
 
-SQSTRING : "'" /(?:[^']|'')*/ "'"
-    { ($return = $item[2]) =~ s/''/'/g }
+SQSTRING : "'" <skip: ''> /(?:[^']|'')*/ "'"
+    { ($return = $item[3]) =~ s/''/'/g }
 
-DQSTRING : '"' /(?:[^"]|"")+/ '"'
-    { ($return = $item[2]) =~ s/""/"/g }
+DQSTRING : '"' <skip: ''> /(?:[^"]|"")+/ '"'
+    { ($return = $item[3]) =~ s/""/"/g }
 
-BQSTRING : '[' /(?:[^]]|]])+/ ']'
-    { ($return = $item[2]) =~ s/]]/]/g; }
+BQSTRING : '[' <skip: ''> /(?:[^]]|]])+/ ']'
+    { ($return = $item[3]) =~ s/]]/]/g; }
 
 END_OF_GRAMMAR
 
index b3e81ae..4787302 100644 (file)
@@ -623,11 +623,11 @@ NAME : /\w+/
     | DQSTRING
     | SQSTRING
 
-DQSTRING : '"' /((?:[^"]|"")+)/ '"'
-    { ($return = $item[2]) =~ s/""/"/g }
+DQSTRING : '"' <skip: ''> /((?:[^"]|"")+)/ '"'
+    { ($return = $item[3]) =~ s/""/"/g }
 
-SQSTRING : "'" /((?:[^']|'')*)/ "'"
-    { ($return = $item[2]) =~ s/''/'/g }
+SQSTRING : "'" <skip: ''> /((?:[^']|'')*)/ "'"
+    { ($return = $item[3]) =~ s/''/'/g }
 
 VALUE : /[-+]?\d*\.?\d+(?:[eE]\d+)?/
     { $item[1] }
index 28d39ff..98fff7e 100644 (file)
@@ -99,6 +99,16 @@ Created on Fri Aug 15 15:08:18 2003
          </field>
        </fields>
       </table>
+
+      <table order="1" name=" table with spaces ">
+       <fields>
+         <field
+             name=" field with spaces "
+             is_primary_key="1" data_type="text"
+             default_value=" value with spaces ">
+         </field>
+       </fields>
+      </table>
   </tables>
 
   <views>