let string_of_vtable = fun vtable ->
    let current = ref vtable.vt_ftable.ta_name
    and first   = ref true
    and string_of_constraint = fun (c1, c2) ->
      Printf.sprintf "%s = %s"
      (column_fullname c1)
      (column_fullname c2) in
    let do_join = fun (table, columns) ->
      let parent_current =
        if   !first
        then !current
        else Printf.sprintf "(%s)" !current
      in
        first := false;
        match columns with
          | [] ->
              current := Printf.sprintf "%s, %s" parent_current table.ta_name
          | _ ->
              let constraints =
                Dbf_misc.join
                  ~sep:" AND "
                  ~to_string:string_of_constraint
                  columns
              in
                current :=
                Printf.sprintf "%s INNER JOIN %s ON %s"
                  parent_current table.ta_name constraints
    in
      List.iter do_join vtable.vt_join;
      !current