module D = Sqlite3.Data let f : Sqlite3.Data.t array -> Sqlite3.Data.t = fun arguments -> if Array.length arguments < 2 then Sqlite3.Data.NULL else let sep = Array.get arguments 0 in (* Shift all the elements into an list*) let contents = Array.to_seqi arguments |> Seq.filter_map (fun (i, value) -> if i = 0 then None else match value with | D.INT i -> Some (Int64.to_string i) | D.FLOAT f -> Some (Float.to_string f) | D.NONE -> None | D.NULL -> None | D.TEXT s | D.BLOB s -> if String.length s = 0 then None else Some (String.trim s)) |> List.of_seq in D.TEXT (String.concat (D.to_string_coerce sep) contents) let register : Sqlite3.db -> unit = fun db -> Sqlite3.create_funN db "join" f; Sqlite3.create_funN db "concat" f