Skip to content

Commit d57c648

Browse files
authored
refactor(query): refactor test style (#17630)
* refactor(query): refactor test style * refactor(query): refactor test style
1 parent 0c2fa1a commit d57c648

File tree

20 files changed

+664
-748
lines changed

20 files changed

+664
-748
lines changed

src/query/config/src/config.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3304,3 +3304,28 @@ mod cache_config_converters {
33043304
}
33053305
}
33063306
}
3307+
3308+
#[cfg(test)]
3309+
mod test {
3310+
use std::ffi::OsString;
3311+
3312+
use clap::Parser;
3313+
use pretty_assertions::assert_eq;
3314+
3315+
use crate::Config;
3316+
use crate::InnerConfig;
3317+
3318+
/// It's required to make sure setting's default value is the same with clap.
3319+
#[test]
3320+
fn test_config_default() {
3321+
let setting_default = InnerConfig::default();
3322+
let config_default: InnerConfig = Config::parse_from(Vec::<OsString>::new())
3323+
.try_into()
3324+
.expect("parse from args must succeed");
3325+
3326+
assert_eq!(
3327+
setting_default, config_default,
3328+
"default setting is different from default config, please check again"
3329+
)
3330+
}
3331+
}

src/query/config/tests/it/config.rs

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/query/config/tests/it/main.rs

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/query/expression/src/types/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ impl<T: ValueType> ArrayColumn<T> {
262262
}
263263

264264
pub fn memory_size(&self) -> usize {
265-
T::column_memory_size(&self.values) + self.offsets.len() * 8
265+
T::column_memory_size(&self.underlying_column()) + self.offsets.len() * 8
266266
}
267267

268268
// Note: if the array column has been sliced, the number of values may not match the offsets.

src/query/expression/tests/it/block.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
use databend_common_column::buffer::Buffer;
12
use databend_common_expression::block_debug::box_render;
23
use databend_common_expression::types::number::NumberScalar;
34
use databend_common_expression::types::string::StringColumnBuilder;
45
use databend_common_expression::types::AnyType;
6+
use databend_common_expression::types::ArrayColumn;
57
use databend_common_expression::types::DataType;
68
use databend_common_expression::types::Int32Type;
9+
use databend_common_expression::types::Int64Type;
710
use databend_common_expression::types::NumberDataType;
11+
use databend_common_expression::types::StringType;
12+
use databend_common_expression::types::ValueType;
813
use databend_common_expression::BlockEntry;
914
use databend_common_expression::Column;
1015
use databend_common_expression::DataField;
@@ -75,4 +80,26 @@ fn test_block_entry_memory_size() {
7580
let scalar_str = Scalar::String("abc".to_string());
7681
let entry = BlockEntry::new(DataType::String, Value::<AnyType>::Scalar(scalar_str));
7782
assert_eq!(3, entry.memory_size());
83+
84+
let col = StringType::from_data((0..10).map(|x| x.to_string()).collect::<Vec<_>>());
85+
assert_eq!(col.memory_size(), 10 + 10 * 12);
86+
87+
let array = ArrayColumn::<Int64Type>::new(
88+
Buffer::from_iter(0..10i64),
89+
Buffer::from(vec![0u64, 1, 3, 6, 10]),
90+
);
91+
let total_memory_size = array.memory_size(); // 10 * 8 + 5 * 8 = 80 + 40 = 120
92+
let expected = array
93+
.iter()
94+
.map(|x| Int64Type::column_memory_size(&x))
95+
.sum::<usize>()
96+
+ (array.len() + 1) * 8;
97+
assert_eq!(total_memory_size, expected);
98+
99+
let array2 = array.slice(0..2);
100+
let array3 = array.slice(2..4);
101+
assert_eq!(
102+
total_memory_size,
103+
array2.memory_size() + array3.memory_size() - 8
104+
);
78105
}

src/query/expression/tests/it/common.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,17 @@ pub fn run_filter(file: &mut impl Write, predicate: Vec<bool>, block: &DataBlock
4949
}
5050

5151
pub fn run_concat(file: &mut impl Write, blocks: &[DataBlock]) {
52+
let total_block_size: usize = blocks.iter().map(|b| b.memory_size()).sum();
5253
let result = DataBlock::concat(blocks);
5354

5455
match result {
5556
Ok(result_block) => {
57+
let result_block_size = result_block.memory_size();
58+
// bits could be compressed into one byte in nullable column
59+
assert!(
60+
total_block_size >= result_block_size
61+
&& total_block_size as f64 <= result_block_size as f64 * 1.5f64
62+
);
5663
for (i, c) in blocks.iter().enumerate() {
5764
writeln!(file, "Concat-Column {i}:").unwrap();
5865
writeln!(file, "{c:?}").unwrap();

src/query/formats/src/field_decoder/fast_values.rs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,3 +709,134 @@ pub fn skip_to_next_row<R: AsRef<[u8]>>(reader: &mut Cursor<R>, mut balance: i32
709709
}
710710
Ok(())
711711
}
712+
713+
#[cfg(test)]
714+
mod test {
715+
716+
use std::io::Write;
717+
718+
use databend_common_exception::ErrorCode;
719+
use databend_common_exception::Result;
720+
use databend_common_expression::types::DataType;
721+
use databend_common_expression::types::NumberDataType;
722+
use databend_common_expression::ColumnBuilder;
723+
use databend_common_expression::DataBlock;
724+
use databend_common_expression::Scalar;
725+
use databend_common_io::prelude::FormatSettings;
726+
use goldenfile::Mint;
727+
728+
use super::FastFieldDecoderValues;
729+
use super::FastValuesDecodeFallback;
730+
use super::FastValuesDecoder;
731+
732+
struct DummyFastValuesDecodeFallback {}
733+
734+
#[async_trait::async_trait]
735+
impl FastValuesDecodeFallback for DummyFastValuesDecodeFallback {
736+
async fn parse_fallback(&self, _data: &str) -> Result<Vec<Scalar>> {
737+
Err(ErrorCode::Unimplemented("fallback".to_string()))
738+
}
739+
}
740+
741+
#[tokio::test]
742+
async fn test_fast_values_decoder_multi() -> Result<()> {
743+
let mut mint = Mint::new("testdata");
744+
let file = &mut mint.new_goldenfile("fast_values.txt").unwrap();
745+
746+
struct Test {
747+
data: &'static str,
748+
column_types: Vec<DataType>,
749+
}
750+
751+
let cases = vec![
752+
Test {
753+
data: "(0, 1, 2), (3,4,5)",
754+
column_types: vec![
755+
DataType::Number(NumberDataType::Int16),
756+
DataType::Number(NumberDataType::Int16),
757+
DataType::Number(NumberDataType::Int16),
758+
],
759+
},
760+
Test {
761+
data: "(0, 1, 2), (3,4,5), ",
762+
column_types: vec![
763+
DataType::Number(NumberDataType::Int16),
764+
DataType::Number(NumberDataType::Int16),
765+
DataType::Number(NumberDataType::Int16),
766+
],
767+
},
768+
Test {
769+
data: "('', '', '')",
770+
column_types: vec![
771+
DataType::Number(NumberDataType::Int16),
772+
DataType::Number(NumberDataType::Int16),
773+
DataType::Number(NumberDataType::Int16),
774+
],
775+
},
776+
Test {
777+
data: "( 1, '', '2022-10-01')",
778+
column_types: vec![
779+
DataType::Number(NumberDataType::Int16),
780+
DataType::String,
781+
DataType::Date,
782+
],
783+
},
784+
Test {
785+
data: "(1, 2, 3), (1, 1, 1), (1, 1, 1);",
786+
column_types: vec![
787+
DataType::Number(NumberDataType::Int16),
788+
DataType::Number(NumberDataType::Int16),
789+
DataType::Number(NumberDataType::Int16),
790+
],
791+
},
792+
Test {
793+
data: "(1, 2, 3), (1, 1, 1), (1, 1, 1); ",
794+
column_types: vec![
795+
DataType::Number(NumberDataType::Int16),
796+
DataType::Number(NumberDataType::Int16),
797+
DataType::Number(NumberDataType::Int16),
798+
],
799+
},
800+
Test {
801+
data: "(1.2, -2.9, 3.55), (3.12e2, 3.45e+3, -1.9e-3);",
802+
column_types: vec![
803+
DataType::Number(NumberDataType::Int16),
804+
DataType::Number(NumberDataType::Int16),
805+
DataType::Number(NumberDataType::Int16),
806+
],
807+
},
808+
];
809+
810+
for case in cases {
811+
writeln!(file, "---------- Input Data ----------")?;
812+
writeln!(file, "{:?}", case.data)?;
813+
814+
writeln!(file, "---------- Input Column Types ----------")?;
815+
writeln!(file, "{:?}", case.column_types)?;
816+
817+
let field_decoder =
818+
FastFieldDecoderValues::create_for_insert(FormatSettings::default(), true);
819+
let mut values_decoder = FastValuesDecoder::new(case.data, &field_decoder);
820+
let fallback = DummyFastValuesDecodeFallback {};
821+
let mut columns = case
822+
.column_types
823+
.into_iter()
824+
.map(|dt| ColumnBuilder::with_capacity(&dt, values_decoder.estimated_rows()))
825+
.collect::<Vec<_>>();
826+
let result = values_decoder.parse(&mut columns, &fallback).await;
827+
828+
writeln!(file, "---------- Output ---------")?;
829+
830+
if let Err(err) = result {
831+
writeln!(file, "{}", err)?;
832+
} else {
833+
let columns = columns.into_iter().map(|cb| cb.build()).collect::<Vec<_>>();
834+
let got = DataBlock::new_from_columns(columns);
835+
writeln!(file, "{}", got)?;
836+
}
837+
writeln!(file, "\n")?;
838+
}
839+
840+
Ok(())
841+
}
842+
}

src/query/formats/src/field_encoder/helpers/escape.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,106 @@ pub fn write_tsv_escaped_string(bytes: &[u8], buf: &mut Vec<u8>, field_delimiter
9191
buf.extend_from_slice(&bytes[start..]);
9292
}
9393
}
94+
95+
#[cfg(test)]
96+
mod test {
97+
use crate::field_encoder::helpers::write_json_string;
98+
use crate::field_encoder::helpers::write_tsv_escaped_string;
99+
use crate::field_encoder::write_csv_string;
100+
101+
#[test]
102+
fn test_escape() {
103+
{
104+
let mut buf = vec![];
105+
write_tsv_escaped_string(b"\0\n\r\t\\\'", &mut buf, b'\t');
106+
assert_eq!(&buf, b"\\0\\n\\r\\t\\\\\'")
107+
}
108+
109+
{
110+
let mut buf = vec![];
111+
write_tsv_escaped_string(b"\n123\n456\n", &mut buf, b'\t');
112+
assert_eq!(&buf, b"\\n123\\n456\\n")
113+
}
114+
115+
{
116+
let mut buf = vec![];
117+
write_tsv_escaped_string(b"123\n", &mut buf, b'\t');
118+
assert_eq!(&buf, b"123\\n")
119+
}
120+
121+
{
122+
let mut buf = vec![];
123+
write_tsv_escaped_string(b"\n123", &mut buf, b'\t');
124+
assert_eq!(&buf, b"\\n123")
125+
}
126+
127+
{
128+
let mut buf = vec![];
129+
write_tsv_escaped_string(b"\n,23", &mut buf, b',');
130+
assert_eq!(&buf, b"\\n\\,23")
131+
}
132+
}
133+
134+
#[test]
135+
fn test_json_escape() {
136+
let basic = b"\0\n\r\t\'/\"\\";
137+
{
138+
let mut buf = vec![];
139+
write_json_string(basic, &mut buf, false, true);
140+
assert_eq!(&buf, b"\\u0000\\n\\r\\t\'\\/\\\"\\\\")
141+
}
142+
143+
{
144+
let mut buf = vec![];
145+
write_json_string(basic, &mut buf, false, false);
146+
assert_eq!(&buf, b"\\u0000\\n\\r\\t\'/\\\"\\\\")
147+
}
148+
149+
{
150+
let mut buf = vec![];
151+
write_json_string(basic, &mut buf, true, true);
152+
assert_eq!(&buf, b"\\u0000\\n\\r\\t\'\\/\"\"\\\\")
153+
}
154+
155+
{
156+
let mut buf = vec![];
157+
write_json_string(b"\n123\n456\n", &mut buf, true, true);
158+
assert_eq!(&buf, b"\\n123\\n456\\n")
159+
}
160+
161+
{
162+
let mut buf = vec![];
163+
write_json_string(b"123\n", &mut buf, true, true);
164+
assert_eq!(&buf, b"123\\n")
165+
}
166+
167+
{
168+
let mut buf = vec![];
169+
write_json_string(b"\n123", &mut buf, true, true);
170+
assert_eq!(&buf, b"\\n123")
171+
}
172+
173+
{
174+
let mut buf = vec![];
175+
write_json_string(b"\n123", &mut buf, true, true);
176+
assert_eq!(&buf, b"\\n123")
177+
}
178+
179+
{
180+
let s = "123\u{2028}\u{2029}abc";
181+
let mut buf = vec![];
182+
write_json_string(s.as_bytes(), &mut buf, true, true);
183+
assert_eq!(&buf, b"123\\u2028\\u2029abc")
184+
}
185+
}
186+
187+
#[test]
188+
fn test_csv_string() {
189+
{
190+
let s = "a\"\nb";
191+
let mut buf = vec![];
192+
write_csv_string(s.as_bytes(), &mut buf, b'"');
193+
assert_eq!(&buf, b"\"a\"\"\nb\"")
194+
}
195+
}
196+
}

0 commit comments

Comments
 (0)