This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 6a92870485 doc-gen: migrate scalar functions (array) documentation 1/3 
(#13928)
6a92870485 is described below

commit 6a9287048535d88e58c6e302e8083c67d6f3648c
Author: Ian Lai <[email protected]>
AuthorDate: Sun Dec 29 21:14:19 2024 +0800

    doc-gen: migrate scalar functions (array) documentation 1/3 (#13928)
    
    * doc-gen: migrate scalar functions (array) documentation 1/3
    
    * fix: remove unsed import, fix typo and update function docs
    
    ---------
    
    Co-authored-by: Cheng-Yuan-Lai <a186235@g,ail.com>
---
 datafusion-cli/Cargo.lock                      |   2 +
 datafusion/functions-nested/Cargo.toml         |   2 +
 datafusion/functions-nested/src/array_has.rs   | 160 +++++++--------
 datafusion/functions-nested/src/cardinality.rs |  50 ++---
 datafusion/functions-nested/src/concat.rs      | 158 ++++++---------
 datafusion/functions-nested/src/dimension.rs   |  99 ++++------
 datafusion/functions-nested/src/distance.rs    |  58 +++---
 datafusion/functions-nested/src/empty.rs       |  50 ++---
 datafusion/functions-nested/src/except.rs      |  70 +++----
 datafusion/functions-nested/src/extract.rs     | 258 +++++++++++--------------
 docs/source/user-guide/sql/scalar_functions.md | 144 +++++++-------
 11 files changed, 446 insertions(+), 605 deletions(-)

diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index 863bb5181f..92dcf24708 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -1476,10 +1476,12 @@ dependencies = [
  "arrow-ord",
  "arrow-schema",
  "datafusion-common",
+ "datafusion-doc",
  "datafusion-execution",
  "datafusion-expr",
  "datafusion-functions",
  "datafusion-functions-aggregate",
+ "datafusion-macros",
  "datafusion-physical-expr-common",
  "itertools",
  "log",
diff --git a/datafusion/functions-nested/Cargo.toml 
b/datafusion/functions-nested/Cargo.toml
index 5310493b4e..e7254e4125 100644
--- a/datafusion/functions-nested/Cargo.toml
+++ b/datafusion/functions-nested/Cargo.toml
@@ -46,10 +46,12 @@ arrow-buffer = { workspace = true }
 arrow-ord = { workspace = true }
 arrow-schema = { workspace = true }
 datafusion-common = { workspace = true }
+datafusion-doc = { workspace = true }
 datafusion-execution = { workspace = true }
 datafusion-expr = { workspace = true }
 datafusion-functions = { workspace = true }
 datafusion-functions-aggregate = { workspace = true }
+datafusion-macros = { workspace = true }
 datafusion-physical-expr-common = { workspace = true }
 itertools = { workspace = true, features = ["use_std"] }
 log = { workspace = true }
diff --git a/datafusion/functions-nested/src/array_has.rs 
b/datafusion/functions-nested/src/array_has.rs
index 499b07dafc..0a3daa18c0 100644
--- a/datafusion/functions-nested/src/array_has.rs
+++ b/datafusion/functions-nested/src/array_has.rs
@@ -25,17 +25,17 @@ use arrow_buffer::BooleanBuffer;
 use datafusion_common::cast::as_generic_list_array;
 use datafusion_common::utils::string_utils::string_array_to_vec;
 use datafusion_common::{exec_err, Result, ScalarValue};
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
+use datafusion_macros::user_doc;
 use datafusion_physical_expr_common::datum::compare_with_eq;
 use itertools::Itertools;
 
 use crate::utils::make_scalar_function;
 
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 // Create static instances of ScalarUDFs for each function
 make_udf_expr_and_func!(ArrayHas,
@@ -57,6 +57,27 @@ make_udf_expr_and_func!(ArrayHasAny,
     array_has_any_udf // internal function name
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns true if the array contains the element.",
+    syntax_example = "array_has(array, element)",
+    sql_example = r#"```sql
+> select array_has([1, 2, 3], 2);
++-----------------------------+
+| array_has(List([1,2,3]), 2) |
++-----------------------------+
+| true                        |
++-----------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "element",
+        description = "Scalar or Array expression. Can be a constant, column, 
or function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub struct ArrayHas {
     signature: Signature,
@@ -138,41 +159,10 @@ impl ScalarUDFImpl for ArrayHas {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_has_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_has_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns true if the array contains the element.",
-
-            "array_has(array, element)")
-            .with_sql_example(
-                r#"```sql
-> select array_has([1, 2, 3], 2);
-+-----------------------------+
-| array_has(List([1,2,3]), 2) |
-+-----------------------------+
-| true                        |
-+-----------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "element",
-                "Scalar or Array expression. Can be a constant, column, or 
function, and any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 fn array_has_inner_for_scalar(
     haystack: &ArrayRef,
     needle: &dyn Datum,
@@ -287,6 +277,27 @@ fn array_has_any_inner(args: &[ArrayRef]) -> 
Result<ArrayRef> {
     }
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns true if all elements of sub-array exist in array.",
+    syntax_example = "array_has_all(array, sub-array)",
+    sql_example = r#"```sql
+> select array_has_all([1, 2, 3, 4], [2, 3]);
++--------------------------------------------+
+| array_has_all(List([1,2,3,4]), List([2,3])) |
++--------------------------------------------+
+| true                                       |
++--------------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "sub-array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub struct ArrayHasAll {
     signature: Signature,
@@ -337,39 +348,31 @@ impl ScalarUDFImpl for ArrayHasAll {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_has_all_doc())
+        self.doc()
     }
 }
 
-fn get_array_has_all_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns true if all elements of sub-array exist in array.",
-
-            "array_has_all(array, sub-array)")
-            .with_sql_example(
-                r#"```sql
-> select array_has_all([1, 2, 3, 4], [2, 3]);
-+--------------------------------------------+
-| array_has_all(List([1,2,3,4]), List([2,3])) |
-+--------------------------------------------+
-| true                                       |
-+--------------------------------------------+
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns true if any elements exist in both arrays.",
+    syntax_example = "array_has_any(array, sub-array)",
+    sql_example = r#"```sql
+> select array_has_any([1, 2, 3], [3, 4]);
++------------------------------------------+
+| array_has_any(List([1,2,3]), List([3,4])) |
++------------------------------------------+
+| true                                     |
++------------------------------------------+
 ```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "sub-array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "sub-array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub struct ArrayHasAny {
     signature: Signature,
@@ -420,39 +423,10 @@ impl ScalarUDFImpl for ArrayHasAny {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_has_any_doc())
+        self.doc()
     }
 }
 
-fn get_array_has_any_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns true if any elements exist in both arrays.",
-
-            "array_has_any(array, sub-array)")
-            .with_sql_example(
-                r#"```sql
-> select array_has_any([1, 2, 3], [3, 4]);
-+------------------------------------------+
-| array_has_any(List([1,2,3]), List([3,4])) |
-+------------------------------------------+
-| true                                     |
-+------------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "sub-array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// Represents the type of comparison for array_has.
 #[derive(Debug, PartialEq, Clone, Copy)]
 enum ComparisonType {
diff --git a/datafusion/functions-nested/src/cardinality.rs 
b/datafusion/functions-nested/src/cardinality.rs
index 45543d1bd6..b577e2aa9d 100644
--- a/datafusion/functions-nested/src/cardinality.rs
+++ b/datafusion/functions-nested/src/cardinality.rs
@@ -26,13 +26,13 @@ use arrow_schema::DataType::{FixedSizeList, LargeList, 
List, Map, UInt64};
 use datafusion_common::cast::{as_large_list_array, as_list_array, 
as_map_array};
 use datafusion_common::Result;
 use datafusion_common::{exec_err, plan_err};
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ArrayFunctionSignature, ColumnarValue, Documentation, ScalarUDFImpl, 
Signature,
     TypeSignature, Volatility,
 };
+use datafusion_macros::user_doc;
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 make_udf_expr_and_func!(
     Cardinality,
@@ -57,6 +57,23 @@ impl Cardinality {
     }
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the total number of elements in the array.",
+    syntax_example = "cardinality(array)",
+    sql_example = r#"```sql
+> select cardinality([[1, 2, 3, 4], [5, 6, 7, 8]]);
++--------------------------------------+
+| cardinality(List([1,2,3,4,5,6,7,8])) |
++--------------------------------------+
+| 8                                    |
++--------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct Cardinality {
     signature: Signature,
@@ -96,37 +113,10 @@ impl ScalarUDFImpl for Cardinality {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_cardinality_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_cardinality_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the total number of elements in the array.",
-
-            "cardinality(array)")
-            .with_sql_example(
-                r#"```sql
-> select cardinality([[1, 2, 3, 4], [5, 6, 7, 8]]);
-+--------------------------------------+
-| cardinality(List([1,2,3,4,5,6,7,8])) |
-+--------------------------------------+
-| 8                                    |
-+--------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// Cardinality SQL function
 pub fn cardinality_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 1 {
diff --git a/datafusion/functions-nested/src/concat.rs 
b/datafusion/functions-nested/src/concat.rs
index 3e8a5877fb..934c5a5fec 100644
--- a/datafusion/functions-nested/src/concat.rs
+++ b/datafusion/functions-nested/src/concat.rs
@@ -17,7 +17,7 @@
 
 //! [`ScalarUDFImpl`] definitions for `array_append`, `array_prepend` and 
`array_concat` functions.
 
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 use std::{any::Any, cmp::Ordering};
 
 use arrow::array::{Capacities, MutableArrayData};
@@ -28,11 +28,11 @@ use datafusion_common::Result;
 use datafusion_common::{
     cast::as_generic_list_array, exec_err, not_impl_err, plan_err, 
utils::list_ndims,
 };
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     type_coercion::binary::get_wider_type, ColumnarValue, Documentation, 
ScalarUDFImpl,
     Signature, Volatility,
 };
+use datafusion_macros::user_doc;
 
 use crate::utils::{align_array_dimensions, check_datatypes, 
make_scalar_function};
 
@@ -44,6 +44,24 @@ make_udf_expr_and_func!(
     array_append_udf                              // internal function name
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Appends an element to the end of an array.",
+    syntax_example = "array_append(array, element)",
+    sql_example = r#"```sql
+> select array_append([1, 2, 3], 4);
++--------------------------------------+
+| array_append(List([1,2,3]),Int64(4)) |
++--------------------------------------+
+| [1, 2, 3, 4]                         |
++--------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(name = "element", description = "Element to append to the array.")
+)]
 #[derive(Debug)]
 pub struct ArrayAppend {
     signature: Signature,
@@ -99,41 +117,10 @@ impl ScalarUDFImpl for ArrayAppend {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_append_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_append_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Appends an element to the end of an array.",
-
-            "array_append(array, element)")
-            .with_sql_example(
-                r#"```sql
-> select array_append([1, 2, 3], 4);
-+--------------------------------------+
-| array_append(List([1,2,3]),Int64(4)) |
-+--------------------------------------+
-| [1, 2, 3, 4]                         |
-+--------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "element",
-                "Element to append to the array.",
-            )
-            .build()
-    })
-}
-
 make_udf_expr_and_func!(
     ArrayPrepend,
     array_prepend,
@@ -142,6 +129,24 @@ make_udf_expr_and_func!(
     array_prepend_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Prepends an element to the beginning of an array.",
+    syntax_example = "array_prepend(element, array)",
+    sql_example = r#"```sql
+> select array_prepend(1, [2, 3, 4]);
++---------------------------------------+
+| array_prepend(Int64(1),List([2,3,4])) |
++---------------------------------------+
+| [1, 2, 3, 4]                          |
++---------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(name = "element", description = "Element to prepend to the 
array.")
+)]
 #[derive(Debug)]
 pub struct ArrayPrepend {
     signature: Signature,
@@ -197,41 +202,10 @@ impl ScalarUDFImpl for ArrayPrepend {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_prepend_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION_PREPEND: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_prepend_doc() -> &'static Documentation {
-    DOCUMENTATION_PREPEND.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Prepends an element to the beginning of an array.",
-
-            "array_prepend(element, array)")
-            .with_sql_example(
-                r#"```sql
-> select array_prepend(1, [2, 3, 4]);
-+---------------------------------------+
-| array_prepend(Int64(1),List([2,3,4])) |
-+---------------------------------------+
-| [1, 2, 3, 4]                          |
-+---------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "element",
-                "Element to prepend to the array.",
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 make_udf_expr_and_func!(
     ArrayConcat,
     array_concat,
@@ -239,6 +213,27 @@ make_udf_expr_and_func!(
     array_concat_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Concatenates arrays.",
+    syntax_example = "array_concat(array[, ..., array_n])",
+    sql_example = r#"```sql
+> select array_concat([1, 2], [3, 4], [5, 6]);
++---------------------------------------------------+
+| array_concat(List([1,2]),List([3,4]),List([5,6])) |
++---------------------------------------------------+
+| [1, 2, 3, 4, 5, 6]                                |
++---------------------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "array_n",
+        description = "Subsequent array column or literal array to 
concatenate."
+    )
+)]
 #[derive(Debug)]
 pub struct ArrayConcat {
     signature: Signature,
@@ -319,39 +314,10 @@ impl ScalarUDFImpl for ArrayConcat {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_concat_doc())
+        self.doc()
     }
 }
 
-fn get_array_concat_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Concatenates arrays.",
-
-            "array_concat(array[, ..., array_n])")
-            .with_sql_example(
-                r#"```sql
-> select array_concat([1, 2], [3, 4], [5, 6]);
-+---------------------------------------------------+
-| array_concat(List([1,2]),List([3,4]),List([5,6])) |
-+---------------------------------------------------+
-| [1, 2, 3, 4, 5, 6]                                |
-+---------------------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression to concatenate. Can be a constant, column, 
or function, and any combination of array operators.",
-            )
-            .with_argument(
-                "array_n",
-                "Subsequent array column or literal array to concatenate.",
-            )
-            .build()
-    })
-}
-
 /// Array_concat/Array_cat SQL function
 pub(crate) fn array_concat_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.is_empty() {
diff --git a/datafusion/functions-nested/src/dimension.rs 
b/datafusion/functions-nested/src/dimension.rs
index 2d2f90e9c7..9933bcf4a4 100644
--- a/datafusion/functions-nested/src/dimension.rs
+++ b/datafusion/functions-nested/src/dimension.rs
@@ -29,11 +29,11 @@ use datafusion_common::{exec_err, plan_err, Result};
 use crate::utils::{compute_array_dims, make_scalar_function};
 use arrow_schema::DataType::{FixedSizeList, LargeList, List, UInt64};
 use arrow_schema::Field;
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
-use std::sync::{Arc, OnceLock};
+use datafusion_macros::user_doc;
+use std::sync::Arc;
 
 make_udf_expr_and_func!(
     ArrayDims,
@@ -43,6 +43,23 @@ make_udf_expr_and_func!(
     array_dims_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns an array of the array's dimensions.",
+    syntax_example = "array_dims(array)",
+    sql_example = r#"```sql
+> select array_dims([[1, 2, 3], [4, 5, 6]]);
++---------------------------------+
+| array_dims(List([1,2,3,4,5,6])) |
++---------------------------------+
+| [2, 3]                          |
++---------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayDims {
     signature: Signature,
@@ -94,37 +111,10 @@ impl ScalarUDFImpl for ArrayDims {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_dims_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_dims_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns an array of the array's dimensions.",
-
-            "array_dims(array)")
-            .with_sql_example(
-                r#"```sql
-> select array_dims([[1, 2, 3], [4, 5, 6]]);
-+---------------------------------+
-| array_dims(List([1,2,3,4,5,6])) |
-+---------------------------------+
-| [2, 3]                          |
-+---------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 make_udf_expr_and_func!(
     ArrayNdims,
     array_ndims,
@@ -133,6 +123,24 @@ make_udf_expr_and_func!(
     array_ndims_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the number of dimensions of the array.",
+    syntax_example = "array_ndims(array, element)",
+    sql_example = r#"```sql
+> select array_ndims([[1, 2, 3], [4, 5, 6]]);
++----------------------------------+
+| array_ndims(List([1,2,3,4,5,6])) |
++----------------------------------+
+| 2                                |
++----------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(name = "element", description = "Array element.")
+)]
 #[derive(Debug)]
 pub(super) struct ArrayNdims {
     signature: Signature,
@@ -181,39 +189,10 @@ impl ScalarUDFImpl for ArrayNdims {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_ndims_doc())
+        self.doc()
     }
 }
 
-fn get_array_ndims_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the number of dimensions of the array.",
-
-            "array_ndims(array, element)")
-            .with_sql_example(
-                r#"```sql
-> select array_ndims([[1, 2, 3], [4, 5, 6]]);
-+----------------------------------+
-| array_ndims(List([1,2,3,4,5,6])) |
-+----------------------------------+
-| 2                                |
-+----------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "element",
-                "Array element.",
-            )
-            .build()
-    })
-}
-
 /// Array_dims SQL function
 pub fn array_dims_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 1 {
diff --git a/datafusion/functions-nested/src/distance.rs 
b/datafusion/functions-nested/src/distance.rs
index 704e840da3..1f0d31f2e0 100644
--- a/datafusion/functions-nested/src/distance.rs
+++ b/datafusion/functions-nested/src/distance.rs
@@ -29,13 +29,13 @@ use datafusion_common::cast::{
 };
 use datafusion_common::utils::coerced_fixed_size_list_to_list;
 use datafusion_common::{exec_err, internal_datafusion_err, Result};
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
 use datafusion_functions::{downcast_arg, downcast_named_arg};
+use datafusion_macros::user_doc;
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 make_udf_expr_and_func!(
     ArrayDistance,
@@ -45,6 +45,27 @@ make_udf_expr_and_func!(
     array_distance_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the Euclidean distance between two input arrays of 
equal length.",
+    syntax_example = "array_distance(array1, array2)",
+    sql_example = r#"```sql
+> select array_distance([1, 2], [1, 4]);
++------------------------------------+
+| array_distance(List([1,2], [1,4])) |
++------------------------------------+
+| 2.0                                |
++------------------------------------+
+```"#,
+    argument(
+        name = "array1",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "array2",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayDistance {
     signature: Signature,
@@ -108,41 +129,10 @@ impl ScalarUDFImpl for ArrayDistance {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_distance_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_distance_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the Euclidean distance between two input arrays of 
equal length.",
-
-            "array_distance(array1, array2)")
-            .with_sql_example(
-                r#"```sql
-> select array_distance([1, 2], [1, 4]);
-+------------------------------------+
-| array_distance(List([1,2], [1,4])) |
-+------------------------------------+
-| 2.0                                |
-+------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array1",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "array2",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 pub fn array_distance_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 2 {
         return exec_err!("array_distance expects exactly two arguments");
diff --git a/datafusion/functions-nested/src/empty.rs 
b/datafusion/functions-nested/src/empty.rs
index 5270c84c03..ab205a7cd4 100644
--- a/datafusion/functions-nested/src/empty.rs
+++ b/datafusion/functions-nested/src/empty.rs
@@ -23,12 +23,12 @@ use arrow_schema::DataType;
 use arrow_schema::DataType::{Boolean, FixedSizeList, LargeList, List};
 use datafusion_common::cast::as_generic_list_array;
 use datafusion_common::{exec_err, plan_err, Result};
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
+use datafusion_macros::user_doc;
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 make_udf_expr_and_func!(
     ArrayEmpty,
@@ -38,6 +38,23 @@ make_udf_expr_and_func!(
     array_empty_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns 1 for an empty array or 0 for a non-empty array.",
+    syntax_example = "empty(array)",
+    sql_example = r#"```sql
+> select empty([1]);
++------------------+
+| empty(List([1])) |
++------------------+
+| 0                |
++------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayEmpty {
     signature: Signature,
@@ -86,37 +103,10 @@ impl ScalarUDFImpl for ArrayEmpty {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_empty_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_empty_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns 1 for an empty array or 0 for a non-empty array.",
-
-            "empty(array)")
-            .with_sql_example(
-                r#"```sql
-> select empty([1]);
-+------------------+
-| empty(List([1])) |
-+------------------+
-| 0                |
-+------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// Array_empty SQL function
 pub fn array_empty_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 1 {
diff --git a/datafusion/functions-nested/src/except.rs 
b/datafusion/functions-nested/src/except.rs
index 83c09ad7fd..1bb5ffd5d3 100644
--- a/datafusion/functions-nested/src/except.rs
+++ b/datafusion/functions-nested/src/except.rs
@@ -24,12 +24,12 @@ use arrow_array::{Array, ArrayRef, GenericListArray, 
OffsetSizeTrait};
 use arrow_buffer::OffsetBuffer;
 use arrow_schema::{DataType, FieldRef};
 use datafusion_common::{exec_err, internal_err, HashSet, Result};
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
+use datafusion_macros::user_doc;
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 make_udf_expr_and_func!(
     ArrayExcept,
@@ -39,6 +39,33 @@ make_udf_expr_and_func!(
     array_except_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns an array of the elements that appear in the first 
array but not in the second.",
+    syntax_example = "array_except(array1, array2)",
+    sql_example = r#"```sql
+> select array_except([1, 2, 3, 4], [5, 6, 3, 4]);
++----------------------------------------------------+
+| array_except([1, 2, 3, 4], [5, 6, 3, 4]);           |
++----------------------------------------------------+
+| [1, 2]                                              |
++----------------------------------------------------+
+> select array_except([1, 2, 3, 4], [3, 4, 5, 6]);
++----------------------------------------------------+
+| array_except([1, 2, 3, 4], [3, 4, 5, 6]);           |
++----------------------------------------------------+
+| [1, 2]                                              |
++----------------------------------------------------+
+```"#,
+    argument(
+        name = "array1",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "array2",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayExcept {
     signature: Signature,
@@ -86,47 +113,10 @@ impl ScalarUDFImpl for ArrayExcept {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_except_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_except_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns an array of the elements that appear in the first 
array but not in the second.",
-
-            "array_except(array1, array2)")
-            .with_sql_example(
-                r#"```sql
-> select array_except([1, 2, 3, 4], [5, 6, 3, 4]);
-+----------------------------------------------------+
-| array_except([1, 2, 3, 4], [5, 6, 3, 4]);           |
-+----------------------------------------------------+
-| [1, 2]                                              |
-+----------------------------------------------------+
-> select array_except([1, 2, 3, 4], [3, 4, 5, 6]);
-+----------------------------------------------------+
-| array_except([1, 2, 3, 4], [3, 4, 5, 6]);           |
-+----------------------------------------------------+
-| [1, 2]                                              |
-+----------------------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array1",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "array2",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// Array_except SQL function
 pub fn array_except_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 2 {
diff --git a/datafusion/functions-nested/src/extract.rs 
b/datafusion/functions-nested/src/extract.rs
index f972597bbf..d5b8b5d619 100644
--- a/datafusion/functions-nested/src/extract.rs
+++ b/datafusion/functions-nested/src/extract.rs
@@ -35,13 +35,13 @@ use datafusion_common::cast::as_list_array;
 use datafusion_common::{
     exec_err, internal_datafusion_err, plan_err, DataFusionError, Result,
 };
-use datafusion_expr::scalar_doc_sections::DOC_SECTION_ARRAY;
 use datafusion_expr::Expr;
 use datafusion_expr::{
     ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
 };
+use datafusion_macros::user_doc;
 use std::any::Any;
-use std::sync::{Arc, OnceLock};
+use std::sync::Arc;
 
 use crate::utils::make_scalar_function;
 
@@ -80,6 +80,27 @@ make_udf_expr_and_func!(
     array_any_value_udf
 );
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Extracts the element with the index n from the array.",
+    syntax_example = "array_element(array, index)",
+    sql_example = r#"```sql
+> select array_element([1, 2, 3, 4], 3);
++-----------------------------------------+
+| array_element(List([1,2,3,4]),Int64(3)) |
++-----------------------------------------+
+| 3                                       |
++-----------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "index",
+        description = "Index to extract the element from the array."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayElement {
     signature: Signature,
@@ -156,41 +177,10 @@ impl ScalarUDFImpl for ArrayElement {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_element_doc())
+        self.doc()
     }
 }
 
-static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-
-fn get_array_element_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Extracts the element with the index n from the array.",
-
-            "array_element(array, index)")
-            .with_sql_example(
-                r#"```sql
-> select array_element([1, 2, 3, 4], 3);
-+-----------------------------------------+
-| array_element(List([1,2,3,4]),Int64(3)) |
-+-----------------------------------------+
-| 3                                       |
-+-----------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "index",
-                "Index to extract the element from the array.",
-            )
-            .build()
-    })
-}
-
 /// array_element SQL function
 ///
 /// There are two arguments for array_element, the first one is the array, the 
second one is the 1-indexed index.
@@ -296,6 +286,35 @@ pub fn array_slice(array: Expr, begin: Expr, end: Expr, 
stride: Option<Expr>) ->
     array_slice_udf().call(args)
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns a slice of the array based on 1-indexed start and 
end positions.",
+    syntax_example = "array_slice(array, begin, end)",
+    sql_example = r#"```sql
+> select array_slice([1, 2, 3, 4, 5, 6, 7, 8], 3, 6);
++--------------------------------------------------------+
+| array_slice(List([1,2,3,4,5,6,7,8]),Int64(3),Int64(6)) |
++--------------------------------------------------------+
+| [3, 4, 5, 6]                                           |
++--------------------------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    ),
+    argument(
+        name = "begin",
+        description = "Index of the first element. If negative, it counts 
backward from the end of the array."
+    ),
+    argument(
+        name = "end",
+        description = "Index of the last element. If negative, it counts 
backward from the end of the array."
+    ),
+    argument(
+        name = "stride",
+        description = "Stride of the array slice. The default is 1."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArraySlice {
     signature: Signature,
@@ -362,47 +381,10 @@ impl ScalarUDFImpl for ArraySlice {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_slice_doc())
+        self.doc()
     }
 }
 
-fn get_array_slice_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns a slice of the array based on 1-indexed start and end 
positions.",
-
-            "array_slice(array, begin, end)")
-            .with_sql_example(
-                r#"```sql
-> select array_slice([1, 2, 3, 4, 5, 6, 7, 8], 3, 6);
-+--------------------------------------------------------+
-| array_slice(List([1,2,3,4,5,6,7,8]),Int64(3),Int64(6)) |
-+--------------------------------------------------------+
-| [3, 4, 5, 6]                                           |
-+--------------------------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .with_argument(
-                "begin",
-                "Index of the first element. If negative, it counts backward 
from the end of the array.",
-            )
-            .with_argument(
-                "end",
-                "Index of the last element. If negative, it counts backward 
from the end of the array.",
-            )
-            .with_argument(
-                "stride",
-                "Stride of the array slice. The default is 1.",
-            )
-            .build()
-    })
-}
-
 /// array_slice SQL function
 ///
 /// We follow the behavior of array_slice in DuckDB
@@ -629,6 +611,23 @@ where
     )?))
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the array without the first element.",
+    syntax_example = "array_pop_front(array)",
+    sql_example = r#"```sql
+> select array_pop_front([1, 2, 3]);
++-------------------------------+
+| array_pop_front(List([1,2,3])) |
++-------------------------------+
+| [2, 3]                        |
++-------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayPopFront {
     signature: Signature,
@@ -673,35 +672,10 @@ impl ScalarUDFImpl for ArrayPopFront {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_pop_front_doc())
+        self.doc()
     }
 }
 
-fn get_array_pop_front_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the array without the first element.",
-
-            "array_pop_front(array)")
-            .with_sql_example(
-                r#"```sql
-> select array_pop_front([1, 2, 3]);
-+-------------------------------+
-| array_pop_front(List([1,2,3])) |
-+-------------------------------+
-| [2, 3]                        |
-+-------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// array_pop_front SQL function
 fn array_pop_front_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     let array_data_type = args[0].data_type();
@@ -737,6 +711,23 @@ where
     general_array_slice::<O>(array, &from_array, &to_array, None)
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the array without the last element.",
+    syntax_example = "array_pop_back(array)",
+    sql_example = r#"```sql
+> select array_pop_back([1, 2, 3]);
++-------------------------------+
+| array_pop_back(List([1,2,3])) |
++-------------------------------+
+| [1, 2]                        |
++-------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayPopBack {
     signature: Signature,
@@ -781,35 +772,10 @@ impl ScalarUDFImpl for ArrayPopBack {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_pop_back_doc())
+        self.doc()
     }
 }
 
-fn get_array_pop_back_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the array without the last element.",
-
-            "array_pop_back(array)")
-            .with_sql_example(
-                r#"```sql
-> select array_pop_back([1, 2, 3]);
-+-------------------------------+
-| array_pop_back(List([1,2,3])) |
-+-------------------------------+
-| [1, 2]                        |
-+-------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 /// array_pop_back SQL function
 fn array_pop_back_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 1 {
@@ -849,6 +815,23 @@ where
     general_array_slice::<O>(array, &from_array, &to_array, None)
 }
 
+#[user_doc(
+    doc_section(label = "Array Functions"),
+    description = "Returns the first non-null element in the array.",
+    syntax_example = "array_any_value(array)",
+    sql_example = r#"```sql
+> select array_any_value([NULL, 1, 2, 3]);
++-------------------------------+
+| array_any_value(List([NULL,1,2,3])) |
++-------------------------------------+
+| 1                                   |
++-------------------------------------+
+```"#,
+    argument(
+        name = "array",
+        description = "Array expression. Can be a constant, column, or 
function, and any combination of array operators."
+    )
+)]
 #[derive(Debug)]
 pub(super) struct ArrayAnyValue {
     signature: Signature,
@@ -897,35 +880,10 @@ impl ScalarUDFImpl for ArrayAnyValue {
     }
 
     fn documentation(&self) -> Option<&Documentation> {
-        Some(get_array_any_value_doc())
+        self.doc()
     }
 }
 
-fn get_array_any_value_doc() -> &'static Documentation {
-    DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ARRAY,
-                "Returns the first non-null element in the array.",
-
-            "array_any_value(array)")
-            .with_sql_example(
-                r#"```sql
-> select array_any_value([NULL, 1, 2, 3]);
-+-------------------------------+
-| array_any_value(List([NULL,1,2,3])) |
-+-------------------------------------+
-| 1                                   |
-+-------------------------------------+
-```"#,
-            )
-            .with_argument(
-                "array",
-                "Array expression. Can be a constant, column, or function, and 
any combination of array operators.",
-            )
-            .build()
-    })
-}
-
 fn array_any_value_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
     if args.len() != 1 {
         return exec_err!("array_any_value expects one argument");
diff --git a/docs/source/user-guide/sql/scalar_functions.md 
b/docs/source/user-guide/sql/scalar_functions.md
index 56cc8e10fb..79fe440f37 100644
--- a/docs/source/user-guide/sql/scalar_functions.md
+++ b/docs/source/user-guide/sql/scalar_functions.md
@@ -2597,26 +2597,25 @@ _Alias of [current_date](#current_date)._
 
 ### `array_any_value`
 
-Extracts the element with the index n from the array.
+Returns the first non-null element in the array.
 
 ```
-array_element(array, index)
+array_any_value(array)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **index**: Index to extract the element from the array.
 
 #### Example
 
 ```sql
-> select array_element([1, 2, 3, 4], 3);
-+-----------------------------------------+
-| array_element(List([1,2,3,4]),Int64(3)) |
-+-----------------------------------------+
-| 3                                       |
-+-----------------------------------------+
+> select array_any_value([NULL, 1, 2, 3]);
++-------------------------------+
+| array_any_value(List([NULL,1,2,3])) |
++-------------------------------------+
+| 1                                   |
++-------------------------------------+
 ```
 
 #### Aliases
@@ -2659,26 +2658,26 @@ _Alias of [array_concat](#array_concat)._
 
 ### `array_concat`
 
-Appends an element to the end of an array.
+Concatenates arrays.
 
 ```
-array_append(array, element)
+array_concat(array[, ..., array_n])
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **element**: Element to append to the array.
+- **array_n**: Subsequent array column or literal array to concatenate.
 
 #### Example
 
 ```sql
-> select array_append([1, 2, 3], 4);
-+--------------------------------------+
-| array_append(List([1,2,3]),Int64(4)) |
-+--------------------------------------+
-| [1, 2, 3, 4]                         |
-+--------------------------------------+
+> select array_concat([1, 2], [3, 4], [5, 6]);
++---------------------------------------------------+
+| array_concat(List([1,2]),List([3,4]),List([5,6])) |
++---------------------------------------------------+
+| [1, 2, 3, 4, 5, 6]                                |
++---------------------------------------------------+
 ```
 
 #### Aliases
@@ -2877,26 +2876,26 @@ array_has(array, element)
 
 ### `array_has_all`
 
-Returns true if the array contains the element.
+Returns true if all elements of sub-array exist in array.
 
 ```
-array_has(array, element)
+array_has_all(array, sub-array)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **element**: Scalar or Array expression. Can be a constant, column, or 
function, and any combination of array operators.
+- **sub-array**: Array expression. Can be a constant, column, or function, and 
any combination of array operators.
 
 #### Example
 
 ```sql
-> select array_has([1, 2, 3], 2);
-+-----------------------------+
-| array_has(List([1,2,3]), 2) |
-+-----------------------------+
-| true                        |
-+-----------------------------+
+> select array_has_all([1, 2, 3, 4], [2, 3]);
++--------------------------------------------+
+| array_has_all(List([1,2,3,4]), List([2,3])) |
++--------------------------------------------+
+| true                                       |
++--------------------------------------------+
 ```
 
 #### Aliases
@@ -2905,26 +2904,26 @@ array_has(array, element)
 
 ### `array_has_any`
 
-Returns true if the array contains the element.
+Returns true if any elements exist in both arrays.
 
 ```
-array_has(array, element)
+array_has_any(array, sub-array)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **element**: Scalar or Array expression. Can be a constant, column, or 
function, and any combination of array operators.
+- **sub-array**: Array expression. Can be a constant, column, or function, and 
any combination of array operators.
 
 #### Example
 
 ```sql
-> select array_has([1, 2, 3], 2);
-+-----------------------------+
-| array_has(List([1,2,3]), 2) |
-+-----------------------------+
-| true                        |
-+-----------------------------+
+> select array_has_any([1, 2, 3], [3, 4]);
++------------------------------------------+
+| array_has_any(List([1,2,3]), List([3,4])) |
++------------------------------------------+
+| true                                     |
++------------------------------------------+
 ```
 
 #### Aliases
@@ -2996,25 +2995,26 @@ array_length(array, dimension)
 
 ### `array_ndims`
 
-Returns an array of the array's dimensions.
+Returns the number of dimensions of the array.
 
 ```
-array_dims(array)
+array_ndims(array, element)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
+- **element**: Array element.
 
 #### Example
 
 ```sql
-> select array_dims([[1, 2, 3], [4, 5, 6]]);
-+---------------------------------+
-| array_dims(List([1,2,3,4,5,6])) |
-+---------------------------------+
-| [2, 3]                          |
-+---------------------------------+
+> select array_ndims([[1, 2, 3], [4, 5, 6]]);
++----------------------------------+
+| array_ndims(List([1,2,3,4,5,6])) |
++----------------------------------+
+| 2                                |
++----------------------------------+
 ```
 
 #### Aliases
@@ -3023,26 +3023,25 @@ array_dims(array)
 
 ### `array_pop_back`
 
-Extracts the element with the index n from the array.
+Returns the array without the last element.
 
 ```
-array_element(array, index)
+array_pop_back(array)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **index**: Index to extract the element from the array.
 
 #### Example
 
 ```sql
-> select array_element([1, 2, 3, 4], 3);
-+-----------------------------------------+
-| array_element(List([1,2,3,4]),Int64(3)) |
-+-----------------------------------------+
-| 3                                       |
-+-----------------------------------------+
+> select array_pop_back([1, 2, 3]);
++-------------------------------+
+| array_pop_back(List([1,2,3])) |
++-------------------------------+
+| [1, 2]                        |
++-------------------------------+
 ```
 
 #### Aliases
@@ -3051,26 +3050,25 @@ array_element(array, index)
 
 ### `array_pop_front`
 
-Extracts the element with the index n from the array.
+Returns the array without the first element.
 
 ```
-array_element(array, index)
+array_pop_front(array)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **index**: Index to extract the element from the array.
 
 #### Example
 
 ```sql
-> select array_element([1, 2, 3, 4], 3);
-+-----------------------------------------+
-| array_element(List([1,2,3,4]),Int64(3)) |
-+-----------------------------------------+
-| 3                                       |
-+-----------------------------------------+
+> select array_pop_front([1, 2, 3]);
++-------------------------------+
+| array_pop_front(List([1,2,3])) |
++-------------------------------+
+| [2, 3]                        |
++-------------------------------+
 ```
 
 #### Aliases
@@ -3161,8 +3159,8 @@ array_prepend(element, array)
 
 #### Arguments
 
-- **element**: Element to prepend to the array.
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
+- **element**: Element to prepend to the array.
 
 #### Example
 
@@ -3455,26 +3453,28 @@ array_reverse(array)
 
 ### `array_slice`
 
-Extracts the element with the index n from the array.
+Returns a slice of the array based on 1-indexed start and end positions.
 
 ```
-array_element(array, index)
+array_slice(array, begin, end)
 ```
 
 #### Arguments
 
 - **array**: Array expression. Can be a constant, column, or function, and any 
combination of array operators.
-- **index**: Index to extract the element from the array.
+- **begin**: Index of the first element. If negative, it counts backward from 
the end of the array.
+- **end**: Index of the last element. If negative, it counts backward from the 
end of the array.
+- **stride**: Stride of the array slice. The default is 1.
 
 #### Example
 
 ```sql
-> select array_element([1, 2, 3, 4], 3);
-+-----------------------------------------+
-| array_element(List([1,2,3,4]),Int64(3)) |
-+-----------------------------------------+
-| 3                                       |
-+-----------------------------------------+
+> select array_slice([1, 2, 3, 4, 5, 6, 7, 8], 3, 6);
++--------------------------------------------------------+
+| array_slice(List([1,2,3,4,5,6,7,8]),Int64(3),Int64(6)) |
++--------------------------------------------------------+
+| [3, 4, 5, 6]                                           |
++--------------------------------------------------------+
 ```
 
 #### Aliases


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to