42 lines
1.8 KiB
Diff
42 lines
1.8 KiB
Diff
# UNDF: UNDF-2026-000000757
|
||
# UNDF:
|
||
--- a/influxdb3_catalog/src/catalog/versions/v1.rs
|
||
+++ b/influxdb3_catalog/src/catalog/versions/v1.rs
|
||
@@ -1442,10 +1442,16 @@ impl TableDefinitionV1 {
|
||
pub fn add_columns(
|
||
&mut self,
|
||
columns: Vec<(ColumnId, Arc<str>, InfluxColumnType)>,
|
||
) -> Result<()> {
|
||
+ // Pre-build a HashSet of existing series key IDs for O(1) membership
|
||
+ // checks instead of O(K) Vec::contains per column → O(C×K) total.
|
||
+ let mut series_key_set: std::collections::HashSet<ColumnId> =
|
||
+ self.series_key.iter().copied().collect();
|
||
+
|
||
let mut cols = BTreeMap::new();
|
||
for col_def in self.columns.resource_iter().cloned() {
|
||
cols.insert(Arc::clone(&col_def.name), col_def);
|
||
}
|
||
|
||
let mut sort_key_changed = false;
|
||
|
||
for (id, name, column_type) in columns {
|
||
let nullable = name.as_ref() != TIME_COLUMN_NAME;
|
||
assert!(
|
||
cols.insert(
|
||
Arc::clone(&name),
|
||
Arc::new(ColumnDefinition::new(
|
||
id,
|
||
Arc::clone(&name),
|
||
column_type,
|
||
nullable
|
||
))
|
||
)
|
||
.is_none(),
|
||
"attempted to add existing column"
|
||
);
|
||
// add new tags to the series key in the order provided
|
||
- if matches!(column_type, InfluxColumnType::Tag) && !self.series_key.contains(&id) {
|
||
+ if matches!(column_type, InfluxColumnType::Tag) && series_key_set.insert(id) {
|
||
self.tag_column_name_to_position_id
|
||
.insert(Arc::clone(&name), self.series_key.len() as u8);
|
||
self.series_key.push(id);
|