Skip to main content

diesel/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2//! # Diesel
3//!
4//! Diesel is an ORM and query builder designed to reduce the boilerplate for database interactions.
5//! If this is your first time reading this documentation,
6//! we recommend you start with the [getting started guide].
7//! We also have [many other long form guides].
8//!
9//! [getting started guide]: https://diesel.rs/guides/getting-started/
10//! [many other long form guides]: https://diesel.rs/guides
11//!
12//! # Where to find things
13//!
14//! ## Declaring your schema
15//!
16//! For Diesel to validate your queries at compile time
17//! it requires you to specify your schema in your code,
18//! which you can do with [the `table!` macro][`table!`].
19//! `diesel print-schema` can be used
20//! to automatically generate these macro calls
21//! (by connecting to your database and querying its schema).
22//!
23//!
24//! ## Getting started
25//!
26//! Queries usually start from either a table, or a function like [`update`].
27//! Those functions can be found [here](#functions).
28//!
29//! Diesel provides a [`prelude` module](prelude),
30//! which exports most of the typically used traits and types.
31//! We are conservative about what goes in this module,
32//! and avoid anything which has a generic name.
33//! Files which use Diesel are expected to have `use diesel::prelude::*;`.
34//!
35//! [`update`]: update()
36//!
37//! ## Constructing a query
38//!
39//! The tools the query builder gives you can be put into these three categories:
40//!
41//! - "Query builder methods" are things that map to portions of a whole query
42//!   (such as `ORDER` and `WHERE`). These methods usually have the same name
43//!   as the SQL they map to, except for `WHERE` which is called `filter` in Diesel
44//!   (To not conflict with the Rust keyword).
45//!   These methods live in [the `query_dsl` module](query_dsl).
46//! - "Expression methods" are things you would call on columns
47//!   or other individual values.
48//!   These methods live in [the `expression_methods` module](expression_methods)
49//!   You can often find these by thinking "what would this be called"
50//!   if it were a method
51//!   and typing that into the search bar
52//!   (e.g. `LIKE` is called `like` in Diesel).
53//!   Most operators are named based on the Rust function which maps to that
54//!   operator in [`std::ops`][]
55//!   (For example `==` is called `.eq`, and `!=` is called `.ne`).
56//! - "Bare functions" are normal SQL functions
57//!   such as `sum`.
58//!   They live in [the `dsl` module](dsl).
59//!   Diesel only supports a very small number of these functions.
60//!   You can declare additional functions you want to use
61//!   with [the `define_sql_function!` macro][`define_sql_function!`].
62//!
63//! [`std::ops`]: //doc.rust-lang.org/stable/std/ops/index.html
64//!
65//! ## Serializing and Deserializing
66//!
67//! Types which represent the result of a SQL query implement
68//! a trait called [`Queryable`].
69//!
70//! Diesel maps "Rust types" (e.g. `i32`) to and from "SQL types"
71//! (e.g. [`diesel::sql_types::Integer`]).
72//! You can find all the types supported by Diesel in [the `sql_types` module](sql_types).
73//! These types are only used to represent a SQL type.
74//! You should never put them on your `Queryable` structs.
75//!
76//! To find all the Rust types which can be used with a given SQL type,
77//! see the documentation for that SQL type.
78//!
79//! To find all the SQL types which can be used with a Rust type,
80//! go to the docs for either [`ToSql`] or [`FromSql`],
81//! go to the "Implementors" section,
82//! and find the Rust type you want to use.
83//!
84//! [`Queryable`]: deserialize::Queryable
85//! [`diesel::sql_types::Integer`]: sql_types::Integer
86//! [`ToSql`]: serialize::ToSql
87//! [`FromSql`]: deserialize::FromSql
88//!
89//! ## How to read diesels compile time error messages
90//!
91//! Diesel is known for generating large complicated looking errors. Usually
92//! most of these error messages can be broken down easily. The following
93//! section tries to give an overview of common error messages and how to read them.
94//! As a general note it's always useful to read the complete error message as emitted
95//! by rustc, including the `required because of …` part of the message.
96//! Your IDE might hide important parts!
97//!
98//! The following error messages are common:
99//!
100//! * `the trait bound (diesel::sql_types::Integer, …, diesel::sql_types::Text): load_dsl::private::CompatibleType<YourModel, Pg> is not satisfied`
101//!   while trying to execute a query:
102//!   This error indicates a mismatch between what your query returns and what your model struct
103//!   expects the query to return. The fields need to match in terms of field order, field type
104//!   and field count. If you are sure that everything matches, double check the enabled diesel
105//!   features (for support for types from other crates) and double check (via `cargo tree`)
106//!   that there is only one version of such a shared crate in your dependency tree.
107//!   Consider using [`#[derive(Selectable)]`](derive@crate::prelude::Selectable) +
108//!   `#[diesel(check_for_backend(diesel::pg::Pg))]`
109//!   to improve the generated error message.
110//! * `the trait bound i32: diesel::Expression is not satisfied` in the context of `Insertable`
111//!   model structs:
112//!   This error indicates a type mismatch between the field you are trying to insert into the database
113//!   and the actual database type. These error messages contain a line
114//!   like ` = note: required for i32 to implement AsExpression<diesel::sql_types::Text>`
115//!   that show both the provided rust side type (`i32` in that case) and the expected
116//!   database side type (`Text` in that case).
117//! * `the trait bound i32: AppearsOnTable<users::table> is not satisfied` in the context of `AsChangeset`
118//!   model structs:
119//!   This error indicates a type mismatch between the field you are trying to update and the actual
120//!   database type. Double check your type mapping.
121//! * `the trait bound SomeLargeType: QueryFragment<Sqlite, SomeMarkerType> is not satisfied` while
122//!   trying to execute a query.
123//!   This error message indicates that a given query is not supported by your backend. This usually
124//!   means that you are trying to use SQL features from one SQL dialect on a different database
125//!   system. Double check your query that everything required is supported by the selected
126//!   backend. If that's the case double check that the relevant feature flags are enabled
127//!   (for example, `returning_clauses_for_sqlite_3_35` for enabling support for returning clauses in newer
128//!   sqlite versions)
129//! * `the trait bound posts::title: SelectableExpression<users::table> is not satisfied` while
130//!   executing a query:
131//!   This error message indicates that you're trying to select a field from a table
132//!   that does not appear in your from clause. If your query joins the relevant table via
133//!   [`left_join`](crate::query_dsl::QueryDsl::left_join) you need to call
134//!   [`.nullable()`](crate::expression_methods::NullableExpressionMethods::nullable)
135//!   on the relevant column in your select clause.
136//!
137//!
138//! ## Getting help
139//!
140//! If you run into problems, Diesel has an active community.
141//! Open a new [discussion] thread at diesel github repository
142//! and we will try to help you
143//!
144//! [discussion]: https://github.com/diesel-rs/diesel/discussions/categories/q-a
145//!
146//! # Crate feature flags
147//!
148//! The following feature flags are considered to be part of diesels public
149//! API. Any feature flag that is not listed here is **not** considered to
150//! be part of the public API and can disappear at any point in time:
151
152//!
153//! - `sqlite`: This feature enables the diesel sqlite backend. Enabling this feature requires per default
154//!   a compatible copy of `libsqlite3` for your target architecture. Alternatively, you can add `libsqlite3-sys`
155//!   with the `bundled` feature as a dependency to your crate so SQLite will be bundled:
156//!   ```toml
157//!   [dependencies]
158//!   libsqlite3-sys = { version = "0.29", features = ["bundled"] }
159//!   ```
160//! - `sqlite-no-std` A diesel sqlite backend for no-std environments. This is mostly the same as the `sqlite` backend,
161//!   but it doesn't enable the `std` feature flag
162//! - `postgres`: This feature enables the diesel postgres backend. This features implies `postgres_backend`
163//!   Enabling this feature requires a compatible copy of `libpq` for your target architecture.
164//!   Alternatively, you can add `pq-sys` with the `bundled` feature as a dependency to your
165//!   crate so libpq will be bundled:
166//!   ```toml
167//!   [dependencies]
168//!   pq-sys = { version = "0.6", features = ["bundled"] }
169//!   openssl-sys = { version = "0.9.100", features = ["vendored"] }
170//!   ```
171//! - `mysql`: This feature enables the diesel mysql backend. This feature implies `mysql_backend`.
172//!   Enabling this feature requires a compatible copy of `libmysqlclient` for your target architecture.
173//!   Alternatively, you can add `mysqlclient-sys` with the `bundled` feature as a dependency to your
174//!   crate so libmysqlclient will be bundled:
175//!   ```toml
176//!   [dependencies]
177//!   mysqlclient-sys = { version = "0.5", features = ["bundled"] }
178//!   openssl-sys = { version = "0.9.100", features = ["vendored"] }
179//!   ```
180//! - `mariadb`: This feature enables the diesel mariadb backend. This feature implies `mariadb_backend`.
181//!   Enabling this feature requires a compatible copy of `libmysqlclient` or `libmariadb` for your target architecture.
182//! - `postgres_backend`: This feature enables those parts of diesels postgres backend, that are not dependent
183//!   on `libpq`. Diesel does not provide any connection implementation with only this feature enabled.
184//!   This feature can be used to implement a custom implementation of diesels `Connection` trait for the
185//!   postgres backend outside of diesel itself, while reusing the existing query dsl extensions for the
186//!   postgres backend
187//! - `mysql_backend`: This feature enables those parts of diesels mysql backend, that are not dependent
188//!   on `libmysqlclient`. Diesel does not provide any connection implementation with only this feature enabled.
189//!   This feature can be used to implement a custom implementation of diesels `Connection` trait for the
190//!   mysql backend outside of diesel itself, while reusing the existing query dsl extensions for the
191//!   mysql backend
192//! - `mariadb_backend`: This feature enables those parts of diesels mariadb backend, that are not dependent
193//!   on `libmysqlclient`. Diesel does not provide any connection implementation with only this feature enabled.
194//!   This feature can be used to implement a custom implementation of diesels `Connection` trait for the
195//!   mariadb backend outside of diesel itself, while reusing the existing query dsl extensions for the
196//!   mariadb backend
197//! - `returning_clauses_for_sqlite_3_35`: This feature enables support for `RETURNING` clauses in the sqlite backend.
198//!   Enabling this feature requires sqlite 3.35.0 or newer.
199//! - `32-column-tables`: This feature enables support for tables with up to 32 columns.
200//!   This feature is enabled by default. Consider disabling this feature if you write a library crate
201//!   providing general extensions for diesel or if you do not need to support tables with more than 16 columns
202//!   and you want to minimize your compile times.
203//! - `64-column-tables`: This feature enables support for tables with up to 64 columns. It implies the
204//!   `32-column-tables` feature. Enabling this feature will increase your compile times.
205//! - `128-column-tables`: This feature enables support for tables with up to 128 columns. It implies the
206//!   `64-column-tables` feature. Enabling this feature will increase your compile times significantly.
207//! - `custom-count-column-tables`: This feature allows to customize the number of columns
208//!   supported by diesel by setting the `DIESEL_MAX_COLUMN_COUNT` environment variable to the desired
209//!   value. It is meant to be used if the other `*-column-tables` features do not fit your use-case.
210//!   Keep in mind that larger values increase the compile times for Diesel significantly.
211//!   For a greater convenience this environment variable can also be set in a `.cargo/config.toml`
212//!   file as described in the [cargo documentation](https://doc.rust-lang.org/cargo/reference/config.html#env).
213//! - `i-implement-a-third-party-backend-and-opt-into-breaking-changes`: This feature opens up some otherwise
214//!   private API, that can be useful to implement a third party [`Backend`](crate::backend::Backend)
215//!   or write a custom [`Connection`] implementation. **Do not use this feature for
216//!   any other usecase**. By enabling this feature you explicitly opt out diesel stability guarantees. We explicitly
217//!   reserve us the right to break API's exported under this feature flag in any upcoming minor version release.
218//!   If you publish a crate depending on this feature flag consider to restrict the supported diesel version to the
219//!   currently released minor version.
220//! - `serde_json`: This feature flag enables support for (de)serializing json values from the database using
221//!   types provided by `serde_json`.
222//! - `chrono`: This feature flags enables support for (de)serializing date/time values from the database using
223//!   types provided by `chrono`
224//! - `uuid`: This feature flag enables support for (de)serializing uuid values from the database using types
225//!   provided by `uuid`
226//! - `network-address`: This feature flag enables support for (de)serializing
227//!   IP values from the database using types provided by `ipnetwork`.
228//! - `ipnet-address`: This feature flag enables support for (de)serializing IP
229//!   values from the database using types provided by `ipnet`.
230//! - `numeric`: This feature flag enables support for (de)serializing numeric values from the database using types
231//!   provided by `bigdecimal`
232//! - `r2d2`: This feature flag enables support for the `r2d2` connection pool implementation.
233//! - `extras`: This feature enables the feature flagged support for any third party crate. This implies the
234//!   following feature flags: `serde_json`, `chrono`, `uuid`, `network-address`, `numeric`, `r2d2`
235//! - `with-deprecated`: This feature enables items marked as `#[deprecated]`. It is enabled by default.
236//!   disabling this feature explicitly opts out diesels stability guarantee.
237//! - `without-deprecated`: This feature disables any item marked as `#[deprecated]`. Enabling this feature
238//!   explicitly opts out the stability guarantee given by diesel. This feature overrides the `with-deprecated`.
239//!   Note that this may also remove items that are not shown as `#[deprecated]` in our documentation, due to
240//!   various bugs in rustdoc. It can be used to check if you depend on any such hidden `#[deprecated]` item.
241//! - `std`: This features enables usage of the rust standard library. When disabled Diesel will only use the `core`
242//!   and `alloc` crate instead. If this feature is disabled it is required to enable the `hashbrown` feature.
243//! - `hashbrown`: This feature enables an optional dependency on the hashbrown crate. It's required for usage in `no_std`
244//!   environments.
245//!
246//! By default the following features are enabled:
247//!
248//! - `with-deprecated`
249//! - `32-column-tables`
250//! - `std`
251
252#![cfg_attr(feature = "unstable", feature(trait_alias))]
253#![cfg_attr(feature = "unstable", feature(strict_provenance_lints))]
254#![cfg_attr(
255    feature = "unstable",
256    warn(fuzzy_provenance_casts, lossy_provenance_casts)
257)]
258#![cfg_attr(diesel_docsrs, feature(doc_cfg, rustdoc_internals))]
259#![cfg_attr(diesel_docsrs, expect(internal_features))]
260#![cfg_attr(feature = "128-column-tables", recursion_limit = "256")]
261// Built-in Lints
262#![warn(
263    unreachable_pub,
264    missing_debug_implementations,
265    missing_copy_implementations,
266    elided_lifetimes_in_paths,
267    missing_docs
268)]
269// Clippy lints
270#![allow(
271    clippy::match_same_arms,
272    clippy::needless_doctest_main,
273    clippy::map_unwrap_or,
274    clippy::redundant_field_names,
275    clippy::type_complexity
276)]
277#![warn(
278    clippy::unwrap_used,
279    clippy::print_stdout,
280    clippy::mut_mut,
281    clippy::non_ascii_literal,
282    clippy::similar_names,
283    clippy::unicode_not_nfc,
284    clippy::enum_glob_use,
285    clippy::if_not_else,
286    clippy::items_after_statements,
287    clippy::used_underscore_binding,
288    clippy::cast_possible_wrap,
289    clippy::cast_possible_truncation,
290    clippy::cast_sign_loss
291)]
292#![cfg_attr(
293    not(test),
294    warn(clippy::std_instead_of_alloc, clippy::std_instead_of_core)
295)]
296#![deny(unsafe_code)]
297#![cfg_attr(test, allow(clippy::unwrap_used))]
298
299// the no-std version needs hashbrown
300#[cfg(all(not(feature = "hashbrown"), not(feature = "std")))]
301compile_error!("The hashbrown feature is required for no-std support");
302
303extern crate alloc;
304extern crate core;
305extern crate diesel_derives;
306
307#[macro_use]
308#[doc(hidden)]
309pub mod macros;
310#[doc(hidden)]
311pub mod internal;
312
313#[cfg(test)]
314#[macro_use]
315extern crate cfg_if;
316
317#[cfg(test)]
318pub mod test_helpers;
319
320pub mod associations;
321pub mod backend;
322pub mod collation;
323pub mod connection;
324pub mod data_types;
325pub mod deserialize;
326#[macro_use]
327pub mod expression;
328pub mod expression_methods;
329#[doc(hidden)]
330pub mod insertable;
331pub mod query_builder;
332pub mod query_dsl;
333pub mod query_source;
334#[cfg(feature = "r2d2")]
335pub mod r2d2;
336pub mod result;
337pub mod serialize;
338pub mod upsert;
339#[macro_use]
340pub mod sql_types;
341pub mod migration;
342pub mod row;
343
344#[cfg(any(feature = "mysql_backend", feature = "mariadb_backend"))]
345pub mod mysql_like;
346
347#[cfg(feature = "mysql_backend")]
348pub mod mysql;
349
350#[cfg(feature = "mariadb_backend")]
351pub mod mariadb;
352#[cfg(feature = "postgres_backend")]
353pub mod pg;
354#[cfg(feature = "__sqlite-shared")]
355pub mod sqlite;
356
357#[macro_use]
358mod reexport_ambiguities;
359mod type_impls;
360pub mod types;
361mod util;
362
363#[doc(hidden)]
364#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
365#[deprecated(since = "2.0.0", note = "Use explicit macro imports instead")]
366pub use diesel_derives::{
367    AsChangeset, AsExpression, Associations, DieselNumericOps, FromSqlRow, Identifiable,
368    Insertable, QueryId, Queryable, QueryableByName, SqlType,
369};
370
371pub use diesel_derives::MultiConnection;
372
373pub mod dsl {
374    //! Includes various helper types and bare functions which are named too
375    //! generically to be included in prelude, but are often used when using Diesel.
376
377    #[allow(hidden_glob_reexports, non_camel_case_types, dead_code)]
mod helper_types_proxy {
    #[doc(inline)]
    pub use crate::helper_types::*;
    type abbrev = ();
    type array_append = ();
    type array_cat = ();
    type array_dims = ();
    type array_fill_with_lower_bound = ();
    type array_fill = ();
    type array_length = ();
    type array_lower = ();
    type array_ndims = ();
    type array_position_with_subscript = ();
    type array_position = ();
    type array_positions = ();
    type array_prepend = ();
    type array_remove = ();
    type array_replace = ();
    type array_sample = ();
    type array_shuffle = ();
    type array_to_json = ();
    type array_to_string_with_null_string = ();
    type array_to_string = ();
    type array_upper = ();
    type avg = ();
    type broadcast = ();
    type cardinality = ();
    type daterange = ();
    type family = ();
    type first_value = ();
    type host = ();
    type hostmask = ();
    type inet_merge = ();
    type inet_same_family = ();
    type int4range = ();
    type int8range = ();
    type isempty = ();
    type json_array_length = ();
    type json_build_array_0 = ();
    type json_build_array_1 = ();
    type json_build_array_2 = ();
    type json_extract_path_1 = ();
    type json_extract_path_2 = ();
    type json_extract_path_text_1 = ();
    type json_extract_path_text_2 = ();
    type json_object_with_keys_and_values = ();
    type json_object = ();
    type json_populate_record = ();
    type json_strip_nulls = ();
    type json_typeof = ();
    type jsonb_array_length = ();
    type jsonb_build_array_0 = ();
    type jsonb_build_array_1 = ();
    type jsonb_build_array_2 = ();
    type jsonb_extract_path_1 = ();
    type jsonb_extract_path_2 = ();
    type jsonb_extract_path_text_1 = ();
    type jsonb_extract_path_text_2 = ();
    type jsonb_insert_with_insert_after = ();
    type jsonb_insert = ();
    type jsonb_object_with_keys_and_values = ();
    type jsonb_object = ();
    type jsonb_populate_record = ();
    type jsonb_pretty = ();
    type jsonb_set_create_if_missing = ();
    type jsonb_set_lax = ();
    type jsonb_set = ();
    type jsonb_strip_nulls = ();
    type jsonb_typeof = ();
    type lag_with_offset_and_default = ();
    type lag_with_offset = ();
    type lag = ();
    type last_value = ();
    type lead_with_offset_and_default = ();
    type lead_with_offset = ();
    type lead = ();
    type lower_inc = ();
    type lower_inf = ();
    type lower = ();
    type masklen = ();
    type max = ();
    type min = ();
    type multirange_merge = ();
    type netmask = ();
    type network = ();
    type nth_value = ();
    type numrange = ();
    type range_merge = ();
    type row_to_json = ();
    type set_masklen = ();
    type sum = ();
    type to_json = ();
    type to_jsonb = ();
    type trim_array = ();
    type tsrange = ();
    type tstzrange = ();
    type upper_inc = ();
    type upper_inf = ();
    type upper = ();
    type json = ();
    type json_array_0 = ();
    type json_array_1 = ();
    type json_array_2 = ();
    type json_array_length_with_path = ();
    type json_error_position = ();
    type json_extract_double = ();
    type json_extract_integer = ();
    type json_extract_json_1 = ();
    type json_extract_json_2 = ();
    type json_extract_string = ();
    type json_group_array = ();
    type json_group_object = ();
    type json_insert_0 = ();
    type json_insert_1 = ();
    type json_insert_2 = ();
    type json_object_0 = ();
    type json_object_1 = ();
    type json_object_2 = ();
    type json_patch = ();
    type json_pretty = ();
    type json_pretty_with_indentation = ();
    type json_quote = ();
    type json_remove_0 = ();
    type json_remove_1 = ();
    type json_remove_2 = ();
    type json_replace_0 = ();
    type json_replace_1 = ();
    type json_replace_2 = ();
    type json_set_0 = ();
    type json_set_1 = ();
    type json_set_2 = ();
    type json_type = ();
    type json_type_with_path = ();
    type json_valid = ();
    type json_valid_with_flags = ();
    type jsonb = ();
    type jsonb_array_0 = ();
    type jsonb_array_1 = ();
    type jsonb_array_2 = ();
    type jsonb_extract_double = ();
    type jsonb_extract_integer = ();
    type jsonb_extract_jsonb_1 = ();
    type jsonb_extract_jsonb_2 = ();
    type jsonb_extract_string = ();
    type jsonb_group_array = ();
    type jsonb_group_object = ();
    type jsonb_insert_0 = ();
    type jsonb_insert_1 = ();
    type jsonb_insert_2 = ();
    type jsonb_object_0 = ();
    type jsonb_object_1 = ();
    type jsonb_object_2 = ();
    type jsonb_patch = ();
    type jsonb_remove_0 = ();
    type jsonb_remove_1 = ();
    type jsonb_remove_2 = ();
    type jsonb_replace_0 = ();
    type jsonb_replace_1 = ();
    type jsonb_replace_2 = ();
    type jsonb_set_0 = ();
    type jsonb_set_1 = ();
    type jsonb_set_2 = ();
}make_proxy_mod!(helper_types_proxy, crate::helper_types);
378    #[doc(inline)]
379    pub use helper_types_proxy::*;
380
381    #[allow(hidden_glob_reexports, non_camel_case_types, dead_code)]
mod expression_dsl_proxy {
    #[doc(inline)]
    pub use crate::expression::dsl::*;
    type abbrev = ();
    type array_append = ();
    type array_cat = ();
    type array_dims = ();
    type array_fill_with_lower_bound = ();
    type array_fill = ();
    type array_length = ();
    type array_lower = ();
    type array_ndims = ();
    type array_position_with_subscript = ();
    type array_position = ();
    type array_positions = ();
    type array_prepend = ();
    type array_remove = ();
    type array_replace = ();
    type array_sample = ();
    type array_shuffle = ();
    type array_to_json = ();
    type array_to_string_with_null_string = ();
    type array_to_string = ();
    type array_upper = ();
    type avg = ();
    type broadcast = ();
    type cardinality = ();
    type daterange = ();
    type family = ();
    type first_value = ();
    type host = ();
    type hostmask = ();
    type inet_merge = ();
    type inet_same_family = ();
    type int4range = ();
    type int8range = ();
    type isempty = ();
    type json_array_length = ();
    type json_build_array_0 = ();
    type json_build_array_1 = ();
    type json_build_array_2 = ();
    type json_extract_path_1 = ();
    type json_extract_path_2 = ();
    type json_extract_path_text_1 = ();
    type json_extract_path_text_2 = ();
    type json_object_with_keys_and_values = ();
    type json_object = ();
    type json_populate_record = ();
    type json_strip_nulls = ();
    type json_typeof = ();
    type jsonb_array_length = ();
    type jsonb_build_array_0 = ();
    type jsonb_build_array_1 = ();
    type jsonb_build_array_2 = ();
    type jsonb_extract_path_1 = ();
    type jsonb_extract_path_2 = ();
    type jsonb_extract_path_text_1 = ();
    type jsonb_extract_path_text_2 = ();
    type jsonb_insert_with_insert_after = ();
    type jsonb_insert = ();
    type jsonb_object_with_keys_and_values = ();
    type jsonb_object = ();
    type jsonb_populate_record = ();
    type jsonb_pretty = ();
    type jsonb_set_create_if_missing = ();
    type jsonb_set_lax = ();
    type jsonb_set = ();
    type jsonb_strip_nulls = ();
    type jsonb_typeof = ();
    type lag_with_offset_and_default = ();
    type lag_with_offset = ();
    type lag = ();
    type last_value = ();
    type lead_with_offset_and_default = ();
    type lead_with_offset = ();
    type lead = ();
    type lower_inc = ();
    type lower_inf = ();
    type lower = ();
    type masklen = ();
    type max = ();
    type min = ();
    type multirange_merge = ();
    type netmask = ();
    type network = ();
    type nth_value = ();
    type numrange = ();
    type range_merge = ();
    type row_to_json = ();
    type set_masklen = ();
    type sum = ();
    type to_json = ();
    type to_jsonb = ();
    type trim_array = ();
    type tsrange = ();
    type tstzrange = ();
    type upper_inc = ();
    type upper_inf = ();
    type upper = ();
    type json = ();
    type json_array_0 = ();
    type json_array_1 = ();
    type json_array_2 = ();
    type json_array_length_with_path = ();
    type json_error_position = ();
    type json_extract_double = ();
    type json_extract_integer = ();
    type json_extract_json_1 = ();
    type json_extract_json_2 = ();
    type json_extract_string = ();
    type json_group_array = ();
    type json_group_object = ();
    type json_insert_0 = ();
    type json_insert_1 = ();
    type json_insert_2 = ();
    type json_object_0 = ();
    type json_object_1 = ();
    type json_object_2 = ();
    type json_patch = ();
    type json_pretty = ();
    type json_pretty_with_indentation = ();
    type json_quote = ();
    type json_remove_0 = ();
    type json_remove_1 = ();
    type json_remove_2 = ();
    type json_replace_0 = ();
    type json_replace_1 = ();
    type json_replace_2 = ();
    type json_set_0 = ();
    type json_set_1 = ();
    type json_set_2 = ();
    type json_type = ();
    type json_type_with_path = ();
    type json_valid = ();
    type json_valid_with_flags = ();
    type jsonb = ();
    type jsonb_array_0 = ();
    type jsonb_array_1 = ();
    type jsonb_array_2 = ();
    type jsonb_extract_double = ();
    type jsonb_extract_integer = ();
    type jsonb_extract_jsonb_1 = ();
    type jsonb_extract_jsonb_2 = ();
    type jsonb_extract_string = ();
    type jsonb_group_array = ();
    type jsonb_group_object = ();
    type jsonb_insert_0 = ();
    type jsonb_insert_1 = ();
    type jsonb_insert_2 = ();
    type jsonb_object_0 = ();
    type jsonb_object_1 = ();
    type jsonb_object_2 = ();
    type jsonb_patch = ();
    type jsonb_remove_0 = ();
    type jsonb_remove_1 = ();
    type jsonb_remove_2 = ();
    type jsonb_replace_0 = ();
    type jsonb_replace_1 = ();
    type jsonb_replace_2 = ();
    type jsonb_set_0 = ();
    type jsonb_set_1 = ();
    type jsonb_set_2 = ();
}make_proxy_mod!(expression_dsl_proxy, crate::expression::dsl);
382    #[doc(inline)]
383    pub use expression_dsl_proxy::*;
384
385    #[doc(inline)]
386    pub use crate::query_builder::functions::{
387        delete, insert_into, insert_or_ignore_into, replace_into, select, sql_query, update,
388    };
389
390    #[doc(inline)]
391    #[cfg(feature = "postgres_backend")]
392    pub use crate::query_builder::functions::{copy_from, copy_to};
393
394    #[doc(inline)]
395    pub use diesel_derives::auto_type;
396
397    #[cfg(feature = "postgres_backend")]
398    #[doc(inline)]
399    pub use crate::pg::expression::extensions::OnlyDsl;
400
401    #[cfg(feature = "postgres_backend")]
402    #[doc(inline)]
403    pub use crate::pg::expression::extensions::TablesampleDsl;
404}
405
406pub mod helper_types {
407    //! Provide helper types for concisely writing the return type of functions.
408    //! As with iterators, it is unfortunately difficult to return a partially
409    //! constructed query without exposing the exact implementation of the
410    //! function. Without higher kinded types, these various DSLs can't be
411    //! combined into a single trait for boxing purposes.
412    //!
413    //! All types here are in the form `<FirstType as
414    //! DslName<OtherTypes>>::Output`. So the return type of
415    //! `users.filter(first_name.eq("John")).order(last_name.asc()).limit(10)` would
416    //! be `Limit<Order<FindBy<users, first_name, &str>, Asc<last_name>>>`
417    use super::query_builder::combination_clause::{self, CombinationClause};
418    use super::query_builder::{AsQuery, locking_clause as lock};
419    use super::query_dsl::methods::*;
420    use super::query_dsl::*;
421    use super::query_source::{aliasing, joins};
422    use crate::dsl::CountStar;
423    use crate::query_builder::select_clause::SelectClause;
424
425    #[doc(inline)]
426    pub use crate::expression::helper_types::*;
427
428    /// Represents the return type of [`.select(selection)`](crate::prelude::QueryDsl::select)
429    pub type Select<Source, Selection> = <Source as SelectDsl<Selection>>::Output;
430
431    /// Represents the return type of [`diesel::select(selection)`](crate::select)
432    #[allow(non_camel_case_types)] // required for `#[auto_type]`
433    pub type select<Selection> = crate::query_builder::SelectStatement<
434        crate::query_builder::NoFromClause,
435        SelectClause<Selection>,
436    >;
437
438    #[doc(hidden)]
439    #[deprecated(note = "Use `select` instead")]
440    pub type BareSelect<Selection> = crate::query_builder::SelectStatement<
441        crate::query_builder::NoFromClause,
442        SelectClause<Selection>,
443    >;
444
445    /// Represents the return type of [`.filter(predicate)`](crate::prelude::QueryDsl::filter)
446    pub type Filter<Source, Predicate> = <Source as FilterDsl<Predicate>>::Output;
447
448    /// Represents the return type of [`.filter(lhs.eq(rhs))`](crate::prelude::QueryDsl::filter)
449    pub type FindBy<Source, Column, Value> = Filter<Source, Eq<Column, Value>>;
450
451    /// Represents the return type of [`.for_update()`](crate::prelude::QueryDsl::for_update)
452    pub type ForUpdate<Source> = <Source as LockingDsl<lock::ForUpdate>>::Output;
453
454    /// Represents the return type of [`.for_no_key_update()`](crate::prelude::QueryDsl::for_no_key_update)
455    pub type ForNoKeyUpdate<Source> = <Source as LockingDsl<lock::ForNoKeyUpdate>>::Output;
456
457    /// Represents the return type of [`.for_share()`](crate::prelude::QueryDsl::for_share)
458    pub type ForShare<Source> = <Source as LockingDsl<lock::ForShare>>::Output;
459
460    /// Represents the return type of [`.for_key_share()`](crate::prelude::QueryDsl::for_key_share)
461    pub type ForKeyShare<Source> = <Source as LockingDsl<lock::ForKeyShare>>::Output;
462
463    /// Represents the return type of [`.skip_locked()`](crate::prelude::QueryDsl::skip_locked)
464    pub type SkipLocked<Source> = <Source as ModifyLockDsl<lock::SkipLocked>>::Output;
465
466    /// Represents the return type of [`.no_wait()`](crate::prelude::QueryDsl::no_wait)
467    pub type NoWait<Source> = <Source as ModifyLockDsl<lock::NoWait>>::Output;
468
469    /// Represents the return type of [`.find(pk)`](crate::prelude::QueryDsl::find)
470    pub type Find<Source, PK> = <Source as FindDsl<PK>>::Output;
471
472    /// Represents the return type of [`.or_filter(predicate)`](crate::prelude::QueryDsl::or_filter)
473    pub type OrFilter<Source, Predicate> = <Source as OrFilterDsl<Predicate>>::Output;
474
475    /// Represents the return type of [`.order(ordering)`](crate::prelude::QueryDsl::order)
476    pub type Order<Source, Ordering> = <Source as OrderDsl<Ordering>>::Output;
477
478    /// Represents the return type of [`.order_by(ordering)`](crate::prelude::QueryDsl::order_by)
479    ///
480    /// Type alias of [Order]
481    pub type OrderBy<Source, Ordering> = Order<Source, Ordering>;
482
483    /// Represents the return type of [`.then_order_by(ordering)`](crate::prelude::QueryDsl::then_order_by)
484    pub type ThenOrderBy<Source, Ordering> = <Source as ThenOrderDsl<Ordering>>::Output;
485
486    /// Represents the return type of [`.limit()`](crate::prelude::QueryDsl::limit)
487    pub type Limit<Source, DummyArgForAutoType = i64> =
488        <Source as LimitDsl<DummyArgForAutoType>>::Output;
489
490    /// Represents the return type of [`.offset()`](crate::prelude::QueryDsl::offset)
491    pub type Offset<Source, DummyArgForAutoType = i64> =
492        <Source as OffsetDsl<DummyArgForAutoType>>::Output;
493
494    /// Represents the return type of [`.inner_join(rhs)`](crate::prelude::QueryDsl::inner_join)
495    pub type InnerJoin<Source, Rhs> =
496        <Source as JoinWithImplicitOnClause<Rhs, joins::Inner>>::Output;
497
498    /// Represents the return type of [`.inner_join(rhs.on(on))`](crate::prelude::QueryDsl::inner_join)
499    pub type InnerJoinOn<Source, Rhs, On> =
500        <Source as InternalJoinDsl<Rhs, joins::Inner, On>>::Output;
501
502    /// Represents the return type of [`.left_join(rhs)`](crate::prelude::QueryDsl::left_join)
503    pub type LeftJoin<Source, Rhs> =
504        <Source as JoinWithImplicitOnClause<Rhs, joins::LeftOuter>>::Output;
505
506    /// Represents the return type of [`.left_join(rhs.on(on))`](crate::prelude::QueryDsl::left_join)
507    pub type LeftJoinOn<Source, Rhs, On> =
508        <Source as InternalJoinDsl<Rhs, joins::LeftOuter, On>>::Output;
509
510    /// Represents the return type of [`rhs.on(on)`](crate::query_dsl::JoinOnDsl::on)
511    pub type On<Source, On> = joins::OnClauseWrapper<Source, On>;
512
513    use super::associations::HasTable;
514    use super::query_builder::{AsChangeset, IntoUpdateTarget, UpdateStatement};
515
516    /// Represents the return type of [`update(lhs).set(rhs)`](crate::query_builder::UpdateStatement::set)
517    pub type Update<Target, Changes> = UpdateStatement<
518        <Target as HasTable>::Table,
519        <Target as IntoUpdateTarget>::WhereClause,
520        <Changes as AsChangeset>::Changeset,
521    >;
522
523    /// Represents the return type of [`.into_boxed::<'a, DB>()`](crate::prelude::QueryDsl::into_boxed)
524    pub type IntoBoxed<'a, Source, DB> = <Source as BoxedDsl<'a, DB>>::Output;
525
526    /// Represents the return type of [`.into_boxed_clone::<'a, DB>()`](crate::prelude::QueryDsl::into_boxed_clone)
527    pub type IntoBoxedClone<'a, Source, DB> = <Source as BoxedCloneDsl<'a, DB>>::Output;
528
529    /// Represents the return type of [`.distinct()`](crate::prelude::QueryDsl::distinct)
530    pub type Distinct<Source> = <Source as DistinctDsl>::Output;
531
532    /// Represents the return type of [`.distinct_on(expr)`](crate::prelude::QueryDsl::distinct_on)
533    #[cfg(feature = "postgres_backend")]
534    pub type DistinctOn<Source, Expr> = <Source as DistinctOnDsl<Expr>>::Output;
535
536    /// Represents the return type of [`.single_value()`](SingleValueDsl::single_value)
537    pub type SingleValue<Source> = <Source as SingleValueDsl>::Output;
538
539    /// Represents the return type of [`.nullable()`](SelectNullableDsl::nullable)
540    pub type NullableSelect<Source> = <Source as SelectNullableDsl>::Output;
541
542    /// Represents the return type of [`.group_by(expr)`](crate::prelude::QueryDsl::group_by)
543    pub type GroupBy<Source, Expr> = <Source as GroupByDsl<Expr>>::Output;
544
545    /// Represents the return type of [`.having(predicate)`](crate::prelude::QueryDsl::having)
546    pub type Having<Source, Predicate> = <Source as HavingDsl<Predicate>>::Output;
547
548    /// Represents the return type of [`.union(rhs)`](crate::prelude::CombineDsl::union)
549    pub type Union<Source, Rhs> = CombinationClause<
550        combination_clause::Union,
551        combination_clause::Distinct,
552        <Source as CombineDsl>::Query,
553        <Rhs as AsQuery>::Query,
554    >;
555
556    /// Represents the return type of [`.union_all(rhs)`](crate::prelude::CombineDsl::union_all)
557    pub type UnionAll<Source, Rhs> = CombinationClause<
558        combination_clause::Union,
559        combination_clause::All,
560        <Source as CombineDsl>::Query,
561        <Rhs as AsQuery>::Query,
562    >;
563
564    /// Represents the return type of [`.intersect(rhs)`](crate::prelude::CombineDsl::intersect)
565    pub type Intersect<Source, Rhs> = CombinationClause<
566        combination_clause::Intersect,
567        combination_clause::Distinct,
568        <Source as CombineDsl>::Query,
569        <Rhs as AsQuery>::Query,
570    >;
571
572    /// Represents the return type of [`.intersect_all(rhs)`](crate::prelude::CombineDsl::intersect_all)
573    pub type IntersectAll<Source, Rhs> = CombinationClause<
574        combination_clause::Intersect,
575        combination_clause::All,
576        <Source as CombineDsl>::Query,
577        <Rhs as AsQuery>::Query,
578    >;
579
580    /// Represents the return type of [`.except(rhs)`](crate::prelude::CombineDsl::except)
581    pub type Except<Source, Rhs> = CombinationClause<
582        combination_clause::Except,
583        combination_clause::Distinct,
584        <Source as CombineDsl>::Query,
585        <Rhs as AsQuery>::Query,
586    >;
587
588    /// Represents the return type of [`.except_all(rhs)`](crate::prelude::CombineDsl::except_all)
589    pub type ExceptAll<Source, Rhs> = CombinationClause<
590        combination_clause::Except,
591        combination_clause::All,
592        <Source as CombineDsl>::Query,
593        <Rhs as AsQuery>::Query,
594    >;
595
596    type JoinQuerySource<Left, Right, Kind, On> = joins::JoinOn<joins::Join<Left, Right, Kind>, On>;
597
598    /// A query source representing the inner join between two tables.
599    ///
600    /// The third generic type (`On`) controls how the tables are
601    /// joined.
602    ///
603    /// By default, the implicit join established by [`joinable!`][]
604    /// will be used, allowing you to omit the exact join
605    /// condition. For example, for the inner join between three
606    /// tables that implement [`JoinTo`][], you only need to specify
607    /// the tables: `InnerJoinQuerySource<InnerJoinQuerySource<table1,
608    /// table2>, table3>`.
609    ///
610    /// [`JoinTo`]: crate::query_source::JoinTo
611    ///
612    /// If you use an explicit `ON` clause, you will need to specify
613    /// the `On` generic type.
614    ///
615    /// ```rust
616    /// # include!("doctest_setup.rs");
617    /// use diesel::{dsl, helper_types::InnerJoinQuerySource};
618    /// # use diesel::{backend::Backend, serialize::ToSql, sql_types};
619    /// use schema::*;
620    ///
621    /// # fn main() -> QueryResult<()> {
622    /// #     let conn = &mut establish_connection();
623    /// #
624    /// // If you have an explicit join like this...
625    /// let join_constraint = comments::columns::post_id.eq(posts::columns::id);
626    /// #     let query =
627    /// posts::table.inner_join(comments::table.on(join_constraint));
628    /// #
629    /// #     // Dummy usage just to ensure the example compiles.
630    /// #     let filter = posts::columns::id.eq(1);
631    /// #     let filter: &FilterExpression<_> = &filter;
632    /// #     query.filter(filter).select(posts::columns::id).get_result::<i32>(conn)?;
633    /// #
634    /// #     Ok(())
635    /// # }
636    ///
637    /// // ... you can use `InnerJoinQuerySource` like this.
638    /// type JoinConstraint = dsl::Eq<comments::columns::post_id, posts::columns::id>;
639    /// type MyInnerJoinQuerySource = InnerJoinQuerySource<posts::table, comments::table, JoinConstraint>;
640    /// # type FilterExpression<DB> = dyn BoxableExpression<MyInnerJoinQuerySource, DB, SqlType = sql_types::Bool>;
641    /// ```
642    pub type InnerJoinQuerySource<Left, Right, On = <Left as joins::JoinTo<Right>>::OnClause> =
643        JoinQuerySource<Left, Right, joins::Inner, On>;
644
645    /// A query source representing the left outer join between two tables.
646    ///
647    /// The third generic type (`On`) controls how the tables are
648    /// joined.
649    ///
650    /// By default, the implicit join established by [`joinable!`][]
651    /// will be used, allowing you to omit the exact join
652    /// condition. For example, for the left join between three
653    /// tables that implement [`JoinTo`][], you only need to specify
654    /// the tables: `LeftJoinQuerySource<LeftJoinQuerySource<table1,
655    /// table2>, table3>`.
656    ///
657    /// [`JoinTo`]: crate::query_source::JoinTo
658    ///
659    /// If you use an explicit `ON` clause, you will need to specify
660    /// the `On` generic type.
661    ///
662    /// ```rust
663    /// # include!("doctest_setup.rs");
664    /// use diesel::{dsl, helper_types::LeftJoinQuerySource};
665    /// # use diesel::{backend::Backend, serialize::ToSql, sql_types};
666    /// use schema::*;
667    ///
668    /// # fn main() -> QueryResult<()> {
669    /// #     let conn = &mut establish_connection();
670    /// #
671    /// // If you have an explicit join like this...
672    /// let join_constraint = comments::columns::post_id.eq(posts::columns::id);
673    /// #     let query =
674    /// posts::table.left_join(comments::table.on(join_constraint));
675    /// #
676    /// #     // Dummy usage just to ensure the example compiles.
677    /// #     let filter = posts::columns::id.eq(1);
678    /// #     let filter: &FilterExpression<_> = &filter;
679    /// #     query.filter(filter).select(posts::columns::id).get_result::<i32>(conn)?;
680    /// #
681    /// #     Ok(())
682    /// # }
683    ///
684    /// // ... you can use `LeftJoinQuerySource` like this.
685    /// type JoinConstraint = dsl::Eq<comments::columns::post_id, posts::columns::id>;
686    /// type MyLeftJoinQuerySource = LeftJoinQuerySource<posts::table, comments::table, JoinConstraint>;
687    /// # type FilterExpression<DB> = dyn BoxableExpression<MyLeftJoinQuerySource, DB, SqlType = sql_types::Bool>;
688    /// ```
689    pub type LeftJoinQuerySource<Left, Right, On = <Left as joins::JoinTo<Right>>::OnClause> =
690        JoinQuerySource<Left, Right, joins::LeftOuter, On>;
691
692    /// Maps `F` to `Alias<S>`
693    ///
694    /// Any column `F` that belongs to `S::Table` will be transformed into
695    /// [`AliasedField<S, Self>`](crate::query_source::AliasedField)
696    ///
697    /// Any column `F` that does not belong to `S::Table` will be left untouched.
698    ///
699    /// This also works with tuples and some expressions.
700    pub type AliasedFields<S, F> = <F as aliasing::FieldAliasMapper<S>>::Out;
701
702    #[doc(hidden)]
703    #[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
704    #[deprecated(note = "Use `LoadQuery::RowIter` directly")]
705    pub type LoadIter<'conn, 'query, Q, Conn, U, B = crate::connection::DefaultLoadingMode> =
706        <Q as load_dsl::LoadQuery<'query, Conn, U, B>>::RowIter<'conn>;
707
708    /// Represents the return type of [`diesel::delete`]
709    #[allow(non_camel_case_types)] // required for `#[auto_type]`
710    pub type delete<T> = crate::query_builder::DeleteStatement<
711        <T as HasTable>::Table,
712        <T as IntoUpdateTarget>::WhereClause,
713    >;
714
715    /// Represents the return type of [`diesel::insert_into`]
716    #[allow(non_camel_case_types)] // required for `#[auto_type]`
717    pub type insert_into<T> = crate::query_builder::IncompleteInsertStatement<T>;
718
719    /// Represents the return type of [`diesel::update`]
720    #[allow(non_camel_case_types)] // required for `#[auto_type]`
721    pub type update<T> =
722        UpdateStatement<<T as HasTable>::Table, <T as IntoUpdateTarget>::WhereClause>;
723
724    /// Represents the return type of [`diesel::insert_or_ignore_into`]
725    #[allow(non_camel_case_types)] // required for `#[auto_type]`
726    pub type insert_or_ignore_into<T> = crate::query_builder::IncompleteInsertOrIgnoreStatement<T>;
727
728    /// Represents the return type of [`diesel::replace_into`]
729    #[allow(non_camel_case_types)] // required for `#[auto_type]`
730    pub type replace_into<T> = crate::query_builder::IncompleteReplaceStatement<T>;
731
732    /// Represents the return type of
733    /// [`IncompleteInsertStatement::values()`](crate::query_builder::IncompleteInsertStatement::values)
734    pub type Values<I, U> = crate::query_builder::InsertStatement<
735        <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
736        <U as crate::Insertable<
737            <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
738        >>::Values,
739        <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Op,
740    >;
741
742    /// Represents the return type of
743    /// [`InsertStatement::on_conflict()`](crate::query_builder::InsertStatement::on_conflict)
744    pub type OnConflict<I, Target> = crate::upsert::IncompleteOnConflict<
745        crate::query_builder::InsertStatement<
746            <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
747            <<I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Values as crate::query_builder::IntoConflictValueClause>::ValueClause,
748            <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Op,
749            <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Ret,
750        >,
751        crate::query_builder::ConflictTarget<Target>,
752        >;
753
754    /// Represents the return type of [`InsertStatement::on_conflict_do_nothing`](crate::query_builder::InsertStatement::on_conflict_do_nothing)
755    pub type OnConflictDoNothing<I> = crate::query_builder::InsertStatement<
756        <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
757        crate::query_builder::upsert::on_conflict_clause::OnConflictValues<
758            <<I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Values as crate::query_builder::IntoConflictValueClause>::ValueClause,
759            crate::query_builder::upsert::on_conflict_target::NoConflictTarget,
760            crate::query_builder::upsert::on_conflict_actions::DoNothing<
761                <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
762            >,
763        >,
764        <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Op,
765        <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Ret,
766    >;
767
768    /// Represents the return type of
769    /// [`IncompleteOnConflict::do_nothing()`](crate::upsert::IncompleteOnConflict::do_nothing)
770    pub type DoNothing<I> = crate::query_builder::InsertStatement<
771        <I as crate::upsert::OnConflictHelper>::Table,
772        crate::query_builder::upsert::on_conflict_clause::OnConflictValues<
773            <I as crate::upsert::OnConflictHelper>::Values,
774            <I as crate::upsert::OnConflictHelper>::Target,
775            crate::query_builder::upsert::on_conflict_actions::DoNothing<
776                <I as crate::upsert::OnConflictHelper>::Table,
777            >,
778        >,
779        <I as crate::upsert::OnConflictHelper>::Op,
780        <I as crate::upsert::OnConflictHelper>::Ret,
781    >;
782
783    /// Represents the return type of
784    /// [`IncompleteOnConflict::do_update()`](crate::upsert::IncompleteOnConflict::do_update)
785    pub type DoUpdate<I> = crate::upsert::IncompleteDoUpdate<
786        crate::query_builder::InsertStatement<
787            <I as crate::upsert::OnConflictHelper>::Table,
788            <I as crate::upsert::OnConflictHelper>::Values,
789            <I as crate::upsert::OnConflictHelper>::Op,
790            <I as crate::upsert::OnConflictHelper>::Ret,
791        >,
792        <I as crate::upsert::OnConflictHelper>::Target,
793    >;
794
795    /// Represents the return type of
796    /// [`UpdateStatement::set()`](crate::query_builder::UpdateStatement::set) and
797    /// [`IncompleteDoUpdate::set()`](crate::upsert::IncompleteDoUpdate::set)
798    pub type Set<U, V> = <U as crate::query_builder::update_statement::SetAutoTypeHelper<V>>::Out;
799
800    /// Represents the return type of
801    /// [`InsertStatement::returning`](crate::query_builder::InsertStatement::returning),
802    /// [`UpdateStatement::returning`] and
803    /// [`DeleteStatement::returning`](crate::query_builder::DeleteStatement::returning)
804    pub type Returning<Q, S> =
805        <Q as crate::query_builder::returning::ReturningClauseHelper<S>>::WithReturning;
806
807    #[doc(hidden)] // used for `QueryDsl::count`
808    pub type Count<Q> = Select<Q, CountStar>;
809}
810
811pub mod prelude {
812
813    //! Re-exports important traits and types. Meant to be glob imported when using Diesel.
814
815    #[doc(inline)]
816    pub use crate::associations::{Associations, GroupedBy, Identifiable};
817    #[doc(inline)]
818    pub use crate::connection::Connection;
819    #[doc(inline)]
820    pub use crate::deserialize::{Queryable, QueryableByName};
821    #[doc(inline)]
822    pub use crate::expression::{
823        AppearsOnTable, BoxableExpression, Expression, IntoSql, Selectable, SelectableExpression,
824    };
825    // If [`IntoSql`](crate::expression::helper_types::IntoSql) the type gets imported at the
826    // same time as IntoSql the trait (this one) gets imported via the prelude, then
827    // methods of the trait won't be resolved because the type may take priority over the trait.
828    // That issue can be avoided by also importing it anonymously:
829    pub use crate::expression::IntoSql as _;
830
831    #[doc(inline)]
832    pub use crate::expression::functions::declare_sql_function;
833    #[doc(inline)]
834    pub use crate::expression::functions::define_sql_function;
835    #[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
836    pub use crate::expression::functions::sql_function;
837
838    #[doc(inline)]
839    pub use crate::expression::SelectableHelper;
840    #[doc(inline)]
841    pub use crate::expression_methods::*;
842    #[doc(inline)]
843    pub use crate::insertable::Insertable;
844    #[doc(inline)]
845    pub use crate::macros::prelude::*;
846    #[doc(inline)]
847    pub use crate::query_builder::AsChangeset;
848    #[doc(inline)]
849    pub use crate::query_builder::DecoratableTarget;
850    #[doc(inline)]
851    pub use crate::query_builder::has_query::HasQuery;
852    #[doc(inline)]
853    pub use crate::query_dsl::{
854        BelongingToDsl, CombineDsl, JoinOnDsl, QueryDsl, RunQueryDsl, SaveChangesDsl,
855    };
856    pub use crate::query_source::SizeRestrictedColumn as _;
857    #[doc(inline)]
858    pub use crate::query_source::{Column, JoinTo, QuerySource, Table};
859    #[doc(inline)]
860    pub use crate::result::{
861        ConnectionError, ConnectionResult, OptionalEmptyChangesetExtension, OptionalExtension,
862        QueryResult,
863    };
864    #[doc(inline)]
865    pub use diesel_derives::allow_tables_to_appear_in_same_query;
866    #[doc(inline)]
867    pub use diesel_derives::table_proc as table;
868    #[doc(inline)]
869    pub use diesel_derives::view_proc as view;
870
871    #[cfg(feature = "mariadb")]
872    #[doc(inline)]
873    pub use crate::mariadb::MariadbConnection;
874    #[cfg(feature = "mysql")]
875    #[doc(inline)]
876    pub use crate::mysql::MysqlConnection;
877    #[cfg(feature = "postgres")]
878    #[doc(inline)]
879    pub use crate::pg::PgConnection;
880    #[doc(inline)]
881    #[cfg(feature = "postgres_backend")]
882    pub use crate::pg::query_builder::copy::ExecuteCopyFromDsl;
883    #[cfg(feature = "__sqlite-shared")]
884    #[doc(inline)]
885    pub use crate::sqlite::SqliteConnection;
886}
887
888#[doc(inline)]
889pub use crate::macros::table;
890
891#[doc(inline)]
892pub use diesel_derives::allow_tables_to_appear_in_same_query;
893
894pub use crate::prelude::*;
895#[doc(inline)]
896pub use crate::query_builder::debug_query;
897#[doc(inline)]
898#[cfg(feature = "postgres")]
899pub use crate::query_builder::functions::{copy_from, copy_to};
900#[doc(inline)]
901pub use crate::query_builder::functions::{
902    delete, insert_into, insert_or_ignore_into, replace_into, select, sql_query, update,
903};
904pub use crate::result::Error::NotFound;
905
906extern crate self as diesel;