@lix-js/sdk 0.6.0-preview.2 → 0.6.0-preview.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/SKILL.md +46 -8
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +25 -1
  3. package/dist/engine-wasm/wasm/lix_engine.js +60 -2
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +5 -0
  6. package/dist/generated/builtin-schemas.d.ts +87 -162
  7. package/dist/generated/builtin-schemas.js +139 -236
  8. package/dist/open-lix.d.ts +10 -3
  9. package/dist/open-lix.js +39 -0
  10. package/dist-engine-src/src/binary_cas/types.rs +0 -6
  11. package/dist-engine-src/src/catalog/context.rs +412 -0
  12. package/dist-engine-src/src/catalog/mod.rs +10 -0
  13. package/dist-engine-src/src/catalog/schema.rs +4 -0
  14. package/dist-engine-src/src/catalog/snapshot.rs +1114 -0
  15. package/dist-engine-src/src/cel/mod.rs +1 -1
  16. package/dist-engine-src/src/cel/provider.rs +1 -1
  17. package/dist-engine-src/src/commit_graph/context.rs +328 -1015
  18. package/dist-engine-src/src/commit_graph/mod.rs +2 -3
  19. package/dist-engine-src/src/commit_graph/types.rs +7 -43
  20. package/dist-engine-src/src/commit_graph/walker.rs +57 -81
  21. package/dist-engine-src/src/commit_store/codec.rs +887 -0
  22. package/dist-engine-src/src/commit_store/context.rs +944 -0
  23. package/dist-engine-src/src/commit_store/materialization.rs +84 -0
  24. package/dist-engine-src/src/commit_store/mod.rs +16 -0
  25. package/dist-engine-src/src/commit_store/storage.rs +600 -0
  26. package/dist-engine-src/src/commit_store/types.rs +215 -0
  27. package/dist-engine-src/src/common/identity.rs +15 -5
  28. package/dist-engine-src/src/common/json_pointer.rs +67 -0
  29. package/dist-engine-src/src/common/metadata.rs +17 -12
  30. package/dist-engine-src/src/common/mod.rs +5 -5
  31. package/dist-engine-src/src/domain.rs +324 -0
  32. package/dist-engine-src/src/engine.rs +29 -43
  33. package/dist-engine-src/src/entity_identity.rs +238 -118
  34. package/dist-engine-src/src/functions/context.rs +17 -52
  35. package/dist-engine-src/src/functions/deterministic.rs +1 -1
  36. package/dist-engine-src/src/functions/mod.rs +1 -1
  37. package/dist-engine-src/src/functions/provider.rs +4 -4
  38. package/dist-engine-src/src/functions/state.rs +39 -66
  39. package/dist-engine-src/src/functions/types.rs +1 -1
  40. package/dist-engine-src/src/init.rs +204 -151
  41. package/dist-engine-src/src/json_store/context.rs +354 -60
  42. package/dist-engine-src/src/json_store/encoded.rs +6 -6
  43. package/dist-engine-src/src/json_store/mod.rs +4 -1
  44. package/dist-engine-src/src/json_store/store.rs +884 -11
  45. package/dist-engine-src/src/json_store/types.rs +166 -1
  46. package/dist-engine-src/src/lib.rs +11 -10
  47. package/dist-engine-src/src/live_state/context.rs +608 -830
  48. package/dist-engine-src/src/live_state/mod.rs +3 -3
  49. package/dist-engine-src/src/live_state/overlay.rs +7 -7
  50. package/dist-engine-src/src/live_state/reader.rs +5 -5
  51. package/dist-engine-src/src/live_state/types.rs +19 -36
  52. package/dist-engine-src/src/live_state/visibility.rs +19 -14
  53. package/dist-engine-src/src/plugin/archive.rs +3 -6
  54. package/dist-engine-src/src/plugin/install.rs +0 -18
  55. package/dist-engine-src/src/plugin/plugin_manifest.json +0 -1
  56. package/dist-engine-src/src/schema/annotations/defaults.rs +2 -7
  57. package/dist-engine-src/src/schema/builtin/lix_account.json +0 -1
  58. package/dist-engine-src/src/schema/builtin/lix_active_account.json +0 -1
  59. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +0 -1
  60. package/dist-engine-src/src/schema/builtin/lix_change.json +11 -10
  61. package/dist-engine-src/src/schema/builtin/lix_change_author.json +0 -1
  62. package/dist-engine-src/src/schema/builtin/lix_commit.json +8 -46
  63. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +29 -22
  64. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +0 -1
  65. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +0 -1
  66. package/dist-engine-src/src/schema/builtin/lix_key_value.json +0 -1
  67. package/dist-engine-src/src/schema/builtin/lix_label.json +10 -3
  68. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +74 -0
  69. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +2 -8
  70. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +0 -1
  71. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +0 -1
  72. package/dist-engine-src/src/schema/builtin/mod.rs +10 -59
  73. package/dist-engine-src/src/schema/compatibility.rs +787 -0
  74. package/dist-engine-src/src/schema/definition.json +47 -17
  75. package/dist-engine-src/src/schema/definition.rs +202 -96
  76. package/dist-engine-src/src/schema/key.rs +9 -77
  77. package/dist-engine-src/src/schema/mod.rs +4 -4
  78. package/dist-engine-src/src/schema/tests.rs +133 -92
  79. package/dist-engine-src/src/session/context.rs +86 -48
  80. package/dist-engine-src/src/session/create_version.rs +22 -14
  81. package/dist-engine-src/src/session/execute.rs +117 -23
  82. package/dist-engine-src/src/session/merge/apply.rs +4 -4
  83. package/dist-engine-src/src/session/merge/conflicts.rs +3 -2
  84. package/dist-engine-src/src/session/merge/stats.rs +1 -1
  85. package/dist-engine-src/src/session/merge/version.rs +35 -45
  86. package/dist-engine-src/src/session/mod.rs +9 -7
  87. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +100 -0
  88. package/dist-engine-src/src/session/switch_version.rs +17 -28
  89. package/dist-engine-src/src/session/transaction.rs +76 -0
  90. package/dist-engine-src/src/sql2/change_provider.rs +14 -20
  91. package/dist-engine-src/src/sql2/classify.rs +75 -48
  92. package/dist-engine-src/src/sql2/context.rs +22 -18
  93. package/dist-engine-src/src/sql2/directory_history_provider.rs +28 -20
  94. package/dist-engine-src/src/sql2/directory_provider.rs +131 -83
  95. package/dist-engine-src/src/sql2/entity_history_provider.rs +10 -14
  96. package/dist-engine-src/src/sql2/entity_provider.rs +680 -169
  97. package/dist-engine-src/src/sql2/error.rs +24 -5
  98. package/dist-engine-src/src/sql2/execute.rs +426 -272
  99. package/dist-engine-src/src/sql2/file_history_provider.rs +29 -21
  100. package/dist-engine-src/src/sql2/file_provider.rs +533 -108
  101. package/dist-engine-src/src/sql2/filesystem_planner.rs +58 -94
  102. package/dist-engine-src/src/sql2/filesystem_visibility.rs +37 -23
  103. package/dist-engine-src/src/sql2/history_projection.rs +3 -27
  104. package/dist-engine-src/src/sql2/history_provider.rs +11 -17
  105. package/dist-engine-src/src/sql2/history_route.rs +22 -8
  106. package/dist-engine-src/src/sql2/lix_state_provider.rs +178 -96
  107. package/dist-engine-src/src/sql2/mod.rs +8 -4
  108. package/dist-engine-src/src/sql2/predicate_typecheck.rs +246 -0
  109. package/dist-engine-src/src/sql2/public_bind/assignment.rs +46 -0
  110. package/dist-engine-src/src/sql2/public_bind/capability.rs +41 -0
  111. package/dist-engine-src/src/sql2/public_bind/dml.rs +172 -0
  112. package/dist-engine-src/src/sql2/public_bind/mod.rs +26 -0
  113. package/dist-engine-src/src/sql2/public_bind/table.rs +168 -0
  114. package/dist-engine-src/src/sql2/read_only.rs +10 -12
  115. package/dist-engine-src/src/sql2/session.rs +7 -10
  116. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +76 -0
  117. package/dist-engine-src/src/sql2/udfs/mod.rs +8 -1
  118. package/dist-engine-src/src/sql2/udfs/public_call.rs +238 -0
  119. package/dist-engine-src/src/sql2/version_provider.rs +46 -31
  120. package/dist-engine-src/src/sql2/version_scope.rs +4 -4
  121. package/dist-engine-src/src/storage_bench.rs +1782 -325
  122. package/dist-engine-src/src/test_support.rs +183 -36
  123. package/dist-engine-src/src/tracked_state/by_file_index.rs +20 -24
  124. package/dist-engine-src/src/tracked_state/codec.rs +1519 -181
  125. package/dist-engine-src/src/tracked_state/context.rs +1155 -271
  126. package/dist-engine-src/src/tracked_state/diff.rs +249 -57
  127. package/dist-engine-src/src/tracked_state/materialization.rs +365 -103
  128. package/dist-engine-src/src/tracked_state/materializer.rs +488 -0
  129. package/dist-engine-src/src/tracked_state/merge.rs +37 -19
  130. package/dist-engine-src/src/tracked_state/mod.rs +8 -7
  131. package/dist-engine-src/src/tracked_state/storage.rs +138 -6
  132. package/dist-engine-src/src/tracked_state/tree.rs +695 -252
  133. package/dist-engine-src/src/tracked_state/types.rs +176 -6
  134. package/dist-engine-src/src/transaction/commit.rs +695 -435
  135. package/dist-engine-src/src/transaction/context.rs +551 -310
  136. package/dist-engine-src/src/transaction/live_state_overlay.rs +9 -8
  137. package/dist-engine-src/src/transaction/mod.rs +2 -0
  138. package/dist-engine-src/src/transaction/normalization.rs +311 -447
  139. package/dist-engine-src/src/transaction/prep.rs +37 -0
  140. package/dist-engine-src/src/transaction/schema_resolver.rs +93 -71
  141. package/dist-engine-src/src/transaction/staging.rs +701 -406
  142. package/dist-engine-src/src/transaction/types.rs +231 -122
  143. package/dist-engine-src/src/transaction/validation.rs +2717 -1698
  144. package/dist-engine-src/src/untracked_state/codec.rs +40 -96
  145. package/dist-engine-src/src/untracked_state/context.rs +21 -5
  146. package/dist-engine-src/src/untracked_state/materialization.rs +10 -104
  147. package/dist-engine-src/src/untracked_state/mod.rs +3 -5
  148. package/dist-engine-src/src/untracked_state/storage.rs +105 -57
  149. package/dist-engine-src/src/untracked_state/types.rs +63 -13
  150. package/dist-engine-src/src/version/context.rs +1 -13
  151. package/dist-engine-src/src/version/lifecycle.rs +221 -0
  152. package/dist-engine-src/src/version/mod.rs +3 -2
  153. package/dist-engine-src/src/version/refs.rs +12 -103
  154. package/dist-engine-src/src/version/stage_rows.rs +15 -19
  155. package/package.json +1 -1
  156. package/dist-engine-src/src/changelog/codec.rs +0 -321
  157. package/dist-engine-src/src/changelog/context.rs +0 -92
  158. package/dist-engine-src/src/changelog/materialization.rs +0 -121
  159. package/dist-engine-src/src/changelog/mod.rs +0 -13
  160. package/dist-engine-src/src/changelog/reader.rs +0 -20
  161. package/dist-engine-src/src/changelog/storage.rs +0 -220
  162. package/dist-engine-src/src/changelog/types.rs +0 -38
  163. package/dist-engine-src/src/schema/builtin/lix_change_set.json +0 -18
  164. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +0 -75
  165. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +0 -63
  166. package/dist-engine-src/src/schema_registry.rs +0 -294
  167. package/dist-engine-src/src/sql2/commit_derived_provider.rs +0 -591
  168. package/dist-engine-src/src/tracked_state/rebuild.rs +0 -771
  169. package/dist-engine-src/src/tracked_state/tree_types.rs +0 -176
@@ -21,7 +21,9 @@ use datafusion::physical_plan::{
21
21
  use futures_util::{stream, TryStreamExt};
22
22
  use serde_json::Value as JsonValue;
23
23
 
24
- use crate::live_state::{LiveStateFilter, LiveStateReader, LiveStateRow, LiveStateScanRequest};
24
+ use crate::live_state::{
25
+ LiveStateFilter, LiveStateReader, LiveStateScanRequest, MaterializedLiveStateRow,
26
+ };
25
27
  use crate::sql2::dml::{InsertExec, InsertSink};
26
28
  use crate::sql2::record_batch::record_batch_with_row_count;
27
29
  use crate::sql2::write_normalization::{InsertCell, SqlCell, UpdateAssignmentValues};
@@ -29,7 +31,8 @@ use crate::sql2::{
29
31
  SqlWriteContext, WriteAccess, WriteContextLiveStateReader, WriteContextVersionRefReader,
30
32
  };
31
33
  use crate::transaction::types::{
32
- LogicalPrimaryKey, StageRow, StageRowOrigin, StageWrite, StageWriteMode, StageWriteOperation,
34
+ LogicalPrimaryKey, TransactionWrite, TransactionWriteMode, TransactionWriteOperation,
35
+ TransactionWriteOrigin, TransactionWriteRow,
33
36
  };
34
37
  use crate::version::{
35
38
  version_descriptor_stage_row, version_descriptor_tombstone_row, version_ref_stage_row,
@@ -268,8 +271,8 @@ impl InsertSink for LixVersionInsertSink {
268
271
 
269
272
  if !rows.is_empty() {
270
273
  self.write_ctx
271
- .stage_write(StageWrite::Rows {
272
- mode: StageWriteMode::Insert,
274
+ .stage_write(TransactionWrite::Rows {
275
+ mode: TransactionWriteMode::Insert,
273
276
  rows,
274
277
  })
275
278
  .await
@@ -397,8 +400,8 @@ impl ExecutionPlan for LixVersionDeleteExec {
397
400
 
398
401
  if !rows.is_empty() {
399
402
  write_ctx
400
- .stage_write(StageWrite::Rows {
401
- mode: StageWriteMode::Replace,
403
+ .stage_write(TransactionWrite::Rows {
404
+ mode: TransactionWriteMode::Replace,
402
405
  rows,
403
406
  })
404
407
  .await
@@ -540,8 +543,8 @@ impl ExecutionPlan for LixVersionUpdateExec {
540
543
 
541
544
  if !rows.is_empty() {
542
545
  write_ctx
543
- .stage_write(StageWrite::Rows {
544
- mode: StageWriteMode::Replace,
546
+ .stage_write(TransactionWrite::Rows {
547
+ mode: TransactionWriteMode::Replace,
545
548
  rows,
546
549
  })
547
550
  .await
@@ -717,7 +720,7 @@ struct VersionDescriptor {
717
720
  hidden: bool,
718
721
  }
719
722
 
720
- fn parse_descriptor(row: &LiveStateRow) -> Result<VersionDescriptor, LixError> {
723
+ fn parse_descriptor(row: &MaterializedLiveStateRow) -> Result<VersionDescriptor, LixError> {
721
724
  let snapshot = parse_snapshot(row, "lix_version_descriptor")?;
722
725
  let id = snapshot
723
726
  .get("id")
@@ -741,7 +744,7 @@ fn parse_descriptor(row: &LiveStateRow) -> Result<VersionDescriptor, LixError> {
741
744
  Ok(VersionDescriptor { id, name, hidden })
742
745
  }
743
746
 
744
- fn parse_snapshot(row: &LiveStateRow, schema_key: &str) -> Result<JsonValue, LixError> {
747
+ fn parse_snapshot(row: &MaterializedLiveStateRow, schema_key: &str) -> Result<JsonValue, LixError> {
745
748
  let snapshot_content = row.snapshot_content.as_deref().ok_or_else(|| {
746
749
  LixError::new(
747
750
  "LIX_ERROR_UNKNOWN",
@@ -903,7 +906,10 @@ fn version_update_rows_from_batch(
903
906
  .collect()
904
907
  }
905
908
 
906
- fn version_stage_rows(row: VersionRow, origin: Option<StageRowOrigin>) -> Vec<StageRow> {
909
+ fn version_stage_rows(
910
+ row: VersionRow,
911
+ origin: Option<TransactionWriteOrigin>,
912
+ ) -> Vec<TransactionWriteRow> {
907
913
  vec![
908
914
  with_origin(
909
915
  version_descriptor_stage_row(&row.id, &row.name, row.hidden),
@@ -913,33 +919,42 @@ fn version_stage_rows(row: VersionRow, origin: Option<StageRowOrigin>) -> Vec<St
913
919
  ]
914
920
  }
915
921
 
916
- fn version_tombstone_rows(row: VersionRow) -> Vec<StageRow> {
917
- let origin = Some(lix_version_origin(StageWriteOperation::Delete, &row.id));
922
+ fn version_tombstone_rows(row: VersionRow) -> Vec<TransactionWriteRow> {
923
+ let origin = Some(lix_version_origin(
924
+ TransactionWriteOperation::Delete,
925
+ &row.id,
926
+ ));
918
927
  vec![
919
928
  with_origin(version_descriptor_tombstone_row(&row.id), origin.clone()),
920
929
  with_origin(version_ref_tombstone_row(&row.id), origin),
921
930
  ]
922
931
  }
923
932
 
924
- fn version_insert_stage_rows(row: VersionRow) -> Vec<StageRow> {
925
- let origin = lix_version_origin(StageWriteOperation::Insert, &row.id);
933
+ fn version_insert_stage_rows(row: VersionRow) -> Vec<TransactionWriteRow> {
934
+ let origin = lix_version_origin(TransactionWriteOperation::Insert, &row.id);
926
935
  version_stage_rows(row, Some(origin))
927
936
  }
928
937
 
929
- fn version_update_stage_rows(row: VersionRow) -> Vec<StageRow> {
930
- let origin = lix_version_origin(StageWriteOperation::Update, &row.id);
938
+ fn version_update_stage_rows(row: VersionRow) -> Vec<TransactionWriteRow> {
939
+ let origin = lix_version_origin(TransactionWriteOperation::Update, &row.id);
931
940
  version_stage_rows(row, Some(origin))
932
941
  }
933
942
 
934
- fn with_origin(mut row: StageRow, origin: Option<StageRowOrigin>) -> StageRow {
943
+ fn with_origin(
944
+ mut row: TransactionWriteRow,
945
+ origin: Option<TransactionWriteOrigin>,
946
+ ) -> TransactionWriteRow {
935
947
  row.origin = origin;
936
948
  row
937
949
  }
938
950
 
939
- fn lix_version_origin(operation: StageWriteOperation, version_id: &str) -> StageRowOrigin {
940
- StageRowOrigin {
951
+ fn lix_version_origin(
952
+ action: TransactionWriteOperation,
953
+ version_id: &str,
954
+ ) -> TransactionWriteOrigin {
955
+ TransactionWriteOrigin {
941
956
  surface: "lix_version".to_string(),
942
- operation,
957
+ operation: action,
943
958
  primary_key: Some(LogicalPrimaryKey {
944
959
  columns: vec!["id".to_string()],
945
960
  values: vec![version_id.to_string()],
@@ -1013,11 +1028,11 @@ fn required_string_value(
1013
1028
  batch: &RecordBatch,
1014
1029
  row_index: usize,
1015
1030
  column_name: &str,
1016
- operation: &str,
1031
+ action: &str,
1017
1032
  ) -> Result<String> {
1018
- optional_string_value(batch, row_index, column_name, operation)?.ok_or_else(|| {
1033
+ optional_string_value(batch, row_index, column_name, action)?.ok_or_else(|| {
1019
1034
  DataFusionError::Execution(format!(
1020
- "{operation} lix_version requires non-null text column '{column_name}'"
1035
+ "{action} lix_version requires non-null text column '{column_name}'"
1021
1036
  ))
1022
1037
  })
1023
1038
  }
@@ -1026,7 +1041,7 @@ fn optional_string_value(
1026
1041
  batch: &RecordBatch,
1027
1042
  row_index: usize,
1028
1043
  column_name: &str,
1029
- operation: &str,
1044
+ action: &str,
1030
1045
  ) -> Result<Option<String>> {
1031
1046
  match optional_scalar_value(batch, row_index, column_name)? {
1032
1047
  None
@@ -1038,7 +1053,7 @@ fn optional_string_value(
1038
1053
  | Some(ScalarValue::Utf8View(Some(value)))
1039
1054
  | Some(ScalarValue::LargeUtf8(Some(value))) => Ok(Some(value)),
1040
1055
  Some(other) => Err(DataFusionError::Execution(format!(
1041
- "{operation} lix_version expected text-compatible column '{column_name}', got {other:?}"
1056
+ "{action} lix_version expected text-compatible column '{column_name}', got {other:?}"
1042
1057
  ))),
1043
1058
  }
1044
1059
  }
@@ -1047,11 +1062,11 @@ fn required_bool_value(
1047
1062
  batch: &RecordBatch,
1048
1063
  row_index: usize,
1049
1064
  column_name: &str,
1050
- operation: &str,
1065
+ action: &str,
1051
1066
  ) -> Result<bool> {
1052
- optional_bool_value(batch, row_index, column_name, operation)?.ok_or_else(|| {
1067
+ optional_bool_value(batch, row_index, column_name, action)?.ok_or_else(|| {
1053
1068
  DataFusionError::Execution(format!(
1054
- "{operation} lix_version requires non-null boolean column '{column_name}'"
1069
+ "{action} lix_version requires non-null boolean column '{column_name}'"
1055
1070
  ))
1056
1071
  })
1057
1072
  }
@@ -1060,13 +1075,13 @@ fn optional_bool_value(
1060
1075
  batch: &RecordBatch,
1061
1076
  row_index: usize,
1062
1077
  column_name: &str,
1063
- operation: &str,
1078
+ action: &str,
1064
1079
  ) -> Result<Option<bool>> {
1065
1080
  match optional_scalar_value(batch, row_index, column_name)? {
1066
1081
  None | Some(ScalarValue::Null) | Some(ScalarValue::Boolean(None)) => Ok(None),
1067
1082
  Some(ScalarValue::Boolean(Some(value))) => Ok(Some(value)),
1068
1083
  Some(other) => Err(DataFusionError::Execution(format!(
1069
- "{operation} lix_version expected boolean column '{column_name}', got {other:?}"
1084
+ "{action} lix_version expected boolean column '{column_name}', got {other:?}"
1070
1085
  ))),
1071
1086
  }
1072
1087
  }
@@ -50,12 +50,12 @@ impl VersionBinding {
50
50
  }
51
51
  }
52
52
 
53
- pub(crate) fn require_active_version_id(&self, operation: &str) -> Result<String, LixError> {
53
+ pub(crate) fn require_active_version_id(&self, action: &str) -> Result<String, LixError> {
54
54
  match self {
55
55
  Self::Active { version_id } => Ok(version_id.clone()),
56
56
  Self::Explicit => Err(LixError::new(
57
57
  "LIX_ERROR_UNKNOWN",
58
- format!("{operation} is only supported for active-version SQL surfaces"),
58
+ format!("{action} is only supported for active-version SQL surfaces"),
59
59
  )),
60
60
  }
61
61
  }
@@ -65,7 +65,7 @@ pub(crate) fn resolve_write_version_scope(
65
65
  explicit_global: Option<bool>,
66
66
  explicit_version_id: Option<String>,
67
67
  fallback_version_id: Option<&str>,
68
- operation: &str,
68
+ action: &str,
69
69
  surface: &str,
70
70
  ) -> Result<WriteVersionScope, DataFusionError> {
71
71
  if explicit_global == Some(true) {
@@ -86,7 +86,7 @@ pub(crate) fn resolve_write_version_scope(
86
86
  let version_id = explicit_version_id
87
87
  .or_else(|| fallback_version_id.map(ToOwned::to_owned))
88
88
  .ok_or_else(|| {
89
- DataFusionError::Execution(format!("{operation} requires lixcol_version_id"))
89
+ DataFusionError::Execution(format!("{action} requires lixcol_version_id"))
90
90
  })?;
91
91
  if explicit_global == Some(false) && version_id == GLOBAL_VERSION_ID {
92
92
  return Err(DataFusionError::Execution(format!(