Skip to content

Commit bedb150

Browse files
authored
feat: Add UPDATE support (#70)
* feat: Add UPDATE support * format code
1 parent 3ed588f commit bedb150

16 files changed

Lines changed: 1441 additions & 93 deletions

CMakeLists.txt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ set(LOADABLE_EXTENSION_NAME ${TARGET_NAME}_loadable_extension)
99
project(${TARGET_NAME})
1010
include_directories(src/include)
1111

12-
set(EXTENSION_SOURCES src/lance_extension.cpp src/lance_scan.cpp
13-
src/lance_search.cpp src/lance_common.cpp
14-
src/lance_filter_ir.cpp
15-
src/lance_storage.cpp
16-
src/lance_replacement.cpp
17-
src/lance_insert.cpp
18-
src/lance_delete.cpp
19-
src/lance_write.cpp)
12+
set(EXTENSION_SOURCES src/lance_extension.cpp src/lance_scan.cpp
13+
src/lance_search.cpp src/lance_common.cpp
14+
src/lance_filter_ir.cpp
15+
src/lance_storage.cpp
16+
src/lance_replacement.cpp
17+
src/lance_insert.cpp
18+
src/lance_delete.cpp
19+
src/lance_update.cpp
20+
src/lance_write.cpp)
2021

2122
build_static_extension(${TARGET_NAME} ${EXTENSION_SOURCES})
2223
build_loadable_extension(${TARGET_NAME} " " ${EXTENSION_SOURCES})

Cargo.lock

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

Cargo.toml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ panic = "abort"
1818

1919
[dependencies]
2020

21-
# Lance and Arrow dependencies - using compatible versions
22-
lance = { version = "1.0.0", default-features = false, features = ["aws", "azure", "gcp", "oss", "huggingface"] }
23-
lance-core = "1.0.0"
24-
lance-namespace = "1.0.0"
25-
lance-namespace-impls = { version = "1.0.0", features = ["rest"] }
26-
arrow = { version = "56.2.0", features = ["ffi"] }
21+
# Lance and Arrow dependencies - using compatible versions
22+
lance = { version = "1.0.0", default-features = false, features = ["aws", "azure", "gcp", "oss", "huggingface"] }
23+
lance-arrow = "1.0.0"
24+
lance-core = "1.0.0"
25+
lance-namespace = "1.0.0"
26+
lance-namespace-impls = { version = "1.0.0", features = ["rest"] }
27+
lance-table = "1.0.0"
28+
datafusion = "50.3.0"
29+
arrow = { version = "56.2.0", features = ["ffi"] }
2730
arrow-array = "56.2.0"
2831
arrow-schema = "56.2.0"
2932
bzip2-sys = { version = "0.1.13", features = ["static"] }
@@ -36,3 +39,4 @@ datafusion-expr = "50.3.0"
3639
datafusion-functions = "50.3.0"
3740
datafusion-sql = "50.3.0"
3841
lance-index = "1.0.0"
42+
roaring = "0.10.12"

rust/error.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub enum ErrorCode {
3131
DatasetCommitTransaction = 25,
3232
DirNamespaceDropTable = 26,
3333
DatasetDelete = 27,
34+
DatasetUpdateOverwrite = 28,
3435
}
3536

3637
struct LastError {

rust/ffi/dataset.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ use std::ffi::{c_char, c_void, CStr};
33
use std::ptr;
44
use std::sync::Arc;
55

6+
use datafusion_sql::unparser::expr_to_sql;
67
use lance::dataset::builder::DatasetBuilder;
78
use lance::Dataset;
8-
use datafusion_sql::unparser::expr_to_sql;
99

1010
use crate::error::{clear_last_error, set_last_error, ErrorCode};
1111
use crate::runtime;
@@ -274,7 +274,9 @@ fn dataset_delete_inner(
274274
};
275275
let predicate = match filter {
276276
Some(expr) => expr_to_sql(&expr)
277-
.map_err(|err| FfiError::new(ErrorCode::DatasetDelete, format!("predicate sql: {err}")))?
277+
.map_err(|err| {
278+
FfiError::new(ErrorCode::DatasetDelete, format!("predicate sql: {err}"))
279+
})?
278280
.to_string(),
279281
None => "true".to_string(),
280282
};
@@ -315,9 +317,8 @@ fn dataset_delete_inner(
315317
};
316318

317319
let deleted_rows = before_rows.saturating_sub(after_rows);
318-
let deleted_rows_i64 = i64::try_from(deleted_rows).map_err(|_| {
319-
FfiError::new(ErrorCode::DatasetDelete, "deleted row count overflow")
320-
})?;
320+
let deleted_rows_i64 = i64::try_from(deleted_rows)
321+
.map_err(|_| FfiError::new(ErrorCode::DatasetDelete, "deleted row count overflow"))?;
321322

322323
unsafe {
323324
std::ptr::write_unaligned(out_deleted_rows, deleted_rows_i64);

rust/ffi/dir_namespace.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use std::sync::Arc;
55

66
use lance::dataset::builder::DatasetBuilder;
77
use lance_core::Error as LanceError;
8-
use lance_namespace::LanceNamespace;
98
use lance_namespace::models::{DropTableRequest, ListTablesRequest};
9+
use lance_namespace::LanceNamespace;
1010
use lance_namespace_impls::DirectoryNamespaceBuilder;
1111

1212
use crate::error::{clear_last_error, set_last_error, ErrorCode};
@@ -50,10 +50,7 @@ fn parse_storage_options(
5050
FfiError::new(ErrorCode::Utf8, format!("option_keys[{idx}] utf8: {err}"))
5151
})?;
5252
let value = unsafe { CStr::from_ptr(val_ptr) }.to_str().map_err(|err| {
53-
FfiError::new(
54-
ErrorCode::Utf8,
55-
format!("option_values[{idx}] utf8: {err}"),
56-
)
53+
FfiError::new(ErrorCode::Utf8, format!("option_values[{idx}] utf8: {err}"))
5754
})?;
5855
storage_options.insert(key.to_string(), value.to_string());
5956
}
@@ -123,7 +120,9 @@ fn open_dataset_in_dir_namespace_inner(
123120
option_values: *const *const c_char,
124121
options_len: usize,
125122
) -> FfiResult<(DatasetHandle, String)> {
126-
let root = unsafe { cstr_to_str(root, "root")? }.trim_end_matches('/').to_string();
123+
let root = unsafe { cstr_to_str(root, "root")? }
124+
.trim_end_matches('/')
125+
.to_string();
127126
let table_name = unsafe { cstr_to_str(table_name, "table_name")? };
128127
let storage_options = parse_storage_options(option_keys, option_values, options_len)?;
129128

@@ -160,7 +159,13 @@ pub unsafe extern "C" fn lance_open_dataset_in_dir_namespace(
160159
}
161160
}
162161

163-
match open_dataset_in_dir_namespace_inner(root, table_name, option_keys, option_values, options_len) {
162+
match open_dataset_in_dir_namespace_inner(
163+
root,
164+
table_name,
165+
option_keys,
166+
option_values,
167+
options_len,
168+
) {
164169
Ok((handle, table_uri)) => {
165170
clear_last_error();
166171
if !out_table_uri.is_null() {
@@ -224,7 +229,8 @@ pub unsafe extern "C" fn lance_dir_namespace_drop_table(
224229
option_values: *const *const c_char,
225230
options_len: usize,
226231
) -> i32 {
227-
match dir_namespace_drop_table_inner(root, table_name, option_keys, option_values, options_len) {
232+
match dir_namespace_drop_table_inner(root, table_name, option_keys, option_values, options_len)
233+
{
228234
Ok(()) => {
229235
clear_last_error();
230236
0

rust/ffi/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ mod scan;
88
mod search;
99
mod stream;
1010
mod types;
11+
mod update;
1112
mod util;
1213
mod write;

0 commit comments

Comments
 (0)