@@ -6080,53 +6080,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
60806080 }
60816081 }
60826082
6083− ast::ExprKind::FullSet { target, value } => {
6084− if let ast::ExprKind::SourceRef { name, .. } = &target.node {
6085− let schema = self.source_schemas.get(name).cloned().unwrap_or_default();
6086−
6087− // Single-value source (`Person *owner`, `Int 1 *counter`):
6088− // wrap the bare value as a one-row `[{_value: val}]` relation
6089− // and write it. (`scalar_sources` are the scalar subset;
6090− // single-value covers records and ADTs too.)
6091− if self.scalar_sources.contains(name) || self.single_value_sources.contains(name) {
6092− let val = self.compile_set_value_expr(builder, value, env, db);
6093− // Validate refinements on the raw value (wrap as [val] for the check)
6094− if self.source_refinements.contains_key(name) {
6095− let singleton =
6096− self.call_rt(builder, "knot_relation_singleton", &[val]);
6097− self.emit_refinement_checks(builder, name, singleton, env, db);
6098− }
6099− let wrapped = self.call_rt(builder, "knot_scalar_source_wrap", &[val]);
6100− let (name_ptr, name_len) = self.string_ptr(builder, name);
6101− let (schema_ptr, schema_len) = self.string_ptr(builder, &schema);
6102− self.call_rt_void(
6103− builder,
6104− "knot_source_write",
6105− &[db, name_ptr, name_len, schema_ptr, schema_len, wrapped],
6106− );
6107− return self.call_rt(builder, "knot_value_unit", &[]);
6108− }
6109−
6110− let val = self.compile_set_value_expr(builder, value, env, db);
6111− self.emit_refinement_checks(builder, name, val, env, db);
6112− let (name_ptr, name_len) = self.string_ptr(builder, name);
6113− let (schema_ptr, schema_len) = self.string_ptr(builder, &schema);
6114− self.call_rt_void(
6115− builder,
6116− "knot_source_write",
6117− &[db, name_ptr, name_len, schema_ptr, schema_len, val],
6118− );
6119− self.call_rt(builder, "knot_value_unit", &[])
6120− } else {
6121− self.push_codegen_error(
6122− builder,
6123− target.span,
6124− "codegen: replace target must be a source reference",
6125− )
6126− }
6127− }
6128−
6129− ast::ExprKind::Atomic(inner) => {
6083+ast::ExprKind::Atomic(inner) => {
61306084 let is_nested = self.atomic_retry_block.is_some();
61316085 // Whether the body might issue a SQL write (Set/FullSet,
61326086 // direct or via a user fn). If not, the SAVEPOINT can be
@@ -6414,7 +6368,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
64146368 };
64156369 match &expr.node {
64166370 ast::ExprKind::NameOf(_) => false,
6417− Set { target, value } | FullSet { target, value } => {
6371+ Set { target, value } => {
64186372 let target_ok = match &target.node {
64196373 SourceRef { name, .. } => {
64206374 out.push(name.clone());
@@ -10306,7 +10260,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1030610260 // Only writes (`set`/`full =`) and `atomic` are effects. `full`
1030710261 // is a viewer-only tag with no semantic effect.
1030810262 ast::ExprKind::SourceRef { .. } => false,
10309− ast::ExprKind::Set { .. } | ast::ExprKind::FullSet { .. } => true,
10263+ ast::ExprKind::Set { .. } => true,
1031010264 ast::ExprKind::Atomic(_) => true,
1031110265 ast::ExprKind::App { func, arg } => {
1031210266 Self::expr_contains_io(func, builtins, io_fns)
@@ -10515,7 +10469,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1051510469 }
1051610470 };
1051710471 match &expr.node {
10518− ast::ExprKind::Set { .. } | ast::ExprKind::FullSet { .. } => true,
10472+ ast::ExprKind::Set { .. } => true,
1051910473 ast::ExprKind::Atomic(inner) => {
1052010474 Self::expr_contains_writes(inner, write_fns, known_fns, passthrough_fns)
1052110475 }
@@ -10669,7 +10623,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1066910623 // A query over a source/derived is a pure, lazy `[T]` — NOT IO.
1067010624 // `full` is a viewer-only tag with no semantic effect.
1067110625 ast::ExprKind::SourceRef { .. } => false,
10672− ast::ExprKind::Set { .. } | ast::ExprKind::FullSet { .. } => true,
10626+ ast::ExprKind::Set { .. } => true,
1067310627 ast::ExprKind::Atomic(_) => true,
1067410628 ast::ExprKind::BinOp { lhs, rhs, .. } => {
1067510629 self.expr_is_io_scoped(lhs, scopes) || self.expr_is_io_scoped(rhs, scopes)
@@ -10810,7 +10764,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1081010764 // as the relation value itself.
1081110765 ast::ExprKind::SourceRef { .. } => false,
1081210766 // Writes and atomic blocks must not run at `let` time.
10813− ast::ExprKind::Set { .. } | ast::ExprKind::FullSet { .. } => true,
10767+ ast::ExprKind::Set { .. } => true,
1081410768 ast::ExprKind::Atomic(_) => true,
1081510769 ast::ExprKind::BinOp { lhs, rhs, .. } => {
1081610770 self.expr_has_external_io(lhs) || self.expr_has_external_io(rhs)
@@ -11050,7 +11004,6 @@ impl<M: cranelift_module::Module> Codegen<M> {
1105011004 let is_io_computation = matches!(
1105111005 &expr.node,
1105211006 ast::ExprKind::Set { .. }
11053− | ast::ExprKind::FullSet { .. }
1105411007 | ast::ExprKind::Atomic(_)
1105511008 | ast::ExprKind::Do(_)
1105611009 | ast::ExprKind::Case { .. }
@@ -12247,7 +12200,6 @@ impl<M: cranelift_module::Module> Codegen<M> {
1224712200 | ast::ExprKind::List(_)
1224812201 | ast::ExprKind::Do(_)
1224912202 | ast::ExprKind::Set { .. }
12250− | ast::ExprKind::FullSet { .. }
1225112203 ) || self.expr_is_known_relation(expr);
1225212204 if is_known_relation {
1225312205 val
@@ -12699,7 +12651,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1269912651 self.call_rt_void(builder, "knot_relation_push", &[result, val]);
1270012652 } else if matches!(
1270112653 &expr.node,
12702− ast::ExprKind::Set { .. } | ast::ExprKind::FullSet { .. }
12654+ ast::ExprKind::Set { .. }
1270312655 ) {
1270412656 // Compile set inside do block
1270512657 let _ = self.compile_expr(builder, expr, env, db);
@@ -13417,7 +13369,7 @@ impl<M: cranelift_module::Module> Codegen<M> {
1341713369 ast::StmtKind::GroupBy { key } => Self::references_source(key, source_name),
1341813370 ast::StmtKind::Expr(e) => Self::references_source(e, source_name),
1341913371 }),
13420− ast::ExprKind::Set { target, value } | ast::ExprKind::FullSet { target, value } => {
13372+ ast::ExprKind::Set { target, value } => {
1342113373 Self::references_source(target, source_name)
1342213374 || Self::references_source(value, source_name)
1342313375 }
@@ -18790,7 +18742,6 @@ fn beta_reduce_inner(
1879018742 | Case { .. }
1879118743 | Do(_)
1879218744 | Set { .. }
18793− | FullSet { .. }
1879418745 | Atomic(_)
1879518746 | TimeUnitLit { .. }
1879618747 | Annot { .. }
@@ -18920,7 +18871,7 @@ fn substitute_inner(
1892018871 // matchers then compiled the broken AST, panicking with
1892118872 // "codegen: undefined variable" or silently capturing a same-named
1892218873 // in-scope variable.
18923− Case { .. } | Do(_) | Set { .. } | FullSet { .. } | Atomic(_) | Serve { .. } => {
18874+ Case { .. } | Do(_) | Set { .. } | Atomic(_) | Serve { .. } => {
1892418875 if expr_mentions_var(expr, var) {
1892518876 return None;
1892618877 }
@@ -18975,7 +18926,7 @@ fn expr_mentions_var(expr: &ast::Expr, var: &str) -> bool {
1897518926 || arms.iter().any(|a| expr_mentions_var(&a.body, var))
1897618927 }
1897718928 Do(stmts) => in_stmts(stmts),
18978− Set { target, value } | FullSet { target, value } => {
18929+ Set { target, value } => {
1897918930 expr_mentions_var(target, var) || expr_mentions_var(value, var)
1898018931 }
1898118932 Atomic(inner) | Refine(inner) => expr_mentions_var(inner, var),
@@ -19098,7 +19049,7 @@ fn collect_free_vars_set(expr: &ast::Expr, bound: &HashSet<String>, free: &mut H
1909819049 }
1909919050 }
1910019051 }
19101− Set { target, value } | FullSet { target, value } => {
19052+ Set { target, value } => {
1910219053 collect_free_vars_set(target, bound, free);
1910319054 collect_free_vars_set(value, bound, free);
1910419055 }
@@ -20315,7 +20266,7 @@ fn collect_free_vars(expr: &ast::Expr, bound: &HashSet<&str>, free: &mut Vec<Str
2031520266 }
2031620267 }
2031720268 }
20318− ast::ExprKind::Set { target, value } | ast::ExprKind::FullSet { target, value } => {
20269+ ast::ExprKind::Set { target, value } => {
2031920270 collect_free_vars(target, bound, free);
2032020271 collect_free_vars(value, bound, free);
2032120272 }
@@ -20454,7 +20405,7 @@ pub(crate) fn expr_refs_var(expr: &ast::Expr, var: &str) -> bool {
2045420405 }
2045520406 false
2045620407 }
20457− ast::ExprKind::Set { target, value } | ast::ExprKind::FullSet { target, value } => {
20408+ ast::ExprKind::Set { target, value } => {
2045820409 expr_refs_var(target, var) || expr_refs_var(value, var)
2045920410 }
2046020411 ast::ExprKind::Atomic(inner) | ast::ExprKind::Refine(inner) => expr_refs_var(inner, var),
@@ -20565,7 +20516,7 @@ fn expr_uses_var_as_value(expr: &ast::Expr, var: &str) -> bool {
2056520516 }
2056620517 false
2056720518 }
20568− ast::ExprKind::Set { target, value } | ast::ExprKind::FullSet { target, value } => {
20519+ ast::ExprKind::Set { target, value } => {
2056920520 expr_uses_var_as_value(target, var) || expr_uses_var_as_value(value, var)
2057020521 }
2057120522 ast::ExprKind::Atomic(inner) | ast::ExprKind::Refine(inner) => {
@@ -20881,10 +20832,7 @@ fn pretty_expr(expr: &ast::Expr) -> String {
2088120832 ast::ExprKind::Set { target, value } => {
2088220833 format!("{} = {}", pretty_expr(target), pretty_expr(value))
2088320834 }
20884− ast::ExprKind::FullSet { target, value } => {
20885− format!("full {} = {}", pretty_expr(target), pretty_expr(value))
20886− }
20887− ast::ExprKind::Atomic(e) => format!("atomic ({})", pretty_expr(e)),
20835+ast::ExprKind::Atomic(e) => format!("atomic ({})", pretty_expr(e)),
2088820836 ast::ExprKind::TimeUnitLit { value, .. } => pretty_expr(value),
2088920837 ast::ExprKind::Annot { expr, .. } => pretty_expr(expr),
2089020838 ast::ExprKind::Refine(inner) => format!("refine {}", pretty_expr(inner)),