diesel/pg/expression/
array.rs1use backend::Backend;
2use expression::{
3 AppearsOnTable, AsExpressionList, Expression, NonAggregate, SelectableExpression,
4};
5use query_builder::{AstPass, QueryFragment};
6use sql_types;
7use std::marker::PhantomData;
8
9#[derive(Debug, Clone, Copy, QueryId)]
11pub struct ArrayLiteral<T, ST> {
12 elements: T,
13 _marker: PhantomData<ST>,
14}
15
16pub fn array<ST, T>(elements: T) -> ArrayLiteral<T::Expression, ST>
51where
52 T: AsExpressionList<ST>,
53{
54 ArrayLiteral {
55 elements: elements.as_expression_list(),
56 _marker: PhantomData,
57 }
58}
59
60impl<T, ST> Expression for ArrayLiteral<T, ST>
61where
62 T: Expression,
63{
64 type SqlType = sql_types::Array<ST>;
65}
66
67impl<T, ST, DB> QueryFragment<DB> for ArrayLiteral<T, ST>
68where
69 DB: Backend,
70 for<'a> (&'a T): QueryFragment<DB>,
71{
72 fn walk_ast(&self, mut out: AstPass<DB>) -> ::result::QueryResult<()> {
73 out.push_sql("ARRAY[");
74 QueryFragment::walk_ast(&&self.elements, out.reborrow())?;
75 out.push_sql("]");
76 Ok(())
77 }
78}
79
80impl<T, ST, QS> SelectableExpression<QS> for ArrayLiteral<T, ST>
81where
82 T: SelectableExpression<QS>,
83 ArrayLiteral<T, ST>: AppearsOnTable<QS>,
84{
85}
86
87impl<T, ST, QS> AppearsOnTable<QS> for ArrayLiteral<T, ST>
88where
89 T: AppearsOnTable<QS>,
90 ArrayLiteral<T, ST>: Expression,
91{
92}
93
94impl<T, ST> NonAggregate for ArrayLiteral<T, ST>
95where
96 T: NonAggregate,
97 ArrayLiteral<T, ST>: Expression,
98{
99}