This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 2281db57b3 Publish built docs triggered by
c48f12d27cc60ae5e9c3d0791d553453f0dd7001
2281db57b3 is described below
commit 2281db57b3d2346fcd4c2956fddaf535fef36201
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Sun Nov 10 09:05:04 2024 +0000
Publish built docs triggered by c48f12d27cc60ae5e9c3d0791d553453f0dd7001
---
.../optimizer_rule.rs | 221 ++++++++++++++++++
_sources/contributor-guide/howtos.md.txt | 3 +-
_sources/library-user-guide/profiling.md.txt | 8 +-
_sources/library-user-guide/query-optimizer.md.txt | 2 +-
_sources/user-guide/sql/scalar_functions.md.txt | 52 ++---
contributor-guide/howtos.html | 2 +-
library-user-guide/profiling.html | 40 ++--
library-user-guide/query-optimizer.html | 2 +-
searchindex.js | 2 +-
user-guide/sql/scalar_functions.html | 257 +++++++++++----------
10 files changed, 417 insertions(+), 172 deletions(-)
diff --git a/_downloads/6b1061daa902cf2423ed86f1373aefed/optimizer_rule.rs
b/_downloads/6b1061daa902cf2423ed86f1373aefed/optimizer_rule.rs
new file mode 100644
index 0000000000..e0b552620a
--- /dev/null
+++ b/_downloads/6b1061daa902cf2423ed86f1373aefed/optimizer_rule.rs
@@ -0,0 +1,221 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use arrow::array::{ArrayRef, Int32Array, RecordBatch, StringArray};
+use arrow_schema::DataType;
+use datafusion::prelude::SessionContext;
+use datafusion_common::tree_node::{Transformed, TreeNode};
+use datafusion_common::{assert_batches_eq, Result, ScalarValue};
+use datafusion_expr::{
+ BinaryExpr, ColumnarValue, Expr, LogicalPlan, Operator, ScalarUDF,
ScalarUDFImpl,
+ Signature, Volatility,
+};
+use datafusion_optimizer::optimizer::ApplyOrder;
+use datafusion_optimizer::{OptimizerConfig, OptimizerRule};
+use std::any::Any;
+use std::sync::Arc;
+
+/// This example demonstrates how to add your own [`OptimizerRule`]
+/// to DataFusion.
+///
+/// [`OptimizerRule`]s transform [`LogicalPlan`]s into an equivalent (but
+/// hopefully faster) form.
+///
+/// See [analyzer_rule.rs] for an example of AnalyzerRules, which are for
+/// changing plan semantics.
+#[tokio::main]
+pub async fn main() -> Result<()> {
+ // DataFusion includes many built in OptimizerRules for tasks such as outer
+ // to inner join conversion and constant folding.
+ //
+ // Note you can change the order of optimizer rules using the lower level
+ // `SessionState` API
+ let ctx = SessionContext::new();
+ ctx.add_optimizer_rule(Arc::new(MyOptimizerRule {}));
+
+ // Now, let's plan and run queries with the new rule
+ ctx.register_batch("person", person_batch())?;
+ let sql = "SELECT * FROM person WHERE age = 22";
+ let plan = ctx.sql(sql).await?.into_optimized_plan()?;
+
+ // We can see the effect of our rewrite on the output plan that the filter
+ // has been rewritten to `my_eq`
+ assert_eq!(
+ plan.display_indent().to_string(),
+ "Filter: my_eq(person.age, Int32(22))\
+ \n TableScan: person projection=[name, age]"
+ );
+
+ // The query below doesn't respect a filter `where age = 22` because
+ // the plan has been rewritten using UDF which returns always true
+ //
+ // And the output verifies the predicates have been changed (as the my_eq
+ // function always returns true)
+ assert_batches_eq!(
+ [
+ "+--------+-----+",
+ "| name | age |",
+ "+--------+-----+",
+ "| Andy | 11 |",
+ "| Andrew | 22 |",
+ "| Oleks | 33 |",
+ "+--------+-----+",
+ ],
+ &ctx.sql(sql).await?.collect().await?
+ );
+
+ // however we can see the rule doesn't trigger for queries with predicates
+ // other than `=`
+ assert_batches_eq!(
+ [
+ "+-------+-----+",
+ "| name | age |",
+ "+-------+-----+",
+ "| Andy | 11 |",
+ "| Oleks | 33 |",
+ "+-------+-----+",
+ ],
+ &ctx.sql("SELECT * FROM person WHERE age <> 22")
+ .await?
+ .collect()
+ .await?
+ );
+
+ Ok(())
+}
+
+/// An example OptimizerRule that replaces all `col = <const>` predicates with
a
+/// user defined function
+#[derive(Default, Debug)]
+struct MyOptimizerRule {}
+
+impl OptimizerRule for MyOptimizerRule {
+ fn name(&self) -> &str {
+ "my_optimizer_rule"
+ }
+
+ // New OptimizerRules should use the "rewrite" api as it is more efficient
+ fn supports_rewrite(&self) -> bool {
+ true
+ }
+
+ /// Ask the optimizer to handle the plan recursion. `rewrite` will be
called
+ /// on each plan node.
+ fn apply_order(&self) -> Option<ApplyOrder> {
+ Some(ApplyOrder::BottomUp)
+ }
+
+ fn rewrite(
+ &self,
+ plan: LogicalPlan,
+ _config: &dyn OptimizerConfig,
+ ) -> Result<Transformed<LogicalPlan>> {
+ plan.map_expressions(|expr| {
+ // This closure is called for all expressions in the current plan
+ //
+ // For example, given a plan like `SELECT a + b, 5 + 10`
+ //
+ // The closure would be called twice:
+ // 1. once for `a + b`
+ // 2. once for `5 + 10`
+ self.rewrite_expr(expr)
+ })
+ }
+}
+
+impl MyOptimizerRule {
+ /// Rewrites an Expr replacing all `<col> = <const>` expressions with
+ /// a call to my_eq udf
+ fn rewrite_expr(&self, expr: Expr) -> Result<Transformed<Expr>> {
+ // do a bottom up rewrite of the expression tree
+ expr.transform_up(|expr| {
+ // Closure called for each sub tree
+ match expr {
+ Expr::BinaryExpr(binary_expr) if is_binary_eq(&binary_expr) =>
{
+ // destruture the expression
+ let BinaryExpr { left, op: _, right } = binary_expr;
+ // rewrite to `my_eq(left, right)`
+ let udf = ScalarUDF::new_from_impl(MyEq::new());
+ let call = udf.call(vec![*left, *right]);
+ Ok(Transformed::yes(call))
+ }
+ _ => Ok(Transformed::no(expr)),
+ }
+ })
+ // Note that the TreeNode API handles propagating the transformed flag
+ // and errors up the call chain
+ }
+}
+
+/// return true of the expression is an equality expression for a literal or
+/// column reference
+fn is_binary_eq(binary_expr: &BinaryExpr) -> bool {
+ binary_expr.op == Operator::Eq
+ && is_lit_or_col(binary_expr.left.as_ref())
+ && is_lit_or_col(binary_expr.right.as_ref())
+}
+
+/// Return true if the expression is a literal or column reference
+fn is_lit_or_col(expr: &Expr) -> bool {
+ matches!(expr, Expr::Column(_) | Expr::Literal(_))
+}
+
+/// A simple user defined filter function
+#[derive(Debug, Clone)]
+struct MyEq {
+ signature: Signature,
+}
+
+impl MyEq {
+ fn new() -> Self {
+ Self {
+ signature: Signature::any(2, Volatility::Stable),
+ }
+ }
+}
+
+impl ScalarUDFImpl for MyEq {
+ fn as_any(&self) -> &dyn Any {
+ self
+ }
+
+ fn name(&self) -> &str {
+ "my_eq"
+ }
+
+ fn signature(&self) -> &Signature {
+ &self.signature
+ }
+
+ fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Boolean)
+ }
+
+ fn invoke(&self, _args: &[ColumnarValue]) -> Result<ColumnarValue> {
+ // this example simply returns "true" which is not what a real
+ // implementation would do.
+ Ok(ColumnarValue::Scalar(ScalarValue::from(true)))
+ }
+}
+
+/// Return a RecordBatch with made up data
+fn person_batch() -> RecordBatch {
+ let name: ArrayRef =
+ Arc::new(StringArray::from_iter_values(["Andy", "Andrew", "Oleks"]));
+ let age: ArrayRef = Arc::new(Int32Array::from(vec![11, 22, 33]));
+ RecordBatch::try_from_iter(vec![("name", name), ("age", age)]).unwrap()
+}
diff --git a/_sources/contributor-guide/howtos.md.txt
b/_sources/contributor-guide/howtos.md.txt
index f105ab2c42..e4515cee42 100644
--- a/_sources/contributor-guide/howtos.md.txt
+++ b/_sources/contributor-guide/howtos.md.txt
@@ -49,6 +49,7 @@ Below is a checklist of what you need to do to add a new
scalar function to Data
- Run `./dev/update_function_docs.sh` to update docs
[advanced_udf.rs]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udaf.rs
+[datafusion/expr/src]:
https://github.com/apache/datafusion/tree/main/datafusion/expr/src
[sqllogictest/test_files]:
https://github.com/apache/datafusion/tree/main/datafusion/sqllogictest/test_files
## How to add a new aggregate function
@@ -56,7 +57,7 @@ Below is a checklist of what you need to do to add a new
scalar function to Data
Below is a checklist of what you need to do to add a new aggregate function to
DataFusion:
- Add the actual implementation of an `Accumulator` and `AggregateExpr`:
-- In
[datafusion/expr/src](../../../datafusion/expr/src/aggregate_function.rs), add:
+- In [datafusion/expr/src], add:
- a new variant to `AggregateFunction`
- a new entry to `FromStr` with the name of the function as called by SQL
- a new line in `return_type` with the expected return type of the function,
given an incoming type
diff --git a/_sources/library-user-guide/profiling.md.txt
b/_sources/library-user-guide/profiling.md.txt
index 02f6958d17..40fae6f447 100644
--- a/_sources/library-user-guide/profiling.md.txt
+++ b/_sources/library-user-guide/profiling.md.txt
@@ -21,7 +21,7 @@
The section contains examples how to perform CPU profiling for Apache
DataFusion on different operating systems.
-### Building a flamegraph
+## Building a flamegraph
[Video: how to CPU profile DataFusion with a
Flamegraph](https://youtu.be/2z11xtYw_xs)
@@ -34,7 +34,7 @@ in images such as this:
## MacOS
-#### Step 1: Install the flamegraph Tool
+### Step 1: Install the flamegraph Tool
To install flamegraph, run:
@@ -42,11 +42,11 @@ To install flamegraph, run:
cargo install flamegraph
```
-#### Step 2: Prepare Your Environment
+### Step 2: Prepare Your Environment
Ensure that you're in the directory containing the necessary data files for
your DataFusion query. The flamegraph tool will profile the execution of your
query against this data.
-#### Step 3: Running the Flamegraph Tool
+### Step 3: Running the Flamegraph Tool
To generate a flamegraph, you'll need to use the -- separator to pass
arguments to the binary you're profiling. For datafusion-cli, you need to make
sure to run the command with sudo permissions (especially on macOS, where
DTrace requires elevated privileges).
diff --git a/_sources/library-user-guide/query-optimizer.md.txt
b/_sources/library-user-guide/query-optimizer.md.txt
index 5aacfaf59c..c2c60af85f 100644
--- a/_sources/library-user-guide/query-optimizer.md.txt
+++ b/_sources/library-user-guide/query-optimizer.md.txt
@@ -68,7 +68,7 @@ let optimizer = Optimizer::with_rules(vec
+[optimizer_rule.rs](../../../datafusion-examples/examples/optimizer_rule.rs)
example to learn more about the general approach to writing optimizer rules and
then move onto studying the existing rules.
diff --git a/_sources/user-guide/sql/scalar_functions.md.txt
b/_sources/user-guide/sql/scalar_functions.md.txt
index b92b815d7c..232efb02d4 100644
--- a/_sources/user-guide/sql/scalar_functions.md.txt
+++ b/_sources/user-guide/sql/scalar_functions.md.txt
@@ -3983,44 +3983,42 @@ make_map(['key1', 'key2'], ['value1', 'value2'])
#### Example
-````sql
- -- Using map function
- SELECT MAP('type', 'test');
- ----
- {type: test}
-
- SELECT MAP(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
- ----
- {POST: 41, HEAD: 33, PATCH: }
+```sql
+-- Using map function
+SELECT MAP('type', 'test');
+----
+{type: test}
- SELECT MAP([[1,2], [3,4]], ['a', 'b']);
- ----
- {[1, 2]: a, [3, 4]: b}
+SELECT MAP(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
+----
+{POST: 41, HEAD: 33, PATCH: }
- SELECT MAP { 'a': 1, 'b': 2 };
- ----
- {a: 1, b: 2}
+SELECT MAP([[1,2], [3,4]], ['a', 'b']);
+----
+{[1, 2]: a, [3, 4]: b}
- -- Using make_map function
- SELECT MAKE_MAP(['POST', 'HEAD'], [41, 33]);
- ----
- {POST: 41, HEAD: 33}
+SELECT MAP { 'a': 1, 'b': 2 };
+----
+{a: 1, b: 2}
- SELECT MAKE_MAP(['key1', 'key2'], ['value1', null]);
- ----
- {key1: value1, key2: }
- ```
+-- Using make_map function
+SELECT MAKE_MAP(['POST', 'HEAD'], [41, 33]);
+----
+{POST: 41, HEAD: 33}
+SELECT MAKE_MAP(['key1', 'key2'], ['value1', null]);
+----
+{key1: value1, key2: }
+```
### `map_extract`
Returns a list containing the value for the given key or an empty list if the
key is not present in the map.
-````
-
+```
map_extract(map, key)
+```
-````
#### Arguments
- **map**: Map expression. Can be a constant, column, or function, and any
combination of map operators.
@@ -4040,7 +4038,7 @@ SELECT map_extract(MAP {1: 'one', 2: 'two'}, 2);
SELECT map_extract(MAP {'x': 10, 'y': NULL, 'z': 30}, 'y');
----
[]
-````
+```
#### Aliases
diff --git a/contributor-guide/howtos.html b/contributor-guide/howtos.html
index e7d32c432e..54784be30c 100644
--- a/contributor-guide/howtos.html
+++ b/contributor-guide/howtos.html
@@ -638,7 +638,7 @@ users to enable or disable the new module as
desired.</p></li>
<p>Below is a checklist of what you need to do to add a new aggregate function
to DataFusion:</p>
<ul class="simple">
<li><p>Add the actual implementation of an <code class="docutils literal
notranslate"><span class="pre">Accumulator</span></code> and <code
class="docutils literal notranslate"><span
class="pre">AggregateExpr</span></code>:</p></li>
-<li><p>In <a class="reference internal"
href="#../../../datafusion/expr/src/aggregate_function.rs"><span class="xref
myst">datafusion/expr/src</span></a>, add:</p>
+<li><p>In <a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/expr/src">datafusion/expr/src</a>,
add:</p>
<ul>
<li><p>a new variant to <code class="docutils literal notranslate"><span
class="pre">AggregateFunction</span></code></p></li>
<li><p>a new entry to <code class="docutils literal notranslate"><span
class="pre">FromStr</span></code> with the name of the function as called by
SQL</p></li>
diff --git a/library-user-guide/profiling.html
b/library-user-guide/profiling.html
index a2930fa552..c8f49f2f1b 100644
--- a/library-user-guide/profiling.html
+++ b/library-user-guide/profiling.html
@@ -527,21 +527,23 @@
<a class="reference internal nav-link"
href="#step-3-running-the-flamegraph-tool">
Step 3: Running the Flamegraph Tool
</a>
- </li>
- <li class="toc-h3 nav-item toc-entry">
- <a class="reference internal nav-link"
href="#example-generating-a-flamegraph-for-a-specific-query">
- Example: Generating a Flamegraph for a Specific Query
- </a>
- </li>
- <li class="toc-h3 nav-item toc-entry">
- <a class="reference internal nav-link"
href="#example-flamegraph-for-a-specific-test">
- Example: Flamegraph for a specific test:
- </a>
- </li>
- <li class="toc-h3 nav-item toc-entry">
- <a class="reference internal nav-link"
href="#example-flamegraph-for-a-benchmark">
- Example: Flamegraph for a benchmark
- </a>
+ <ul class="nav section-nav flex-column">
+ <li class="toc-h4 nav-item toc-entry">
+ <a class="reference internal nav-link"
href="#example-generating-a-flamegraph-for-a-specific-query">
+ Example: Generating a Flamegraph for a Specific Query
+ </a>
+ </li>
+ <li class="toc-h4 nav-item toc-entry">
+ <a class="reference internal nav-link"
href="#example-flamegraph-for-a-specific-test">
+ Example: Flamegraph for a specific test:
+ </a>
+ </li>
+ <li class="toc-h4 nav-item toc-entry">
+ <a class="reference internal nav-link"
href="#example-flamegraph-for-a-benchmark">
+ Example: Flamegraph for a benchmark
+ </a>
+ </li>
+ </ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link"
href="#cpu-profiling-with-xcode-instruments">
@@ -638,9 +640,8 @@ in images such as this:</p>
<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>sudo<span class="w"> </span>flamegraph<span
class="w"> </span>--<span class="w"> </span>datafusion-cli<span class="w">
</span>-f<span class="w"> </span><path_to_sql_file/sql_file.sql>
</pre></div>
</div>
-</section>
<section id="example-generating-a-flamegraph-for-a-specific-query">
-<h3>Example: Generating a Flamegraph for a Specific Query<a class="headerlink"
href="#example-generating-a-flamegraph-for-a-specific-query" title="Link to
this heading">¶</a></h3>
+<h4>Example: Generating a Flamegraph for a Specific Query<a class="headerlink"
href="#example-generating-a-flamegraph-for-a-specific-query" title="Link to
this heading">¶</a></h4>
<p>Here is an example using <code class="docutils literal notranslate"><span
class="pre">28.sql</span></code>:</p>
<div class="highlight-shell notranslate"><div
class="highlight"><pre><span></span>sudo<span class="w"> </span>flamegraph<span
class="w"> </span>--<span class="w"> </span>datafusion-cli<span class="w">
</span>-f<span class="w"> </span><span class="m">28</span>.sql
</pre></div>
@@ -648,17 +649,18 @@ in images such as this:</p>
<p>You can also invoke the flamegraph tool with <code class="docutils literal
notranslate"><span class="pre">cargo</span></code> to profile a specific test
or benchmark.</p>
</section>
<section id="example-flamegraph-for-a-specific-test">
-<h3>Example: Flamegraph for a specific test:<a class="headerlink"
href="#example-flamegraph-for-a-specific-test" title="Link to this
heading">¶</a></h3>
+<h4>Example: Flamegraph for a specific test:<a class="headerlink"
href="#example-flamegraph-for-a-specific-test" title="Link to this
heading">¶</a></h4>
<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span><span
class="nv">CARGO_PROFILE_RELEASE_DEBUG</span><span class="o">=</span><span
class="nb">true</span><span class="w"> </span>cargo<span class="w">
</span>flamegraph<span class="w"> </span>--root<span class="w">
</span>--unit-test<span class="w"> </span>datafusion<span class="w">
</span>--<span class="w"> </span>dataframe::tests::test_array_agg
</pre></div>
</div>
</section>
<section id="example-flamegraph-for-a-benchmark">
-<h3>Example: Flamegraph for a benchmark<a class="headerlink"
href="#example-flamegraph-for-a-benchmark" title="Link to this
heading">¶</a></h3>
+<h4>Example: Flamegraph for a benchmark<a class="headerlink"
href="#example-flamegraph-for-a-benchmark" title="Link to this
heading">¶</a></h4>
<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span><span
class="nv">CARGO_PROFILE_RELEASE_DEBUG</span><span class="o">=</span><span
class="nb">true</span><span class="w"> </span>cargo<span class="w">
</span>flamegraph<span class="w"> </span>--root<span class="w">
</span>--bench<span class="w"> </span>sql_planner<span class="w">
</span>--<span class="w"> </span>--bench
</pre></div>
</div>
</section>
+</section>
<section id="cpu-profiling-with-xcode-instruments">
<h3>CPU profiling with XCode Instruments<a class="headerlink"
href="#cpu-profiling-with-xcode-instruments" title="Link to this
heading">¶</a></h3>
<p><a class="reference external" href="https://youtu.be/P3dXH61Kr5U">Video:
how to CPU profile DataFusion with XCode Instruments</a></p>
diff --git a/library-user-guide/query-optimizer.html
b/library-user-guide/query-optimizer.html
index 8884ea6567..ca34e28887 100644
--- a/library-user-guide/query-optimizer.html
+++ b/library-user-guide/query-optimizer.html
@@ -661,7 +661,7 @@ and applying it to a logical plan to produce an optimized
logical plan.</p>
<section id="writing-optimization-rules">
<h2>Writing Optimization Rules<a class="headerlink"
href="#writing-optimization-rules" title="Link to this heading">¶</a></h2>
<p>Please refer to the
-<a class="reference internal"
href="#../../datafusion-examples/examples/optimizer_rule.rs"><span class="xref
myst">optimizer_rule.rs</span></a>
+<a class="reference download internal" download=""
href="../_downloads/6b1061daa902cf2423ed86f1373aefed/optimizer_rule.rs"><span
class="xref download myst">optimizer_rule.rs</span></a>
example to learn more about the general approach to writing optimizer rules and
then move onto studying the existing rules.</p>
<p>All rules must implement the <code class="docutils literal
notranslate"><span class="pre">OptimizerRule</span></code> trait.</p>
diff --git a/searchindex.js b/searchindex.js
index 5641147e03..f1ad6f4a53 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"!=": [[47, "op-neq"]], "!~": [[47,
"op-re-not-match"]], "!~*": [[47, "op-re-not-match-i"]], "!~~": [[47, "id18"]],
"!~~*": [[47, "id19"]], "#": [[47, "op-bit-xor"]], "%": [[47, "op-modulo"]],
"&": [[47, "op-bit-and"]], "(relation, name) tuples in logical fields and
logical columns are unique": [[9,
"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]], "*":
[[47, "op-multiply"]], "+": [[47, "op-plus"]], "-": [[47, "op-minus"]], "/":
[[4 [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"!=": [[47, "op-neq"]], "!~": [[47,
"op-re-not-match"]], "!~*": [[47, "op-re-not-match-i"]], "!~~": [[47, "id18"]],
"!~~*": [[47, "id19"]], "#": [[47, "op-bit-xor"]], "%": [[47, "op-modulo"]],
"&": [[47, "op-bit-and"]], "(relation, name) tuples in logical fields and
logical columns are unique": [[9,
"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]], "*":
[[47, "op-multiply"]], "+": [[47, "op-plus"]], "-": [[47, "op-minus"]], "/":
[[4 [...]
\ No newline at end of file
diff --git a/user-guide/sql/scalar_functions.html
b/user-guide/sql/scalar_functions.html
index 7db3d6e371..813ea6fb82 100644
--- a/user-guide/sql/scalar_functions.html
+++ b/user-guide/sql/scalar_functions.html
@@ -4079,8 +4079,29 @@
Example
</a>
</li>
+ </ul>
+ </li>
+ <li class="toc-h3 nav-item toc-entry">
+ <a class="reference internal nav-link" href="#map-extract">
+ <code class="docutils literal notranslate">
+ <span class="pre">
+ map_extract
+ </span>
+ </code>
+ </a>
+ <ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#id277">
+ Arguments
+ </a>
+ </li>
+ <li class="toc-h4 nav-item toc-entry">
+ <a class="reference internal nav-link" href="#id278">
+ Example
+ </a>
+ </li>
+ <li class="toc-h4 nav-item toc-entry">
+ <a class="reference internal nav-link" href="#id279">
Aliases
</a>
</li>
@@ -4096,12 +4117,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id278">
+ <a class="reference internal nav-link" href="#id280">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id279">
+ <a class="reference internal nav-link" href="#id281">
Example
</a>
</li>
@@ -4117,12 +4138,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id280">
+ <a class="reference internal nav-link" href="#id282">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id281">
+ <a class="reference internal nav-link" href="#id283">
Example
</a>
</li>
@@ -4145,12 +4166,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id282">
+ <a class="reference internal nav-link" href="#id284">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id283">
+ <a class="reference internal nav-link" href="#id285">
Example
</a>
</li>
@@ -4166,12 +4187,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id284">
+ <a class="reference internal nav-link" href="#id286">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id285">
+ <a class="reference internal nav-link" href="#id287">
Example
</a>
</li>
@@ -4187,12 +4208,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id286">
+ <a class="reference internal nav-link" href="#id288">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id287">
+ <a class="reference internal nav-link" href="#id289">
Example
</a>
</li>
@@ -4208,12 +4229,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id288">
+ <a class="reference internal nav-link" href="#id290">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id289">
+ <a class="reference internal nav-link" href="#id291">
Example
</a>
</li>
@@ -4229,12 +4250,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id290">
+ <a class="reference internal nav-link" href="#id292">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id291">
+ <a class="reference internal nav-link" href="#id293">
Example
</a>
</li>
@@ -4250,12 +4271,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id292">
+ <a class="reference internal nav-link" href="#id294">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id293">
+ <a class="reference internal nav-link" href="#id295">
Example
</a>
</li>
@@ -4278,12 +4299,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id294">
+ <a class="reference internal nav-link" href="#id296">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id295">
+ <a class="reference internal nav-link" href="#id297">
Example
</a>
</li>
@@ -4299,12 +4320,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id296">
+ <a class="reference internal nav-link" href="#id298">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id297">
+ <a class="reference internal nav-link" href="#id299">
Example
</a>
</li>
@@ -4320,12 +4341,12 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id298">
+ <a class="reference internal nav-link" href="#id300">
Arguments
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id299">
+ <a class="reference internal nav-link" href="#id301">
Example
</a>
</li>
@@ -4341,7 +4362,7 @@
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
- <a class="reference internal nav-link" href="#id300">
+ <a class="reference internal nav-link" href="#id302">
Example
</a>
</li>
@@ -8560,13 +8581,13 @@ a struct type of fields <code class="docutils literal
notranslate"><span class="
<ul class="simple">
<li><p><a class="reference internal" href="#element-at">element_at</a></p></li>
<li><p><a class="reference internal" href="#map">map</a></p></li>
-<li><p><a class="reference internal" href="#map_extract"><span class="xref
myst">map_extract</span></a></p></li>
+<li><p><a class="reference internal"
href="#map-extract">map_extract</a></p></li>
<li><p><a class="reference internal" href="#map-keys">map_keys</a></p></li>
<li><p><a class="reference internal" href="#map-values">map_values</a></p></li>
</ul>
<section id="element-at">
<h3><code class="docutils literal notranslate"><span
class="pre">element_at</span></code><a class="headerlink" href="#element-at"
title="Link to this heading">¶</a></h3>
-<p><em>Alias of <a class="reference internal" href="#map_extract"><span
class="xref myst">map_extract</span></a>.</em></p>
+<p><em>Alias of <a class="reference internal"
href="#map-extract">map_extract</a>.</em></p>
</section>
<section id="map">
<h3><code class="docutils literal notranslate"><span
class="pre">map</span></code><a class="headerlink" href="#map" title="Link to
this heading">¶</a></h3>
@@ -8588,64 +8609,66 @@ For <code class="docutils literal notranslate"><span
class="pre">make_map</span>
</section>
<section id="id276">
<h4>Example<a class="headerlink" href="#id276" title="Link to this
heading">¶</a></h4>
-<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="w"> </span><span
class="c1">-- Using map function</span>
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="k">MAP</span><span class="p">(</span><span
class="s1">'type'</span><span class="p">,</span><span class="w">
</span><span class="s1">'test'</span><span class="p">);</span>
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="k">type</span><span class="p">:</span><span class="w"> </span><span
class="n">test</span><span class="err">}</span>
-
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="k">MAP</span><span class="p">([</span><span
class="s1">'POST'</span><span class="p">,</span><span class="w">
</span><span class="s1">'HEAD'</span><span class="p">,</span><span
class="w"> </span><span class="s1">'PATCH'</span><span
class="p">],</span><span class="w"> </span><span class="p">[</span><span
class="mi">41</span><span class="p">,</span><span class="w"> </span [...]
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="n">POST</span><span class="p">:</span><span class="w"> </span><span
class="mi">41</span><span class="p">,</span><span class="w"> </span><span
class="n">HEAD</span><span class="p">:</span><span class="w"> </span><span
class="mi">33</span><span class="p">,</span><span class="w"> </span><span
class="n">PATCH</span><span class="p">:</span><span class="w"> </span><span
class="err">}</span>
-
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="k">MAP</span><span class="p">([[</span><span
class="mi">1</span><span class="p">,</span><span class="mi">2</span><span
class="p">],</span><span class="w"> </span><span class="p">[</span><span
class="mi">3</span><span class="p">,</span><span class="mi">4</span><span
class="p">]],</span><span class="w"> </span><span class="p">[</span><span
class="s1">'a'</span><span class="p">,</span><s [...]
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="p">[</span><span class="mi">1</span><span class="p">,</span><span
class="w"> </span><span class="mi">2</span><span class="p">]:</span><span
class="w"> </span><span class="n">a</span><span class="p">,</span><span
class="w"> </span><span class="p">[</span><span class="mi">3</span><span
class="p">,</span><span class="w"> </span><span class="mi">4</span><span
class="p">]:</span><span class="w"> </span><span class="n">b</sp [...]
-
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="k">MAP</span><span class="w"> </span><span
class="err">{</span><span class="w"> </span><span
class="s1">'a'</span><span class="p">:</span><span class="w">
</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span><span class="s1">'b'</span><span class="p">:</span><span
class="w"> </span><span class="mi">2</span><span class="w"> </span><span
class="err">}< [...]
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="n">a</span><span class="p">:</span><span class="w"> </span><span
class="mi">1</span><span class="p">,</span><span class="w"> </span><span
class="n">b</span><span class="p">:</span><span class="w"> </span><span
class="mi">2</span><span class="err">}</span>
+<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="c1">-- Using map
function</span>
+<span class="k">SELECT</span><span class="w"> </span><span
class="k">MAP</span><span class="p">(</span><span
class="s1">'type'</span><span class="p">,</span><span class="w">
</span><span class="s1">'test'</span><span class="p">);</span>
+<span class="c1">----</span>
+<span class="err">{</span><span class="k">type</span><span
class="p">:</span><span class="w"> </span><span class="n">test</span><span
class="err">}</span>
-<span class="w"> </span><span class="c1">-- Using make_map
function</span>
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="n">MAKE_MAP</span><span class="p">([</span><span
class="s1">'POST'</span><span class="p">,</span><span class="w">
</span><span class="s1">'HEAD'</span><span class="p">],</span><span
class="w"> </span><span class="p">[</span><span class="mi">41</span><span
class="p">,</span><span class="w"> </span><span class="mi">33</span><span
class="p">]);</span>
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="n">POST</span><span class="p">:</span><span class="w"> </span><span
class="mi">41</span><span class="p">,</span><span class="w"> </span><span
class="n">HEAD</span><span class="p">:</span><span class="w"> </span><span
class="mi">33</span><span class="err">}</span>
+<span class="k">SELECT</span><span class="w"> </span><span
class="k">MAP</span><span class="p">([</span><span
class="s1">'POST'</span><span class="p">,</span><span class="w">
</span><span class="s1">'HEAD'</span><span class="p">,</span><span
class="w"> </span><span class="s1">'PATCH'</span><span
class="p">],</span><span class="w"> </span><span class="p">[</span><span
class="mi">41</span><span class="p">,</span><span class="w"> </span><span
class="mi">33</span><spa [...]
+<span class="c1">----</span>
+<span class="err">{</span><span class="n">POST</span><span
class="p">:</span><span class="w"> </span><span class="mi">41</span><span
class="p">,</span><span class="w"> </span><span class="n">HEAD</span><span
class="p">:</span><span class="w"> </span><span class="mi">33</span><span
class="p">,</span><span class="w"> </span><span class="n">PATCH</span><span
class="p">:</span><span class="w"> </span><span class="err">}</span>
-<span class="w"> </span><span class="k">SELECT</span><span class="w">
</span><span class="n">MAKE_MAP</span><span class="p">([</span><span
class="s1">'key1'</span><span class="p">,</span><span class="w">
</span><span class="s1">'key2'</span><span class="p">],</span><span
class="w"> </span><span class="p">[</span><span
class="s1">'value1'</span><span class="p">,</span><span class="w">
</span><span class="k">null</span><span class="p">]);</span>
-<span class="w"> </span><span class="c1">----</span>
-<span class="w"> </span><span class="err">{</span><span
class="n">key1</span><span class="p">:</span><span class="w"> </span><span
class="n">value1</span><span class="p">,</span><span class="w"> </span><span
class="n">key2</span><span class="p">:</span><span class="w"> </span><span
class="err">}</span>
-<span class="w"> </span><span class="o">```</span>
+<span class="k">SELECT</span><span class="w"> </span><span
class="k">MAP</span><span class="p">([[</span><span class="mi">1</span><span
class="p">,</span><span class="mi">2</span><span class="p">],</span><span
class="w"> </span><span class="p">[</span><span class="mi">3</span><span
class="p">,</span><span class="mi">4</span><span class="p">]],</span><span
class="w"> </span><span class="p">[</span><span
class="s1">'a'</span><span class="p">,</span><span class="w">
</span><span cla [...]
+<span class="c1">----</span>
+<span class="err">{</span><span class="p">[</span><span
class="mi">1</span><span class="p">,</span><span class="w"> </span><span
class="mi">2</span><span class="p">]:</span><span class="w"> </span><span
class="n">a</span><span class="p">,</span><span class="w"> </span><span
class="p">[</span><span class="mi">3</span><span class="p">,</span><span
class="w"> </span><span class="mi">4</span><span class="p">]:</span><span
class="w"> </span><span class="n">b</span><span class="err">}</span>
+<span class="k">SELECT</span><span class="w"> </span><span
class="k">MAP</span><span class="w"> </span><span class="err">{</span><span
class="w"> </span><span class="s1">'a'</span><span
class="p">:</span><span class="w"> </span><span class="mi">1</span><span
class="p">,</span><span class="w"> </span><span
class="s1">'b'</span><span class="p">:</span><span class="w">
</span><span class="mi">2</span><span class="w"> </span><span
class="err">}</span><span class="p">;</span>
+<span class="c1">----</span>
+<span class="err">{</span><span class="n">a</span><span
class="p">:</span><span class="w"> </span><span class="mi">1</span><span
class="p">,</span><span class="w"> </span><span class="n">b</span><span
class="p">:</span><span class="w"> </span><span class="mi">2</span><span
class="err">}</span>
-<span class="o">###</span><span class="w"> </span><span
class="o">`</span><span class="n">map_extract</span><span class="o">`</span>
+<span class="c1">-- Using make_map function</span>
+<span class="k">SELECT</span><span class="w"> </span><span
class="n">MAKE_MAP</span><span class="p">([</span><span
class="s1">'POST'</span><span class="p">,</span><span class="w">
</span><span class="s1">'HEAD'</span><span class="p">],</span><span
class="w"> </span><span class="p">[</span><span class="mi">41</span><span
class="p">,</span><span class="w"> </span><span class="mi">33</span><span
class="p">]);</span>
+<span class="c1">----</span>
+<span class="err">{</span><span class="n">POST</span><span
class="p">:</span><span class="w"> </span><span class="mi">41</span><span
class="p">,</span><span class="w"> </span><span class="n">HEAD</span><span
class="p">:</span><span class="w"> </span><span class="mi">33</span><span
class="err">}</span>
-<span class="k">Returns</span><span class="w"> </span><span
class="n">a</span><span class="w"> </span><span class="n">list</span><span
class="w"> </span><span class="n">containing</span><span class="w">
</span><span class="n">the</span><span class="w"> </span><span
class="n">value</span><span class="w"> </span><span class="k">for</span><span
class="w"> </span><span class="n">the</span><span class="w"> </span><span
class="n">given</span><span class="w"> </span><span class="k">key</span><s [...]
+<span class="k">SELECT</span><span class="w"> </span><span
class="n">MAKE_MAP</span><span class="p">([</span><span
class="s1">'key1'</span><span class="p">,</span><span class="w">
</span><span class="s1">'key2'</span><span class="p">],</span><span
class="w"> </span><span class="p">[</span><span
class="s1">'value1'</span><span class="p">,</span><span class="w">
</span><span class="k">null</span><span class="p">]);</span>
+<span class="c1">----</span>
+<span class="err">{</span><span class="n">key1</span><span
class="p">:</span><span class="w"> </span><span class="n">value1</span><span
class="p">,</span><span class="w"> </span><span class="n">key2</span><span
class="p">:</span><span class="w"> </span><span class="err">}</span>
</pre></div>
</div>
-<p>map_extract(map, key)</p>
-<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span>#### Arguments
-
-- **map**: Map expression. Can be a constant, column, or function, and any
combination of map operators.
-- **key**: Key to extract from the map. Can be a constant, column, or
function, any combination of arithmetic or string operators, or a named
expression of the previously listed.
-
-#### Example
-
-```sql
-SELECT map_extract(MAP {'a': 1, 'b': NULL, 'c': 3},
'a');
-----
-[1]
+</section>
+</section>
+<section id="map-extract">
+<h3><code class="docutils literal notranslate"><span
class="pre">map_extract</span></code><a class="headerlink" href="#map-extract"
title="Link to this heading">¶</a></h3>
+<p>Returns a list containing the value for the given key or an empty list if
the key is not present in the map.</p>
+<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">map_extract</span><span
class="p">(</span><span class="nb">map</span><span class="p">,</span> <span
class="n">key</span><span class="p">)</span>
+</pre></div>
+</div>
+<section id="id277">
+<h4>Arguments<a class="headerlink" href="#id277" title="Link to this
heading">¶</a></h4>
+<ul class="simple">
+<li><p><strong>map</strong>: Map expression. Can be a constant, column, or
function, and any combination of map operators.</p></li>
+<li><p><strong>key</strong>: Key to extract from the map. Can be a constant,
column, or function, any combination of arithmetic or string operators, or a
named expression of the previously listed.</p></li>
+</ul>
+</section>
+<section id="id278">
+<h4>Example<a class="headerlink" href="#id278" title="Link to this
heading">¶</a></h4>
+<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">map_extract</span><span
class="p">(</span><span class="k">MAP</span><span class="w"> </span><span
class="err">{</span><span class="s1">'a'</span><span
class="p">:</span><span class="w"> </span><span class="mi">1</span><span
class="p">,</span><span class="w"> </span><span
class="s1">'b'</span><span class="p">:</span><span clas [...]
+<span class="c1">----</span>
+<span class="p">[</span><span class="mi">1</span><span class="p">]</span>
-SELECT map_extract(MAP {1: 'one', 2: 'two'}, 2);
-----
-['two']
+<span class="k">SELECT</span><span class="w"> </span><span
class="n">map_extract</span><span class="p">(</span><span
class="k">MAP</span><span class="w"> </span><span class="err">{</span><span
class="mi">1</span><span class="p">:</span><span class="w"> </span><span
class="s1">'one'</span><span class="p">,</span><span class="w">
</span><span class="mi">2</span><span class="p">:</span><span class="w">
</span><span class="s1">'two'</span><span class="err">}</span><span
class [...]
+<span class="c1">----</span>
+<span class="p">[</span><span class="s1">'two'</span><span
class="p">]</span>
-SELECT map_extract(MAP {'x': 10, 'y': NULL, 'z': 30},
'y');
-----
-[]
+<span class="k">SELECT</span><span class="w"> </span><span
class="n">map_extract</span><span class="p">(</span><span
class="k">MAP</span><span class="w"> </span><span class="err">{</span><span
class="s1">'x'</span><span class="p">:</span><span class="w">
</span><span class="mi">10</span><span class="p">,</span><span class="w">
</span><span class="s1">'y'</span><span class="p">:</span><span
class="w"> </span><span class="k">NULL</span><span class="p">,</span><span
class="w [...]
+<span class="c1">----</span>
+<span class="p">[]</span>
</pre></div>
</div>
</section>
-<section id="id277">
-<h4>Aliases<a class="headerlink" href="#id277" title="Link to this
heading">¶</a></h4>
+<section id="id279">
+<h4>Aliases<a class="headerlink" href="#id279" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p>element_at</p></li>
</ul>
@@ -8657,14 +8680,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">map_keys</span><span
class="p">(</span><span class="nb">map</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id278">
-<h4>Arguments<a class="headerlink" href="#id278" title="Link to this
heading">¶</a></h4>
+<section id="id280">
+<h4>Arguments<a class="headerlink" href="#id280" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>map</strong>: Map expression. Can be a constant, column, or
function, and any combination of map operators.</p></li>
</ul>
</section>
-<section id="id279">
-<h4>Example<a class="headerlink" href="#id279" title="Link to this
heading">¶</a></h4>
+<section id="id281">
+<h4>Example<a class="headerlink" href="#id281" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">map_keys</span><span class="p">(</span><span
class="k">MAP</span><span class="w"> </span><span class="err">{</span><span
class="s1">'a'</span><span class="p">:</span><span class="w">
</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span><span class="s1">'b'</span><span class="p">:</span><span class="
[...]
<span class="c1">----</span>
<span class="p">[</span><span class="n">a</span><span class="p">,</span><span
class="w"> </span><span class="n">b</span><span class="p">,</span><span
class="w"> </span><span class="k">c</span><span class="p">]</span>
@@ -8682,14 +8705,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">map_values</span><span
class="p">(</span><span class="nb">map</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id280">
-<h4>Arguments<a class="headerlink" href="#id280" title="Link to this
heading">¶</a></h4>
+<section id="id282">
+<h4>Arguments<a class="headerlink" href="#id282" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>map</strong>: Map expression. Can be a constant, column, or
function, and any combination of map operators.</p></li>
</ul>
</section>
-<section id="id281">
-<h4>Example<a class="headerlink" href="#id281" title="Link to this
heading">¶</a></h4>
+<section id="id283">
+<h4>Example<a class="headerlink" href="#id283" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">map_values</span><span
class="p">(</span><span class="k">MAP</span><span class="w"> </span><span
class="err">{</span><span class="s1">'a'</span><span
class="p">:</span><span class="w"> </span><span class="mi">1</span><span
class="p">,</span><span class="w"> </span><span
class="s1">'b'</span><span class="p">:</span><span class [...]
<span class="c1">----</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span><span
class="w"> </span><span class="p">,</span><span class="w"> </span><span
class="mi">3</span><span class="p">]</span>
@@ -8718,8 +8741,8 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">digest</span><span
class="p">(</span><span class="n">expression</span><span class="p">,</span>
<span class="n">algorithm</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id282">
-<h4>Arguments<a class="headerlink" href="#id282" title="Link to this
heading">¶</a></h4>
+<section id="id284">
+<h4>Arguments<a class="headerlink" href="#id284" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String expression to operate on. Can be a
constant, column, or function, and any combination of operators.</p></li>
<li><p><strong>algorithm</strong>: String expression specifying algorithm to
use. Must be one of:</p></li>
@@ -8733,8 +8756,8 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<li><p>blake3</p></li>
</ul>
</section>
-<section id="id283">
-<h4>Example<a class="headerlink" href="#id283" title="Link to this
heading">¶</a></h4>
+<section id="id285">
+<h4>Example<a class="headerlink" href="#id285" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">digest</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">,</span><span class="w">
</span><span class="s1">'sha256'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">------------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">digest</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">),</span><span class="w"> </span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"sha256"</span><span
class="p">))</span><span class="w"> </span><span class="o">|</span>
@@ -8751,14 +8774,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">md5</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id284">
-<h4>Arguments<a class="headerlink" href="#id284" title="Link to this
heading">¶</a></h4>
+<section id="id286">
+<h4>Arguments<a class="headerlink" href="#id286" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String expression to operate on. Can be a
constant, column, or function, and any combination of operators.</p></li>
</ul>
</section>
-<section id="id285">
-<h4>Example<a class="headerlink" href="#id285" title="Link to this
heading">¶</a></h4>
+<section id="id287">
+<h4>Example<a class="headerlink" href="#id287" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">md5</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">-------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">md5</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">))</span><span class="w"> </span><span
class="o">|</span>
@@ -8775,14 +8798,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">sha224</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id286">
-<h4>Arguments<a class="headerlink" href="#id286" title="Link to this
heading">¶</a></h4>
+<section id="id288">
+<h4>Arguments<a class="headerlink" href="#id288" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String expression to operate on. Can be a
constant, column, or function, and any combination of operators.</p></li>
</ul>
</section>
-<section id="id287">
-<h4>Example<a class="headerlink" href="#id287" title="Link to this
heading">¶</a></h4>
+<section id="id289">
+<h4>Example<a class="headerlink" href="#id289" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">sha224</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">------------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">sha224</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">))</span><span class="w"> </span><span
class="o">|</span>
@@ -8799,14 +8822,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">sha256</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id288">
-<h4>Arguments<a class="headerlink" href="#id288" title="Link to this
heading">¶</a></h4>
+<section id="id290">
+<h4>Arguments<a class="headerlink" href="#id290" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String expression to operate on. Can be a
constant, column, or function, and any combination of operators.</p></li>
</ul>
</section>
-<section id="id289">
-<h4>Example<a class="headerlink" href="#id289" title="Link to this
heading">¶</a></h4>
+<section id="id291">
+<h4>Example<a class="headerlink" href="#id291" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">sha256</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">--------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">sha256</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">))</span><span class="w"> </span><span
class="o">|</span>
@@ -8823,14 +8846,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">sha384</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id290">
-<h4>Arguments<a class="headerlink" href="#id290" title="Link to this
heading">¶</a></h4>
+<section id="id292">
+<h4>Arguments<a class="headerlink" href="#id292" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String expression to operate on. Can be a
constant, column, or function, and any combination of operators.</p></li>
</ul>
</section>
-<section id="id291">
-<h4>Example<a class="headerlink" href="#id291" title="Link to this
heading">¶</a></h4>
+<section id="id293">
+<h4>Example<a class="headerlink" href="#id293" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">sha384</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">-----------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">sha384</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">))</span><span class="w"> </span><span
class="o">|</span>
@@ -8847,14 +8870,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">sha512</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id292">
-<h4>Arguments<a class="headerlink" href="#id292" title="Link to this
heading">¶</a></h4>
+<section id="id294">
+<h4>Arguments<a class="headerlink" href="#id294" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: String</p></li>
</ul>
</section>
-<section id="id293">
-<h4>Example<a class="headerlink" href="#id293" title="Link to this
heading">¶</a></h4>
+<section id="id295">
+<h4>Example<a class="headerlink" href="#id295" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">sha512</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">-------------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">sha512</span><span class="p">(</span><span class="n">Utf8</span><span
class="p">(</span><span class="ss">"foo"</span><span
class="p">))</span><span class="w"> </span><span
class="o">|</span>
@@ -8880,15 +8903,15 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">arrow_cast</span><span
class="p">(</span><span class="n">expression</span><span class="p">,</span>
<span class="n">datatype</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id294">
-<h4>Arguments<a class="headerlink" href="#id294" title="Link to this
heading">¶</a></h4>
+<section id="id296">
+<h4>Arguments<a class="headerlink" href="#id296" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: Expression to cast. The expression can be
a constant, column, or function, and any combination of operators.</p></li>
<li><p><strong>datatype</strong>: <a class="reference external"
href="https://docs.rs/arrow/latest/arrow/datatypes/enum.DataType.html">Arrow
data type</a> name to cast to, as a string. The format is the same as that
returned by [<code class="docutils literal notranslate"><span
class="pre">arrow_typeof</span></code>]</p></li>
</ul>
</section>
-<section id="id295">
-<h4>Example<a class="headerlink" href="#id295" title="Link to this
heading">¶</a></h4>
+<section id="id297">
+<h4>Example<a class="headerlink" href="#id297" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">arrow_cast</span><span class="p">(</span><span
class="o">-</span><span class="mi">5</span><span class="p">,</span><span
class="w"> </span><span class="s1">'Int8'</span><span
class="p">)</span><span class="w"> </span><span class="k">as</span><span
class="w"> </span><span class="n">a</ [...]
<span class="w"> </span><span class="n">arrow_cast</span><span
class="p">(</span><span class="s1">'foo'</span><span
class="p">,</span><span class="w"> </span><span
class="s1">'Dictionary(Int32, Utf8)'</span><span
class="p">)</span><span class="w"> </span><span class="k">as</span><span
class="w"> </span><span class="n">b</span><span class="p">,</span>
<span class="w"> </span><span class="n">arrow_cast</span><span
class="p">(</span><span class="s1">'bar'</span><span
class="p">,</span><span class="w"> </span><span
class="s1">'LargeUtf8'</span><span class="p">)</span><span class="w">
</span><span class="k">as</span><span class="w"> </span><span
class="k">c</span><span class="p">,</span>
@@ -8909,14 +8932,14 @@ SELECT map_extract(MAP {'x': 10, 'y':
NULL, 'z': 30}, &#
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">arrow_typeof</span><span
class="p">(</span><span class="n">expression</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id296">
-<h4>Arguments<a class="headerlink" href="#id296" title="Link to this
heading">¶</a></h4>
+<section id="id298">
+<h4>Arguments<a class="headerlink" href="#id298" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression</strong>: Expression to evaluate. The expression can
be a constant, column, or function, and any combination of operators.</p></li>
</ul>
</section>
-<section id="id297">
-<h4>Example<a class="headerlink" href="#id297" title="Link to this
heading">¶</a></h4>
+<section id="id299">
+<h4>Example<a class="headerlink" href="#id299" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="n">arrow_typeof</span><span class="p">(</span><span
class="s1">'foo'</span><span class="p">),</span><span class="w">
</span><span class="n">arrow_typeof</span><span class="p">(</span><span
class="mi">1</span><span class="p">);</span>
<span class="o">+</span><span
class="c1">---------------------------+------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="n">arrow_typeof</span><span class="p">(</span><span
class="n">Utf8</span><span class="p">(</span><span
class="ss">"foo"</span><span class="p">))</span><span class="w">
</span><span class="o">|</span><span class="w"> </span><span
class="n">arrow_typeof</span><span class="p">(</span><span
class="n">Int64</span><span class="p">(</span><span class="mi">1</span><span
class="p">))</span><span class="w"> </span><span class=" [...]
@@ -8936,15 +8959,15 @@ syntax such as <code class="docutils literal
notranslate"><span class="pre">my_s
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">get_field</span><span
class="p">(</span><span class="n">expression1</span><span class="p">,</span>
<span class="n">expression2</span><span class="p">)</span>
</pre></div>
</div>
-<section id="id298">
-<h4>Arguments<a class="headerlink" href="#id298" title="Link to this
heading">¶</a></h4>
+<section id="id300">
+<h4>Arguments<a class="headerlink" href="#id300" title="Link to this
heading">¶</a></h4>
<ul class="simple">
<li><p><strong>expression1</strong>: The map or struct to retrieve a field
for.</p></li>
<li><p><strong>expression2</strong>: The field name in the map or struct to
retrieve data for. Must evaluate to a string.</p></li>
</ul>
</section>
-<section id="id299">
-<h4>Example<a class="headerlink" href="#id299" title="Link to this
heading">¶</a></h4>
+<section id="id301">
+<h4>Example<a class="headerlink" href="#id301" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">create</span><span class="w"> </span><span
class="k">table</span><span class="w"> </span><span class="n">t</span><span
class="w"> </span><span class="p">(</span><span class="n">idx</span><span
class="w"> </span><span class="nb">varchar</span><span class="p">,</span><span
class="w"> </span><span class="n">v</span><span class="w"> </span><span c [...]
<span class="o">></span><span class="w"> </span><span
class="k">select</span><span class="w"> </span><span
class="n">struct</span><span class="p">(</span><span class="n">idx</span><span
class="p">,</span><span class="w"> </span><span class="n">v</span><span
class="p">)</span><span class="w"> </span><span class="k">from</span><span
class="w"> </span><span class="n">t</span><span class="w"> </span><span
class="k">as</span><span class="w"> </span><span class="k">c</span><span
class="p">;</span>
<span class="o">+</span><span class="c1">-------------------------+</span>
@@ -8977,8 +9000,8 @@ syntax such as <code class="docutils literal
notranslate"><span class="pre">my_s
<div class="highlight-default notranslate"><div
class="highlight"><pre><span></span><span class="n">version</span><span
class="p">()</span>
</pre></div>
</div>
-<section id="id300">
-<h4>Example<a class="headerlink" href="#id300" title="Link to this
heading">¶</a></h4>
+<section id="id302">
+<h4>Example<a class="headerlink" href="#id302" title="Link to this
heading">¶</a></h4>
<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="o">></span><span class="w">
</span><span class="k">select</span><span class="w"> </span><span
class="k">version</span><span class="p">();</span>
<span class="o">+</span><span
class="c1">--------------------------------------------+</span>
<span class="o">|</span><span class="w"> </span><span
class="k">version</span><span class="p">()</span><span class="w">
</span><span class="o">|</span>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]