New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documentation for multi-table inner join is confusing #1129

Closed
carols10cents opened this Issue Aug 25, 2017 · 6 comments

Comments

Projects
None yet
4 participants
@carols10cents

carols10cents commented Aug 25, 2017

Setup

I have a repo demonstrating this problem here: https://github.com/carols10cents/diesel-inner-join-mvce

Versions

  • Rust: stable 1.19.0
  • Diesel: 0.16.0
  • Database: postgres 9.6.1
  • Operating System macOS Sierra

Feature Flags

  • diesel: postgres
  • diesel_codegen: postgres

Problem Description

What are you trying to accomplish?

I have these tables:

#[derive(Debug, Clone, Queryable, Identifiable, Associations, AsChangeset)]
pub struct Crate {
    pub id: i32,
    pub name: String,
}

#[derive(Clone, Identifiable, Queryable, Associations, Debug)]
#[belongs_to(Crate)]
pub struct Version {
    pub id: i32,
    pub crate_id: i32,
}

#[derive(Insertable, Identifiable, Queryable, Associations, Debug)]
#[belongs_to(Version)]
#[table_name = "readme_rendering"]
#[primary_key(version_id)]
struct ReadmeRendering {
    version_id: i32,
    rendered_at: String,
}

And I would like to write diesel that generates the equivalent of:

SELECT * FROM versions
    INNER JOIN readme_rendering ON versions.id = readme_rendering.version_id
    INNER JOIN crates ON versions.crate_id = crates.id;

This looks similar to the example with users, posts, and comments in the docs that says users.inner_join(posts).inner_join(comments) generates this sql:

SELECT * FROM users
    INNER JOIN posts ON posts.user_id = users.id
    INNER JOIN comments ON comments.user_id = users.id

So I have this query:

    let versions_to_readme_and_crates_doesnt_work = versions::table
        .inner_join(readme_rendering::table)
        .inner_join(crates::table)
        .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
        .load::<(Version, Option<String>, Option<String>)>(&conn)
        .expect("error loading versions_to_readme_and_crates_doesnt_work");

What is the expected output?

I expect this to compile and run the sql above.

What is the actual output?

I get this compilation error, which seems to indicate diesel is trying to join crates and readme_rendering?

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`

Full errors behind toggle:

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `__diesel_infer_schema::infer_crates::crates::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `(__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at)`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), (__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at), (__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name))`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::DefaultSelectClause`
   = note: required because of the requirements on the impl of `diesel::query_builder::Query` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::AsQuery` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::InternalJoinDsl<__diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>>`
error[E0277]: the trait bound `__diesel_infer_schema::infer_crates::crates::table: diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not implemented for `__diesel_infer_schema::infer_crates::crates::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_crates::crates::columns::id`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `(__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), (__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at), (__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name))`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::DefaultSelectClause`
   = note: required because of the requirements on the impl of `diesel::query_builder::Query` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::AsQuery` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::InternalJoinDsl<__diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>>`

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:63:10
   |
63 |         .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
   |          ^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `__diesel_infer_schema::infer_crates::crates::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>`
   = note: required because of the requirements on the impl of `diesel::SelectDsl<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`

error[E0277]: the trait bound `__diesel_infer_schema::infer_crates::crates::table: diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not satisfied
  --> src/main.rs:63:10
   |
63 |         .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
   |          ^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not implemented for `__diesel_infer_schema::infer_crates::crates::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_crates::crates::columns::name`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `__diesel_infer_schema::infer_crates::crates::columns::name`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>`
   = note: required because of the requirements on the impl of `diesel::SelectDsl<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`

error[E0599]: no method named `load` found for type `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>>` in the current scope
  --> src/main.rs:64:10
   |
64 |         .load::<(Version, Option<String>, Option<String>)>(&conn)
   |          ^^^^
   |
   = note: the method `load` exists but the following trait bounds were not satisfied:
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)> : diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name) : diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)> : diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name) : diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `_ : diesel::query_builder::QueryId`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`

Are you seeing any additional errors?

Nope. There's other code in the repo that shows versions joining to crates works fine, and versions joining to readme_rendering works fine.

Steps to reproduce

Clone https://github.com/carols10cents/diesel-inner-join-mvce and cargo run; you should get the errors shown above.

Checklist

  • I have already looked over the issue tracker for similar issues.
@killercup

This comment has been minimized.

Member

killercup commented Aug 25, 2017

@Eijebong

This comment has been minimized.

Member

Eijebong commented Aug 25, 2017

Hey, thanks for the awesome bug report with a repository and everything ❤️

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.

@killercup

This comment has been minimized.

Member

killercup commented Aug 25, 2017

@carols10cents

This comment has been minimized.

carols10cents commented Aug 25, 2017

Hey, thanks for the awesome bug report with a repository and everything ❤️

You're welcome! I try :)

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.

I read the docs for that, but I didn't think that applied because i'm not trying to do crates.inner_join(readme_rendering) at all :-/ Why do I need that if I'm only trying to join each of those to version but not to each other?

The docs say:

// This would be required to do `users.inner_join(posts.inner_join(comments))`
// if there were an association between users and posts, and an association
// between posts and comments, but no association between users and comments

but that's not the join i'm trying to do, i'm trying to do the equivalent of users.inner_join(posts).inner_join(comments), which I thought was a different situation according to the inner_join docs....

@carols10cents

This comment has been minimized.

carols10cents commented Aug 25, 2017

Ok, I just tried it and the code compiles and runs the query i'm expecting... I think this is a documentation bug then :) The comment on the enable_multi_table_joins! macro made me think it didn't apply to my situation :-/

@carols10cents carols10cents changed the title from Multi-table inner join not functioning as expected given documentation to Documentation for multi-table inner join is confusing Aug 25, 2017

@krircc

This comment has been minimized.

krircc commented Aug 29, 2017

I have the same problme, when i do with inner_join

sgrif added a commit that referenced this issue Oct 8, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 8, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 8, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 8, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 9, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 9, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

sgrif added a commit that referenced this issue Oct 9, 2017

Infer `enable_multi_table_joins!` for all possible combination of tables
This macro is basically a workaround for a lack of certain language
features. It's confusing, and unclear to users when they do or do not
need to invoke it. There's no downside to just speculatively adding it
for all tables, so let's do that.

However, for simplicity, I've opted to also remove the code that makes
`JoinTo` imply this. This will actually improve the error messages
(users won't see an error about a missing `JoinTo` implementation when
trying to use a table as a subselect), and makes it more clear when this
macro needs to be invoked, *especially* after we rename it to
`allow_tables_to_appear_in_same_query!`

I've checked the compile times both on crates.io and our own test suite
with this change, and didn't see any noticeable change.

Fixes #1237.
Fixes #1129.

@sgrif sgrif closed this in #1245 Oct 10, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment