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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// SPDX-License-Identifier: Apache-2.0
//! Truncate operation on `ColumnData`: discard rows beyond a given index.
use super::types::ColumnData;
impl ColumnData {
/// Truncate this column to `n` rows, discarding any rows beyond that point.
///
/// Used by transaction rollback to restore the column to its pre-write state.
/// Panics in debug builds if `n > self.len()`.
pub(crate) fn truncate(&mut self, n: usize) {
debug_assert!(
n <= self.len(),
"truncate({n}) exceeds column length {}",
self.len()
);
match self {
Self::Int64 { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Float64 { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Bool { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Timestamp { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Decimal { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Uuid { values, valid } => {
values.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
Self::String {
data,
offsets,
valid,
} => {
// offsets has length n_rows + 1; truncate to n+1.
if n < offsets.len().saturating_sub(1) {
let byte_end = offsets[n] as usize;
data.truncate(byte_end);
offsets.truncate(n + 1);
}
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Bytes {
data,
offsets,
valid,
} => {
if n < offsets.len().saturating_sub(1) {
let byte_end = offsets[n] as usize;
data.truncate(byte_end);
offsets.truncate(n + 1);
}
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Geometry {
data,
offsets,
valid,
} => {
if n < offsets.len().saturating_sub(1) {
let byte_end = offsets[n] as usize;
data.truncate(byte_end);
offsets.truncate(n + 1);
}
if let Some(v) = valid {
v.truncate(n);
}
}
Self::Vector { data, dim, valid } => {
let d = *dim as usize;
if d > 0 {
data.truncate(n * d);
}
if let Some(v) = valid {
v.truncate(n);
}
}
Self::DictEncoded { ids, valid, .. } => {
ids.truncate(n);
if let Some(v) = valid {
v.truncate(n);
}
}
}
}
}