Skip to content

Commit 254feaf

Browse files
authored
Merge pull request #7738 from andylokandy/alloc
refactor(function): eliminate an allocation in parse_json()
2 parents a823c4e + d8e32bb commit 254feaf

File tree

3 files changed

+19
-24
lines changed

3 files changed

+19
-24
lines changed

src/common/jsonb/src/value.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414

1515
use std::borrow::Cow;
1616
use std::collections::BTreeMap;
17+
use std::fmt;
1718
use std::fmt::Debug;
1819
use std::fmt::Display;
1920
use std::fmt::Formatter;
20-
use std::fmt::{self};
21-
use std::io::Write;
2221
use std::ops::Neg;
2322

2423
use decimal_rs::Decimal;
@@ -214,11 +213,9 @@ impl<'a> Value<'a> {
214213
}
215214

216215
/// Attempts to serialize the JSONB Value into a byte stream.
217-
pub fn to_writer<W: Write>(&self, mut writer: W) -> Result<(), Error> {
218-
let mut buf = Vec::new();
219-
let mut encoder = Encoder::new(&mut buf);
216+
pub fn to_vec(&self, buf: &mut Vec<u8>) -> Result<(), Error> {
217+
let mut encoder = Encoder::new(buf);
220218
encoder.encode(self)?;
221-
writer.write_all(&buf)?;
222219
Ok(())
223220
}
224221
}

src/common/jsonb/tests/it/parser.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fn test_parse_null() {
2424
assert_eq!(value.as_null(), Some(()));
2525

2626
let mut buf: Vec<u8> = Vec::new();
27-
value.to_writer(&mut buf).unwrap();
27+
value.to_vec(&mut buf).unwrap();
2828
assert_eq!(buf, b"\x20\0\0\0\0\0\0\0");
2929
}
3030

@@ -35,7 +35,7 @@ fn test_parse_boolean() {
3535
assert_eq!(value.as_bool(), Some(true));
3636

3737
let mut buf: Vec<u8> = Vec::new();
38-
value.to_writer(&mut buf).unwrap();
38+
value.to_vec(&mut buf).unwrap();
3939
assert_eq!(buf, b"\x20\0\0\0\x40\0\0\0");
4040

4141
let s = r#"false"#;
@@ -44,7 +44,7 @@ fn test_parse_boolean() {
4444
assert_eq!(value.as_bool(), Some(false));
4545

4646
let mut buf: Vec<u8> = Vec::new();
47-
value.to_writer(&mut buf).unwrap();
47+
value.to_vec(&mut buf).unwrap();
4848
assert_eq!(buf, b"\x20\0\0\0\x30\0\0\0");
4949
}
5050

@@ -56,7 +56,7 @@ fn test_parse_number_int64() {
5656
assert_eq!(value.as_i64(), Some(-1234));
5757

5858
let mut buf: Vec<u8> = Vec::new();
59-
value.to_writer(&mut buf).unwrap();
59+
value.to_vec(&mut buf).unwrap();
6060
assert_eq!(buf, b"\x20\0\0\0\x20\0\0\x04\x03\0\xd2\x04");
6161

6262
let s = r#"34567890"#;
@@ -65,7 +65,7 @@ fn test_parse_number_int64() {
6565
assert_eq!(value.as_i64(), Some(34567890));
6666

6767
let mut buf: Vec<u8> = Vec::new();
68-
value.to_writer(&mut buf).unwrap();
68+
value.to_vec(&mut buf).unwrap();
6969
assert_eq!(buf, b"\x20\0\0\0\x20\0\0\x06\x02\0\xd2\x76\x0f\x02");
7070
}
7171

@@ -77,7 +77,7 @@ fn test_parse_number_float64() {
7777
assert_eq!(value.as_f64(), Some(0.0123));
7878

7979
let mut buf: Vec<u8> = Vec::new();
80-
value.to_writer(&mut buf).unwrap();
80+
value.to_vec(&mut buf).unwrap();
8181
assert_eq!(buf, b"\x20\0\0\0\x20\0\0\x03\x02\x04\x7b");
8282

8383
let s = r#"12.34e5"#;
@@ -86,7 +86,7 @@ fn test_parse_number_float64() {
8686
assert_eq!(value.as_f64(), Some(1234000.0));
8787

8888
let mut buf: Vec<u8> = Vec::new();
89-
value.to_writer(&mut buf).unwrap();
89+
value.to_vec(&mut buf).unwrap();
9090
assert_eq!(buf, b"\x20\0\0\0\x20\0\0\x04\0\x03\xd2\x04");
9191
}
9292

@@ -98,7 +98,7 @@ fn test_parse_string() {
9898
assert_eq!(value.as_str(), Some(&Cow::from("asd")));
9999

100100
let mut buf: Vec<u8> = Vec::new();
101-
value.to_writer(&mut buf).unwrap();
101+
value.to_vec(&mut buf).unwrap();
102102
assert_eq!(buf, b"\x20\0\0\0\x10\0\0\x03\x61\x73\x64");
103103

104104
let s = r#""\\\"abc\\\"""#;
@@ -107,7 +107,7 @@ fn test_parse_string() {
107107
assert_eq!(value.as_str(), Some(&Cow::from("\\\"abc\\\"")));
108108

109109
let mut buf: Vec<u8> = Vec::new();
110-
value.to_writer(&mut buf).unwrap();
110+
value.to_vec(&mut buf).unwrap();
111111
assert_eq!(buf, b"\x20\0\0\0\x10\0\0\x07\x5c\x22\x61\x62\x63\x5c\x22");
112112

113113
let s = r#""测试abc""#;
@@ -116,7 +116,7 @@ fn test_parse_string() {
116116
assert_eq!(value.as_str(), Some(&Cow::from("测试abc")));
117117

118118
let mut buf: Vec<u8> = Vec::new();
119-
value.to_writer(&mut buf).unwrap();
119+
value.to_vec(&mut buf).unwrap();
120120
assert_eq!(
121121
buf,
122122
b"\x20\0\0\0\x10\0\0\x09\xe6\xb5\x8b\xe8\xaf\x95\x61\x62\x63"
@@ -128,7 +128,7 @@ fn test_parse_string() {
128128
assert_eq!(value.as_str(), Some(&Cow::from("€")));
129129

130130
let mut buf: Vec<u8> = Vec::new();
131-
value.to_writer(&mut buf).unwrap();
131+
value.to_vec(&mut buf).unwrap();
132132
assert_eq!(buf, b"\x20\0\0\0\x10\0\0\x03\xe2\x82\xac");
133133
}
134134

@@ -139,15 +139,15 @@ fn test_parse_array() {
139139
assert!(value.is_array());
140140

141141
let mut buf: Vec<u8> = Vec::new();
142-
value.to_writer(&mut buf).unwrap();
142+
value.to_vec(&mut buf).unwrap();
143143
assert_eq!(buf, b"\x80\0\0\x06\x40\0\0\0\x20\0\0\x02\x20\0\0\x03\x20\0\0\x05\x10\0\0\x03\x50\0\0\x04\x39\x30\x03\0\xc8\x02\x04\xc2\x12\x0c\x61\x73\x64\x80\0\0\0");
144144

145145
let s = r#"[1,2,3,["a","b","c"]]"#;
146146
let value = parse_value(s.as_bytes()).unwrap();
147147
assert!(value.is_array());
148148

149149
let mut buf: Vec<u8> = Vec::new();
150-
value.to_writer(&mut buf).unwrap();
150+
value.to_vec(&mut buf).unwrap();
151151
assert_eq!(buf, b"\x80\0\0\x04\x20\0\0\x01\x20\0\0\x01\x20\0\0\x01\x50\0\0\x13\x01\x02\x03\x80\0\0\x03\x10\0\0\x01\x10\0\0\x01\x10\0\0\x01\x61\x62\x63");
152152
}
153153

@@ -158,15 +158,15 @@ fn test_parse_object() {
158158
assert!(value.is_object());
159159

160160
let mut buf: Vec<u8> = Vec::new();
161-
value.to_writer(&mut buf).unwrap();
161+
value.to_vec(&mut buf).unwrap();
162162
assert_eq!(buf, b"\x40\0\0\x02\x10\0\0\x02\x10\0\0\x02\x10\0\0\x02\x10\0\0\x02\x6b\x31\x6b\x32\x76\x31\x76\x32");
163163

164164
let s = r#"{"k":"v","a":"b"}"#;
165165
let value = parse_value(s.as_bytes()).unwrap();
166166
assert!(value.is_object());
167167

168168
let mut buf: Vec<u8> = Vec::new();
169-
value.to_writer(&mut buf).unwrap();
169+
value.to_vec(&mut buf).unwrap();
170170
assert_eq!(
171171
buf,
172172
b"\x40\0\0\x02\x10\0\0\x01\x10\0\0\x01\x10\0\0\x01\x10\0\0\x01\x61\x6b\x62\x76"

src/query/functions-v2/src/scalars/variant.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,9 @@ pub fn register(registry: &mut FunctionRegistry) {
3535
let value = parse_value(s).map_err(|err| {
3636
format!("unable to parse '{}': {}", &String::from_utf8_lossy(s), err)
3737
})?;
38-
let mut buf: Vec<u8> = Vec::new();
3938
value
40-
.to_writer(&mut buf)
39+
.to_vec(&mut output.data)
4140
.map_err(|_| "unable to encode jsonb".to_string())?;
42-
output.put_slice(buf.as_slice());
4341
output.commit_row();
4442

4543
Ok(())

0 commit comments

Comments
 (0)