diff options
author | Harel Ben-Attia <harelba@gmail.com> | 2015-12-08 10:33:58 +0200 |
---|---|---|
committer | Harel Ben-Attia <harelba@gmail.com> | 2015-12-08 10:33:58 +0200 |
commit | 9167ea05fb56c878c33684e52c842c7ff59c42a2 (patch) | |
tree | abb041259c194832a6ab31d912e9f24c3c6df48f | |
parent | 55d062b61a5b84ff8bc1ca883c452628afa417d3 (diff) |
Fixed bug in escaping double-quotes (#115) + #116
-rwxr-xr-x | bin/q | 15 | ||||
-rwxr-xr-x | test/test-suite | 9 |
2 files changed, 17 insertions, 7 deletions
@@ -1271,6 +1271,10 @@ class QTextAsData(object): return q_output +def escape_double_quotes_if_needed(v): + x = v.replace('"','""') + return x + def quote_none_func(output_delimiter,v): return v @@ -1278,19 +1282,22 @@ def quote_minimal_func(output_delimiter,v): if v is None: return v t = type(v) - if t == str or t == unicode and output_delimiter in v: - return '"%s"' % (v) + if t == str or t == unicode and ((output_delimiter in v) or ('"' in v)): + return '"%s"' % (escape_double_quotes_if_needed(v)) return v; def quote_nonnumeric_func(output_delimiter,v): if v is None: return v if type(v) == str or type(v) == unicode: - return '"%s"' % (v) + return '"%s"' % (escape_double_quotes_if_needed(v)) return v; def quote_all_func(output_delimiter,v): - return '"%s"' % (v) + if type(v) == str or type(v) == unicode: + return '"%s"' % (escape_double_quotes_if_needed(v)) + else: + return '"%s"' % v class QOutputParams(object): def __init__(self, diff --git a/test/test-suite b/test/test-suite index b4eddba..666353f 100755 --- a/test/test-suite +++ b/test/test-suite @@ -870,7 +870,7 @@ class BasicTests(AbstractQTestCase): def test_none_input_quoting_mode_in_relaxed_mode(self): tmp_data_file = self.create_file_with_data(sample_quoted_data2) - cmd = '../bin/q -d " " -m relaxed -D , -w none "select * from %s"' % tmp_data_file.name + cmd = '../bin/q -d " " -m relaxed -D , -w none -W none "select * from %s"' % tmp_data_file.name retcode, o, e = run_command(cmd) self.assertEquals(retcode,0) @@ -879,7 +879,7 @@ class BasicTests(AbstractQTestCase): self.assertEquals(o[0],'"quoted,data",23') self.assertEquals(o[1],'unquoted-data,54,') - + self.cleanup(tmp_data_file) def test_none_input_quoting_mode_in_strict_mode(self): @@ -1593,7 +1593,10 @@ class FormattingTests(AbstractQTestCase): self.assertEquals(o[0], '55.000 5.500') def test_column_formatting_with_output_header(self): - cmd = 'seq 1 10 | sed "1i column_name" | ../bin/q -f 1=%4.3f,2=%4.3f "select sum(column_name) mysum,avg(column_name) myavg from -" -c 1 -H -O' + # Required in order to maintain compatibility between GNU and POSIX sed + # (simplistic 1i column_name sed command did not run properly on mac machines) + sed_cmd = "'1i\\'$'\\n''column_name'$'\\n'" + cmd = 'seq 1 10 | sed ' + sed_cmd + ' | ../bin/q -f 1=%4.3f,2=%4.3f "select sum(column_name) mysum,avg(column_name) myavg from -" -c 1 -H -O' retcode, o, e = run_command(cmd) |