diff options
Diffstat (limited to '')
| -rw-r--r-- | lib/nt.ml | 14 | ||||
| -rw-r--r-- | lib/nt_ffi.ml | 1 |
2 files changed, 13 insertions, 2 deletions
@@ -298,7 +298,7 @@ module Make (B : Backend) = struct match Nt_ffi.ptr_to_opt raw with | None -> Error (Error.cursor_error ("plan_scan failed for path: " ^ path)) | Some p -> Ok p ) - | Join {left; right; _} -> ( + | Join {left; right; on_attrs} -> ( let* lp = build_plan left in match build_plan right with | Error e -> @@ -309,8 +309,18 @@ module Make (B : Backend) = struct let join = getf act Nt_ffi.action_join in setf join Nt_ffi.join_left (Nt_ffi.nint_to_ptr lp); setf join Nt_ffi.join_right (Nt_ffi.nint_to_ptr rp); + (* NULL-terminated const char**; backing arrays stay reachable until + assemble returns *) + let cattrs = List.map Nt_ffi.cstring on_attrs in + let arr = + Ctypes.CArray.of_list (Ctypes.ptr Ctypes.char) + (List.map Ctypes.CArray.start cattrs @ [Nt_ffi.null_char_ptr]) + in + setf join Nt_ffi.join_attrs (Ctypes.CArray.start arr); (* assemble takes ownership of both children *) - match Nt_ffi.ptr_to_opt (Nt_ffi.rnt_plan_assemble act) with + let raw = Nt_ffi.rnt_plan_assemble act in + ignore (Sys.opaque_identity (cattrs, arr)); + match Nt_ffi.ptr_to_opt raw with | None -> Error (Error.cursor_error "plan_join failed") | Some p -> Ok p ) ) | Take {limit; source} -> ( diff --git a/lib/nt_ffi.ml b/lib/nt_ffi.ml index 962e1a7..4d73c32 100644 --- a/lib/nt_ffi.ml +++ b/lib/nt_ffi.ml @@ -98,6 +98,7 @@ type plan_args_join let plan_args_join : plan_args_join structure typ = structure "PlanArgsJoin" let join_left = field plan_args_join "left" (ptr void) let join_right = field plan_args_join "right" (ptr void) +let join_attrs = field plan_args_join "attrs" (ptr (ptr char)) let () = seal plan_args_join type plan_args_take |
