let insert_index = fun ~name ~columns ~unique ->
    validate_name_exn name;
    match columns with
      | []       ->
          raise (Invalid_args "An index must contain at least one column")
      | hd :: _  ->
          let db = hd.col_table.ta_db in
            assert
              (not (List.exists
                      (fun c -> c.col_table.ta_db != db) (* Phys. eq *)
                      columns));
            if index_by_name_opt db name <> None then
              raise (Duplicated_name name);
            let index = { idx_name    = name;
                          idx_db      = db;
                          idx_columns = columns;
                          idx_unique  = unique; }
            in
              db.db_indexes <- db.db_indexes @ [index];
              index