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 0176a62adb Publish built docs triggered by
74beabc4db9d161f77ff43e0bce284fc0bddb2e1
0176a62adb is described below
commit 0176a62adb055063a4ba78da8a8bffb0a7f081e3
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Oct 28 09:11:36 2025 +0000
Publish built docs triggered by 74beabc4db9d161f77ff43e0bce284fc0bddb2e1
---
.../functions/adding-udfs.md.txt | 113 +++++++++++++++++++++
library-user-guide/functions/adding-udfs.html | 96 +++++++++++++++++
library-user-guide/functions/index.html | 1 +
searchindex.js | 2 +-
4 files changed, 211 insertions(+), 1 deletion(-)
diff --git a/_sources/library-user-guide/functions/adding-udfs.md.txt
b/_sources/library-user-guide/functions/adding-udfs.md.txt
index ecb618179e..7581d8b650 100644
--- a/_sources/library-user-guide/functions/adding-udfs.md.txt
+++ b/_sources/library-user-guide/functions/adding-udfs.md.txt
@@ -586,6 +586,119 @@ For async UDF implementation details, see
[`async_udf.rs`](https://github.com/ap
[`process_scalar_func_inputs`]:
https://docs.rs/datafusion/latest/datafusion/physical_expr/functions/fn.process_scalar_func_inputs.html
[`advanced_udf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udf.rs
+## Named Arguments
+
+DataFusion supports PostgreSQL-style named arguments for scalar functions,
allowing you to pass arguments by parameter name:
+
+```sql
+SELECT substr(str => 'hello', start_pos => 2, length => 3);
+```
+
+Named arguments can be mixed with positional arguments, but positional
arguments must come first:
+
+```sql
+SELECT substr('hello', start_pos => 2, length => 3); -- Valid
+```
+
+### Implementing Functions with Named Arguments
+
+To support named arguments in your UDF, add parameter names to your function's
signature using `.with_parameter_names()`:
+
+```rust
+# use arrow::datatypes::DataType;
+# use datafusion_expr::{Signature, Volatility};
+#
+# #[derive(Debug)]
+# struct MyFunction {
+# signature: Signature,
+# }
+#
+impl MyFunction {
+ fn new() -> Self {
+ Self {
+ signature: Signature::uniform(
+ 2,
+ vec![DataType::Float64],
+ Volatility::Immutable
+ )
+ .with_parameter_names(vec![
+ "base".to_string(),
+ "exponent".to_string()
+ ])
+ .expect("valid parameter names"),
+ }
+ }
+}
+```
+
+The parameter names should match the order of arguments in your function's
signature. DataFusion automatically resolves named arguments to the correct
positional order before invoking your function.
+
+### Example
+
+```rust
+# use std::sync::Arc;
+# use std::any::Any;
+# use arrow::datatypes::DataType;
+# use datafusion_common::Result;
+# use datafusion_expr::{ColumnarValue, ScalarFunctionArgs, Signature,
Volatility};
+# use datafusion_expr::ScalarUDFImpl;
+
+#[derive(Debug, PartialEq, Eq, Hash)]
+struct PowerFunction {
+ signature: Signature,
+}
+
+impl PowerFunction {
+ fn new() -> Self {
+ Self {
+ signature: Signature::uniform(
+ 2,
+ vec![DataType::Float64],
+ Volatility::Immutable
+ )
+ .with_parameter_names(vec![
+ "base".to_string(),
+ "exponent".to_string()
+ ])
+ .expect("valid parameter names"),
+ }
+ }
+}
+
+impl ScalarUDFImpl for PowerFunction {
+ fn as_any(&self) -> &dyn Any { self }
+ fn name(&self) -> &str { "power" }
+ fn signature(&self) -> &Signature { &self.signature }
+
+ fn return_type(&self, _args: &[DataType]) -> Result<DataType> {
+ Ok(DataType::Float64)
+ }
+
+ fn invoke_with_args(&self, _args: ScalarFunctionArgs) ->
Result<ColumnarValue> {
+ // Your implementation - arguments are in correct positional order
+ unimplemented!()
+ }
+}
+```
+
+Once registered, users can call your function with named arguments:
+
+```sql
+SELECT power(base => 2.0, exponent => 3.0);
+SELECT power(2.0, exponent => 3.0);
+```
+
+### Error Messages
+
+When a function call fails due to incorrect arguments, DataFusion will show
the parameter names in error messages to help users:
+
+```text
+No function matches the given name and argument types substr(Utf8).
+ Candidate functions:
+ substr(str: Any, start_pos: Any)
+ substr(str: Any, start_pos: Any, length: Any)
+```
+
## Adding a Window UDF
Scalar UDFs are functions that take a row of data and return a single value.
Window UDFs are similar, but they also have
diff --git a/library-user-guide/functions/adding-udfs.html
b/library-user-guide/functions/adding-udfs.html
index dae0e5ff22..94fe3f2145 100644
--- a/library-user-guide/functions/adding-udfs.html
+++ b/library-user-guide/functions/adding-udfs.html
@@ -1063,6 +1063,96 @@ UDF.</p>
<p>For async UDF implementation details, see <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/async_udf.rs"><code
class="docutils literal notranslate"><span
class="pre">async_udf.rs</span></code></a>.</p>
</section>
</section>
+<section id="named-arguments">
+<h2>Named Arguments<a class="headerlink" href="#named-arguments" title="Link
to this heading">#</a></h2>
+<p>DataFusion supports PostgreSQL-style named arguments for scalar functions,
allowing you to pass arguments by parameter name:</p>
+<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">substr</span><span class="p">(</span><span
class="n">str</span><span class="w"> </span><span class="o">=></span><span
class="w"> </span><span class="s1">'hello'</span><span
class="p">,</span><span class="w"> </span><span class="n">start_pos</span><span
class="w"> </span><span class="o">=></span><span class="w"> </span><span cla
[...]
+</pre></div>
+</div>
+<p>Named arguments can be mixed with positional arguments, but positional
arguments must come first:</p>
+<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">substr</span><span class="p">(</span><span
class="s1">'hello'</span><span class="p">,</span><span class="w">
</span><span class="n">start_pos</span><span class="w"> </span><span
class="o">=></span><span class="w"> </span><span class="mi">2</span><span
class="p">,</span><span class="w"> </span><span class="k">length</span><span
cla [...]
+</pre></div>
+</div>
+<section id="implementing-functions-with-named-arguments">
+<h3>Implementing Functions with Named Arguments<a class="headerlink"
href="#implementing-functions-with-named-arguments" title="Link to this
heading">#</a></h3>
+<p>To support named arguments in your UDF, add parameter names to your
function’s signature using <code class="docutils literal notranslate"><span
class="pre">.with_parameter_names()</span></code>:</p>
+<div class="highlight-rust notranslate"><div
class="highlight"><pre><span></span><span class="k">impl</span><span class="w">
</span><span class="n">MyFunction</span><span class="w"> </span><span
class="p">{</span>
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">new</span><span class="p">()</span><span class="w">
</span><span class="p">-></span><span class="w"> </span><span
class="nc">Self</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="bp">Self</span><span class="w">
</span><span class="p">{</span>
+<span class="w"> </span><span class="n">signature</span><span
class="p">:</span><span class="w"> </span><span
class="nc">Signature</span><span class="p">::</span><span
class="n">uniform</span><span class="p">(</span>
+<span class="w"> </span><span class="mi">2</span><span
class="p">,</span>
+<span class="w"> </span><span class="fm">vec!</span><span
class="p">[</span><span class="n">DataType</span><span class="p">::</span><span
class="n">Float64</span><span class="p">],</span>
+<span class="w"> </span><span class="n">Volatility</span><span
class="p">::</span><span class="n">Immutable</span>
+<span class="w"> </span><span class="p">)</span>
+<span class="w"> </span><span class="p">.</span><span
class="n">with_parameter_names</span><span class="p">(</span><span
class="fm">vec!</span><span class="p">[</span>
+<span class="w"> </span><span
class="s">"base"</span><span class="p">.</span><span
class="n">to_string</span><span class="p">(),</span>
+<span class="w"> </span><span
class="s">"exponent"</span><span class="p">.</span><span
class="n">to_string</span><span class="p">()</span>
+<span class="w"> </span><span class="p">])</span>
+<span class="w"> </span><span class="p">.</span><span
class="n">expect</span><span class="p">(</span><span class="s">"valid
parameter names"</span><span class="p">),</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>The parameter names should match the order of arguments in your function’s
signature. DataFusion automatically resolves named arguments to the correct
positional order before invoking your function.</p>
+</section>
+<section id="example">
+<h3>Example<a class="headerlink" href="#example" title="Link to this
heading">#</a></h3>
+<div class="highlight-rust notranslate"><div
class="highlight"><pre><span></span><span class="cp">#[derive(Debug, PartialEq,
Eq, Hash)]</span>
+<span class="k">struct</span><span class="w"> </span><span
class="nc">PowerFunction</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="n">signature</span><span
class="p">:</span><span class="w"> </span><span
class="nc">Signature</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="k">impl</span><span class="w"> </span><span
class="n">PowerFunction</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">new</span><span class="p">()</span><span class="w">
</span><span class="p">-></span><span class="w"> </span><span
class="nc">Self</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="bp">Self</span><span class="w">
</span><span class="p">{</span>
+<span class="w"> </span><span class="n">signature</span><span
class="p">:</span><span class="w"> </span><span
class="nc">Signature</span><span class="p">::</span><span
class="n">uniform</span><span class="p">(</span>
+<span class="w"> </span><span class="mi">2</span><span
class="p">,</span>
+<span class="w"> </span><span class="fm">vec!</span><span
class="p">[</span><span class="n">DataType</span><span class="p">::</span><span
class="n">Float64</span><span class="p">],</span>
+<span class="w"> </span><span class="n">Volatility</span><span
class="p">::</span><span class="n">Immutable</span>
+<span class="w"> </span><span class="p">)</span>
+<span class="w"> </span><span class="p">.</span><span
class="n">with_parameter_names</span><span class="p">(</span><span
class="fm">vec!</span><span class="p">[</span>
+<span class="w"> </span><span
class="s">"base"</span><span class="p">.</span><span
class="n">to_string</span><span class="p">(),</span>
+<span class="w"> </span><span
class="s">"exponent"</span><span class="p">.</span><span
class="n">to_string</span><span class="p">()</span>
+<span class="w"> </span><span class="p">])</span>
+<span class="w"> </span><span class="p">.</span><span
class="n">expect</span><span class="p">(</span><span class="s">"valid
parameter names"</span><span class="p">),</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="p">}</span>
+
+<span class="k">impl</span><span class="w"> </span><span
class="n">ScalarUDFImpl</span><span class="w"> </span><span
class="k">for</span><span class="w"> </span><span
class="n">PowerFunction</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">as_any</span><span class="p">(</span><span
class="o">&</span><span class="bp">self</span><span class="p">)</span><span
class="w"> </span><span class="p">-></span><span class="w"> </span><span
class="kp">&</span><span class="nc">dyn</span><span class="w"> </span><span
class="n">Any</span><span class="w"> </span><span class="p">{</span><span
class="w"> </span><span class="bp">self</span> [...]
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">name</span><span class="p">(</span><span
class="o">&</span><span class="bp">self</span><span class="p">)</span><span
class="w"> </span><span class="p">-></span><span class="w"> </span><span
class="kp">&</span><span class="kt">str</span><span class="w"> </span><span
class="p">{</span><span class="w"> </span><span
class="s">"power"</span><span class="w"> </span><span class="p"> [...]
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">signature</span><span class="p">(</span><span
class="o">&</span><span class="bp">self</span><span class="p">)</span><span
class="w"> </span><span class="p">-></span><span class="w"> </span><span
class="kp">&</span><span class="nc">Signature</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span
class="o">&</span><span class="bp">self</span><span class=" [...]
+
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">return_type</span><span class="p">(</span><span
class="o">&</span><span class="bp">self</span><span class="p">,</span><span
class="w"> </span><span class="n">_args</span><span class="p">:</span><span
class="w"> </span><span class="kp">&</span><span class="p">[</span><span
class="n">DataType</span><span class="p">])</span><span class="w"> </span><span
class="p">-></span><span class="w"> [...]
+<span class="w"> </span><span class="nb">Ok</span><span
class="p">(</span><span class="n">DataType</span><span class="p">::</span><span
class="n">Float64</span><span class="p">)</span>
+<span class="w"> </span><span class="p">}</span>
+
+<span class="w"> </span><span class="k">fn</span><span class="w">
</span><span class="nf">invoke_with_args</span><span class="p">(</span><span
class="o">&</span><span class="bp">self</span><span class="p">,</span><span
class="w"> </span><span class="n">_args</span><span class="p">:</span><span
class="w"> </span><span class="nc">ScalarFunctionArgs</span><span
class="p">)</span><span class="w"> </span><span class="p">-></span><span
class="w"> </span><span class="nb">Result</span> [...]
+<span class="w"> </span><span class="c1">// Your implementation -
arguments are in correct positional order</span>
+<span class="w"> </span><span class="fm">unimplemented!</span><span
class="p">()</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>Once registered, users can call your function with named arguments:</p>
+<div class="highlight-sql notranslate"><div
class="highlight"><pre><span></span><span class="k">SELECT</span><span
class="w"> </span><span class="n">power</span><span class="p">(</span><span
class="n">base</span><span class="w"> </span><span class="o">=></span><span
class="w"> </span><span class="mi">2</span><span class="p">.</span><span
class="mi">0</span><span class="p">,</span><span class="w"> </span><span
class="n">exponent</span><span class="w"> </span><span class="o">=></span
[...]
+<span class="k">SELECT</span><span class="w"> </span><span
class="n">power</span><span class="p">(</span><span class="mi">2</span><span
class="p">.</span><span class="mi">0</span><span class="p">,</span><span
class="w"> </span><span class="n">exponent</span><span class="w"> </span><span
class="o">=></span><span class="w"> </span><span class="mi">3</span><span
class="p">.</span><span class="mi">0</span><span class="p">);</span>
+</pre></div>
+</div>
+</section>
+<section id="error-messages">
+<h3>Error Messages<a class="headerlink" href="#error-messages" title="Link to
this heading">#</a></h3>
+<p>When a function call fails due to incorrect arguments, DataFusion will show
the parameter names in error messages to help users:</p>
+<div class="highlight-text notranslate"><div
class="highlight"><pre><span></span>No function matches the given name and
argument types substr(Utf8).
+ Candidate functions:
+ substr(str: Any, start_pos: Any)
+ substr(str: Any, start_pos: Any, length: Any)
+</pre></div>
+</div>
+</section>
+</section>
<section id="adding-a-window-udf">
<h2>Adding a Window UDF<a class="headerlink" href="#adding-a-window-udf"
title="Link to this heading">#</a></h2>
<p>Scalar UDFs are functions that take a row of data and return a single
value. Window UDFs are similar, but they also have
@@ -1638,6 +1728,12 @@ validation of the input <code class="docutils literal
notranslate"><span class="
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-by-impl-asyncscalarudfimpl">Adding by <code class="docutils
literal notranslate"><span class="pre">impl</span> <span
class="pre">AsyncScalarUDFImpl</span></code></a></li>
</ul>
</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#named-arguments">Named Arguments</a><ul class="nav section-nav
flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#implementing-functions-with-named-arguments">Implementing Functions with
Named Arguments</a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#example">Example</a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#error-messages">Error Messages</a></li>
+</ul>
+</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-a-window-udf">Adding a Window UDF</a><ul class="nav section-nav
flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#registering-a-window-udf">Registering a Window UDF</a></li>
</ul>
diff --git a/library-user-guide/functions/index.html
b/library-user-guide/functions/index.html
index 89c555a6f5..c717eb5d42 100644
--- a/library-user-guide/functions/index.html
+++ b/library-user-guide/functions/index.html
@@ -711,6 +711,7 @@
<li class="toctree-l1"><a class="reference internal"
href="adding-udfs.html">Adding User Defined Functions:
Scalar/Window/Aggregate/Table Functions</a><ul>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-a-scalar-udf">Adding a Scalar UDF</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-an-async-scalar-udf">Adding an Async Scalar
UDF</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#named-arguments">Named Arguments</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-a-window-udf">Adding a Window UDF</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-an-aggregate-udf">Adding an Aggregate UDF</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-a-table-udf">Adding a Table UDF</a></li>
diff --git a/searchindex.js b/searchindex.js
index 581c21f2e6..9721e5bb8a 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles":{"!=":[[60,"op-neq"]],"!~":[[60,"op-re-not-match"]],"!~*":[[60,"op-re-not-match-i"]],"!~~":[[60,"id19"]],"!~~*":[[60,"id20"]],"#":[[60,"op-bit-xor"]],"%":[[60,"op-modulo"]],"&":[[60,"op-bit-and"]],"(relation,
name) tuples in logical fields and logical columns are
unique":[[13,"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]],"*":[[60,"op-multiply"]],"+":[[60,"op-plus"]],"-":[[60,"op-minus"]],"/":[[60,"op-divide"]],"<":[[60,"op-lt"]],"<
[...]
\ No newline at end of file
+Search.setIndex({"alltitles":{"!=":[[60,"op-neq"]],"!~":[[60,"op-re-not-match"]],"!~*":[[60,"op-re-not-match-i"]],"!~~":[[60,"id19"]],"!~~*":[[60,"id20"]],"#":[[60,"op-bit-xor"]],"%":[[60,"op-modulo"]],"&":[[60,"op-bit-and"]],"(relation,
name) tuples in logical fields and logical columns are
unique":[[13,"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]],"*":[[60,"op-multiply"]],"+":[[60,"op-plus"]],"-":[[60,"op-minus"]],"/":[[60,"op-divide"]],"<":[[60,"op-lt"]],"<
[...]
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]