Skip to main content

diesel/sqlite/expression/
functions.rs

1//! SQLite specific functions
2#[cfg(doc)]
3use crate::expression::functions::aggregate_expressions::AggregateExpressionMethods;
4use crate::expression::functions::declare_sql_function;
5use crate::expression_methods::json_expression_methods::private::JsonOrNullableJsonOrJsonbOrNullableJsonb;
6use crate::sql_types::*;
7use crate::sqlite::expression::expression_methods::BinaryOrNullableBinary;
8use crate::sqlite::expression::expression_methods::JsonOrNullableJson;
9use crate::sqlite::expression::expression_methods::MaybeNullableValue;
10use crate::sqlite::expression::expression_methods::NotBlob;
11use crate::sqlite::expression::expression_methods::TextOrNullableText;
12use crate::sqlite::expression::expression_methods::TextOrNullableTextOrBinaryOrNullableBinary;
13use crate::sqlite::expression::functions::helper::CombinedNullableValue;
14
15#[cfg(feature = "__sqlite-shared")]
16#[allow(unused_imports)]
#[doc(hidden)]
mod return_type_helpers {
    #[doc(inline)]
    pub use super::__json_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_return_type::*;
    #[doc(inline)]
    pub use super::__json_array_length_return_type::*;
    #[doc(inline)]
    pub use super::__json_array_length_with_path_return_type::*;
    #[doc(inline)]
    pub use super::__json_error_position_return_type::*;
    #[doc(inline)]
    pub use super::__json_extract_string_return_type::*;
    #[doc(inline)]
    pub use super::__json_extract_integer_return_type::*;
    #[doc(inline)]
    pub use super::__json_extract_double_return_type::*;
    #[doc(inline)]
    pub use super::__json_extract_json_return_types::*;
    #[doc(inline)]
    pub use super::__jsonb_extract_string_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_extract_integer_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_extract_double_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_extract_jsonb_return_types::*;
    #[doc(inline)]
    pub use super::__json_pretty_return_type::*;
    #[doc(inline)]
    pub use super::__json_pretty_with_indentation_return_type::*;
    #[doc(inline)]
    pub use super::__json_valid_return_type::*;
    #[doc(inline)]
    pub use super::__json_valid_with_flags_return_type::*;
    #[doc(inline)]
    pub use super::__json_type_return_type::*;
    #[doc(inline)]
    pub use super::__json_type_with_path_return_type::*;
    #[doc(inline)]
    pub use super::__json_quote_return_type::*;
    #[doc(inline)]
    pub use super::__json_group_array_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_group_array_return_type::*;
    #[doc(inline)]
    pub use super::__json_object_return_types::*;
    #[doc(inline)]
    pub use super::__jsonb_object_return_types::*;
    #[doc(inline)]
    pub use super::__json_group_object_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_group_object_return_type::*;
    #[doc(inline)]
    pub use super::__json_array_return_types::*;
    #[doc(inline)]
    pub use super::__jsonb_array_return_types::*;
    #[doc(inline)]
    pub use super::__json_remove_return_types::*;
    #[doc(inline)]
    pub use super::__jsonb_remove_return_types::*;
    #[doc(inline)]
    pub use super::__json_patch_return_type::*;
    #[doc(inline)]
    pub use super::__jsonb_patch_return_type::*;
}#[declare_sql_function(generate_return_type_helpers = true)]
17#[backends(crate::sqlite::Sqlite)]
18extern "SQL" {
19    /// Verifies that its argument is a valid JSON string or JSONB blob and returns a minified
20    /// version of that JSON string with all unnecessary whitespace removed.
21    ///
22    /// # Example
23    ///
24    /// ```rust
25    /// # include!("../../doctest_setup.rs");
26    /// #
27    /// # fn main() {
28    /// #     #[cfg(feature = "serde_json")]
29    /// #     run_test().unwrap();
30    /// # }
31    /// #
32    /// # #[cfg(feature = "serde_json")]
33    /// # fn run_test() -> QueryResult<()> {
34    /// #     use diesel::dsl::json;
35    /// #     use serde_json::{json, Value};
36    /// #     use diesel::sql_types::{Text, Nullable};
37    /// #     let connection = &mut establish_connection();
38    ///
39    /// let result = diesel::select(json::<Text, _>(r#"{"a": "b", "c": 1}"#))
40    ///     .get_result::<Value>(connection)?;
41    ///
42    /// assert_eq!(json!({"a":"b","c":1}), result);
43    ///
44    /// let result = diesel::select(json::<Text, _>(r#"{ "this" : "is", "a": [ "test" ] }"#))
45    ///     .get_result::<Value>(connection)?;
46    ///
47    /// assert_eq!(json!({"a":["test"],"this":"is"}), result);
48    ///
49    /// let result = diesel::select(json::<Nullable<Text>, _>(None::<&str>))
50    ///     .get_result::<Option<Value>>(connection)?;
51    ///
52    /// assert!(result.is_none());
53    ///
54    /// #     Ok(())
55    /// # }
56    /// ```
57    fn json<E: TextOrNullableText + MaybeNullableValue<Json>>(e: E) -> E::Out;
58
59    /// The jsonb(X) function returns the binary JSONB representation of the JSON provided as argument X.
60    ///
61    /// This function requires at least SQLite 3.45 or newer
62    ///
63    /// # Example
64    ///
65    /// ```rust
66    /// # include!("../../doctest_setup.rs");
67    /// #
68    /// # fn main() {
69    /// #     #[cfg(feature = "serde_json")]
70    /// #     run_test().unwrap();
71    /// # }
72    /// #
73    /// # #[cfg(feature = "serde_json")]
74    /// # fn run_test() -> QueryResult<()> {
75    /// #     use diesel::dsl::{sql, jsonb};
76    /// #     use serde_json::{json, Value};
77    /// #     use diesel::sql_types::{Text, Binary, Nullable};
78    /// #     let connection = &mut establish_connection();
79    /// #     assert_version!(connection, 3, 45, 0);
80    ///
81    /// let result = diesel::select(jsonb::<Binary, _>(br#"{"a": "b", "c": 1}"#))
82    ///     .get_result::<Value>(connection)?;
83    ///
84    /// assert_eq!(json!({"a": "b", "c": 1}), result);
85    ///
86    /// let result = diesel::select(jsonb::<Binary, _>(br#"{"this":"is","a":["test"]}"#))
87    ///     .get_result::<Value>(connection)?;
88    ///
89    /// assert_eq!(json!({"this":"is","a":["test"]}), result);
90    ///
91    /// let result = diesel::select(jsonb::<Nullable<Binary>, _>(None::<Vec<u8>>))
92    ///     .get_result::<Option<Value>>(connection)?;
93    ///
94    /// assert!(result.is_none());
95    ///
96    /// #     Ok(())
97    /// # }
98    /// ```
99    fn jsonb<E: BinaryOrNullableBinary + MaybeNullableValue<Jsonb>>(e: E) -> E::Out;
100
101    /// The json_array_length(X) function returns the number of elements in the JSON array X,
102    /// or 0 if X is some kind of JSON value other than an array.
103    /// Errors are thrown if either X is not well-formed JSON or if P is not a well-formed path.
104    ///
105    /// This function requires at least SQLite 3.46 or newer
106    ///
107    /// # Example
108    ///
109    /// ```rust
110    /// # include!("../../doctest_setup.rs");
111    /// #
112    /// # fn main() {
113    /// #     #[cfg(feature = "serde_json")]
114    /// #     run_test().unwrap();
115    /// # }
116    /// #
117    /// # #[cfg(feature = "serde_json")]
118    /// # fn run_test() -> QueryResult<()> {
119    /// #     use diesel::dsl::{sql, json_array_length};
120    /// #     use serde_json::{json, Value};
121    /// #     use diesel::sql_types::{Json, Jsonb, Text, Nullable};
122    /// #     let connection = &mut establish_connection();
123    /// #     assert_version!(connection, 3, 46, 0);
124    ///
125    /// let result = diesel::select(json_array_length::<Json, _>(json!([1,2,3,4])))
126    ///     .get_result::<i32>(connection)?;
127    ///
128    /// assert_eq!(4, result);
129    ///
130    /// let result = diesel::select(json_array_length::<Json, _>(json!({"one":[1,2,3]})))
131    ///     .get_result::<i32>(connection)?;
132    ///
133    /// assert_eq!(0, result);
134    ///
135    /// let result = diesel::select(json_array_length::<Nullable<Json>, _>(None::<Value>))
136    ///     .get_result::<Option<i32>>(connection)?;
137    ///
138    /// assert_eq!(None, result);
139    ///
140    /// let result = diesel::select(json_array_length::<Jsonb, _>(json!([1,2,3,4])))
141    ///     .get_result::<i32>(connection)?;
142    ///
143    /// assert_eq!(4, result);
144    ///
145    /// let result = diesel::select(json_array_length::<Jsonb, _>(json!({"one":[1,2,3]})))
146    ///     .get_result::<i32>(connection)?;
147    ///
148    /// assert_eq!(0, result);
149    ///
150    /// let result = diesel::select(json_array_length::<Nullable<Jsonb>, _>(None::<Value>))
151    ///     .get_result::<Option<i32>>(connection)?;
152    ///
153    /// assert_eq!(None, result);
154    ///
155    /// #     Ok(())
156    /// # }
157    /// ```
158    #[cfg(feature = "__sqlite-shared")]
159    fn json_array_length<
160        J: JsonOrNullableJsonOrJsonbOrNullableJsonb + MaybeNullableValue<Integer>,
161    >(
162        j: J,
163    ) -> J::Out;
164
165    /// The json_array_length(X) function returns the number of elements in the JSON array X,
166    /// or 0 if X is some kind of JSON value other than an array.
167    /// The json_array_length(X,P) locates the array at path P within X and returns the length of that array,
168    /// or 0 if path P locates an element in X that is not a JSON array,
169    /// and NULL if path P does not locate any element of X.
170    /// Errors are thrown if either X is not well-formed JSON or if P is not a well-formed path.
171    ///
172    /// This function requires at least SQLite 3.46 or newer
173    ///
174    /// # Example
175    ///
176    /// ```rust
177    /// # include!("../../doctest_setup.rs");
178    /// #
179    /// # fn main() {
180    /// #     #[cfg(feature = "serde_json")]
181    /// #     run_test().unwrap();
182    /// # }
183    /// #
184    /// # #[cfg(feature = "serde_json")]
185    /// # fn run_test() -> QueryResult<()> {
186    /// #     use diesel::dsl::{sql, json_array_length_with_path};
187    /// #     use serde_json::{json, Value};
188    /// #     use diesel::sql_types::{Json, Jsonb, Text, Nullable};
189    /// #     let connection = &mut establish_connection();
190    /// #     assert_version!(connection, 3, 46, 0);
191    ///
192    /// let result = diesel::select(json_array_length_with_path::<Json, _, _>(json!([1,2,3,4]), "$"))
193    ///     .get_result::<Option<i32>>(connection)?;
194    ///
195    /// assert_eq!(Some(4), result);
196    ///
197    /// let result = diesel::select(json_array_length_with_path::<Json, _, _>(json!([1,2,3,4]), "$[2]"))
198    ///     .get_result::<Option<i32>>(connection)?;
199    ///
200    /// assert_eq!(Some(0), result);
201    ///
202    /// let result = diesel::select(json_array_length_with_path::<Json, _, _>(json!({"one":[1,2,3]}), "$.one"))
203    ///     .get_result::<Option<i32>>(connection)?;
204    ///
205    /// assert_eq!(Some(3), result);
206    ///
207    /// let result = diesel::select(json_array_length_with_path::<Nullable<Json>, _, _>(json!({"one":[1,2,3]}), "$.two"))
208    ///     .get_result::<Option<i32>>(connection)?;
209    ///
210    /// assert_eq!(None, result);
211    ///
212    /// let result = diesel::select(json_array_length_with_path::<Jsonb, _, _>(json!([1,2,3,4]), "$"))
213    ///     .get_result::<Option<i32>>(connection)?;
214    ///
215    /// assert_eq!(Some(4), result);
216    ///
217    /// let result = diesel::select(json_array_length_with_path::<Jsonb, _, _>(json!([1,2,3,4]), "$[2]"))
218    ///     .get_result::<Option<i32>>(connection)?;
219    ///
220    /// assert_eq!(Some(0), result);
221    ///
222    /// let result = diesel::select(json_array_length_with_path::<Jsonb, _, _>(json!({"one":[1,2,3]}), "$.one"))
223    ///     .get_result::<Option<i32>>(connection)?;
224    ///
225    /// assert_eq!(Some(3), result);
226    ///
227    /// let result = diesel::select(json_array_length_with_path::<Nullable<Jsonb>, _, _>(json!({"one":[1,2,3]}), "$.two"))
228    ///     .get_result::<Option<i32>>(connection)?;
229    ///
230    /// assert_eq!(None, result);
231    ///
232    /// #     Ok(())
233    /// # }
234    /// ```
235    #[sql_name = "json_array_length"]
236    #[cfg(feature = "__sqlite-shared")]
237    fn json_array_length_with_path<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
238        j: J,
239        path: Text,
240    ) -> Nullable<Integer>;
241
242    /// The json_error_position(X) function returns 0 if the input X is a well-formed JSON or JSON5 string.
243    /// If the input X contains one or more syntax errors, then this function returns the character position of the first syntax error.
244    /// The left-most character is position 1.
245    ///
246    /// If the input X is a BLOB, then this routine returns 0 if X is a well-formed JSONB blob. If the return value is positive,
247    /// then it represents the approximate 1-based position in the BLOB of the first detected error.
248    ///
249    /// This function requires at least SQLite 3.46 or newer
250    ///
251    /// # Example
252    ///
253    /// ```rust
254    /// # include!("../../doctest_setup.rs");
255    /// #
256    /// # fn main() {
257    /// #     #[cfg(feature = "serde_json")]
258    /// #     run_test().unwrap();
259    /// # }
260    /// #
261    /// # #[cfg(feature = "serde_json")]
262    /// # fn run_test() -> QueryResult<()> {
263    /// #     use diesel::dsl::{sql, json_error_position};
264    /// #     use diesel::sql_types::{Binary, Text, Nullable};
265    /// #     let connection = &mut establish_connection();
266    /// #     assert_version!(connection, 3, 46, 0);
267    ///
268    /// let result = diesel::select(json_error_position::<Text, _>(r#"{"a": "b", "c": 1}"#))
269    ///     .get_result::<i32>(connection)?;
270    ///
271    /// assert_eq!(0, result);
272    ///
273    /// let result = diesel::select(json_error_position::<Text, _>(r#"{"a": b", "c": 1}"#))
274    ///     .get_result::<i32>(connection)?;
275    ///
276    /// assert_eq!(7, result);
277    ///
278    /// let json5 = r#"
279    ///     {
280    ///         // A traditional message.
281    ///         message: 'hello world',
282    ///
283    ///         // A number for some reason.
284    ///         n: 42,
285    ///     }
286    /// "#;
287    /// let result =
288    ///     diesel::select(json_error_position::<Text, _>(json5)).get_result::<i32>(connection)?;
289    ///
290    /// assert_eq!(0, result);
291    ///
292    /// let json5_with_error = r#"
293    ///     {
294    ///         // A traditional message.
295    ///         message: hello world',
296    ///
297    ///         // A number for some reason.
298    ///         n: 42,
299    ///     }
300    /// "#;
301    /// let result = diesel::select(json_error_position::<Text, _>(json5_with_error))
302    ///     .get_result::<i32>(connection)?;
303    ///
304    /// assert_eq!(59, result);
305    ///
306    /// let result = diesel::select(json_error_position::<Nullable<Text>, _>(None::<&str>))
307    ///     .get_result::<Option<i32>>(connection)?;
308    ///
309    /// assert_eq!(None, result);
310    ///
311    /// let result = diesel::select(json_error_position::<Binary, _>(br#"{"a": "b", "c": 1}"#))
312    ///     .get_result::<i32>(connection)?;
313    ///
314    /// assert_eq!(0, result);
315    ///
316    /// let result = diesel::select(json_error_position::<Binary, _>(br#"{"a": b", "c": 1}"#))
317    ///     .get_result::<i32>(connection)?;
318    ///
319    /// assert_eq!(7, result);
320    ///
321    /// let result = diesel::select(json_error_position::<Nullable<Binary>, _>(None::<Vec<u8>>))
322    ///     .get_result::<Option<i32>>(connection)?;
323    ///
324    /// assert_eq!(None, result);
325    ///
326    /// #     Ok(())
327    /// # }
328    /// ```
329    #[cfg(feature = "__sqlite-shared")]
330    fn json_error_position<
331        X: TextOrNullableTextOrBinaryOrNullableBinary + MaybeNullableValue<Integer>,
332    >(
333        x: X,
334    ) -> X::Out;
335
336    /// Extracts a text value from a well-formed JSON document at the given path.
337    ///
338    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
339    /// path is a JSON `null`.
340    ///
341    /// To extract other types, use:
342    /// - [`json_extract_integer`](json_extract_integer()) for integer values
343    /// - [`json_extract_double`](json_extract_double()) for floating-point values
344    /// - [`json_extract_json`](json_extract_json_1()) for JSON objects or arrays
345    ///
346    /// This function requires at least SQLite 3.9 or newer.
347    ///
348    /// # Example
349    ///
350    /// ```rust
351    /// # include!("../../doctest_setup.rs");
352    /// # fn main() {
353    /// #     #[cfg(feature = "serde_json")]
354    /// #     run_test().unwrap();
355    /// # }
356    /// # #[cfg(feature = "serde_json")]
357    /// # fn run_test() -> QueryResult<()> {
358    /// #     use diesel::dsl::*;
359    /// #     use diesel::sql_types::{Json, Nullable};
360    /// #     use serde_json::{json, Value};
361    /// #     let connection = &mut establish_connection();
362    /// #     assert_version!(connection, 3, 9, 0);
363    ///
364    /// let json = json!({"a": "xyz"});
365    /// let result = diesel::select(json_extract_string::<Json, _, _>(json, "$.a"))
366    ///     .get_result::<Option<String>>(connection)?;
367    /// assert_eq!(Some("xyz".to_string()), result);
368    ///
369    /// let json = json!({"a": 42});
370    /// let result = diesel::select(json_extract_string::<Json, _, _>(json, "$.a"))
371    ///     .get_result::<Option<String>>(connection)?;
372    /// assert_eq!(Some("42".to_string()), result);
373    ///
374    /// let result = diesel::select(json_extract_string::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
375    ///     .get_result::<Option<String>>(connection)?;
376    /// assert!(result.is_none());
377    ///
378    /// let json = json!({"a": "xyz"});
379    /// let result = diesel::select(json_extract_string::<Json, _, _>(json, "$.x"))
380    ///     .get_result::<Option<String>>(connection)?;
381    /// assert!(result.is_none());
382    ///
383    /// #     Ok(())
384    /// # }
385    /// ```
386    #[cfg(feature = "__sqlite-shared")]
387    #[sql_name = "json_extract"]
388    fn json_extract_string<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
389        json: J,
390        text: Text,
391    ) -> Nullable<Text>;
392
393    /// Extracts an integer value from a well-formed JSON document at the given path.
394    ///
395    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
396    /// path is a JSON `null`.
397    ///
398    /// To extract other types, use:
399    /// - [`json_extract_string`](json_extract_string()) for text values
400    /// - [`json_extract_double`](json_extract_double()) for floating-point values
401    /// - [`json_extract_json`](json_extract_json_1()) for JSON objects or arrays
402    ///
403    /// This function requires at least SQLite 3.9 or newer.
404    ///
405    /// # Example
406    ///
407    /// ```rust
408    /// # include!("../../doctest_setup.rs");
409    /// # fn main() {
410    /// #     #[cfg(feature = "serde_json")]
411    /// #     run_test().unwrap();
412    /// # }
413    /// # #[cfg(feature = "serde_json")]
414    /// # fn run_test() -> QueryResult<()> {
415    /// #     use diesel::dsl::*;
416    /// #     use diesel::sql_types::{Json, Nullable};
417    /// #     use serde_json::{json, Value};
418    /// #     let connection = &mut establish_connection();
419    /// #     assert_version!(connection, 3, 9, 0);
420    ///
421    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
422    /// let result = diesel::select(json_extract_integer::<Json, _, _>(json, "$.c[2].f"))
423    ///     .get_result::<Option<i32>>(connection)?;
424    /// assert_eq!(Some(7), result);
425    ///
426    /// let json = json!({"a": 3.7});
427    /// let result = diesel::select(json_extract_integer::<Json, _, _>(json, "$.a"))
428    ///     .get_result::<Option<i32>>(connection)?;
429    /// assert_eq!(Some(3), result);
430    ///
431    /// let result = diesel::select(json_extract_integer::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
432    ///     .get_result::<Option<i32>>(connection)?;
433    /// assert!(result.is_none());
434    ///
435    /// let json = json!({"a": 2});
436    /// let result = diesel::select(json_extract_integer::<Json, _, _>(json, "$.x"))
437    ///     .get_result::<Option<i32>>(connection)?;
438    /// assert!(result.is_none());
439    ///
440    /// #     Ok(())
441    /// # }
442    /// ```
443    #[cfg(feature = "__sqlite-shared")]
444    #[sql_name = "json_extract"]
445    fn json_extract_integer<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
446        json: J,
447        text: Text,
448    ) -> Nullable<Integer>;
449
450    /// Extracts a floating-point value from a well-formed JSON document at the given path.
451    ///
452    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
453    /// path is a JSON `null`.
454    ///
455    /// To extract other types, use:
456    /// - [`json_extract_string`](json_extract_string()) for text values
457    /// - [`json_extract_integer`](json_extract_integer()) for integer values
458    /// - [`json_extract_json`](json_extract_json_1()) for JSON objects or arrays
459    ///
460    /// This function requires at least SQLite 3.9 or newer.
461    ///
462    /// # Example
463    ///
464    /// ```rust
465    /// # include!("../../doctest_setup.rs");
466    /// # fn main() {
467    /// #     #[cfg(feature = "serde_json")]
468    /// #     run_test().unwrap();
469    /// # }
470    /// # #[cfg(feature = "serde_json")]
471    /// # fn run_test() -> QueryResult<()> {
472    /// #     use diesel::dsl::*;
473    /// #     use diesel::sql_types::{Json, Nullable};
474    /// #     use serde_json::{json, Value};
475    /// #     let connection = &mut establish_connection();
476    /// #     assert_version!(connection, 3, 9, 0);
477    ///
478    /// let json = json!({"a": 3.14});
479    /// let result = diesel::select(json_extract_double::<Json, _, _>(json, "$.a"))
480    ///     .get_result::<Option<f64>>(connection)?;
481    /// assert_eq!(Some(3.14), result);
482    ///
483    /// let json = json!({"a": 7});
484    /// let result = diesel::select(json_extract_double::<Json, _, _>(json, "$.a"))
485    ///     .get_result::<Option<f64>>(connection)?;
486    /// assert_eq!(Some(7.0), result);
487    ///
488    /// let result = diesel::select(json_extract_double::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
489    ///     .get_result::<Option<f64>>(connection)?;
490    /// assert!(result.is_none());
491    ///
492    /// let json = json!({"a": 3.14});
493    /// let result = diesel::select(json_extract_double::<Json, _, _>(json, "$.x"))
494    ///     .get_result::<Option<f64>>(connection)?;
495    /// assert!(result.is_none());
496    ///
497    /// #     Ok(())
498    /// # }
499    /// ```
500    #[cfg(feature = "__sqlite-shared")]
501    #[sql_name = "json_extract"]
502    fn json_extract_double<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
503        json: J,
504        text: Text,
505    ) -> Nullable<Double>;
506
507    /// Extracts a JSON object or array from a well-formed JSON document at the given path.
508    ///
509    /// When a single path is provided, returns the value at that path as a [`Json`] value.
510    /// When multiple paths are provided (using the variadic form), returns a JSON array
511    /// containing the extracted values.
512    ///
513    /// Returns `NULL` if a single path does not exist in the JSON document. With multiple paths,
514    /// missing paths appear as `null` inside the returned JSON array.
515    ///
516    /// To extract other types, use:
517    /// - [`json_extract_string`](json_extract_string()) for text values
518    /// - [`json_extract_integer`](json_extract_integer()) for integer values
519    /// - [`json_extract_double`](json_extract_double()) for floating-point values
520    ///
521    /// This function requires at least SQLite 3.9 or newer.
522    ///
523    /// # Example
524    ///
525    /// ```rust
526    /// # include!("../../doctest_setup.rs");
527    /// # fn main() {
528    /// #     #[cfg(feature = "serde_json")]
529    /// #     run_test().unwrap();
530    /// # }
531    /// # #[cfg(feature = "serde_json")]
532    /// # fn run_test() -> QueryResult<()> {
533    /// #     use diesel::dsl::*;
534    /// #     use diesel::sql_types::{Json, Nullable};
535    /// #     use serde_json::{json, Value};
536    /// #     let connection = &mut establish_connection();
537    /// #     assert_version!(connection, 3, 9, 0);
538    ///
539    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
540    /// let result = diesel::select(json_extract_json_1::<Json, _, _>(json, "$.c[2]"))
541    ///     .get_result::<Option<Value>>(connection)?;
542    /// assert_eq!(Some(json!({"f": 7})), result);
543    ///
544    /// let json = json!({"a": 2, "c": [4, 5], "f": 7});
545    /// let result = diesel::select(json_extract_json_2::<Json, _, _, _>(json, "$.c", "$.a"))
546    ///     .get_result::<Option<Value>>(connection)?;
547    /// assert_eq!(Some(json!([[4, 5], 2])), result);
548    ///
549    /// let json = json!({"a": 42});
550    /// let result = diesel::select(json_extract_json_1::<Json, _, _>(json, "$.a"))
551    ///     .get_result::<Option<Value>>(connection)?;
552    /// assert_eq!(Some(json!(42)), result);
553    ///
554    /// let json = json!({"a": 42});
555    /// let result = diesel::select(json_extract_json_2::<Json, _, _, _>(json, "$.a", "$.b"))
556    ///     .get_result::<Option<Value>>(connection)?;
557    /// assert_eq!(Some(json!([42, null])), result);
558    ///
559    /// let result = diesel::select(json_extract_json_1::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
560    ///     .get_result::<Option<Value>>(connection)?;
561    /// assert!(result.is_none());
562    ///
563    /// let json = json!({"a": 42});
564    /// let result = diesel::select(json_extract_json_1::<Json, _, _>(json, "$.x"))
565    ///     .get_result::<Option<Value>>(connection)?;
566    /// assert!(result.is_none());
567    ///
568    /// let json = json!({"a": 42});
569    /// let result = diesel::select(json_extract_json_2::<Json, _, _, _>(json, "$.b", "$.c"))
570    ///     .get_result::<Option<Value>>(connection)?;
571    /// assert_eq!(Some(json!([null, null])), result);
572    ///
573    /// #     Ok(())
574    /// # }
575    /// ```
576    #[cfg(feature = "__sqlite-shared")]
577    #[sql_name = "json_extract"]
578    #[variadic(last_arguments = 1, skip_zero_argument_variant = true)]
579    fn json_extract_json<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
580        json: J,
581        text: Text,
582    ) -> Nullable<Json>;
583
584    /// Extracts a text value from a well-formed JSON or JSONB document at the given path.
585    ///
586    /// Works identically to [`json_extract_string`](json_extract_string()) for scalar text values.
587    ///
588    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
589    /// path is a JSON `null`.
590    ///
591    /// To extract other types, use:
592    /// - [`jsonb_extract_integer`](jsonb_extract_integer()) for integer values
593    /// - [`jsonb_extract_double`](jsonb_extract_double()) for floating-point values
594    /// - [`jsonb_extract_jsonb`](jsonb_extract_jsonb_1()) for JSON objects or arrays in JSONB format
595    ///
596    /// This function requires at least SQLite 3.9 or newer.
597    ///
598    /// # Example
599    ///
600    /// ```rust
601    /// # include!("../../doctest_setup.rs");
602    /// # fn main() {
603    /// #     #[cfg(feature = "serde_json")]
604    /// #     run_test().unwrap();
605    /// # }
606    /// # #[cfg(feature = "serde_json")]
607    /// # fn run_test() -> QueryResult<()> {
608    /// #     use diesel::dsl::*;
609    /// #     use diesel::sql_types::{Json, Nullable};
610    /// #     use serde_json::{json, Value};
611    /// #     let connection = &mut establish_connection();
612    /// #     assert_version!(connection, 3, 9, 0);
613    ///
614    /// let json = json!({"a": "xyz"});
615    /// let result = diesel::select(jsonb_extract_string::<Json, _, _>(json, "$.a"))
616    ///     .get_result::<Option<String>>(connection)?;
617    /// assert_eq!(Some("xyz".to_string()), result);
618    ///
619    /// let json = json!({"a": 42});
620    /// let result = diesel::select(jsonb_extract_string::<Json, _, _>(json, "$.a"))
621    ///     .get_result::<Option<String>>(connection)?;
622    /// assert_eq!(Some("42".to_string()), result);
623    ///
624    /// let result = diesel::select(jsonb_extract_string::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
625    ///     .get_result::<Option<String>>(connection)?;
626    /// assert!(result.is_none());
627    ///
628    /// let json = json!({"a": "xyz"});
629    /// let result = diesel::select(jsonb_extract_string::<Json, _, _>(json, "$.x"))
630    ///     .get_result::<Option<String>>(connection)?;
631    /// assert!(result.is_none());
632    ///
633    /// #     Ok(())
634    /// # }
635    /// ```
636    #[cfg(feature = "__sqlite-shared")]
637    #[sql_name = "jsonb_extract"]
638    fn jsonb_extract_string<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
639        json: J,
640        text: Text,
641    ) -> Nullable<Text>;
642
643    /// Extracts an integer value from a well-formed JSON or JSONB document at the given path.
644    ///
645    /// Works identically to [`json_extract_integer`](json_extract_integer()) for integer values.
646    ///
647    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
648    /// path is a JSON `null`.
649    ///
650    /// To extract other types, use:
651    /// - [`jsonb_extract_string`](jsonb_extract_string()) for text values
652    /// - [`jsonb_extract_double`](jsonb_extract_double()) for floating-point values
653    /// - [`jsonb_extract_jsonb`](jsonb_extract_jsonb_1()) for JSON objects or arrays in JSONB format
654    ///
655    /// This function requires at least SQLite 3.9 or newer.
656    ///
657    /// # Example
658    ///
659    /// ```rust
660    /// # include!("../../doctest_setup.rs");
661    /// # fn main() {
662    /// #     #[cfg(feature = "serde_json")]
663    /// #     run_test().unwrap();
664    /// # }
665    /// # #[cfg(feature = "serde_json")]
666    /// # fn run_test() -> QueryResult<()> {
667    /// #     use diesel::dsl::*;
668    /// #     use diesel::sql_types::{Json, Nullable};
669    /// #     use serde_json::{json, Value};
670    /// #     let connection = &mut establish_connection();
671    /// #     assert_version!(connection, 3, 9, 0);
672    ///
673    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
674    /// let result = diesel::select(jsonb_extract_integer::<Json, _, _>(json, "$.c[2].f"))
675    ///     .get_result::<Option<i32>>(connection)?;
676    /// assert_eq!(Some(7), result);
677    ///
678    /// let json = json!({"a": 3.7});
679    /// let result = diesel::select(jsonb_extract_integer::<Json, _, _>(json, "$.a"))
680    ///     .get_result::<Option<i32>>(connection)?;
681    /// assert_eq!(Some(3), result);
682    ///
683    /// let result = diesel::select(jsonb_extract_integer::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
684    ///     .get_result::<Option<i32>>(connection)?;
685    /// assert!(result.is_none());
686    ///
687    /// let json = json!({"a": 2});
688    /// let result = diesel::select(jsonb_extract_integer::<Json, _, _>(json, "$.x"))
689    ///     .get_result::<Option<i32>>(connection)?;
690    /// assert!(result.is_none());
691    ///
692    /// #     Ok(())
693    /// # }
694    /// ```
695    #[cfg(feature = "__sqlite-shared")]
696    #[sql_name = "jsonb_extract"]
697    fn jsonb_extract_integer<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
698        json: J,
699        text: Text,
700    ) -> Nullable<Integer>;
701
702    /// Extracts a floating-point value from a well-formed JSON or JSONB document at the given path.
703    ///
704    /// Works identically to [`json_extract_double`](json_extract_double()) for floating-point values.
705    ///
706    /// Returns `NULL` if the path does not exist in the JSON document, or if the value at that
707    /// path is a JSON `null`.
708    ///
709    /// To extract other types, use:
710    /// - [`jsonb_extract_string`](jsonb_extract_string()) for text values
711    /// - [`jsonb_extract_integer`](jsonb_extract_integer()) for integer values
712    /// - [`jsonb_extract_jsonb`](jsonb_extract_jsonb_1()) for JSON objects or arrays in JSONB format
713    ///
714    /// This function requires at least SQLite 3.9 or newer.
715    ///
716    /// # Example
717    ///
718    /// ```rust
719    /// # include!("../../doctest_setup.rs");
720    /// # fn main() {
721    /// #     #[cfg(feature = "serde_json")]
722    /// #     run_test().unwrap();
723    /// # }
724    /// # #[cfg(feature = "serde_json")]
725    /// # fn run_test() -> QueryResult<()> {
726    /// #     use diesel::dsl::*;
727    /// #     use diesel::sql_types::{Json, Nullable};
728    /// #     use serde_json::{json, Value};
729    /// #     let connection = &mut establish_connection();
730    /// #     assert_version!(connection, 3, 9, 0);
731    ///
732    /// let json = json!({"a": 3.14});
733    /// let result = diesel::select(jsonb_extract_double::<Json, _, _>(json, "$.a"))
734    ///     .get_result::<Option<f64>>(connection)?;
735    /// assert_eq!(Some(3.14), result);
736    ///
737    /// let json = json!({"a": 7});
738    /// let result = diesel::select(jsonb_extract_double::<Json, _, _>(json, "$.a"))
739    ///     .get_result::<Option<f64>>(connection)?;
740    /// assert_eq!(Some(7.0), result);
741    ///
742    /// let result = diesel::select(jsonb_extract_double::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
743    ///     .get_result::<Option<f64>>(connection)?;
744    /// assert!(result.is_none());
745    ///
746    /// let json = json!({"a": 3.14});
747    /// let result = diesel::select(jsonb_extract_double::<Json, _, _>(json, "$.x"))
748    ///     .get_result::<Option<f64>>(connection)?;
749    /// assert!(result.is_none());
750    ///
751    /// #     Ok(())
752    /// # }
753    /// ```
754    #[cfg(feature = "__sqlite-shared")]
755    #[sql_name = "jsonb_extract"]
756    fn jsonb_extract_double<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
757        json: J,
758        text: Text,
759    ) -> Nullable<Double>;
760
761    /// Extracts a JSON object or array from a well-formed JSON or JSONB document at the given path,
762    /// returning it in JSONB format.
763    ///
764    /// Unlike [`json_extract_json`](json_extract_json_1()), which returns JSON objects and arrays
765    /// as text, this function returns them in the internal JSONB binary format. For scalar values
766    /// (text, integer, double, null), both functions behave identically.
767    ///
768    /// When a single path is provided, returns the value at that path as a [`Jsonb`] value.
769    /// When multiple paths are provided (using the variadic form), returns a JSONB array
770    /// containing the extracted values.
771    ///
772    /// Returns `NULL` if a single path does not exist in the JSON document. With multiple paths,
773    /// missing paths appear as `null` inside the returned JSONB array.
774    ///
775    /// To extract other types, use:
776    /// - [`jsonb_extract_string`](jsonb_extract_string()) for text values
777    /// - [`jsonb_extract_integer`](jsonb_extract_integer()) for integer values
778    /// - [`jsonb_extract_double`](jsonb_extract_double()) for floating-point values
779    ///
780    /// This function requires at least SQLite 3.9 or newer.
781    ///
782    /// # Example
783    ///
784    /// ```rust
785    /// # include!("../../doctest_setup.rs");
786    /// # fn main() {
787    /// #     #[cfg(feature = "serde_json")]
788    /// #     run_test().unwrap();
789    /// # }
790    /// # #[cfg(feature = "serde_json")]
791    /// # fn run_test() -> QueryResult<()> {
792    /// #     use diesel::dsl::*;
793    /// #     use diesel::sql_types::{Json, Jsonb, Nullable};
794    /// #     use serde_json::{json, Value};
795    /// #     let connection = &mut establish_connection();
796    /// #     assert_version!(connection, 3, 9, 0);
797    ///
798    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
799    /// let result = diesel::select(jsonb_extract_jsonb_1::<Json, _, _>(json, "$"))
800    ///     .get_result::<Option<Value>>(connection)?;
801    /// assert_eq!(Some(json!({"a": 2, "c": [4, 5, {"f": 7}]})), result);
802    ///
803    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
804    /// let result = diesel::select(jsonb_extract_jsonb_1::<Json, _, _>(json, "$.c"))
805    ///     .get_result::<Option<Value>>(connection)?;
806    /// assert_eq!(Some(json!([4, 5, {"f": 7}])), result);
807    ///
808    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
809    /// let result = diesel::select(jsonb_extract_jsonb_1::<Json, _, _>(json, "$.c[2]"))
810    ///     .get_result::<Option<Value>>(connection)?;
811    /// assert_eq!(Some(json!({"f": 7})), result);
812    ///
813    /// let json = json!({"a": 2, "c": [4, 5]});
814    /// let result = diesel::select(jsonb_extract_jsonb_2::<Json, _, _, _>(json, "$.c", "$.x"))
815    ///     .get_result::<Option<Value>>(connection)?;
816    /// assert_eq!(Some(json!([[4, 5], null])), result);
817    ///
818    /// let result = diesel::select(jsonb_extract_jsonb_1::<Nullable<Json>, _, _>(None::<Value>, "$.a"))
819    ///     .get_result::<Option<Value>>(connection)?;
820    /// assert!(result.is_none());
821    ///
822    /// let json = json!({"a": 2, "c": [4, 5, {"f": 7}]});
823    /// let result = diesel::select(jsonb_extract_jsonb_1::<Json, _, _>(json, "$.x"))
824    ///     .get_result::<Option<Value>>(connection)?;
825    /// assert_eq!(None, result);
826    ///
827    /// let json = json!({"a": 2, "c": [4, 5], "f": 7});
828    /// let result = diesel::select(jsonb_extract_jsonb_2::<Json, _, _, _>(json, "$.c", "$.a"))
829    ///     .get_result::<Option<Value>>(connection)?;
830    /// assert_eq!(Some(json!([[4, 5], 2])), result);
831    ///
832    /// let json = json!({"a": 2});
833    /// let result = diesel::select(jsonb_extract_jsonb_2::<Json, _, _, _>(json, "$.b", "$.c"))
834    ///     .get_result::<Option<Value>>(connection)?;
835    /// assert_eq!(Some(json!([null, null])), result);
836    ///
837    /// #     Ok(())
838    /// # }
839    /// ```
840    #[cfg(feature = "__sqlite-shared")]
841    #[sql_name = "jsonb_extract"]
842    #[variadic(last_arguments = 1, skip_zero_argument_variant = true)]
843    fn jsonb_extract_jsonb<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
844        json: J,
845        text: Text,
846    ) -> Nullable<Jsonb>;
847
848    /// Converts the given json value to pretty-printed, indented text
849    ///
850    /// This function requires at least SQLite 3.46 or newer
851    ///
852    /// # Example
853    ///
854    /// ```rust
855    /// # include!("../../doctest_setup.rs");
856    /// #
857    /// # fn main() {
858    /// #     #[cfg(feature = "serde_json")]
859    /// #     run_test().unwrap();
860    /// # }
861    /// #
862    /// # #[cfg(feature = "serde_json")]
863    /// # fn run_test() -> QueryResult<()> {
864    /// #     use diesel::dsl::{sql, json_pretty};
865    /// #     use serde_json::{json, Value};
866    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
867    /// #     let connection = &mut establish_connection();
868    /// #     assert_version!(connection, 3, 46, 0);
869    ///
870    /// let result = diesel::select(json_pretty::<Json, _>(json!([{"f1":1,"f2":null},2,null,3])))
871    ///     .get_result::<String>(connection)?;
872    ///
873    /// assert_eq!(r#"[
874    ///     {
875    ///         "f1": 1,
876    ///         "f2": null
877    ///     },
878    ///     2,
879    ///     null,
880    ///     3
881    /// ]"#, result);
882    ///
883    /// let result = diesel::select(json_pretty::<Json, _>(json!({"a": 1, "b": "cd"})))
884    ///     .get_result::<String>(connection)?;
885    ///
886    /// assert_eq!(r#"{
887    ///     "a": 1,
888    ///     "b": "cd"
889    /// }"#, result);
890    ///
891    /// let result = diesel::select(json_pretty::<Json, _>(json!("abc")))
892    ///     .get_result::<String>(connection)?;
893    ///
894    /// assert_eq!(r#""abc""#, result);
895    ///
896    /// let result = diesel::select(json_pretty::<Json, _>(json!(22)))
897    ///     .get_result::<String>(connection)?;
898    ///
899    /// assert_eq!(r#"22"#, result);
900    ///
901    /// let result = diesel::select(json_pretty::<Json, _>(json!(false)))
902    ///     .get_result::<String>(connection)?;
903    ///
904    /// assert_eq!(r#"false"#, result);
905    ///
906    /// let result = diesel::select(json_pretty::<Json, _>(json!(null)))
907    ///     .get_result::<String>(connection)?;
908    ///
909    /// assert_eq!(r#"null"#, result);
910    ///
911    /// let result = diesel::select(json_pretty::<Json, _>(json!({})))
912    ///     .get_result::<String>(connection)?;
913    ///
914    /// assert_eq!(r#"{}"#, result);
915    ///
916    /// let result = diesel::select(json_pretty::<Nullable<Json>, _>(None::<Value>))
917    ///     .get_result::<Option<String>>(connection)?;
918    ///
919    /// assert!(result.is_none());
920    ///
921    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!([{"f1":1,"f2":null},2,null,3])))
922    ///     .get_result::<String>(connection)?;
923    ///
924    /// assert_eq!(r#"[
925    ///     {
926    ///         "f1": 1,
927    ///         "f2": null
928    ///     },
929    ///     2,
930    ///     null,
931    ///     3
932    /// ]"#, result);
933    ///
934    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!({"a": 1, "b": "cd"})))
935    ///     .get_result::<String>(connection)?;
936    ///
937    /// assert_eq!(r#"{
938    ///     "a": 1,
939    ///     "b": "cd"
940    /// }"#, result);
941    ///
942    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!("abc")))
943    ///     .get_result::<String>(connection)?;
944    ///
945    /// assert_eq!(r#""abc""#, result);
946    ///
947    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!(22)))
948    ///     .get_result::<String>(connection)?;
949    ///
950    /// assert_eq!(r#"22"#, result);
951    ///
952    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!(false)))
953    ///     .get_result::<String>(connection)?;
954    ///
955    /// assert_eq!(r#"false"#, result);
956    ///
957    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!(null)))
958    ///     .get_result::<String>(connection)?;
959    ///
960    /// assert_eq!(r#"null"#, result);
961    ///
962    /// let result = diesel::select(json_pretty::<Jsonb, _>(json!({})))
963    ///     .get_result::<String>(connection)?;
964    ///
965    /// assert_eq!(r#"{}"#, result);
966    ///
967    /// let result = diesel::select(json_pretty::<Nullable<Jsonb>, _>(None::<Value>))
968    ///     .get_result::<Option<String>>(connection)?;
969    ///
970    /// assert!(result.is_none());
971    /// #     Ok(())
972    /// # }
973    /// ```
974    fn json_pretty<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + MaybeNullableValue<Text>>(
975        j: J,
976    ) -> J::Out;
977
978    /// Converts the given json value to pretty-printed, indented text
979    ///
980    /// This function requires at least SQLite 3.46 or newer
981    ///
982    /// # Example
983    ///
984    /// ```rust
985    /// # include!("../../doctest_setup.rs");
986    /// #
987    /// # fn main() {
988    /// #     #[cfg(feature = "serde_json")]
989    /// #     run_test().unwrap();
990    /// # }
991    /// #
992    /// # #[cfg(feature = "serde_json")]
993    /// # fn run_test() -> QueryResult<()> {
994    /// #     use diesel::dsl::{sql, json_pretty_with_indentation};
995    /// #     use serde_json::{json, Value};
996    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
997    /// #     let connection = &mut establish_connection();
998    /// #     assert_version!(connection, 3, 46, 0);
999    ///
1000    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!([{"f1":1,"f2":null},2,null,3]), "  "))
1001    ///     .get_result::<String>(connection)?;
1002    ///
1003    /// assert_eq!(r#"[
1004    ///   {
1005    ///     "f1": 1,
1006    ///     "f2": null
1007    ///   },
1008    ///   2,
1009    ///   null,
1010    ///   3
1011    /// ]"#, result);
1012    ///
1013    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!([{"f1":1,"f2":null},2,null,3]), None::<&str>))
1014    ///     .get_result::<String>(connection)?;
1015    ///
1016    /// assert_eq!(r#"[
1017    ///     {
1018    ///         "f1": 1,
1019    ///         "f2": null
1020    ///     },
1021    ///     2,
1022    ///     null,
1023    ///     3
1024    /// ]"#, result);
1025    ///
1026    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!({"a": 1, "b": "cd"}), "  "))
1027    ///     .get_result::<String>(connection)?;
1028    ///
1029    /// assert_eq!(r#"{
1030    ///   "a": 1,
1031    ///   "b": "cd"
1032    /// }"#, result);
1033    ///
1034    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!("abc"), "  "))
1035    ///     .get_result::<String>(connection)?;
1036    ///
1037    /// assert_eq!(r#""abc""#, result);
1038    ///
1039    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!(22), "  "))
1040    ///     .get_result::<String>(connection)?;
1041    ///
1042    /// assert_eq!(r#"22"#, result);
1043    ///
1044    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!(false), None::<&str>))
1045    ///     .get_result::<String>(connection)?;
1046    ///
1047    /// assert_eq!(r#"false"#, result);
1048    ///
1049    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!(null), None::<&str>))
1050    ///     .get_result::<String>(connection)?;
1051    ///
1052    /// assert_eq!(r#"null"#, result);
1053    ///
1054    /// let result = diesel::select(json_pretty_with_indentation::<Json, _, _>(json!({}), "  "))
1055    ///     .get_result::<String>(connection)?;
1056    ///
1057    /// assert_eq!(r#"{}"#, result);
1058    ///
1059    /// let result = diesel::select(json_pretty_with_indentation::<Nullable<Json>, _, _>(None::<Value>, None::<&str>))
1060    ///     .get_result::<Option<String>>(connection)?;
1061    ///
1062    /// assert!(result.is_none());
1063    ///
1064    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!([{"f1":1,"f2":null},2,null,3]), "  "))
1065    ///     .get_result::<String>(connection)?;
1066    ///
1067    /// assert_eq!(r#"[
1068    ///   {
1069    ///     "f1": 1,
1070    ///     "f2": null
1071    ///   },
1072    ///   2,
1073    ///   null,
1074    ///   3
1075    /// ]"#, result);
1076    ///
1077    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!([{"f1":1,"f2":null},2,null,3]), None::<&str>))
1078    ///     .get_result::<String>(connection)?;
1079    ///
1080    /// assert_eq!(r#"[
1081    ///     {
1082    ///         "f1": 1,
1083    ///         "f2": null
1084    ///     },
1085    ///     2,
1086    ///     null,
1087    ///     3
1088    /// ]"#, result);
1089    ///
1090    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!({"a": 1, "b": "cd"}), "  "))
1091    ///     .get_result::<String>(connection)?;
1092    ///
1093    /// assert_eq!(r#"{
1094    ///   "a": 1,
1095    ///   "b": "cd"
1096    /// }"#, result);
1097    ///
1098    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!("abc"), "  "))
1099    ///     .get_result::<String>(connection)?;
1100    ///
1101    /// assert_eq!(r#""abc""#, result);
1102    ///
1103    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!(22), "  "))
1104    ///     .get_result::<String>(connection)?;
1105    ///
1106    /// assert_eq!(r#"22"#, result);
1107    ///
1108    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!(false), None::<&str>))
1109    ///     .get_result::<String>(connection)?;
1110    ///
1111    /// assert_eq!(r#"false"#, result);
1112    ///
1113    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!(null), None::<&str>))
1114    ///     .get_result::<String>(connection)?;
1115    ///
1116    /// assert_eq!(r#"null"#, result);
1117    ///
1118    /// let result = diesel::select(json_pretty_with_indentation::<Jsonb, _, _>(json!({}), "  "))
1119    ///     .get_result::<String>(connection)?;
1120    ///
1121    /// assert_eq!(r#"{}"#, result);
1122    ///
1123    /// let result = diesel::select(json_pretty_with_indentation::<Nullable<Jsonb>, _, _>(None::<Value>, None::<&str>))
1124    ///     .get_result::<Option<String>>(connection)?;
1125    ///
1126    /// assert!(result.is_none());
1127    ///
1128    /// #     Ok(())
1129    /// # }
1130    /// ```
1131    #[sql_name = "json_pretty"]
1132    fn json_pretty_with_indentation<
1133        J: JsonOrNullableJsonOrJsonbOrNullableJsonb + MaybeNullableValue<Text>,
1134    >(
1135        j: J,
1136        indentation: Nullable<Text>,
1137    ) -> J::Out;
1138
1139    /// Returns  `true`  if the argument is well-formed JSON, or returns  `false`  if is not well-formed.
1140    ///
1141    /// This function requires at least SQLite 3.46 or newer
1142    ///
1143    /// # Example
1144    ///
1145    /// ```rust
1146    /// # include!("../../doctest_setup.rs");
1147    /// #
1148    /// # fn main() {
1149    /// #     #[cfg(feature = "serde_json")]
1150    /// #     run_test().unwrap();
1151    /// # }
1152    /// #
1153    /// # #[cfg(feature = "serde_json")]
1154    /// # fn run_test() -> QueryResult<()> {
1155    /// #     use diesel::dsl::{sql, json_valid};
1156    /// #     use serde_json::{json, Value};
1157    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
1158    /// #     let connection = &mut establish_connection();
1159    /// #     assert_version!(connection, 3, 46, 0);
1160    ///
1161    /// let result = diesel::select(json_valid::<Json, _>(json!({"x":35})))
1162    ///     .get_result::<bool>(connection)?;
1163    ///
1164    /// assert_eq!(true, result);
1165    ///
1166    /// let result = diesel::select(json_valid::<Nullable<Json>, _>(None::<serde_json::Value>))
1167    ///     .get_result::<Option<bool>>(connection)?;
1168    ///
1169    /// assert_eq!(None, result);
1170    ///
1171    /// # Ok(())
1172    /// # }
1173    /// ```
1174    #[sql_name = "json_valid"]
1175    #[cfg(feature = "__sqlite-shared")]
1176    fn json_valid<J: JsonOrNullableJson + MaybeNullableValue<Bool>>(j: J) -> J::Out;
1177
1178    /// The json_valid(X,Y) function returns 1 if the argument X is well-formed JSON, or returns 0 if X is not well-formed.
1179    /// The Y parameter is an integer bitmask that defines what is meant by "well-formed".
1180    ///
1181    /// The following bits of Y are currently defined:
1182    /// - 0x01 → The input is text that strictly complies with canonical RFC-8259 JSON, without any extensions.
1183    /// - 0x02 → The input is text that is JSON with JSON5 extensions.
1184    /// - 0x04 → The input is a BLOB that superficially appears to be JSONB.
1185    /// - 0x08 → The input is a BLOB that strictly conforms to the internal JSONB format.
1186    ///
1187    /// By combining bits, the following useful values of Y can be derived:
1188    /// - 1 → X is RFC-8259 JSON text
1189    /// - 2 → X is JSON5 text
1190    /// - 4 → X is probably JSONB
1191    /// - 5 → X is RFC-8259 JSON text or JSONB
1192    /// - 6 → X is JSON5 text or JSONB (recommended for most use cases)
1193    /// - 8 → X is strictly conforming JSONB
1194    /// - 9 → X is RFC-8259 or strictly conforming JSONB
1195    /// - 10 → X is JSON5 or strictly conforming JSONB
1196    ///
1197    /// The Y parameter must be between 1 and 15 (inclusive), or an error is raised.
1198    ///
1199    /// If either X or Y inputs are NULL, then the function returns NULL.
1200    ///
1201    /// This function requires at least SQLite 3.46 or newer
1202    ///
1203    /// # Example
1204    ///
1205    /// ```rust
1206    /// # include!("../../doctest_setup.rs");
1207    /// #
1208    /// # fn main() {
1209    /// #     #[cfg(feature = "serde_json")]
1210    /// #     run_test().unwrap();
1211    /// # }
1212    /// #
1213    /// # #[cfg(feature = "serde_json")]
1214    /// # fn run_test() -> QueryResult<()> {
1215    /// #     use diesel::dsl::{sql, json_valid_with_flags};
1216    /// #     use diesel::sqlite::JsonValidFlag;
1217    /// #     use serde_json::{json, Value};
1218    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
1219    /// #     let connection = &mut establish_connection();
1220    /// #     assert_version!(connection, 3, 46, 0);
1221    ///
1222    /// // Standard RFC-8259 JSON
1223    /// let result = diesel::select(json_valid_with_flags::<Text, _, _>(r#"{"x":35}"#, JsonValidFlag::Rfc8259Json))
1224    ///     .get_result::<bool>(connection)?;
1225    /// assert_eq!(true, result);
1226    ///
1227    /// // JSON5 not valid as RFC-8259
1228    /// let result = diesel::select(json_valid_with_flags::<Text, _, _>(r#"{x:35}"#, JsonValidFlag::Rfc8259Json))
1229    ///     .get_result::<bool>(connection)?;
1230    /// assert_eq!(false, result);
1231    ///
1232    /// // JSON5 valid with JSON5 flag
1233    /// let result = diesel::select(json_valid_with_flags::<Text, _, _>(r#"{x:35}"#, JsonValidFlag::Json5OrJsonb))
1234    ///     .get_result::<bool>(connection)?;
1235    /// assert_eq!(true, result);
1236    ///
1237    /// // Invalid JSON
1238    /// let result = diesel::select(json_valid_with_flags::<Text, _, _>(r#"{"x":35"#, JsonValidFlag::Rfc8259Json))
1239    ///     .get_result::<bool>(connection)?;
1240    /// assert_eq!(false, result);
1241    ///
1242    /// // NULL input returns NULL
1243    /// let result = diesel::select(json_valid_with_flags::<Nullable<Text>, _, _>(None::<&str>, JsonValidFlag::Rfc8259Json))
1244    ///     .get_result::<Option<bool>>(connection)?;
1245    /// assert_eq!(None, result);
1246    ///
1247    /// # Ok(())
1248    /// # }
1249    /// ```
1250    #[sql_name = "json_valid"]
1251    #[cfg(feature = "__sqlite-shared")]
1252    fn json_valid_with_flags<
1253        X: TextOrNullableTextOrBinaryOrNullableBinary + SingleValue + MaybeNullableValue<Bool>,
1254    >(
1255        x: X,
1256        flags: crate::sqlite::types::JsonValidFlags,
1257    ) -> X::Out;
1258
1259    /// The json_type(X) function returns the "type" of the outermost element of X.
1260    /// The "type" returned by json_type() is one of the following SQL text values:
1261    /// 'null', 'true', 'false', 'integer', 'real', 'text', 'array', or 'object'.
1262    ///
1263    /// This function requires at least SQLite 3.38 or newer
1264    ///
1265    /// # Example
1266    ///
1267    /// ```rust
1268    /// # include!("../../doctest_setup.rs");
1269    /// #
1270    /// # fn main() {
1271    /// #     #[cfg(feature = "serde_json")]
1272    /// #     run_test().unwrap();
1273    /// # }
1274    /// #
1275    /// # #[cfg(feature = "serde_json")]
1276    /// # fn run_test() -> QueryResult<()> {
1277    /// #     use diesel::dsl::{sql, json_type};
1278    /// #     use serde_json::{json, Value};
1279    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
1280    /// #     let connection = &mut establish_connection();
1281    /// #     assert_version!(connection, 3, 38, 0);
1282    ///
1283    /// let result = diesel::select(json_type::<Json, _>(json!({"a": [2, 3.5, true, false, null, "x"]})))
1284    ///     .get_result::<String>(connection)?;
1285    ///
1286    /// assert_eq!("object", result);
1287    ///
1288    /// let result = diesel::select(json_type::<Jsonb, _>(json!({"a": [2, 3.5, true, false, null, "x"]})))
1289    ///     .get_result::<String>(connection)?;
1290    ///
1291    /// assert_eq!("object", result);
1292    ///
1293    /// let result = diesel::select(json_type::<Nullable<Json>, _>(None::<serde_json::Value>))
1294    ///     .get_result::<Option<String>>(connection)?;
1295    ///
1296    /// assert_eq!(None, result);
1297    ///
1298    /// # Ok(())
1299    /// # }
1300    /// ```
1301    #[sql_name = "json_type"]
1302    #[cfg(feature = "__sqlite-shared")]
1303    fn json_type<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + MaybeNullableValue<Text>>(
1304        j: J,
1305    ) -> J::Out;
1306
1307    /// The json_type(X,P) function returns the "type" of the element in X that is selected by path P.
1308    /// If the path P in json_type(X,P) selects an element that does not exist in X, then this function returns NULL.
1309    ///
1310    /// This function requires at least SQLite 3.38 or newer
1311    ///
1312    /// # Example
1313    ///
1314    /// ```rust
1315    /// # include!("../../doctest_setup.rs");
1316    /// #
1317    /// # fn main() {
1318    /// #     #[cfg(feature = "serde_json")]
1319    /// #     run_test().unwrap();
1320    /// # }
1321    /// #
1322    /// # #[cfg(feature = "serde_json")]
1323    /// # fn run_test() -> QueryResult<()> {
1324    /// #     use diesel::dsl::{sql, json_type_with_path};
1325    /// #     use serde_json::{json, Value};
1326    /// #     use diesel::sql_types::{Text, Json, Jsonb, Nullable};
1327    /// #     let connection = &mut establish_connection();
1328    /// #     assert_version!(connection, 3, 38, 0);
1329    ///
1330    /// let json_value = json!({"a": [2, 3.5, true, false, null, "x"]});
1331    ///
1332    /// let result = diesel::select(json_type_with_path::<Json, _, _>(json_value.clone(), "$.a"))
1333    ///     .get_result::<Option<String>>(connection)?;
1334    ///
1335    /// assert_eq!(Some("array".to_string()), result);
1336    ///
1337    /// let result = diesel::select(json_type_with_path::<Json, _, _>(json_value.clone(), "$.a[0]"))
1338    ///     .get_result::<Option<String>>(connection)?;
1339    ///
1340    /// assert_eq!(Some("integer".to_string()), result);
1341    ///
1342    /// let result = diesel::select(json_type_with_path::<Json, _, _>(json_value.clone(), "$.a[1]"))
1343    ///     .get_result::<Option<String>>(connection)?;
1344    ///
1345    /// assert_eq!(Some("real".to_string()), result);
1346    ///
1347    /// let result = diesel::select(json_type_with_path::<Json, _, _>(json_value.clone(), "$.a[2]"))
1348    ///     .get_result::<Option<String>>(connection)?;
1349    ///
1350    /// assert_eq!(Some("true".to_string()), result);
1351    ///
1352    /// let result = diesel::select(json_type_with_path::<Json, _, _>(json_value.clone(), "$.a[6]"))
1353    ///     .get_result::<Option<String>>(connection)?;
1354    ///
1355    /// assert_eq!(None, result);
1356    ///
1357    /// let result = diesel::select(json_type_with_path::<Jsonb, _, _>(json_value.clone(), "$.a"))
1358    ///     .get_result::<Option<String>>(connection)?;
1359    ///
1360    /// assert_eq!(Some("array".to_string()), result);
1361    ///
1362    /// let result = diesel::select(json_type_with_path::<Nullable<Json>, _, _>(None::<serde_json::Value>, "$.a"))
1363    ///     .get_result::<Option<String>>(connection)?;
1364    ///
1365    /// assert_eq!(None, result);
1366    ///
1367    /// # Ok(())
1368    /// # }
1369    /// ```
1370    #[sql_name = "json_type"]
1371    #[cfg(feature = "__sqlite-shared")]
1372    fn json_type_with_path<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
1373        j: J,
1374        path: Text,
1375    ) -> Nullable<Text>;
1376
1377    /// The json_quote(X) function converts the SQL value X (a number or a string) into its corresponding JSON
1378    /// representation. If X is a JSON value returned by another JSON function, then this function is a no-op.
1379    ///
1380    /// This function requires at least SQLite 3.38 or newer
1381    ///
1382    /// # Example
1383    ///
1384    /// ```rust
1385    /// # include!("../../doctest_setup.rs");
1386    /// #
1387    /// # fn main() {
1388    /// #     #[cfg(feature = "serde_json")]
1389    /// #     run_test().unwrap();
1390    /// # }
1391    /// #
1392    /// # #[cfg(feature = "serde_json")]
1393    /// # fn run_test() -> QueryResult<()> {
1394    /// #     use diesel::dsl::{sql, json_quote};
1395    /// #     use serde_json::{json, Value};
1396    /// #     use diesel::sql_types::{Text, Json, Integer, Float, Double, Nullable};
1397    /// #     let connection = &mut establish_connection();
1398    /// #     assert_version!(connection, 3, 38, 0);
1399    ///
1400    /// let result = diesel::select(json_quote::<Integer, _>(42))
1401    ///     .get_result::<Value>(connection)?;
1402    /// assert_eq!(json!(42), result);
1403    ///
1404    /// let result = diesel::select(json_quote::<Text, _>("verdant"))
1405    ///     .get_result::<Value>(connection)?;
1406    /// assert_eq!(json!("verdant"), result);
1407    ///
1408    /// let result = diesel::select(json_quote::<Text, _>("[1]"))
1409    ///     .get_result::<Value>(connection)?;
1410    /// assert_eq!(json!("[1]"), result);
1411    ///
1412    /// let result = diesel::select(json_quote::<Nullable<Text>, _>(None::<&str>))
1413    ///     .get_result::<Value>(connection)?;
1414    /// assert_eq!(json!(null), result);
1415    ///
1416    /// let result = diesel::select(json_quote::<Double, _>(3.14159))
1417    ///     .get_result::<Value>(connection)?;
1418    /// assert_eq!(json!(3.14159), result);
1419    ///
1420    /// let result = diesel::select(json_quote::<Json, _>(json!([1])))
1421    ///     .get_result::<Value>(connection)?;
1422    // assert_eq!(json!([1]), result);
1423    ///
1424    ///
1425    /// # Ok(())
1426    /// # }
1427    /// ```
1428    #[sql_name = "json_quote"]
1429    #[cfg(feature = "__sqlite-shared")]
1430    fn json_quote<J: SqlType + SingleValue>(j: J) -> Json;
1431
1432    /// The `json_group_array(X)` function is an aggregate SQL function that returns a JSON array comprised of
1433    /// all X values in the aggregation.
1434    ///
1435    /// ## Aggregate Function Expression
1436    ///
1437    /// This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details.
1438    ///
1439    /// # Examples
1440    ///
1441    /// ## Normal function usage
1442    ///
1443    /// ```rust
1444    /// # include!("../../doctest_setup.rs");
1445    /// #
1446    /// # fn main() {
1447    /// #     #[cfg(feature = "serde_json")]
1448    /// #     run_test().unwrap();
1449    /// # }
1450    /// #
1451    /// # #[cfg(feature = "serde_json")]
1452    /// # fn run_test() -> QueryResult<()> {
1453    /// #     use diesel::dsl::*;
1454    /// #     use schema::animals::dsl::*;
1455    /// #     use serde_json::json;
1456    /// #
1457    /// #     let connection = &mut establish_connection();
1458    /// #
1459    /// let result = animals
1460    ///     .select(json_group_array(species))
1461    ///     .get_result::<serde_json::Value>(connection)?;
1462    /// assert_eq!(result, json!(["dog", "spider"]));
1463    ///
1464    /// let result = animals
1465    ///     .select(json_group_array(legs))
1466    ///     .get_result::<serde_json::Value>(connection)?;
1467    /// assert_eq!(result, json!([4, 8]));
1468    ///
1469    /// let result = animals
1470    ///     .select(json_group_array(name))
1471    ///     .get_result::<serde_json::Value>(connection)?;
1472    /// assert_eq!(result, json!(["Jack", null]));
1473    ///
1474    /// # Ok(())
1475    /// # }
1476    /// ```
1477    /// ## Aggregate function expression
1478    ///
1479    /// ```rust
1480    /// # include!("../../doctest_setup.rs");
1481    /// #
1482    /// # fn main() {
1483    /// #     #[cfg(feature = "serde_json")]
1484    /// #     run_test().unwrap();
1485    /// # }
1486    /// #
1487    /// # #[cfg(feature = "serde_json")]
1488    /// # fn run_test() -> QueryResult<()> {
1489    /// #     use diesel::dsl::*;
1490    /// #     use schema::animals::dsl::*;
1491    /// #     use serde_json::json;
1492    /// #
1493    /// #     let connection = &mut establish_connection();
1494    /// #
1495    /// let result = animals
1496    ///     .select(json_group_array(species).aggregate_filter(legs.lt(8)))
1497    ///     .get_result::<serde_json::Value>(connection)?;
1498    /// assert_eq!(result, json!(["dog"]));
1499    ///
1500    /// # Ok(())
1501    /// # }
1502    /// ```
1503    ///
1504    /// # See also
1505    /// - [`jsonb_group_array`](jsonb_group_array()) will return data in JSONB format instead of JSON.
1506    /// - [`json_group_object`](json_group_object()) will return JSON object instead of array.
1507    #[cfg(feature = "__sqlite-shared")]
1508    #[aggregate]
1509    fn json_group_array<E: SqlType + SingleValue>(elements: E) -> Json;
1510
1511    /// The `jsonb_group_array(X)` function is an aggregate SQL function that returns a JSONB array comprised of
1512    /// all X values in the aggregation.
1513    ///
1514    /// ## Aggregate Function Expression
1515    ///
1516    /// This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details.
1517    ///
1518    /// # Examples
1519    ///
1520    /// ## Normal function usage
1521    ///
1522    /// ```rust
1523    /// # include!("../../doctest_setup.rs");
1524    /// #
1525    /// # fn main() {
1526    /// #     #[cfg(feature = "serde_json")]
1527    /// #     run_test().unwrap();
1528    /// # }
1529    /// #
1530    /// # #[cfg(feature = "serde_json")]
1531    /// # fn run_test() -> QueryResult<()> {
1532    /// #     use diesel::dsl::*;
1533    /// #     use schema::animals::dsl::*;
1534    /// #     use serde_json::json;
1535    /// #
1536    /// #     let connection = &mut establish_connection();
1537    /// #
1538    /// let result = animals
1539    ///     .select(json_group_array(species))
1540    ///     .get_result::<serde_json::Value>(connection)?;
1541    /// assert_eq!(result, json!(["dog", "spider"]));
1542    ///
1543    /// let result = animals
1544    ///     .select(json_group_array(legs))
1545    ///     .get_result::<serde_json::Value>(connection)?;
1546    /// assert_eq!(result, json!([4, 8]));
1547    ///
1548    /// let result = animals
1549    ///     .select(json_group_array(name))
1550    ///     .get_result::<serde_json::Value>(connection)?;
1551    /// assert_eq!(result, json!(["Jack", null]));
1552    ///
1553    /// # Ok(())
1554    /// # }
1555    /// ```
1556    ///
1557    /// ## Aggregate function expression
1558    ///
1559    /// ```rust
1560    /// # include!("../../doctest_setup.rs");
1561    /// #
1562    /// # fn main() {
1563    /// #     #[cfg(feature = "serde_json")]
1564    /// #     run_test().unwrap();
1565    /// # }
1566    /// #
1567    /// # #[cfg(feature = "serde_json")]
1568    /// # fn run_test() -> QueryResult<()> {
1569    /// #     use diesel::dsl::*;
1570    /// #     use schema::animals::dsl::*;
1571    /// #     use serde_json::json;
1572    /// #
1573    /// #     let connection = &mut establish_connection();
1574    /// #
1575    /// let result = animals
1576    ///     .select(json_group_array(species).aggregate_filter(legs.lt(8)))
1577    ///     .get_result::<serde_json::Value>(connection)?;
1578    /// assert_eq!(result, json!(["dog"]));
1579    ///
1580    /// # Ok(())
1581    /// # }
1582    /// ```
1583    ///
1584    /// # See also
1585    /// - [`json_group_array`](json_group_array()) will return data in JSON format instead of JSONB.
1586    /// - [`jsonb_group_object`](jsonb_group_object()) will return JSONB object instead of array.
1587    #[cfg(feature = "__sqlite-shared")]
1588    #[aggregate]
1589    fn jsonb_group_array<E: SqlType + SingleValue>(elements: E) -> Jsonb;
1590
1591    /// The `json_object()` SQL function accepts zero or more pairs of arguments and returns a
1592    /// well-formed JSON object composed from those pairs. The first argument of each pair is the
1593    /// label (key) and the second argument is the value. If any argument to `json_object()` is a
1594    /// BLOB then an error is thrown.
1595    ///
1596    /// An argument with SQL type TEXT is normally converted into a quoted JSON string even if the
1597    /// input text is well-formed JSON. However, if the argument is the direct result from another
1598    /// JSON function, then it is treated as JSON and all of its JSON type information and
1599    /// substructure is preserved. This allows calls to `json_object()` and `json_array()` to be
1600    /// nested. The [`json()`] function can also be used to force strings to be recognized as JSON.
1601    ///
1602    /// This function requires at least SQLite 3.38 or newer
1603    ///
1604    /// # Examples
1605    ///
1606    /// ```rust
1607    /// # include!("../../doctest_setup.rs");
1608    /// #
1609    /// # fn main() {
1610    /// #     #[cfg(feature = "serde_json")]
1611    /// #     run_test().unwrap();
1612    /// # }
1613    /// #
1614    /// # #[cfg(feature = "serde_json")]
1615    /// # fn run_test() -> QueryResult<()> {
1616    /// #     use diesel::dsl::*;
1617    /// #     use diesel::sql_types::{Text, Integer};
1618    /// #     use serde_json::json;
1619    /// #
1620    /// #     let connection = &mut establish_connection();
1621    /// #     assert_version!(connection, 3, 38, 0);
1622    /// #
1623    /// let result = diesel::select(json_object_0()).get_result::<serde_json::Value>(connection)?;
1624    /// assert_eq!(json!({}), result);
1625    ///
1626    /// let result = diesel::select(json_object_1::<Text, Integer, _, _>("a", 2))
1627    ///     .get_result::<serde_json::Value>(connection)?;
1628    /// assert_eq!(json!({"a": 2}), result);
1629    ///
1630    /// let result = diesel::select(
1631    ///     json_object_2::<Text, Integer, Text, Text, _, _, _, _>("a", 2, "c", "{e:5}")
1632    /// )
1633    /// .get_result::<serde_json::Value>(connection)?;
1634    /// assert_eq!(json!({"a": 2, "c": "{e:5}"}), result);
1635    ///
1636    /// let result = diesel::select(
1637    ///     json_object_2::<Text, Integer, Text, Json, _, _, _, _>("a", 2, "c", json_object_1::<Text, Integer, _, _>("e", 5))
1638    /// )
1639    /// .get_result::<serde_json::Value>(connection)?;
1640    /// assert_eq!(json!({"a": 2, "c": {"e": 5}}), result);
1641    /// #
1642    /// # Ok(())
1643    /// # }
1644    /// ```
1645    #[cfg(feature = "__sqlite-shared")]
1646    #[variadic(2)]
1647    fn json_object<K: NotBlob<IsNull = is_nullable::NotNull>, V: NotBlob>(key: K, value: V)
1648    -> Json;
1649
1650    /// The `jsonb_object()` SQL function works just like the [`json_object()`](json_object_1())
1651    /// function except that the generated object is returned in SQLite's private binary JSONB
1652    /// format rather than in the standard RFC 8259 text format.
1653    ///
1654    /// This function requires at least SQLite 3.38 or newer
1655    ///
1656    /// # Examples
1657    ///
1658    /// ```rust
1659    /// # include!("../../doctest_setup.rs");
1660    /// #
1661    /// # fn main() {
1662    /// #     #[cfg(feature = "serde_json")]
1663    /// #     run_test().unwrap();
1664    /// # }
1665    /// #
1666    /// # #[cfg(feature = "serde_json")]
1667    /// # fn run_test() -> QueryResult<()> {
1668    /// #     use diesel::dsl::*;
1669    /// #     use diesel::sql_types::{Text, Integer};
1670    /// #     use serde_json::json;
1671    /// #
1672    /// #     let connection = &mut establish_connection();
1673    /// #     assert_version!(connection, 3, 38, 0);
1674    /// #
1675    /// let result = diesel::select(jsonb_object_0()).get_result::<serde_json::Value>(connection)?;
1676    /// assert_eq!(json!({}), result);
1677    ///
1678    /// let result = diesel::select(jsonb_object_1::<Text, Integer, _, _>("a", 2))
1679    ///     .get_result::<serde_json::Value>(connection)?;
1680    /// assert_eq!(json!({"a": 2}), result);
1681    ///
1682    /// let result = diesel::select(
1683    ///     jsonb_object_2::<Text, Integer, Text, Text, _, _, _, _>("a", 2, "c", "{e:5}")
1684    /// )
1685    /// .get_result::<serde_json::Value>(connection)?;
1686    /// assert_eq!(json!({"a": 2, "c": "{e:5}"}), result);
1687    /// #
1688    /// # Ok(())
1689    /// # }
1690    /// ```
1691    #[cfg(feature = "__sqlite-shared")]
1692    #[variadic(2)]
1693    fn jsonb_object<K: NotBlob<IsNull = is_nullable::NotNull>, V: NotBlob>(
1694        key: K,
1695        value: V,
1696    ) -> Jsonb;
1697
1698    /// The json_group_object(NAME,VALUE) function returns a JSON object comprised of all NAME/VALUE pairs in
1699    /// the aggregation.
1700    ///
1701    /// A potential edge case in this function arises when `names` contains duplicate elements.
1702    /// In such case, the result will include all duplicates (e.g., `{"key": 1, "key": 2, "key": 3}`).
1703    /// Note that any duplicate entries in the resulting JSON will be removed during deserialization.
1704    ///
1705    /// This function requires at least SQLite 3.38 or newer
1706    ///
1707    /// ## Aggregate Function Expression
1708    ///
1709    /// This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details.
1710    ///
1711    /// # Examples
1712    ///
1713    /// ## Normal function usage
1714    ///
1715    /// ```rust
1716    /// # include!("../../doctest_setup.rs");
1717    /// #
1718    /// # fn main() {
1719    /// #     #[cfg(feature = "serde_json")]
1720    /// #     run_test().unwrap();
1721    /// # }
1722    /// #
1723    /// # #[cfg(feature = "serde_json")]
1724    /// # fn run_test() -> QueryResult<()> {
1725    /// #     use diesel::dsl::*;
1726    /// #     use diesel::sql_types::Text;
1727    /// #     use serde_json::json;
1728    /// #     use schema::animals::dsl::*;
1729    /// #
1730    /// #     let connection = &mut establish_connection();
1731    /// #     assert_version!(connection, 3, 38, 0);
1732    /// #
1733    /// let result = animals.select(json_group_object(species, name)).get_result::<serde_json::Value>(connection)?;
1734    /// assert_eq!(json!({"dog":"Jack","spider":null}), result);
1735    /// #
1736    /// # Ok(())
1737    /// # }
1738    /// ```
1739    ///
1740    /// ## Aggregate function expression
1741    ///
1742    /// ```rust
1743    /// # include!("../../doctest_setup.rs");
1744    /// #
1745    /// # fn main() {
1746    /// #     #[cfg(feature = "serde_json")]
1747    /// #     run_test().unwrap();
1748    /// # }
1749    /// #
1750    /// # #[cfg(feature = "serde_json")]
1751    /// # fn run_test() -> QueryResult<()> {
1752    /// #     use diesel::dsl::*;
1753    /// #     use diesel::sql_types::Text;
1754    /// #     use serde_json::json;
1755    /// #     use schema::animals::dsl::*;
1756    /// #
1757    /// #     let connection = &mut establish_connection();
1758    /// #
1759    /// #     let version = diesel::select(sql::<Text>("sqlite_version();"))
1760    /// #         .get_result::<String>(connection)?;
1761    /// #
1762    /// #     let version_components: Vec<&str> = version.split('.').collect();
1763    /// #     let major: u32 = version_components[0].parse().unwrap();
1764    /// #     let minor: u32 = version_components[1].parse().unwrap();
1765    /// #
1766    /// #     if major < 3 || minor < 38 {
1767    /// #         println!("SQLite version is too old, skipping the test.");
1768    /// #         return Ok(());
1769    /// #     }
1770    /// #
1771    /// let result = animals.select(json_group_object(species, name).aggregate_filter(legs.lt(8))).get_result::<serde_json::Value>(connection)?;
1772    /// assert_eq!(json!({"dog":"Jack"}), result);
1773    /// #
1774    /// # Ok(())
1775    /// # }
1776    /// ```
1777    ///
1778    /// # See also
1779    /// - [`jsonb_group_object`](jsonb_group_object()) will return data in JSONB format instead of JSON.
1780    /// - [`json_group_array`](json_group_array()) will return JSON array instead of object.
1781    #[cfg(feature = "__sqlite-shared")]
1782    #[aggregate]
1783    fn json_group_object<
1784        N: SqlType<IsNull = is_nullable::NotNull> + SingleValue,
1785        V: SqlType + SingleValue,
1786    >(
1787        names: N,
1788        values: V,
1789    ) -> Json;
1790
1791    /// The jsonb_group_object(NAME,VALUE) function returns a JSONB object comprised of all NAME/VALUE pairs in
1792    /// the aggregation.
1793    ///
1794    /// A potential edge case in this function arises when `names` contains duplicate elements.
1795    /// In such case, the result will include all duplicates (e.g., `{"key": 1, "key": 2, "key": 3}`).
1796    /// Note that any duplicate entries in the resulting JSONB will be removed during deserialization.
1797    ///
1798    /// This function requires at least SQLite 3.38 or newer
1799    ///
1800    /// ## Aggregate Function Expression
1801    ///
1802    /// This function can be used as aggregate expression. See [`AggregateExpressionMethods`] for details.
1803    ///
1804    /// # Examples
1805    ///
1806    /// ## Normal function usage
1807    ///
1808    /// ```rust
1809    /// # include!("../../doctest_setup.rs");
1810    /// #
1811    /// # fn main() {
1812    /// #     #[cfg(feature = "serde_json")]
1813    /// #     run_test().unwrap();
1814    /// # }
1815    /// #
1816    /// # #[cfg(feature = "serde_json")]
1817    /// # fn run_test() -> QueryResult<()> {
1818    /// #     use diesel::dsl::*;
1819    /// #     use diesel::sql_types::Text;
1820    /// #     use serde_json::json;
1821    /// #     use schema::animals::dsl::*;
1822    /// #
1823    /// #     let connection = &mut establish_connection();
1824    /// #     assert_version!(connection, 3, 38, 0);
1825    /// #
1826    /// let result = animals.select(jsonb_group_object(species, name)).get_result::<serde_json::Value>(connection)?;
1827    /// assert_eq!(json!({"dog":"Jack","spider":null}), result);
1828    /// #
1829    /// # Ok(())
1830    /// # }
1831    /// ```
1832    ///
1833    /// ## Aggregate function expression
1834    ///
1835    /// ```rust
1836    /// # include!("../../doctest_setup.rs");
1837    /// #
1838    /// # fn main() {
1839    /// #     #[cfg(feature = "serde_json")]
1840    /// #     run_test().unwrap();
1841    /// # }
1842    /// #
1843    /// # #[cfg(feature = "serde_json")]
1844    /// # fn run_test() -> QueryResult<()> {
1845    /// #     use diesel::dsl::*;
1846    /// #     use diesel::sql_types::Text;
1847    /// #     use serde_json::json;
1848    /// #     use schema::animals::dsl::*;
1849    /// #
1850    /// #     let connection = &mut establish_connection();
1851    /// #
1852    /// #     let version = diesel::select(sql::<Text>("sqlite_version();"))
1853    /// #         .get_result::<String>(connection)?;
1854    /// #
1855    /// #     let version_components: Vec<&str> = version.split('.').collect();
1856    /// #     let major: u32 = version_components[0].parse().unwrap();
1857    /// #     let minor: u32 = version_components[1].parse().unwrap();
1858    /// #
1859    /// #     if major < 3 || minor < 38 {
1860    /// #         println!("SQLite version is too old, skipping the test.");
1861    /// #         return Ok(());
1862    /// #     }
1863    /// #
1864    /// let result = animals.select(jsonb_group_object(species, name).aggregate_filter(legs.lt(8))).get_result::<serde_json::Value>(connection)?;
1865    /// assert_eq!(json!({"dog":"Jack"}), result);
1866    /// #
1867    /// # Ok(())
1868    /// # }
1869    /// ```
1870    ///
1871    /// # See also
1872    /// - [`json_group_object`](jsonb_group_array()) will return data in JSON format instead of JSONB.
1873    /// - [`jsonb_group_array`](jsonb_group_array()) will return JSONB array instead of object.
1874    #[cfg(feature = "__sqlite-shared")]
1875    #[aggregate]
1876    fn jsonb_group_object<
1877        N: SqlType<IsNull = is_nullable::NotNull> + SingleValue,
1878        V: SqlType + SingleValue,
1879    >(
1880        names: N,
1881        values: V,
1882    ) -> Jsonb;
1883
1884    /// The `json_array()` SQL function accepts zero or more arguments and returns a well-formed JSON array
1885    /// that is composed from those arguments. Note that arguments of type BLOB will not be accepted by this
1886    /// function.
1887    ///
1888    /// An argument with SQL type TEXT is normally converted into a quoted JSON string. However, if the
1889    /// argument is the output from another json function, then it is stored as JSON. This allows calls to
1890    /// `json_array()` and `json_object()` to be nested. The [`json()`] function can also be used to force
1891    /// strings to be recognized as JSON.
1892    ///
1893    /// This function requires at least SQLite 3.38 or newer
1894    ///
1895    /// # Examples
1896    ///
1897    /// ```rust
1898    /// # include!("../../doctest_setup.rs");
1899    /// #
1900    /// # fn main() {
1901    /// #     #[cfg(feature = "serde_json")]
1902    /// #     run_test().unwrap();
1903    /// # }
1904    /// #
1905    /// # #[cfg(feature = "serde_json")]
1906    /// # fn run_test() -> QueryResult<()> {
1907    /// #     use diesel::dsl::*;
1908    /// #     use diesel::sql_types::{Text, Double};
1909    /// #     use serde_json::json;
1910    /// #
1911    /// #     let connection = &mut establish_connection();
1912    /// #     assert_version!(connection, 3, 38, 0);
1913    /// #
1914    /// let result = diesel::select(json_array_0()).get_result::<serde_json::Value>(connection)?;
1915    /// assert_eq!(json!([]), result);
1916    ///
1917    /// let result = diesel::select(json_array_1::<Text, _>("abc"))
1918    ///     .get_result::<serde_json::Value>(connection)?;
1919    /// assert_eq!(json!(["abc"]), result);
1920    ///
1921    /// let result = diesel::select(json_array_2::<Text, Double, _, _>("abc", 3.1415))
1922    ///     .get_result::<serde_json::Value>(connection)?;
1923    /// assert_eq!(json!(["abc", 3.1415]), result);
1924    /// #
1925    /// # Ok(())
1926    /// # }
1927    /// ```
1928    #[cfg(feature = "__sqlite-shared")]
1929    #[variadic(1)]
1930    fn json_array<V: NotBlob>(value: V) -> Json;
1931
1932    /// The `jsonb_array()` SQL function accepts zero or more arguments and returns a well-formed JSON array
1933    /// that is composed from those arguments. Note that arguments of type BLOB will not be accepted by this
1934    /// function.
1935    ///
1936    /// An argument with SQL type TEXT is normally converted into a quoted JSON string. However, if the
1937    /// argument is the output from another json function, then it is stored as JSON. This allows calls to
1938    /// `jsonb_array()` and `jsonb_object()` to be nested. The [`json()`] function can also be used to force
1939    /// strings to be recognized as JSON.
1940    ///
1941    /// This function works just like the [`json_array()`](json_array_1()) function except that it returns the
1942    /// constructed JSON array in the SQLite's private JSONB format rather than in the standard RFC 8259 text
1943    /// format.
1944    ///
1945    /// This function requires at least SQLite 3.38 or newer
1946    ///
1947    /// # Examples
1948    ///
1949    /// ```rust
1950    /// # include!("../../doctest_setup.rs");
1951    /// #
1952    /// # fn main() {
1953    /// #     #[cfg(feature = "serde_json")]
1954    /// #     run_test().unwrap();
1955    /// # }
1956    /// #
1957    /// # #[cfg(feature = "serde_json")]
1958    /// # fn run_test() -> QueryResult<()> {
1959    /// #     use diesel::dsl::*;
1960    /// #     use diesel::sql_types::{Text, Double};
1961    /// #     use serde_json::json;
1962    /// #
1963    /// #     let connection = &mut establish_connection();
1964    /// #     assert_version!(connection, 3, 38, 0);
1965    /// #
1966    /// let result = diesel::select(jsonb_array_0()).get_result::<serde_json::Value>(connection)?;
1967    /// assert_eq!(json!([]), result);
1968    ///
1969    /// let result = diesel::select(jsonb_array_1::<Text, _>("abc"))
1970    ///     .get_result::<serde_json::Value>(connection)?;
1971    /// assert_eq!(json!(["abc"]), result);
1972    ///
1973    /// let result = diesel::select(jsonb_array_2::<Text, Double, _, _>("abc", 3.1415))
1974    ///     .get_result::<serde_json::Value>(connection)?;
1975    /// assert_eq!(json!(["abc", 3.1415]), result);
1976    /// #
1977    /// # Ok(())
1978    /// # }
1979    /// ```
1980    #[cfg(feature = "__sqlite-shared")]
1981    #[variadic(1)]
1982    fn jsonb_array<V: NotBlob>(value: V) -> Jsonb;
1983
1984    /// The `json_remove(X,P,...)` SQL function takes a single JSON value as its first argument followed by
1985    /// zero or more path arguments. The `json_remove(X,P,...)` function returns a copy of the X parameter
1986    /// with all the elements identified by path arguments removed. Paths that select elements not found in X
1987    /// are silently ignored.
1988    ///
1989    /// Removals occurs sequentially from left to right. Changes caused by prior removals can affect the path
1990    /// search for subsequent arguments.
1991    ///
1992    /// If the `json_remove(X)` function is called with no path arguments, then it returns the input X
1993    /// reformatted, with excess whitespace removed.
1994    ///
1995    /// The `json_remove()` function throws an error if any of the path arguments is not a well-formed path.
1996    ///
1997    /// This function requires at least SQLite 3.38 or newer
1998    ///
1999    /// # Examples
2000    ///
2001    /// ```rust
2002    /// # include!("../../doctest_setup.rs");
2003    /// #
2004    /// # fn main() {
2005    /// #     #[cfg(feature = "serde_json")]
2006    /// #     run_test().unwrap();
2007    /// # }
2008    /// #
2009    /// # #[cfg(feature = "serde_json")]
2010    /// # fn run_test() -> QueryResult<()> {
2011    /// #     use diesel::dsl::*;
2012    /// #     use diesel::sql_types::{Json, Text};
2013    /// #     use serde_json::json;
2014    /// #
2015    /// #     let connection = &mut establish_connection();
2016    /// #     assert_version!(connection, 3, 38, 0);
2017    /// #
2018    /// let json = json!(['a', 'b', 'c', 'd']);
2019    /// let result = diesel::select(json_remove_0::<Json, _>(json))
2020    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2021    /// assert_eq!(Some(json!(['a', 'b', 'c', 'd'])), result);
2022    ///
2023    /// // Values are removed sequentially from left to right.
2024    /// let json = json!(['a', 'b', 'c', 'd']);
2025    /// let result = diesel::select(json_remove_2::<Json, _, _, _>(json, "$[0]", "$[2]"))
2026    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2027    /// assert_eq!(Some(json!(['b', 'c'])), result);
2028    ///
2029    /// let json = json!({"a": 10, "b": 20});
2030    /// let result = diesel::select(json_remove_1::<Json, _, _>(json, "$.a"))
2031    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2032    /// assert_eq!(Some(json!({"b": 20})), result);
2033    ///
2034    /// // Paths that select not existing elements are silently ignored.
2035    /// let json = json!({"a": 10, "b": 20});
2036    /// let result = diesel::select(json_remove_1::<Json, _, _>(json, "$.c"))
2037    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2038    /// assert_eq!(Some(json!({"a": 10, "b": 20})), result);
2039    ///
2040    /// let json = json!({"a": 10, "b": 20});
2041    /// let result = diesel::select(json_remove_1::<Json, _, _>(json, "$"))
2042    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2043    /// assert_eq!(None, result);
2044    ///
2045    /// #
2046    /// # Ok(())
2047    /// # }
2048    /// ```
2049    #[cfg(feature = "__sqlite-shared")]
2050    #[variadic(1)]
2051    fn json_remove<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
2052        json: J,
2053        path: Text,
2054    ) -> Nullable<Json>;
2055
2056    /// The `jsonb_remove(X,P,...)` SQL function takes a single JSON value as its first argument followed by
2057    /// zero or more path arguments. The `jsonb_remove(X,P,...)` function returns a copy of the X parameter
2058    /// with all the elements identified by path arguments removed. Paths that select elements not found in X
2059    /// are silently ignored.
2060    ///
2061    /// Removals occurs sequentially from left to right. Changes caused by prior removals can affect the path
2062    /// search for subsequent arguments.
2063    ///
2064    /// If the `jsonb_remove(X)` function is called with no path arguments, then it returns the input X
2065    /// reformatted, with excess whitespace removed.
2066    ///
2067    /// The `jsonb_remove()` function throws an error if any of the path arguments is not a well-formed path.
2068    ///
2069    /// This function returns value in a binary JSONB format.
2070    ///
2071    /// This function requires at least SQLite 3.38 or newer
2072    ///
2073    /// # Examples
2074    ///
2075    /// ```rust
2076    /// # include!("../../doctest_setup.rs");
2077    /// #
2078    /// # fn main() {
2079    /// #     #[cfg(feature = "serde_json")]
2080    /// #     run_test().unwrap();
2081    /// # }
2082    /// #
2083    /// # #[cfg(feature = "serde_json")]
2084    /// # fn run_test() -> QueryResult<()> {
2085    /// #     use diesel::dsl::*;
2086    /// #     use diesel::sql_types::{Jsonb, Text};
2087    /// #     use serde_json::json;
2088    /// #
2089    /// #     let connection = &mut establish_connection();
2090    /// #     assert_version!(connection, 3, 38, 0);
2091    /// #
2092    /// let json = json!(['a', 'b', 'c', 'd']);
2093    /// let result = diesel::select(jsonb_remove_0::<Jsonb, _>(json))
2094    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2095    /// assert_eq!(Some(json!(['a', 'b', 'c', 'd'])), result);
2096    ///
2097    /// // Values are removed sequentially from left to right.
2098    /// let json = json!(['a', 'b', 'c', 'd']);
2099    /// let result = diesel::select(jsonb_remove_2::<Jsonb, _, _, _>(json, "$[0]", "$[2]"))
2100    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2101    /// assert_eq!(Some(json!(['b', 'c'])), result);
2102    ///
2103    /// let json = json!({"a": 10, "b": 20});
2104    /// let result = diesel::select(jsonb_remove_1::<Jsonb, _, _>(json, "$.a"))
2105    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2106    /// assert_eq!(Some(json!({"b": 20})), result);
2107    ///
2108    /// // Paths that select not existing elements are silently ignored.
2109    /// let json = json!({"a": 10, "b": 20});
2110    /// let result = diesel::select(jsonb_remove_1::<Jsonb, _, _>(json, "$.c"))
2111    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2112    /// assert_eq!(Some(json!({"a": 10, "b": 20})), result);
2113    ///
2114    /// let json = json!({"a": 10, "b": 20});
2115    /// let result = diesel::select(jsonb_remove_1::<Jsonb, _, _>(json, "$"))
2116    ///     .get_result::<Option<serde_json::Value>>(connection)?;
2117    /// assert_eq!(None, result);
2118    ///
2119    /// #
2120    /// # Ok(())
2121    /// # }
2122    /// ```
2123    #[cfg(feature = "__sqlite-shared")]
2124    #[variadic(1)]
2125    fn jsonb_remove<J: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue>(
2126        json: J,
2127        path: Text,
2128    ) -> Nullable<Jsonb>;
2129
2130    /// Applies an RFC 7396 MergePatch `patch` to the input JSON `target` and
2131    /// returns the patched JSON value.
2132    ///
2133    /// MergePatch can add, modify, or delete elements of a JSON object. Arrays are
2134    /// treated as atomic values: they can only be inserted, replaced, or deleted as a
2135    /// whole, not modified element-wise.
2136    ///
2137    /// # Examples
2138    ///
2139    /// ```rust
2140    /// # include!("../../doctest_setup.rs");
2141    /// #
2142    /// # fn main() {
2143    /// #     #[cfg(feature = "serde_json")]
2144    /// #     run_test().unwrap();
2145    /// # }
2146    /// #
2147    /// # #[cfg(feature = "serde_json")]
2148    /// # fn run_test() -> QueryResult<()> {
2149    /// #     use diesel::dsl::json_patch;
2150    /// #     use serde_json::{json, Value};
2151    /// #     use diesel::sql_types::{Json, Nullable};
2152    /// #     let connection = &mut establish_connection();
2153    ///
2154    /// let result = diesel::select(json_patch::<Json, Json, _, _>(
2155    ///     json!( {"a":1,"b":2} ),
2156    ///     json!( {"c":3,"d":4} ),
2157    /// ))
2158    /// .get_result::<Value>(connection)?;
2159    /// assert_eq!(json!({"a":1,"b":2,"c":3,"d":4}), result);
2160    ///
2161    /// let result = diesel::select(json_patch::<Json, Json, _, _>(
2162    ///     json!( {"a":[1,2],"b":2} ),
2163    ///     json!( {"a":9} ),
2164    /// ))
2165    /// .get_result::<Value>(connection)?;
2166    /// assert_eq!(json!({"a":9,"b":2}), result);
2167    ///
2168    /// let result = diesel::select(json_patch::<Json, Json, _, _>(
2169    ///     json!( {"a":[1,2],"b":2} ),
2170    ///     json!( {"a":null} ),
2171    /// ))
2172    /// .get_result::<Value>(connection)?;
2173    /// assert_eq!(json!({"b":2}), result);
2174    ///
2175    /// let result = diesel::select(json_patch::<Json, Json, _, _>(
2176    ///     json!( {"a":1,"b":2} ),
2177    ///     json!( {"a":9,"b":null,"c":8} ),
2178    /// ))
2179    /// .get_result::<Value>(connection)?;
2180    /// assert_eq!(json!({"a":9,"c":8}), result);
2181    ///
2182    /// let result = diesel::select(json_patch::<Json, Json, _, _>(
2183    ///     json!( {"a":{"x":1,"y":2},"b":3} ),
2184    ///     json!( {"a":{"y":9},"c":8} ),
2185    /// ))
2186    /// .get_result::<Value>(connection)?;
2187    /// assert_eq!(
2188    ///     json!({"a":{"x":1,"y":9},"b":3,"c":8}),
2189    ///     result
2190    /// );
2191    ///
2192    /// // Nullable input yields nullable output
2193    /// let result = diesel::select(json_patch::<Nullable<Json>, Json, _, _>(
2194    ///     None::<Value>,
2195    ///     json!({}),
2196    /// ))
2197    /// .get_result::<Option<Value>>(connection)?;
2198    /// assert!(result.is_none());
2199    ///
2200    /// #     Ok(())
2201    /// # }
2202    /// ```
2203    #[cfg(feature = "__sqlite-shared")]
2204    fn json_patch<
2205        T: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue,
2206        P: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue + CombinedNullableValue<T, Json>,
2207    >(
2208        target: T,
2209        patch: P,
2210    ) -> P::Out;
2211
2212    /// Applies an RFC 7396 MergePatch `patch` to the input JSON `target` and
2213    /// returns the patched JSON value in SQLite's binary JSONB format.
2214    ///
2215    /// See [`json_patch`](json_patch()) for details about the MergePatch semantics.
2216    ///
2217    /// # Examples
2218    ///
2219    /// ```rust
2220    /// # include!("../../doctest_setup.rs");
2221    /// #
2222    /// # fn main() {
2223    /// #     #[cfg(feature = "serde_json")]
2224    /// #     run_test().unwrap();
2225    /// # }
2226    /// #
2227    /// # #[cfg(feature = "serde_json")]
2228    /// # fn run_test() -> QueryResult<()> {
2229    /// #     use diesel::dsl::jsonb_patch;
2230    /// #     use serde_json::{json, Value};
2231    /// #     use diesel::sql_types::{Jsonb, Nullable};
2232    /// #     let connection = &mut establish_connection();
2233    /// #     assert_version!(connection, 3, 45, 0);
2234    ///
2235    /// let result = diesel::select(jsonb_patch::<Jsonb, Jsonb, _, _>(
2236    ///     json!( {"a":1,"b":2} ),
2237    ///     json!( {"c":3,"d":4} ),
2238    /// ))
2239    /// .get_result::<Value>(connection)?;
2240    /// assert_eq!(json!({"a":1,"b":2,"c":3,"d":4}), result);
2241    ///
2242    /// // Nullable input yields nullable output
2243    /// let result = diesel::select(jsonb_patch::<Nullable<Jsonb>, Jsonb, _, _>(
2244    ///     None::<Value>,
2245    ///     json!({}),
2246    /// ))
2247    /// .get_result::<Option<Value>>(connection)?;
2248    /// assert!(result.is_none());
2249    ///
2250    /// #     Ok(())
2251    /// # }
2252    /// ```
2253    #[cfg(feature = "__sqlite-shared")]
2254    fn jsonb_patch<
2255        T: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue,
2256        P: JsonOrNullableJsonOrJsonbOrNullableJsonb + SingleValue + CombinedNullableValue<T, Jsonb>,
2257    >(
2258        target: T,
2259        patch: P,
2260    ) -> P::Out;
2261}
2262
2263pub(super) mod return_type_helpers_reexported {
2264    #[allow(unused_imports)]
2265    #[doc(inline)]
2266    pub use super::return_type_helpers::*;
2267}