Skip to content

Commit

Permalink
Merge pull request #3722 from weiznich/fix/make_alias_syntax_configur…
Browse files Browse the repository at this point in the history
…able

Allow to configure the used alias syntax
  • Loading branch information
weiznich committed Jul 31, 2023
2 parents 082fb7d + e632a7c commit b479f24
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 1 deletion.
23 changes: 23 additions & 0 deletions diesel/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,17 @@ pub trait SqlDialect: self::private::TrustedBackend {
doc = "See [`sql_dialect::select_statement_syntax`] for provided default implementations"
)]
type SelectStatementSyntax;

/// Configures how this backend structures `SELECT` queries
///
/// This allows backends to provide custom [`QueryFragment`](crate::query_builder::QueryFragment)
/// implementations for [`Alias<T>`](crate::query_source::Alias)
///
#[cfg_attr(
feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes",
doc = "See [`sql_dialect::alias_syntax`] for provided default implementations"
)]
type AliasSyntax;
}

/// This module contains all options provided by diesel to configure the [`SqlDialect`] trait.
Expand Down Expand Up @@ -516,6 +527,18 @@ pub(crate) mod sql_dialect {
#[derive(Debug, Copy, Clone)]
pub struct AnsiSqlSelectStatement;
}

/// This module contains all reusable options to configure
/// [`SqlDialect::AliasSyntax`]
#[diesel_derives::__diesel_public_if(
feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes"
)]
pub mod alias_syntax {
/// Indicates that this backend uses `table AS alias` for
/// defining table aliases
#[derive(Debug, Copy, Clone)]
pub struct AsAliasSyntax;
}
}

// These traits are not part of the public API
Expand Down
1 change: 1 addition & 0 deletions diesel/src/mysql/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ impl SqlDialect for Mysql {
type ArrayComparison = sql_dialect::array_comparison::AnsiSqlArrayComparison;

type ConcatClause = MysqlConcatClause;
type AliasSyntax = sql_dialect::alias_syntax::AsAliasSyntax;
}

impl DieselReserveSpecialization for Mysql {}
Expand Down
1 change: 1 addition & 0 deletions diesel/src/pg/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ impl SqlDialect for Pg {

type ExistsSyntax = sql_dialect::exists_syntax::AnsiSqlExistsSyntax;
type ArrayComparison = PgStyleArrayComparison;
type AliasSyntax = sql_dialect::alias_syntax::AsAliasSyntax;
}

impl DieselReserveSpecialization for Pg {}
Expand Down
18 changes: 17 additions & 1 deletion diesel/src/query_source/aliasing/alias.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::field_alias_mapper::FieldAliasMapper;
use super::{AliasSource, AliasedField};

use crate::backend::Backend;
use crate::backend::{sql_dialect, Backend};
use crate::expression::{Expression, SelectableExpression, ValidGrouping};
use crate::helper_types::AliasedFields;
use crate::query_builder::{AsQuery, AstPass, FromClause, QueryFragment, QueryId, SelectStatement};
Expand All @@ -14,7 +14,12 @@ use std::marker::PhantomData;
/// Represents an alias within diesel's query builder
///
/// See [`alias!`](crate::alias) for more details.
#[diesel_derives::__diesel_public_if(
feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes",
public_fields(source)
)]
pub struct Alias<S> {
/// The inner alias definition
pub(crate) source: S,
}

Expand Down Expand Up @@ -80,6 +85,17 @@ where
}

impl<S, DB> QueryFragment<DB> for Alias<S>
where
S: AliasSource,
DB: Backend,
Self: QueryFragment<DB, DB::AliasSyntax>,
{
fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
<Self as QueryFragment<DB, DB::AliasSyntax>>::walk_ast(self, pass)
}
}

impl<S, DB> QueryFragment<DB, sql_dialect::alias_syntax::AsAliasSyntax> for Alias<S>
where
S: AliasSource,
DB: Backend,
Expand Down
1 change: 1 addition & 0 deletions diesel/src/sqlite/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ impl SqlDialect for Sqlite {

type ExistsSyntax = sql_dialect::exists_syntax::AnsiSqlExistsSyntax;
type ArrayComparison = sql_dialect::array_comparison::AnsiSqlArrayComparison;
type AliasSyntax = sql_dialect::alias_syntax::AsAliasSyntax;
}

impl DieselReserveSpecialization for Sqlite {}
Expand Down
6 changes: 6 additions & 0 deletions diesel_derives/src/multiconnection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1035,6 +1035,10 @@ fn generate_querybuilder(connection_types: &[ConnectionVariant]) -> TokenStream
quote::quote! {
<Tab, V, QId, const HAS_STATIC_QUERY_ID: bool> diesel::query_builder::QueryFragment<super::backend::MultiBackend, super::backend::MultiBatchInsertSupport>
for diesel::internal::derives::multiconnection::BatchInsert<V, Tab, QId, HAS_STATIC_QUERY_ID>
},
quote::quote! {
<S> diesel::query_builder::QueryFragment<super::backend::MultiBackend, super::backend::MultiAliasSyntax>
for diesel::query_source::Alias<S>
}
])
.map(|t| generate_queryfragment_impls(t, &query_fragment_bounds));
Expand Down Expand Up @@ -1414,6 +1418,7 @@ fn generate_backend(connection_types: &[ConnectionVariant]) -> TokenStream {
pub struct MultiArrayComparisonSyntax;
pub struct MultiConcatClauseSyntax;
pub struct MultiSelectStatementSyntax;
pub struct MultiAliasSyntax;

impl diesel::backend::SqlDialect for MultiBackend {
type ReturningClause = MultiReturningClause;
Expand All @@ -1427,6 +1432,7 @@ fn generate_backend(connection_types: &[ConnectionVariant]) -> TokenStream {
type ArrayComparison = MultiArrayComparisonSyntax;
type ConcatClause = MultiConcatClauseSyntax;
type SelectStatementSyntax = MultiSelectStatementSyntax;
type AliasSyntax = MultiAliasSyntax;
}

impl diesel::internal::derives::multiconnection::TrustedBackend for MultiBackend {}
Expand Down

0 comments on commit b479f24

Please sign in to comment.