diff --git a/enginetest/queries/json_scripts.go b/enginetest/queries/json_scripts.go index 475b625ac5..ec9b7e4b17 100644 --- a/enginetest/queries/json_scripts.go +++ b/enginetest/queries/json_scripts.go @@ -187,6 +187,44 @@ var JsonScripts = []ScriptTest{ }, }, }, + { + Name: "json_object preserves escaped characters in key and values", + Assertions: []ScriptTestAssertion{ + { + Query: `select cast(JSON_OBJECT('key"with"quotes\n','3"\\') as char);`, + Expected: []sql.Row{ + {`{"key\"with\"quotes\n": "3\"\\"}`}, + }, + }, + }, + }, + { + Name: "json conversion works with escaped characters", + Assertions: []ScriptTestAssertion{ + { + Query: `SELECT CAST(CAST(JSON_OBJECT('key"with"quotes', 1) as CHAR) as JSON);`, + Expected: []sql.Row{ + {`{"key\"with\"quotes": 1}`}, + }, + }, + }, + }, + { + Name: "json_object with escaped k:v pairs from table", + SetUpScript: []string{ + `CREATE TABLE IF NOT EXISTS textt_7998 (t text);`, + `INSERT INTO textt_7998 VALUES ('first row\n\\'), ('second row"');`, + }, + Assertions: []ScriptTestAssertion{ + { + Query: `SELECT JSON_OBJECT(t, t) FROM textt_7998;`, + Expected: []sql.Row{ + {types.MustJSON(`{"first row\n\\": "first row\n\\"}`)}, + {types.MustJSON(`{"second row\"": "second row\""}`)}, + }, + }, + }, + }, { Name: "json_value preserves types", Assertions: []ScriptTestAssertion{ diff --git a/sql/types/json_encode.go b/sql/types/json_encode.go index 727365b38b..19818d516a 100644 --- a/sql/types/json_encode.go +++ b/sql/types/json_encode.go @@ -210,10 +210,12 @@ func writeMarshalledValue(writer io.Writer, val interface{}) error { writer.Write([]byte{'{'}) for i, k := range keys { - writer.Write([]byte{'"'}) - writer.Write([]byte(k)) - writer.Write([]byte(`": `)) - err := writeMarshalledValue(writer, val[k]) + err := writeMarshalledValue(writer, k) + if err != nil { + return err + } + writer.Write([]byte(`: `)) + err = writeMarshalledValue(writer, val[k]) if err != nil { return err } diff --git a/sql/types/json_encode_test.go b/sql/types/json_encode_test.go index e167dd82d3..4f5190361c 100644 --- a/sql/types/json_encode_test.go +++ b/sql/types/json_encode_test.go @@ -106,6 +106,14 @@ newlines val: decimal.New(123, -2), expected: "1.23", }, + { + name: "formatted key strings", + val: map[string]interface{}{ + "baz\n\\n": "qux", + "foo\"": "bar\t", + }, + expected: `{"foo\"": "bar\t", "baz\n\\n": "qux"}`, + }, } for _, test := range tests {