From 3010847f5c2c50bce1969689a0b77fd8a6fb7e55 Mon Sep 17 00:00:00 2001 From: Nik Klassen Date: Sat, 23 Oct 2021 17:13:16 -0400 Subject: [PATCH] fix: correctly escape single quotes in pg arrays --- dialect/pgdialect/append.go | 2 +- dialect/pgdialect/array_parser.go | 8 ++++++++ dialect/pgdialect/array_parser_test.go | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dialect/pgdialect/append.go b/dialect/pgdialect/append.go index 569eb032..d5e0d0a5 100644 --- a/dialect/pgdialect/append.go +++ b/dialect/pgdialect/append.go @@ -286,7 +286,7 @@ func arrayAppendString(b []byte, s string) []byte { case 0: // ignore case '\'': - b = append(b, "'''"...) + b = append(b, "''"...) case '"': b = append(b, '\\', '"') case '\\': diff --git a/dialect/pgdialect/array_parser.go b/dialect/pgdialect/array_parser.go index d3b6035c..0dff754f 100644 --- a/dialect/pgdialect/array_parser.go +++ b/dialect/pgdialect/array_parser.go @@ -110,6 +110,14 @@ func (p *arrayParser) readSubstring() ([]byte, error) { } continue } + if c == '\'' && next == '\'' { + p.buf = append(p.buf, next) + c, err = p.readByte() + if err != nil { + return nil, err + } + continue + } p.buf = append(p.buf, c) c = next diff --git a/dialect/pgdialect/array_parser_test.go b/dialect/pgdialect/array_parser_test.go index c31ed2cd..8e0ba8e4 100644 --- a/dialect/pgdialect/array_parser_test.go +++ b/dialect/pgdialect/array_parser_test.go @@ -13,9 +13,9 @@ func TestArrayParser(t *testing.T) { {`{}`, []string{}}, {`{""}`, []string{""}}, {`{"\\"}`, []string{`\`}}, - {`{"''"}`, []string{"''"}}, - {`{{"''\"{}"}}`, []string{`{"''\"{}"}`}}, - {`{"''\"{}"}`, []string{`''"{}`}}, + {`{"''"}`, []string{"'"}}, + {`{{"'\"{}"}}`, []string{`{"'\"{}"}`}}, + {`{"'\"{}"}`, []string{`'"{}`}}, {"{1,2}", []string{"1", "2"}}, {"{1,NULL}", []string{"1", ""}},