Skip to content

Commit 96461c2

Browse files
authored
feat(query): Support create/drop Vector(HNSW) index (#18077)
* feat(query): Support create/drop vector index * fix * fix tests * fix tests
1 parent 8633f73 commit 96461c2

File tree

50 files changed

+583
-899
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+583
-899
lines changed

Cargo.lock

Lines changed: 14 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ members = [
8484
"src/query/ee_features/storage_encryption",
8585
"src/query/ee_features/stream_handler",
8686
"src/query/ee_features/storage_quota",
87-
"src/query/ee_features/inverted_index",
87+
"src/query/ee_features/table_index",
8888
"src/query/ee_features/virtual_column",
8989
"src/query/ee_features/resources_management",
9090
"src/query/service",
@@ -193,14 +193,13 @@ databend-enterprise-attach-table = { path = "src/query/ee_features/attach_table"
193193
databend-enterprise-data-mask-feature = { path = "src/query/ee_features/data_mask" }
194194
databend-enterprise-fail-safe = { path = "src/query/ee_features/fail_safe" }
195195
databend-enterprise-hilbert-clustering = { path = "src/query/ee_features/hilbert_clustering" }
196-
databend-enterprise-inverted-index = { path = "src/query/ee_features/inverted_index" }
197196
databend-enterprise-meta = { path = "src/meta/ee" }
198-
databend-enterprise-ngram-index = { path = "src/query/ee_features/ngram_index" }
199197
databend-enterprise-query = { path = "src/query/ee" }
200198
databend-enterprise-resources-management = { path = "src/query/ee_features/resources_management" }
201199
databend-enterprise-storage-encryption = { path = "src/query/ee_features/storage_encryption" }
202200
databend-enterprise-storage-quota = { path = "src/query/ee_features/storage_quota" }
203201
databend-enterprise-stream-handler = { path = "src/query/ee_features/stream_handler" }
202+
databend-enterprise-table-index = { path = "src/query/ee_features/table_index" }
204203
databend-enterprise-vacuum-handler = { path = "src/query/ee_features/vacuum_handler" }
205204
databend-enterprise-virtual-column = { path = "src/query/ee_features/virtual_column" }
206205
databend-functions-scalar-arithmetic = { path = "src/query/functions/src/scalars/arithmetic" }

src/common/license/src/license.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ pub enum Feature {
8181
WorkloadGroup,
8282
#[serde(alias = "system_history", alias = "SYSTEM_HISTORY")]
8383
SystemHistory,
84+
#[serde(alias = "vector_index", alias = "VECTOR_INDEX")]
85+
VectorIndex,
8486
#[serde(other)]
8587
Unknown,
8688
}
@@ -131,6 +133,7 @@ impl fmt::Display for Feature {
131133
Feature::NgramIndex => write!(f, "ngram_index"),
132134
Feature::WorkloadGroup => write!(f, "workload_group"),
133135
Feature::SystemHistory => write!(f, "system_history"),
136+
Feature::VectorIndex => write!(f, "vector_index"),
134137
Feature::Unknown => write!(f, "unknown"),
135138
}
136139
}
@@ -179,7 +182,8 @@ impl Feature {
179182
| (Feature::AttacheTable, Feature::AttacheTable)
180183
| (Feature::StorageEncryption, Feature::StorageEncryption)
181184
| (Feature::HilbertClustering, Feature::HilbertClustering)
182-
| (Feature::NgramIndex, Feature::NgramIndex) => Ok(true),
185+
| (Feature::NgramIndex, Feature::NgramIndex)
186+
| (Feature::VectorIndex, Feature::VectorIndex) => Ok(true),
183187
(_, _) => Ok(false),
184188
}
185189
}
@@ -363,6 +367,11 @@ mod tests {
363367
serde_json::from_str::<Feature>("\"system_history\"").unwrap()
364368
);
365369

370+
assert_eq!(
371+
Feature::VectorIndex,
372+
serde_json::from_str::<Feature>("\"VectorIndex\"").unwrap()
373+
);
374+
366375
assert_eq!(
367376
Feature::Unknown,
368377
serde_json::from_str::<Feature>("\"ssss\"").unwrap()

src/meta/api/src/schema_api_impl.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ use databend_common_meta_app::schema::TableIdList;
153153
use databend_common_meta_app::schema::TableIdToName;
154154
use databend_common_meta_app::schema::TableIdent;
155155
use databend_common_meta_app::schema::TableIndex;
156+
use databend_common_meta_app::schema::TableIndexType;
156157
use databend_common_meta_app::schema::TableInfo;
157158
use databend_common_meta_app::schema::TableMeta;
158159
use databend_common_meta_app::schema::TableNameIdent;
@@ -1021,12 +1022,12 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
10211022
IndexColumnIdNotFound::new(*column_id, &index.name),
10221023
)));
10231024
}
1024-
if index_column_ids.contains(column_id) {
1025+
if index_column_ids.contains(&(*column_id, index.index_type.clone())) {
10251026
return Err(KVAppError::AppError(AppError::DuplicatedIndexColumnId(
10261027
DuplicatedIndexColumnId::new(*column_id, &index.name),
10271028
)));
10281029
}
1029-
index_column_ids.insert(column_id);
1030+
index_column_ids.insert((*column_id, index.index_type.clone()));
10301031
}
10311032
}
10321033
}
@@ -2450,7 +2451,7 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
24502451

24512452
// column_id can not be duplicated
24522453
for (name, index) in indexes.iter() {
2453-
if *name == req.name {
2454+
if *name == req.name || index.index_type != req.index_type {
24542455
continue;
24552456
}
24562457
for column_id in &req.column_ids {
@@ -2474,6 +2475,7 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
24742475
&req.tenant,
24752476
req.table_id,
24762477
&req.name,
2478+
&req.index_type,
24772479
&old_index.version,
24782480
)?;
24792481
mark_delete_op = Some(TxnOp::put(m_key, m_value));
@@ -2545,15 +2547,34 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
25452547
let indexes = &mut table_meta.indexes;
25462548
if !indexes.contains_key(&req.name) && !req.if_exists {
25472549
return Err(KVAppError::AppError(AppError::UnknownIndex(
2548-
UnknownError::<IndexName>::new(req.name.clone(), "drop table index"),
2550+
UnknownError::<IndexName>::new(
2551+
req.name.clone(),
2552+
format!("drop {} index", req.index_type),
2553+
),
25492554
)));
25502555
}
25512556
let Some(index) = indexes.remove(&req.name) else {
25522557
return Ok(());
25532558
};
2559+
if index.index_type != req.index_type {
2560+
return Err(KVAppError::AppError(AppError::UnknownIndex(
2561+
UnknownError::<IndexName>::new(
2562+
req.name.clone(),
2563+
format!(
2564+
"drop {} index, but the index is {}",
2565+
req.index_type, index.index_type
2566+
),
2567+
),
2568+
)));
2569+
}
25542570

2555-
let (m_key, m_value) =
2556-
mark_table_index_as_deleted(&req.tenant, req.table_id, &req.name, &index.version)?;
2571+
let (m_key, m_value) = mark_table_index_as_deleted(
2572+
&req.tenant,
2573+
req.table_id,
2574+
&req.name,
2575+
&req.index_type,
2576+
&index.version,
2577+
)?;
25572578

25582579
let txn_req = TxnRequest::new(
25592580
vec![
@@ -4248,15 +4269,21 @@ pub fn mark_table_index_as_deleted(
42484269
tenant: &Tenant,
42494270
table_id: u64,
42504271
index_name: &str,
4272+
index_type: &TableIndexType,
42514273
index_version: &str,
42524274
) -> Result<(String, Vec<u8>), MetaError> {
42534275
let marked_deleted_table_index_id_ident = MarkedDeletedTableIndexIdIdent::new_generic(
42544276
tenant,
42554277
MarkedDeletedTableIndexId::new(table_id, index_name.to_owned(), index_version.to_owned()),
42564278
);
4279+
let deleted_index_type = match index_type {
4280+
TableIndexType::Inverted => MarkedDeletedIndexType::INVERTED,
4281+
TableIndexType::Ngram => MarkedDeletedIndexType::NGRAM,
4282+
TableIndexType::Vector => MarkedDeletedIndexType::VECTOR,
4283+
};
42574284
let marked_deleted_table_index_meta = MarkedDeletedIndexMeta {
42584285
dropped_on: Utc::now(),
4259-
index_type: MarkedDeletedIndexType::INVERTED,
4286+
index_type: deleted_index_type,
42604287
};
42614288

42624289
Ok((

0 commit comments

Comments
 (0)