-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathtable_parsing.rs
84 lines (72 loc) · 2.91 KB
/
table_parsing.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use std::{
fs::{read_to_string, File},
io::Read,
path::PathBuf, sync::Arc,
};
use innodb::innodb::{
buffer_manager::DummyBufferMangaer, charset::InnoDBCharset, page::{index::{record::RecordType, IndexPage}, Page, PageType}, table::{
field::{Field, FieldType, FieldValue}, row::Row, TableDefinition
}
};
#[test]
#[ignore]
fn test_parsing_table_with_floats() {
let sql = read_to_string(
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("test_data")
.join("double_test_table.sql"),
)
.unwrap();
let reference = TableDefinition {
name: String::from("float_sample"),
cluster_columns: vec![Field::new(
"text",
FieldType::Text(20, InnoDBCharset::Utf8mb4),
false,
)],
data_columns: vec![
Field::new("single_f", FieldType::Float, true),
Field::new("double_f", FieldType::Double, true),
],
};
let parsed_table = Arc::new(TableDefinition::try_from_sql_statement(&sql).expect("Failed to parse SQL"));
assert_eq!(parsed_table.as_ref(), &reference);
let mut table_content_file = File::open(
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("test_data")
.join("float_sample.ibd"),
)
.expect("Can't open test table");
let reference_values = vec![
vec![FieldValue::String(String::from("test1")), FieldValue::Float(1.1), FieldValue::Double(2.2)],
vec![FieldValue::String(String::from("test2")), FieldValue::Float(-0.9), FieldValue::Double(-1.42)],
];
let mut parsed_values = Vec::<Vec<FieldValue>>::new();
let buf_mgr = DummyBufferMangaer;
let mut buffer = Vec::<u8>::new();
buffer.resize(16384, 0);
loop {
match table_content_file.read_exact(&mut buffer) {
Ok(_) => {
let page = Page::from_bytes(&buffer).unwrap();
if page.header.page_type == PageType::Index {
let index = IndexPage::try_from_page(page).unwrap();
assert_eq!(index.index_header.index_id, 960, "Wrong Index ID");
let mut record = index.infimum().unwrap();
while record.next().is_some() {
if record.header.record_type == RecordType::Conventional {
let row = Row::try_from_record_and_table(&record, &parsed_table).expect("Failed to parse row");
let values = row.parse_values(&buf_mgr);
assert_eq!(values.len(), parsed_table.field_count());
parsed_values.push(values);
}
record = record.next().unwrap();
}
assert_eq!(record.header.record_type, RecordType::Supremum);
}
}
Err(_) => break,
}
}
assert_eq!(parsed_values, reference_values);
}