type cursor_result = { cursor_id : string; rows : Tuple.materialized list; has_more : bool; } (** Effect classification for sublanguage operations. Categorically: - Query: a natural transformation between instance functors (DRL). Side-effect-free; the database state is unchanged. - Transition: a morphism in the category of database states (DDL, DML, ICL, DCL, and future TCL). Produces a new state via substitution (Harper, PFPL ch. 3-4). Future sublanguages: - TCL -> Transition (transaction boundaries are state morphisms with atomicity constraints) - PPL -> new effect class: potentially non-terminating computation (Turing-complete; breaks the termination guarantee of DRL) - ACL -> a functor restriction: narrows the admissible natural transformations based on authorization context *) type result = | Query of Relation.t | Transition of Management.Database.t * string | Cursor of cursor_result module type S = sig include Configuration.CONFIGURABLE type storage type ast type error val name : string val parse_sexp : Sexplib.Sexp.t -> (ast, error) Result.t val execute : storage -> Management.Database.t -> ast -> (result, error) Result.t val sexp_of_error : error -> Sexplib.Sexp.t end