1#[cfg(doc)]
2use super::aggregate_expressions::{AggregateExpressionMethods, WindowExpressionMethods};
3use crate::expression::functions::declare_sql_function;
4use crate::sql_types::Foldable;
5
6#[doc =
" Represents a SQL `SUM` function. This function can only take types which are"]
#[doc = " Foldable."]
#[doc = ""]
#[doc = " ## Window Function Usage"]
#[doc = ""]
#[doc =
" This function can be used as window function. See [`WindowExpressionMethods`] for details"]
#[doc = ""]
#[doc = " ## Aggregate Function Expression"]
#[doc = ""]
#[doc =
" This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details."]
#[doc = ""]
#[doc = " # Examples"]
#[doc = ""]
#[doc = " ## Normal function usage"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # use schema::animals::dsl::*;"]
#[doc = " # let connection = &mut establish_connection();"]
#[doc =
" assert_eq!(Ok(Some(12i64)), animals.select(sum(legs)).first(connection));"]
#[doc = " # }"]
#[doc = " ```"]
#[doc = ""]
#[doc = " ## Window function"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # use schema::animals::dsl::*;"]
#[doc = " # let connection = &mut establish_connection();"]
#[doc = " let res = animals"]
#[doc = " .select((name, sum(legs).partition_by(id)))"]
#[doc = " .load::<(Option<String>, Option<i64>)>(connection);"]
#[doc = ""]
#[doc = " assert_eq!("]
#[doc = " Ok(vec![(Some(\"Jack\".into()), Some(4)), (None, Some(8))]),"]
#[doc = " res"]
#[doc = " );"]
#[doc = " # }"]
#[doc = " ```"]
#[doc = ""]
#[doc = " ## Aggregate function expression"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # use schema::animals::dsl::*;"]
#[doc = " # let connection = &mut establish_connection();"]
#[doc = " # #[cfg(not(feature = \"mysql\"))]"]
#[doc = " assert_eq!("]
#[doc = " Ok(Some(4i64)),"]
#[doc = " animals"]
#[doc = " .select(sum(legs).aggregate_filter(legs.lt(8)))"]
#[doc = " .first(connection)"]
#[doc = " );"]
#[doc = " # }"]
#[doc = " ```"]
#[allow(non_camel_case_types)]
pub fn sum<ST: Foldable, expr>(expr: expr) -> sum<ST, expr> where
expr: diesel::expression::AsExpression<ST> {
sum_utils::sum {
expr: expr.as_expression(),
ST: ::std::marker::PhantomData,
}
}
#[allow(non_camel_case_types, non_snake_case)]
#[doc = "The return type of [`sum()`](fn@sum)"]
pub type sum<ST, expr> =
sum_utils::sum<ST,
<expr as diesel::expression::AsExpression<ST>>::Expression>;
#[doc(hidden)]
#[allow(non_camel_case_types, non_snake_case, unused_imports)]
pub(crate) mod sum_utils {
use diesel::{self, QueryResult};
use diesel::expression::{
AsExpression, Expression, SelectableExpression, AppearsOnTable,
ValidGrouping,
};
use diesel::query_builder::{QueryFragment, AstPass};
use diesel::sql_types::*;
use diesel::internal::sql_functions::*;
use super::*;
pub struct sum<ST, expr> {
pub(in super) expr: expr,
pub(in super) ST: ::std::marker::PhantomData<ST>,
}
const _: () =
{
use diesel;
use diesel::internal::derives::numeric_ops as ops;
use diesel::expression::{Expression, AsExpression};
use diesel::sql_types::ops::{Add, Sub, Mul, Div};
use diesel::sql_types::{SqlType, SingleValue};
impl<ST, expr, __Rhs> ::std::ops::Add<__Rhs> for sum<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Add,
<<Self as Expression>::SqlType as Add>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Add>::Rhs> {
type Output = ops::Add<Self, __Rhs::Expression>;
fn add(self, rhs: __Rhs) -> Self::Output {
ops::Add::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Sub<__Rhs> for sum<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Sub,
<<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Sub>::Rhs> {
type Output = ops::Sub<Self, __Rhs::Expression>;
fn sub(self, rhs: __Rhs) -> Self::Output {
ops::Sub::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Mul<__Rhs> for sum<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Mul,
<<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Mul>::Rhs> {
type Output = ops::Mul<Self, __Rhs::Expression>;
fn mul(self, rhs: __Rhs) -> Self::Output {
ops::Mul::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Div<__Rhs> for sum<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Div,
<<Self as Expression>::SqlType as Div>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Div>::Rhs> {
type Output = ops::Div<Self, __Rhs::Expression>;
fn div(self, rhs: __Rhs) -> Self::Output {
ops::Div::new(self, rhs.as_expression())
}
}
};
#[automatically_derived]
impl<ST: ::core::fmt::Debug, expr: ::core::fmt::Debug> ::core::fmt::Debug
for sum<ST, expr> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "sum",
"expr", &self.expr, "ST", &&self.ST)
}
}
#[automatically_derived]
impl<ST: ::core::clone::Clone, expr: ::core::clone::Clone>
::core::clone::Clone for sum<ST, expr> {
#[inline]
fn clone(&self) -> sum<ST, expr> {
sum {
expr: ::core::clone::Clone::clone(&self.expr),
ST: ::core::clone::Clone::clone(&self.ST),
}
}
}
#[automatically_derived]
impl<ST: ::core::marker::Copy, expr: ::core::marker::Copy>
::core::marker::Copy for sum<ST, expr> {
}
const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<ST: diesel::query_builder::QueryId,
expr: diesel::query_builder::QueryId>
diesel::query_builder::QueryId for sum<ST, expr> {
type QueryId =
sum<<ST as diesel::query_builder::QueryId>::QueryId,
<expr as diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<ST as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
&&
<expr as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<ST as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
||
<expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
|| false;
}
};
#[doc = "The return type of [`sum()`](fn@sum)"]
pub type HelperType<ST, expr> =
sum<ST, <expr as AsExpression<ST>>::Expression>;
impl<ST: Foldable, expr> Expression for sum<ST, expr> where
(expr): Expression {
type SqlType = ST::Sum;
}
impl<ST: Foldable, expr, __DieselInternal>
SelectableExpression<__DieselInternal> for sum<ST, expr> where
expr: SelectableExpression<__DieselInternal>,
Self: AppearsOnTable<__DieselInternal> {}
impl<ST: Foldable, expr, __DieselInternal>
AppearsOnTable<__DieselInternal> for sum<ST, expr> where
expr: AppearsOnTable<__DieselInternal>, Self: Expression {}
impl<ST: Foldable, expr, __DieselInternal>
FunctionFragment<__DieselInternal> for sum<ST, expr> where
__DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
const FUNCTION_NAME: &'static str = "sum";
#[allow(unused_assignments)]
fn walk_arguments<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
let mut needs_comma = false;
if !self.expr.is_noop(out.backend())? {
if needs_comma { out.push_sql(", "); }
self.expr.walk_ast(out.reborrow())?;
needs_comma = true;
}
Ok(())
}
}
impl<ST: Foldable, expr, __DieselInternal> QueryFragment<__DieselInternal>
for sum<ST, expr> where __DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
fn walk_ast<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
out.push_sql(<Self as
FunctionFragment<__DieselInternal>>::FUNCTION_NAME);
out.push_sql("(");
self.walk_arguments(out.reborrow())?;
out.push_sql(")");
Ok(())
}
}
impl<ST: Foldable, expr, __P, __O, __F, __DieselInternal>
WindowFunctionFragment<sum<ST, expr>, __DieselInternal> for
OverClause<__P, __O, __F> where
__DieselInternal: diesel::backend::Backend {}
impl<ST: Foldable, expr> IsWindowFunction for sum<ST, expr> {
type ArgTypes = (expr,);
}
impl<ST: Foldable, expr, __DieselInternal> ValidGrouping<__DieselInternal>
for sum<ST, expr> {
type IsAggregate = diesel::expression::is_aggregate::Yes;
}
impl<ST: Foldable, expr> IsAggregateFunction for sum<ST, expr> {}
}
#[doc =
" Represents a SQL `AVG` function. This function can only take types which are"]
#[doc = " Foldable."]
#[doc = ""]
#[doc = " ## Window Function Usage"]
#[doc = ""]
#[doc =
" This function can be used as window function. See [`WindowExpressionMethods`] for details"]
#[doc = ""]
#[doc = " ## Aggregate Function Expression"]
#[doc = ""]
#[doc =
" This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details."]
#[doc = ""]
#[doc = " # Examples"]
#[doc = ""]
#[doc = " ## Normal function usage"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " # #[cfg(feature = \"numeric\")]"]
#[doc = " # extern crate bigdecimal;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # run_test().unwrap();"]
#[doc = " # }"]
#[doc = " #"]
#[doc = " # table! {"]
#[doc = " # numbers (number) {"]
#[doc = " # number -> Integer,"]
#[doc = " # }"]
#[doc = " # }"]
#[doc = " #"]
#[doc =
" # #[cfg(all(feature = \"numeric\", any(feature = \"postgres\", not(feature = \"sqlite\"))))]"]
#[doc = " # fn run_test() -> QueryResult<()> {"]
#[doc = " # use bigdecimal::BigDecimal;"]
#[doc = " # use self::numbers::dsl::*;"]
#[doc = " # let conn = &mut establish_connection();"]
#[doc =
" # diesel::sql_query(\"CREATE TEMPORARY TABLE numbers (number INTEGER)\").execute(conn)?;"]
#[doc = " diesel::insert_into(numbers)"]
#[doc = " .values(&vec![number.eq(1), number.eq(2)])"]
#[doc = " .execute(conn)?;"]
#[doc = " let average = numbers.select(avg(number)).get_result(conn)?;"]
#[doc = " let expected = \"1.5\".parse::<BigDecimal>().unwrap();"]
#[doc = " assert_eq!(Some(expected), average);"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[doc = " #"]
#[doc =
" # #[cfg(not(all(feature = \"numeric\", any(feature = \"postgres\", not(feature = \"sqlite\")))))]"]
#[doc = " # fn run_test() -> QueryResult<()> {"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[doc = " ```"]
#[doc = ""]
#[doc = " ## Window function"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # run_test().unwrap();"]
#[doc = " # }"]
#[doc = " #"]
#[doc = " # #[cfg(not(all(feature = \"numeric\", feature = \"postgres\")))]"]
#[doc = " # fn run_test() -> QueryResult<()> {"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[doc = " # #[cfg(all(feature = \"numeric\", feature = \"postgres\"))]"]
#[doc = " fn run_test() -> QueryResult<()> {"]
#[doc = " # use schema::animals::dsl::*;"]
#[doc = " # use bigdecimal::BigDecimal;"]
#[doc = " # let connection = &mut establish_connection();"]
#[doc =
" let res = animals.select((name, avg(legs).partition_by(id))).load::<(Option<String>, Option<BigDecimal>)>(connection)?;"]
#[doc = ""]
#[doc = " assert_eq!(vec!["]
#[doc = " (Some(\"Jack\".into()), \"4\".parse::<BigDecimal>().ok()),"]
#[doc = " (None, \"8\".parse::<BigDecimal>().ok()),"]
#[doc = " ], res);"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[doc = " ```"]
#[doc = ""]
#[doc = " ## Aggregate function expression"]
#[doc = ""]
#[doc = " ```rust"]
#[doc = " # include!(\"../../doctest_setup.rs\");"]
#[doc = " # use diesel::dsl::*;"]
#[doc = " # #[cfg(feature = \"numeric\")]"]
#[doc = " # extern crate bigdecimal;"]
#[doc = " #"]
#[doc = " # fn main() {"]
#[doc = " # run_test().unwrap();"]
#[doc = " # }"]
#[doc = " #"]
#[doc = " # table! {"]
#[doc = " # numbers (number) {"]
#[doc = " # number -> Integer,"]
#[doc = " # }"]
#[doc = " # }"]
#[doc = " #"]
#[doc = " # #[cfg(all(feature = \"numeric\", feature = \"postgres\"))]"]
#[doc = " # fn run_test() -> QueryResult<()> {"]
#[doc = " # use bigdecimal::BigDecimal;"]
#[doc = " # use self::numbers::dsl::*;"]
#[doc = " # let conn = &mut establish_connection();"]
#[doc =
" # diesel::sql_query(\"CREATE TEMPORARY TABLE numbers (number INTEGER)\").execute(conn)?;"]
#[doc = " diesel::insert_into(numbers)"]
#[doc = " .values(&vec![number.eq(1), number.eq(2), number.eq(3)])"]
#[doc = " .execute(conn)?;"]
#[doc = ""]
#[doc =
" let average = numbers.select(avg(number).aggregate_filter(number.lt(3))).get_result(conn)?;"]
#[doc = " let expected = \"1.5\".parse::<BigDecimal>().unwrap();"]
#[doc = " assert_eq!(Some(expected), average);"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[doc = " #"]
#[doc = " # #[cfg(not(all(feature = \"numeric\", feature = \"postgres\")))]"]
#[doc = " # fn run_test() -> QueryResult<()> {"]
#[doc = " # Ok(())"]
#[doc = " # }"]
#[allow(non_camel_case_types)]
pub fn avg<ST: Foldable, expr>(expr: expr) -> avg<ST, expr> where
expr: diesel::expression::AsExpression<ST> {
avg_utils::avg {
expr: expr.as_expression(),
ST: ::std::marker::PhantomData,
}
}
#[allow(non_camel_case_types, non_snake_case)]
#[doc = "The return type of [`avg()`](fn@avg)"]
pub type avg<ST, expr> =
avg_utils::avg<ST,
<expr as diesel::expression::AsExpression<ST>>::Expression>;
#[doc(hidden)]
#[allow(non_camel_case_types, non_snake_case, unused_imports)]
pub(crate) mod avg_utils {
use diesel::{self, QueryResult};
use diesel::expression::{
AsExpression, Expression, SelectableExpression, AppearsOnTable,
ValidGrouping,
};
use diesel::query_builder::{QueryFragment, AstPass};
use diesel::sql_types::*;
use diesel::internal::sql_functions::*;
use super::*;
pub struct avg<ST, expr> {
pub(in super) expr: expr,
pub(in super) ST: ::std::marker::PhantomData<ST>,
}
const _: () =
{
use diesel;
use diesel::internal::derives::numeric_ops as ops;
use diesel::expression::{Expression, AsExpression};
use diesel::sql_types::ops::{Add, Sub, Mul, Div};
use diesel::sql_types::{SqlType, SingleValue};
impl<ST, expr, __Rhs> ::std::ops::Add<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Add,
<<Self as Expression>::SqlType as Add>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Add>::Rhs> {
type Output = ops::Add<Self, __Rhs::Expression>;
fn add(self, rhs: __Rhs) -> Self::Output {
ops::Add::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Sub<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Sub,
<<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Sub>::Rhs> {
type Output = ops::Sub<Self, __Rhs::Expression>;
fn sub(self, rhs: __Rhs) -> Self::Output {
ops::Sub::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Mul<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Mul,
<<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Mul>::Rhs> {
type Output = ops::Mul<Self, __Rhs::Expression>;
fn mul(self, rhs: __Rhs) -> Self::Output {
ops::Mul::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Div<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Div,
<<Self as Expression>::SqlType as Div>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Div>::Rhs> {
type Output = ops::Div<Self, __Rhs::Expression>;
fn div(self, rhs: __Rhs) -> Self::Output {
ops::Div::new(self, rhs.as_expression())
}
}
};
#[automatically_derived]
impl<ST: ::core::fmt::Debug, expr: ::core::fmt::Debug> ::core::fmt::Debug
for avg<ST, expr> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "avg",
"expr", &self.expr, "ST", &&self.ST)
}
}
#[automatically_derived]
impl<ST: ::core::clone::Clone, expr: ::core::clone::Clone>
::core::clone::Clone for avg<ST, expr> {
#[inline]
fn clone(&self) -> avg<ST, expr> {
avg {
expr: ::core::clone::Clone::clone(&self.expr),
ST: ::core::clone::Clone::clone(&self.ST),
}
}
}
#[automatically_derived]
impl<ST: ::core::marker::Copy, expr: ::core::marker::Copy>
::core::marker::Copy for avg<ST, expr> {
}
const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<ST: diesel::query_builder::QueryId,
expr: diesel::query_builder::QueryId>
diesel::query_builder::QueryId for avg<ST, expr> {
type QueryId =
avg<<ST as diesel::query_builder::QueryId>::QueryId,
<expr as diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<ST as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
&&
<expr as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<ST as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
||
<expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
|| false;
}
};
#[doc = "The return type of [`avg()`](fn@avg)"]
pub type HelperType<ST, expr> =
avg<ST, <expr as AsExpression<ST>>::Expression>;
impl<ST: Foldable, expr> Expression for avg<ST, expr> where
(expr): Expression {
type SqlType = ST::Avg;
}
impl<ST: Foldable, expr, __DieselInternal>
SelectableExpression<__DieselInternal> for avg<ST, expr> where
expr: SelectableExpression<__DieselInternal>,
Self: AppearsOnTable<__DieselInternal> {}
impl<ST: Foldable, expr, __DieselInternal>
AppearsOnTable<__DieselInternal> for avg<ST, expr> where
expr: AppearsOnTable<__DieselInternal>, Self: Expression {}
impl<ST: Foldable, expr, __DieselInternal>
FunctionFragment<__DieselInternal> for avg<ST, expr> where
__DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
const FUNCTION_NAME: &'static str = "avg";
#[allow(unused_assignments)]
fn walk_arguments<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
let mut needs_comma = false;
if !self.expr.is_noop(out.backend())? {
if needs_comma { out.push_sql(", "); }
self.expr.walk_ast(out.reborrow())?;
needs_comma = true;
}
Ok(())
}
}
impl<ST: Foldable, expr, __DieselInternal> QueryFragment<__DieselInternal>
for avg<ST, expr> where __DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
fn walk_ast<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
out.push_sql(<Self as
FunctionFragment<__DieselInternal>>::FUNCTION_NAME);
out.push_sql("(");
self.walk_arguments(out.reborrow())?;
out.push_sql(")");
Ok(())
}
}
impl<ST: Foldable, expr, __P, __O, __F, __DieselInternal>
WindowFunctionFragment<avg<ST, expr>, __DieselInternal> for
OverClause<__P, __O, __F> where
__DieselInternal: diesel::backend::Backend {}
impl<ST: Foldable, expr> IsWindowFunction for avg<ST, expr> {
type ArgTypes = (expr,);
}
impl<ST: Foldable, expr, __DieselInternal> ValidGrouping<__DieselInternal>
for avg<ST, expr> {
type IsAggregate = diesel::expression::is_aggregate::Yes;
}
impl<ST: Foldable, expr> IsAggregateFunction for avg<ST, expr> {}
}#[declare_sql_function]
7extern "SQL" {
8 #[aggregate]
73 #[window]
74 fn sum<ST: Foldable>(expr: ST) -> ST::Sum;
75
76 #[aggregate]
196 #[window]
197 fn avg<ST: Foldable>(expr: ST) -> ST::Avg;
198}