Commit 2cc15b18 authored by Joe Tsai's avatar Joe Tsai Committed by Joe Tsai

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: 's avatarIan Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 5d22cebb
...@@ -91,7 +91,7 @@ var ( ...@@ -91,7 +91,7 @@ var (
var errInvalidDelim = errors.New("csv: invalid field or comment delimiter") var errInvalidDelim = errors.New("csv: invalid field or comment delimiter")
func validDelim(r rune) bool { 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. // A Reader reads records from a CSV-encoded file.
......
...@@ -359,6 +359,10 @@ x,,, ...@@ -359,6 +359,10 @@ x,,,
Error: errInvalidDelim, Error: errInvalidDelim,
}, { }, {
Name: "BadComma3", Name: "BadComma3",
Comma: '"',
Error: errInvalidDelim,
}, {
Name: "BadComma4",
Comma: utf8.RuneError, Comma: utf8.RuneError,
Error: errInvalidDelim, Error: errInvalidDelim,
}, { }, {
......
...@@ -13,7 +13,9 @@ import ( ...@@ -13,7 +13,9 @@ import (
var writeTests = []struct { var writeTests = []struct {
Input [][]string Input [][]string
Output string Output string
Error error
UseCRLF bool UseCRLF bool
Comma rune
}{ }{
{Input: [][]string{{"abc"}}, Output: "abc\n"}, {Input: [][]string{{"abc"}}, Output: "abc\n"},
{Input: [][]string{{"abc"}}, Output: "abc\r\n", UseCRLF: true}, {Input: [][]string{{"abc"}}, Output: "abc\r\n", UseCRLF: true},
...@@ -41,6 +43,9 @@ var writeTests = []struct { ...@@ -41,6 +43,9 @@ var writeTests = []struct {
{Input: [][]string{{`\.`}}, Output: "\"\\.\"\n"}, {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{{",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) { func TestWrite(t *testing.T) {
...@@ -48,9 +53,12 @@ func TestWrite(t *testing.T) { ...@@ -48,9 +53,12 @@ func TestWrite(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
f := NewWriter(b) f := NewWriter(b)
f.UseCRLF = tt.UseCRLF f.UseCRLF = tt.UseCRLF
if tt.Comma != 0 {
f.Comma = tt.Comma
}
err := f.WriteAll(tt.Input) err := f.WriteAll(tt.Input)
if err != nil { if err != tt.Error {
t.Errorf("Unexpected error: %s\n", err) t.Errorf("Unexpected error:\ngot %v\nwant %v", err, tt.Error)
} }
out := b.String() out := b.String()
if out != tt.Output { if out != tt.Output {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment