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#[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}