diff options
author | Joe Tsai <joetsai@digital-static.net> | 2018-03-08 14:39:43 -0800 |
---|---|---|
committer | Joe Tsai <thebrokentoaster@gmail.com> | 2018-03-09 00:33:43 +0000 |
commit | 2cc15b18dbab600939147dfe4c58aa6b8f04586e (patch) | |
tree | e42511b0883e8b2dba026efd46e80fce4e16e6f3 /src/encoding/csv | |
parent | 5d22cebb1272b3761860c5fa9ee82ceb3d94c628 (diff) | |
download | go-2cc15b18dbab600939147dfe4c58aa6b8f04586e.tar.gz go-2cc15b18dbab600939147dfe4c58aa6b8f04586e.zip |
encoding/csv: disallow quote for use as Comma
'"' has special semantic meaning that conflicts with using it as Comma.
Change-Id: Ife25ba43ca25dba2ea184c1bb7579a230d376059
Reviewed-on: https://go-review.googlesource.com/99696
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/csv')
-rw-r--r-- | src/encoding/csv/reader.go | 2 | ||||
-rw-r--r-- | src/encoding/csv/reader_test.go | 4 | ||||
-rw-r--r-- | src/encoding/csv/writer_test.go | 12 |
3 files changed, 15 insertions, 3 deletions
diff --git a/src/encoding/csv/reader.go b/src/encoding/csv/reader.go index 2efc7ad094..a2fd4c0970 100644 --- a/src/encoding/csv/reader.go +++ b/src/encoding/csv/reader.go @@ -91,7 +91,7 @@ var ( var errInvalidDelim = errors.New("csv: invalid field or comment delimiter") func validDelim(r rune) bool { - return r != 0 && r != '\r' && r != '\n' && utf8.ValidRune(r) && r != utf8.RuneError + return r != 0 && r != '"' && r != '\r' && r != '\n' && utf8.ValidRune(r) && r != utf8.RuneError } // A Reader reads records from a CSV-encoded file. diff --git a/src/encoding/csv/reader_test.go b/src/encoding/csv/reader_test.go index 1fc69f9ab8..5121791cb3 100644 --- a/src/encoding/csv/reader_test.go +++ b/src/encoding/csv/reader_test.go @@ -359,6 +359,10 @@ x,,, Error: errInvalidDelim, }, { Name: "BadComma3", + Comma: '"', + Error: errInvalidDelim, + }, { + Name: "BadComma4", Comma: utf8.RuneError, Error: errInvalidDelim, }, { diff --git a/src/encoding/csv/writer_test.go b/src/encoding/csv/writer_test.go index 99bc84e998..011f01c172 100644 --- a/src/encoding/csv/writer_test.go +++ b/src/encoding/csv/writer_test.go @@ -13,7 +13,9 @@ import ( var writeTests = []struct { Input [][]string Output string + Error error UseCRLF bool + Comma rune }{ {Input: [][]string{{"abc"}}, Output: "abc\n"}, {Input: [][]string{{"abc"}}, Output: "abc\r\n", UseCRLF: true}, @@ -41,6 +43,9 @@ var writeTests = []struct { {Input: [][]string{{`\.`}}, Output: "\"\\.\"\n"}, {Input: [][]string{{"x09\x41\xb4\x1c", "aktau"}}, Output: "x09\x41\xb4\x1c,aktau\n"}, {Input: [][]string{{",x09\x41\xb4\x1c", "aktau"}}, Output: "\",x09\x41\xb4\x1c\",aktau\n"}, + {Input: [][]string{{"a", "a", ""}}, Output: "a|a|\n", Comma: '|'}, + {Input: [][]string{{",", ",", ""}}, Output: ",|,|\n", Comma: '|'}, + {Input: [][]string{{"foo"}}, Comma: '"', Error: errInvalidDelim}, } func TestWrite(t *testing.T) { @@ -48,9 +53,12 @@ func TestWrite(t *testing.T) { b := &bytes.Buffer{} f := NewWriter(b) f.UseCRLF = tt.UseCRLF + if tt.Comma != 0 { + f.Comma = tt.Comma + } err := f.WriteAll(tt.Input) - if err != nil { - t.Errorf("Unexpected error: %s\n", err) + if err != tt.Error { + t.Errorf("Unexpected error:\ngot %v\nwant %v", err, tt.Error) } out := b.String() if out != tt.Output { |