aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/nt.ml14
-rw-r--r--lib/nt_ffi.ml1
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/nt.ml b/lib/nt.ml
index d526428..15e9f61 100644
--- a/lib/nt.ml
+++ b/lib/nt.ml
@@ -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