summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarel Ben-Attia <harelba@gmail.com>2015-12-08 10:33:58 +0200
committerHarel Ben-Attia <harelba@gmail.com>2015-12-08 10:33:58 +0200
commit9167ea05fb56c878c33684e52c842c7ff59c42a2 (patch)
treeabb041259c194832a6ab31d912e9f24c3c6df48f
parent55d062b61a5b84ff8bc1ca883c452628afa417d3 (diff)
Fixed bug in escaping double-quotes (#115) + #116
-rwxr-xr-xbin/q15
-rwxr-xr-xtest/test-suite9
2 files changed, 17 insertions, 7 deletions
diff --git a/bin/q b/bin/q
index 3c09901..f9fdab4 100755
--- a/bin/q
+++ b/bin/q
@@ -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)