2
0

Fix: Text array parsing disambiguates NULL and "NULL".

This solution is a little awkward, but it avoids breaking backwards
compatibility.

fixes #78
This commit is contained in:
Jack Christensen
2020-11-07 07:31:56 -06:00
parent 36a8da55cc
commit 740b3a5115
27 changed files with 58 additions and 34 deletions
+12 -10
View File
@@ -82,6 +82,7 @@ func (src ArrayHeader) EncodeBinary(ci *ConnInfo, buf []byte) []byte {
type UntypedTextArray struct {
Elements []string
Quoted []bool
Dimensions []ArrayDimension
}
@@ -196,13 +197,14 @@ func ParseUntypedTextArray(src string) (*UntypedTextArray, error) {
}
default:
buf.UnreadRune()
value, err := arrayParseValue(buf)
value, quoted, err := arrayParseValue(buf)
if err != nil {
return nil, errors.Errorf("invalid array value: %v", err)
}
if currentDim == counterDim {
implicitDimensions[currentDim].Length++
}
dst.Quoted = append(dst.Quoted, quoted)
dst.Elements = append(dst.Elements, value)
}
@@ -239,10 +241,10 @@ func skipWhitespace(buf *bytes.Buffer) {
}
}
func arrayParseValue(buf *bytes.Buffer) (string, error) {
func arrayParseValue(buf *bytes.Buffer) (string, bool, error) {
r, _, err := buf.ReadRune()
if err != nil {
return "", err
return "", false, err
}
if r == '"' {
return arrayParseQuotedValue(buf)
@@ -254,41 +256,41 @@ func arrayParseValue(buf *bytes.Buffer) (string, error) {
for {
r, _, err := buf.ReadRune()
if err != nil {
return "", err
return "", false, err
}
switch r {
case ',', '}':
buf.UnreadRune()
return s.String(), nil
return s.String(), false, nil
}
s.WriteRune(r)
}
}
func arrayParseQuotedValue(buf *bytes.Buffer) (string, error) {
func arrayParseQuotedValue(buf *bytes.Buffer) (string, bool, error) {
s := &bytes.Buffer{}
for {
r, _, err := buf.ReadRune()
if err != nil {
return "", err
return "", false, err
}
switch r {
case '\\':
r, _, err = buf.ReadRune()
if err != nil {
return "", err
return "", false, err
}
case '"':
r, _, err = buf.ReadRune()
if err != nil {
return "", err
return "", false, err
}
buf.UnreadRune()
return s.String(), nil
return s.String(), true, nil
}
s.WriteRune(r)
}