|
1 | 1 | //! PostgreSQL specific functions
|
2 | 2 |
|
3 | 3 | use super::expression_methods::InetOrCidr;
|
| 4 | +use super::expression_methods::JsonbOrNullableJsonb; |
4 | 5 | use crate::expression::functions::define_sql_function;
|
5 | 6 | use crate::pg::expression::expression_methods::ArrayOrNullableArray;
|
6 | 7 | use crate::pg::expression::expression_methods::MaybeNullableValue;
|
@@ -1634,3 +1635,48 @@ define_sql_function! {
|
1634 | 1635 | text_array: Arr,
|
1635 | 1636 | ) -> Arr::Out;
|
1636 | 1637 | }
|
| 1638 | + |
| 1639 | +#[cfg(feature = "postgres_backend")] |
| 1640 | +define_sql_function! { |
| 1641 | + /// Returns target with new_value inserted. If the item designated by the path is an array element |
| 1642 | + /// |
| 1643 | + /// |
| 1644 | + /// # Example |
| 1645 | + /// |
| 1646 | + /// ```rust |
| 1647 | + /// # include!("../../doctest_setup.rs"); |
| 1648 | + /// # |
| 1649 | + /// # fn main() { |
| 1650 | + /// # run_test().unwrap(); |
| 1651 | + /// # } |
| 1652 | + /// # |
| 1653 | + /// # fn run_test() -> QueryResult<()> { |
| 1654 | + /// # use diesel::dsl::jsonb_insert; |
| 1655 | + /// # use diesel::sql_types::{Array, Jsonb, Nullable, Text}; |
| 1656 | + /// # use serde_json::{Value, json}; |
| 1657 | + /// # let connection = &mut establish_connection(); |
| 1658 | + /// let result = diesel::select(jsonb_insert::<Jsonb, Array<Text>, _, _, _>(json!([1, 2, 3]), vec!["1"], json!(1))) |
| 1659 | + /// .get_result::<Value>(connection)?; |
| 1660 | + /// assert_eq!(json!([1, 1, 2, 3]), result); |
| 1661 | + /// |
| 1662 | + /// let result = diesel::select(jsonb_insert::<Jsonb, Array<Text>, _, _, _>(json!([1, 2, 3]), Vec::<String>::new(), json!(1))) |
| 1663 | + /// .get_result::<Value>(connection)?; |
| 1664 | + /// assert_eq!(json!([1, 2, 3]), result); |
| 1665 | + /// |
| 1666 | + /// let result = diesel::select(jsonb_insert::<Nullable<Jsonb>, Array<Text>, _, _, _>(Option::<Value>::None, vec!["1"], json!(1))) |
| 1667 | + /// .get_result::<Option<Value>>(connection)?; |
| 1668 | + /// assert_eq!(None, result); |
| 1669 | + /// |
| 1670 | + /// let result = diesel::select(jsonb_insert::<Nullable<Jsonb>, Array<Text>, _, _, _>(json!([1, 2, 3]), vec!["1"], Option::<Value>::None)) |
| 1671 | + /// .get_result::<Option<Value>>(connection)?; |
| 1672 | + /// assert_eq!(None, result); |
| 1673 | + /// |
| 1674 | + /// let result = diesel::select(jsonb_insert::<Jsonb, Nullable<Array<Text>>, _, _, _>(json!([1, 2, 3]), None::<Vec<String>>, json!(1))) |
| 1675 | + /// .get_result::<Value>(connection)?; |
| 1676 | + /// assert!(result.is_err()); |
| 1677 | + /// |
| 1678 | + /// # Ok(()) |
| 1679 | + /// # } |
| 1680 | + /// ``` |
| 1681 | + fn jsonb_insert<J: JsonbOrNullableJsonb + MaybeNullableValue<Jsonb>, P: TextArrayOrNullableTextArray + MaybeNullableValue<Jsonb>>(target: J, path: P, value: J) -> J::Out; |
| 1682 | +} |
0 commit comments