mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-13 23:32:27 +00:00
fix: refuse direct writes to materialized views (#4471)
Refuse user writes (add, insert, update, delete, merge_insert, column changes) to a table carrying `mv.definition`, so a materialized view is written only by refresh. Index, optimize, and computed-column operations stay allowed. Sophon's REST write paths are handled separately in ENT-2878. Fixes ENT-2876.
This commit is contained in:
@@ -246,6 +246,31 @@ def test_legacy_storage_source_update_rebuilds(tmp_path):
|
||||
assert sorted(row["age"] for row in rows) == [8, 36]
|
||||
|
||||
|
||||
def test_direct_writes_to_a_view_are_refused(tmp_path):
|
||||
db = make_db(tmp_path)
|
||||
view = db.create_materialized_view("copy", "people")
|
||||
table = view.table
|
||||
row = [{"name": "eve", "age": 1}]
|
||||
refused = pytest.raises(NotImplementedError, match="is a materialized view")
|
||||
|
||||
with refused:
|
||||
table.add(row)
|
||||
with refused:
|
||||
table.update(where="name = 'kid'", values={"age": 8})
|
||||
with refused:
|
||||
table.delete("age < 18")
|
||||
with refused:
|
||||
table.merge_insert("name").when_not_matched_insert_all().execute(row)
|
||||
with refused:
|
||||
table.add_columns({"older": "age + 1"})
|
||||
with refused:
|
||||
table.drop_columns(["age"])
|
||||
assert table.count_rows() == 3
|
||||
|
||||
db.open_table("people").add(row)
|
||||
assert view.refresh().rows_written == 4
|
||||
|
||||
|
||||
def test_list_and_not_a_view(tmp_path):
|
||||
db = make_db(tmp_path)
|
||||
db.create_materialized_view("adults", "people", where="age >= 18")
|
||||
|
||||
Reference in New Issue
Block a user