aboutsummaryrefslogblamecommitdiffstats
path: root/lib/sublanguage.ml
blob: d92358e8d5bc0aef5e637d6940ccdb6daa2fa880 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                                                      





                                 


                                                
                           









                                                                                   
(** 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 cursor_result = {
  cursor_id : string;
  rows : Tuple.materialized list;
  has_more : bool;
}

type result =
  | Query of Relation.t
  | Transition of Management.Database.t * string
  | Cursor of cursor_result

module type S = sig
  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