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 25a277e5cd Publish built docs triggered by
fef3b718887699f467565222f5bfd60d6ec33f17
25a277e5cd is described below
commit 25a277e5cd4c443640a837dbcf021d5b749128ec
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Oct 24 00:45:05 2025 +0000
Publish built docs triggered by fef3b718887699f467565222f5bfd60d6ec33f17
---
_sources/contributor-guide/howtos.md.txt | 170 +++++++++++--------
.../functions/adding-udfs.md.txt | 8 +-
contributor-guide/howtos.html | 185 +++++++++++----------
library-user-guide/functions/adding-udfs.html | 16 +-
library-user-guide/functions/index.html | 4 +-
searchindex.js | 2 +-
6 files changed, 205 insertions(+), 180 deletions(-)
diff --git a/_sources/contributor-guide/howtos.md.txt
b/_sources/contributor-guide/howtos.md.txt
index 89a1bc7360..24b63865cb 100644
--- a/_sources/contributor-guide/howtos.md.txt
+++ b/_sources/contributor-guide/howtos.md.txt
@@ -21,60 +21,86 @@
## How to update the version of Rust used in CI tests
-- Make a PR to update the [rust-toolchain] file in the root of the repository:
+Make a PR to update the [rust-toolchain] file in the root of the repository.
[rust-toolchain]:
https://github.com/apache/datafusion/blob/main/rust-toolchain.toml
-## How to add a new scalar function
-
-Below is a checklist of what you need to do to add a new scalar function to
DataFusion:
-
-- Add the actual implementation of the function to a new module file within:
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions-nested)
for arrays, maps and structs functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/crypto)
for crypto functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/datetime)
for datetime functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/encoding)
for encoding functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/math)
for math functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/regex)
for regex functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/string)
for string functions
- -
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/unicode)
for unicode functions
- - create a new module
[here](https://github.com/apache/datafusion/tree/main/datafusion/functions/src/)
for other functions.
-- New function modules - for example a `vector` module, should use a [rust
feature](https://doc.rust-lang.org/cargo/reference/features.html) (for example
`vector_expressions`) to allow DataFusion
- users to enable or disable the new module as desired.
-- The implementation of the function is done via implementing `ScalarUDFImpl`
trait for the function struct.
- - See the [advanced_udf.rs] example for an example implementation
- - Add tests for the new function
-- To connect the implementation of the function add to the mod.rs file:
- - a `mod xyz;` where xyz is the new module file
- - a call to `make_udf_function!(..);`
- - an item in `export_functions!(..);`
-- In [sqllogictest/test_files], add new `sqllogictest` integration tests where
the function is called through SQL against well known data and returns the
expected result.
- - Documentation for `sqllogictest`
[here](https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md)
-- Add SQL reference documentation
[here](https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/scalar_functions.md)
- - An example of this being done can be seen
[here](https://github.com/apache/datafusion/pull/12775)
- - 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
-
-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], 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
- - a new line in `signature` with the signature of the function (number and
types of its arguments)
- - a new line in `create_aggregate_expr` mapping the built-in to the
implementation
- - tests to the function.
-- In [sqllogictest/test_files], add new `sqllogictest` integration tests where
the function is called through SQL against well known data and returns the
expected result.
- - Documentation for `sqllogictest`
[here](https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md)
-- Add SQL reference documentation
[here](https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/aggregate_functions.md)
- - An example of this being done can be seen
[here](https://github.com/apache/datafusion/pull/12775)
- - Run `./dev/update_function_docs.sh` to update docs
+## Adding new functions
+
+**Implementation**
+
+| Function type | Location to implement | Trait to implement
| Macros to use | Example
|
+| ------------- | ------------------------- |
---------------------------------------------- |
------------------------------------------------ | -------------------- |
+| Scalar | [functions][df-functions] | [`ScalarUDFImpl`]
| `make_udf_function!()` and `export_functions!()` |
[`advanced_udf.rs`] |
+| Nested | [functions-nested] | [`ScalarUDFImpl`]
| `make_udf_expr_and_func!()` |
|
+| Aggregate | [functions-aggregate] | [`AggregateUDFImpl`] and an
[`Accumulator`] | `make_udaf_expr_and_func!()` |
[`advanced_udaf.rs`] |
+| Window | [functions-window] | [`WindowUDFImpl`] and a
[`PartitionEvaluator`] | `define_udwf_and_expr!()` |
[`advanced_udwf.rs`] |
+| Table | [functions-table] | [`TableFunctionImpl`] and a
[`TableProvider`] | `create_udtf_function!()` |
[`simple_udtf.rs`] |
+
+- The macros are to simplify some boilerplate such as ensuring a DataFrame API
compatible function is also created
+- Ensure new functions are properly exported through the subproject
+ `mod.rs` or `lib.rs`.
+- Functions should preferably provide documentation via the `#[user_doc(...)]`
attribute so their documentation
+ can be included in the SQL reference documentation (see below section)
+- Scalar functions are further grouped into modules for families of functions
(e.g. string, math, datetime).
+ Functions should be added to the relevant module; if a new module needs to
be created then a new [Rust feature]
+ should also be added to allow DataFusion users to conditionally compile the
modules as needed
+- Aggregate functions can optionally implement a [`GroupsAccumulator`] for
better performance
+
+Spark compatible functions are [located in separate crate][df-spark] but
otherwise follow the same steps, though all
+function types (e.g. scalar, nested, aggregate) are grouped together in the
single location.
+
+[df-functions]:
https://github.com/apache/datafusion/tree/main/datafusion/functions
+[functions-nested]:
https://github.com/apache/datafusion/tree/main/datafusion/functions-nested
+[functions-aggregate]:
https://github.com/apache/datafusion/tree/main/datafusion/functions-aggregate
+[functions-window]:
https://github.com/apache/datafusion/tree/main/datafusion/functions-window
+[functions-table]:
https://github.com/apache/datafusion/tree/main/datafusion/functions-table
+[df-spark]: https://github.com/apache/datafusion/tree/main/datafusion/spark
+[`scalarudfimpl`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.ScalarUDFImpl.html
+[`aggregateudfimpl`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.AggregateUDFImpl.html
+[`accumulator`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.Accumulator.html
+[`groupsaccumulator`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.GroupsAccumulator.html
+[`windowudfimpl`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.WindowUDFImpl.html
+[`partitionevaluator`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.PartitionEvaluator.html
+[`tablefunctionimpl`]:
https://docs.rs/datafusion/latest/datafusion/catalog/trait.TableFunctionImpl.html
+[`tableprovider`]:
https://docs.rs/datafusion/latest/datafusion/catalog/trait.TableProvider.html
+[`advanced_udf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udf.rs
+[`advanced_udaf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udaf.rs
+[`advanced_udwf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udwf.rs
+[`simple_udtf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/simple_udtf.rs
+[rust feature]: https://doc.rust-lang.org/cargo/reference/features.html
+
+**Testing**
+
+Prefer adding `sqllogictest` integration tests where the function is called
via SQL against
+well known data and returns an expected result. See the existing [test
files][slt-test-files] if
+there is an appropriate file to add test cases to, otherwise create a new
file. See the
+[`sqllogictest` documentation][slt-readme] for details on how to construct
these tests.
+Ensure edge case, `null` input cases are considered in these tests.
+
+If a behaviour cannot be tested via `sqllogictest` (e.g. testing `simplify()`,
needs to be
+tested in isolation from the optimizer, difficult to construct exact input via
`sqllogictest`)
+then tests can be added as Rust unit tests in the implementation module,
though these should be
+kept minimal where possible
+
+[slt-test-files]:
https://github.com/apache/datafusion/tree/main/datafusion/sqllogictest/test_files
+[slt-readme]:
https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md
+
+**Documentation**
+
+Run documentation update script `./dev/update_function_docs.sh` which will
update the relevant
+markdown document [here][fn-doc-home] (see the documents for
[scalar][fn-doc-scalar],
+[aggregate][fn-doc-aggregate] and [window][fn-doc-window] functions)
+
+- You _should not_ manually update the markdown document after running the
script as those manual
+ changes would be overwritten on next execution
+- Reference [GitHub issue] which introduced this behaviour
+
+[fn-doc-home]:
https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql
+[fn-doc-scalar]:
https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/scalar_functions.md
+[fn-doc-aggregate]:
https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/aggregate_functions.md
+[fn-doc-window]:
https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/window_functions.md
+[github issue]: https://github.com/apache/datafusion/issues/12740
## How to display plans graphically
@@ -97,11 +123,13 @@ can be displayed. For example, the following command
creates a
dot -Tpdf < /tmp/plan.dot > /tmp/plan.pdf
```
-## How to format `.md` document
+## How to format `.md` documents
-We are using `prettier` to format `.md` files.
+We use [`prettier`] to format `.md` files.
-You can either use `npm i -g prettier` to install it globally or use `npx` to
run it as a standalone binary. Using `npx` required a working node environment.
Upgrading to the latest prettier is recommended (by adding `--upgrade` to the
`npm` command).
+You can either use `npm i -g prettier` to install it globally or use `npx` to
run it as a standalone binary.
+Using `npx` requires a working node environment. Upgrading to the latest
prettier is recommended (by adding
+`--upgrade` to the `npm` command).
```bash
$ prettier --version
@@ -114,19 +142,19 @@ After you've confirmed your prettier version, you can
format all the `.md` files
prettier -w {datafusion,datafusion-cli,datafusion-examples,dev,docs}/**/*.md
```
+[`prettier`]: https://prettier.io/
+
## How to format `.toml` files
-We use `taplo` to format `.toml` files.
+We use [`taplo`] to format `.toml` files.
-For Rust developers, you can install it via:
+To install via cargo:
```sh
cargo install taplo-cli --locked
```
-> Refer to the [Installation section][doc] on other ways to install it.
->
-> [doc]: https://taplo.tamasfe.dev/cli/installation/binary.html
+> Refer to the [taplo installation documentation][taplo-install] for other
ways to install it.
```bash
$ taplo --version
@@ -139,28 +167,24 @@ After you've confirmed your `taplo` version, you can
format all the `.toml` file
taplo fmt
```
+[`taplo`]: https://taplo.tamasfe.dev/
+[taplo-install]: https://taplo.tamasfe.dev/cli/installation/binary.html
+
## How to update protobuf/gen dependencies
-The prost/tonic code can be generated by running `./regen.sh`, which in turn
invokes the Rust binary located in `./gen`
+For the `proto` and `proto-common` crates, the prost/tonic code is generated
by running their respective `./regen.sh` scripts,
+which in turn invokes the Rust binary located in `./gen`.
This is necessary after modifying the protobuf definitions or altering the
dependencies of `./gen`, and requires a
valid installation of [protoc] (see [installation instructions] for details).
```bash
-./regen.sh
+# From repository root
+# proto-common
+./datafusion/proto-common/regen.sh
+# proto
+./datafusion/proto/regen.sh
```
[protoc]:
https://github.com/protocolbuffers/protobuf#protocol-compiler-installation
[installation instructions]:
https://datafusion.apache.org/contributor-guide/getting_started.html#protoc-installation
-
-## How to add/edit documentation for UDFs
-
-Documentations for the UDF documentations are generated from code (related
[github issue]). To generate markdown run `./update_function_docs.sh`.
-
-This is necessary after adding new UDF implementation or modifying existing
implementation which requires to update documentation.
-
-```bash
-./dev/update_function_docs.sh
-```
-
-[github issue]: https://github.com/apache/datafusion/issues/12740
diff --git a/_sources/library-user-guide/functions/adding-udfs.md.txt
b/_sources/library-user-guide/functions/adding-udfs.md.txt
index 2335105882..ecb618179e 100644
--- a/_sources/library-user-guide/functions/adding-udfs.md.txt
+++ b/_sources/library-user-guide/functions/adding-udfs.md.txt
@@ -354,7 +354,7 @@ async fn main() {
}
```
-## Adding a Async Scalar UDF
+## Adding an Async Scalar UDF
An Async Scalar UDF allows you to implement user-defined functions that support
asynchronous execution, such as performing network or I/O operations within the
@@ -1257,7 +1257,7 @@ async fn main() -> Result<()> {
[`create_udaf`]:
https://docs.rs/datafusion/latest/datafusion/logical_expr/fn.create_udaf.html
[`advanced_udaf.rs`]:
https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udaf.rs
-## Adding a User-Defined Table Function
+## Adding a Table UDF
A User-Defined Table Function (UDTF) is a function that takes parameters and
returns a `TableProvider`.
@@ -1266,8 +1266,8 @@ This is a simple struct that holds a set of RecordBatches
in memory and treats t
be replaced with your own struct that implements `TableProvider`.
While this is a simple example for illustrative purposes, UDTFs have a lot of
potential use cases. And can be
-particularly useful for reading data from external sources and interactive
analysis. For example, see the [example][4]
-for a working example that reads from a CSV file. As another example, you
could use the built-in UDTF `parquet_metadata`
+particularly useful for reading data from external sources and interactive
analysis. See the [working example][simple_udtf.rs]
+which reads from a CSV file. As another example, you could use the built-in
UDTF `parquet_metadata`
in the CLI to read the metadata from a Parquet file.
```console
diff --git a/contributor-guide/howtos.html b/contributor-guide/howtos.html
index 4b2eb5ca68..3cccbdf782 100644
--- a/contributor-guide/howtos.html
+++ b/contributor-guide/howtos.html
@@ -718,81 +718,85 @@
<h1>HOWTOs<a class="headerlink" href="#howtos" title="Link to this
heading">#</a></h1>
<section id="how-to-update-the-version-of-rust-used-in-ci-tests">
<h2>How to update the version of Rust used in CI tests<a class="headerlink"
href="#how-to-update-the-version-of-rust-used-in-ci-tests" title="Link to this
heading">#</a></h2>
-<ul class="simple">
-<li><p>Make a PR to update the <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/rust-toolchain.toml">rust-toolchain</a>
file in the root of the repository:</p></li>
-</ul>
+<p>Make a PR to update the <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/rust-toolchain.toml">rust-toolchain</a>
file in the root of the repository.</p>
</section>
-<section id="how-to-add-a-new-scalar-function">
-<h2>How to add a new scalar function<a class="headerlink"
href="#how-to-add-a-new-scalar-function" title="Link to this heading">#</a></h2>
-<p>Below is a checklist of what you need to do to add a new scalar function to
DataFusion:</p>
+<section id="adding-new-functions">
+<h2>Adding new functions<a class="headerlink" href="#adding-new-functions"
title="Link to this heading">#</a></h2>
+<p><strong>Implementation</strong></p>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Function type</p></th>
+<th class="head"><p>Location to implement</p></th>
+<th class="head"><p>Trait to implement</p></th>
+<th class="head"><p>Macros to use</p></th>
+<th class="head"><p>Example</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>Scalar</p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions">functions</a></p></td>
+<td><p><a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.ScalarUDFImpl.html"><code
class="docutils literal notranslate"><span
class="pre">ScalarUDFImpl</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span
class="pre">make_udf_function!()</span></code> and <code class="docutils
literal notranslate"><span
class="pre">export_functions!()</span></code></p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udf.rs"><code
class="docutils literal notranslate"><span
class="pre">advanced_udf.rs</span></code></a></p></td>
+</tr>
+<tr class="row-odd"><td><p>Nested</p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions-nested">functions-nested</a></p></td>
+<td><p><a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.ScalarUDFImpl.html"><code
class="docutils literal notranslate"><span
class="pre">ScalarUDFImpl</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span
class="pre">make_udf_expr_and_func!()</span></code></p></td>
+<td><p></p></td>
+</tr>
+<tr class="row-even"><td><p>Aggregate</p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions-aggregate">functions-aggregate</a></p></td>
+<td><p><a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.AggregateUDFImpl.html"><code
class="docutils literal notranslate"><span
class="pre">AggregateUDFImpl</span></code></a> and an <a class="reference
external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.Accumulator.html"><code
class="docutils literal notranslate"><span
class="pre">Accumulator</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span
class="pre">make_udaf_expr_and_func!()</span></code></p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udaf.rs"><code
class="docutils literal notranslate"><span
class="pre">advanced_udaf.rs</span></code></a></p></td>
+</tr>
+<tr class="row-odd"><td><p>Window</p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions-window">functions-window</a></p></td>
+<td><p><a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.WindowUDFImpl.html"><code
class="docutils literal notranslate"><span
class="pre">WindowUDFImpl</span></code></a> and a <a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.PartitionEvaluator.html"><code
class="docutils literal notranslate"><span
class="pre">PartitionEvaluator</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span
class="pre">define_udwf_and_expr!()</span></code></p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udwf.rs"><code
class="docutils literal notranslate"><span
class="pre">advanced_udwf.rs</span></code></a></p></td>
+</tr>
+<tr class="row-even"><td><p>Table</p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions-table">functions-table</a></p></td>
+<td><p><a class="reference external"
href="https://docs.rs/datafusion/latest/datafusion/catalog/trait.TableFunctionImpl.html"><code
class="docutils literal notranslate"><span
class="pre">TableFunctionImpl</span></code></a> and a <a class="reference
external"
href="https://docs.rs/datafusion/latest/datafusion/catalog/trait.TableProvider.html"><code
class="docutils literal notranslate"><span
class="pre">TableProvider</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span
class="pre">create_udtf_function!()</span></code></p></td>
+<td><p><a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/simple_udtf.rs"><code
class="docutils literal notranslate"><span
class="pre">simple_udtf.rs</span></code></a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
<ul class="simple">
-<li><p>Add the actual implementation of the function to a new module file
within:</p>
-<ul>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions-nested">here</a>
for arrays, maps and structs functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/crypto">here</a>
for crypto functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/datetime">here</a>
for datetime functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/encoding">here</a>
for encoding functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/math">here</a>
for math functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/regex">here</a>
for regex functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/string">here</a>
for string functions</p></li>
-<li><p><a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/unicode">here</a>
for unicode functions</p></li>
-<li><p>create a new module <a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/functions/src/">here</a>
for other functions.</p></li>
-</ul>
-</li>
-<li><p>New function modules - for example a <code class="docutils literal
notranslate"><span class="pre">vector</span></code> module, should use a <a
class="reference external"
href="https://doc.rust-lang.org/cargo/reference/features.html">rust feature</a>
(for example <code class="docutils literal notranslate"><span
class="pre">vector_expressions</span></code>) to allow DataFusion
-users to enable or disable the new module as desired.</p></li>
-<li><p>The implementation of the function is done via implementing <code
class="docutils literal notranslate"><span
class="pre">ScalarUDFImpl</span></code> trait for the function struct.</p>
-<ul>
-<li><p>See the <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/advanced_udaf.rs">advanced_udf.rs</a>
example for an example implementation</p></li>
-<li><p>Add tests for the new function</p></li>
-</ul>
-</li>
-<li><p>To connect the implementation of the function add to the mod.rs
file:</p>
-<ul>
-<li><p>a <code class="docutils literal notranslate"><span
class="pre">mod</span> <span class="pre">xyz;</span></code> where xyz is the
new module file</p></li>
-<li><p>a call to <code class="docutils literal notranslate"><span
class="pre">make_udf_function!(..);</span></code></p></li>
-<li><p>an item in <code class="docutils literal notranslate"><span
class="pre">export_functions!(..);</span></code></p></li>
-</ul>
-</li>
-<li><p>In <a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/sqllogictest/test_files">sqllogictest/test_files</a>,
add new <code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> integration tests where the function is
called through SQL against well known data and returns the expected result.</p>
-<ul>
-<li><p>Documentation for <code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md">here</a></p></li>
+<li><p>The macros are to simplify some boilerplate such as ensuring a
DataFrame API compatible function is also created</p></li>
+<li><p>Ensure new functions are properly exported through the subproject
+<code class="docutils literal notranslate"><span
class="pre">mod.rs</span></code> or <code class="docutils literal
notranslate"><span class="pre">lib.rs</span></code>.</p></li>
+<li><p>Functions should preferably provide documentation via the <code
class="docutils literal notranslate"><span
class="pre">#[user_doc(...)]</span></code> attribute so their documentation
+can be included in the SQL reference documentation (see below section)</p></li>
+<li><p>Scalar functions are further grouped into modules for families of
functions (e.g. string, math, datetime).
+Functions should be added to the relevant module; if a new module needs to be
created then a new <a class="reference external"
href="https://doc.rust-lang.org/cargo/reference/features.html">Rust feature</a>
+should also be added to allow DataFusion users to conditionally compile the
modules as needed</p></li>
+<li><p>Aggregate functions can optionally implement a <a class="reference
external"
href="https://docs.rs/datafusion/latest/datafusion/logical_expr/trait.GroupsAccumulator.html"><code
class="docutils literal notranslate"><span
class="pre">GroupsAccumulator</span></code></a> for better performance</p></li>
</ul>
-</li>
-<li><p>Add SQL reference documentation <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/scalar_functions.md">here</a></p>
-<ul>
-<li><p>An example of this being done can be seen <a class="reference external"
href="https://github.com/apache/datafusion/pull/12775">here</a></p></li>
-<li><p>Run <code class="docutils literal notranslate"><span
class="pre">./dev/update_function_docs.sh</span></code> to update docs</p></li>
-</ul>
-</li>
-</ul>
-</section>
-<section id="how-to-add-a-new-aggregate-function">
-<h2>How to add a new aggregate function<a class="headerlink"
href="#how-to-add-a-new-aggregate-function" title="Link to this
heading">#</a></h2>
-<p>Below is a checklist of what you need to do to add a new aggregate function
to DataFusion:</p>
+<p>Spark compatible functions are <a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/spark">located
in separate crate</a> but otherwise follow the same steps, though all
+function types (e.g. scalar, nested, aggregate) are grouped together in the
single location.</p>
+<p><strong>Testing</strong></p>
+<p>Prefer adding <code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> integration tests where the function is
called via SQL against
+well known data and returns an expected result. See the existing <a
class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/sqllogictest/test_files">test
files</a> if
+there is an appropriate file to add test cases to, otherwise create a new
file. See the
+<a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md"><code
class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> documentation</a> for details on how to
construct these tests.
+Ensure edge case, <code class="docutils literal notranslate"><span
class="pre">null</span></code> input cases are considered in these tests.</p>
+<p>If a behaviour cannot be tested via <code class="docutils literal
notranslate"><span class="pre">sqllogictest</span></code> (e.g. testing <code
class="docutils literal notranslate"><span
class="pre">simplify()</span></code>, needs to be
+tested in isolation from the optimizer, difficult to construct exact input via
<code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code>)
+then tests can be added as Rust unit tests in the implementation module,
though these should be
+kept minimal where possible</p>
+<p><strong>Documentation</strong></p>
+<p>Run documentation update script <code class="docutils literal
notranslate"><span class="pre">./dev/update_function_docs.sh</span></code>
which will update the relevant
+markdown document <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql">here</a>
(see the documents for <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/scalar_functions.md">scalar</a>,
+<a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/aggregate_functions.md">aggregate</a>
and <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/window_functions.md">window</a>
functions)</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 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>
-<li><p>a new line in <code class="docutils literal notranslate"><span
class="pre">return_type</span></code> with the expected return type of the
function, given an incoming type</p></li>
-<li><p>a new line in <code class="docutils literal notranslate"><span
class="pre">signature</span></code> with the signature of the function (number
and types of its arguments)</p></li>
-<li><p>a new line in <code class="docutils literal notranslate"><span
class="pre">create_aggregate_expr</span></code> mapping the built-in to the
implementation</p></li>
-<li><p>tests to the function.</p></li>
-</ul>
-</li>
-<li><p>In <a class="reference external"
href="https://github.com/apache/datafusion/tree/main/datafusion/sqllogictest/test_files">sqllogictest/test_files</a>,
add new <code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> integration tests where the function is
called through SQL against well known data and returns the expected result.</p>
-<ul>
-<li><p>Documentation for <code class="docutils literal notranslate"><span
class="pre">sqllogictest</span></code> <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion/sqllogictest/README.md">here</a></p></li>
-</ul>
-</li>
-<li><p>Add SQL reference documentation <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/docs/source/user-guide/sql/aggregate_functions.md">here</a></p>
-<ul>
-<li><p>An example of this being done can be seen <a class="reference external"
href="https://github.com/apache/datafusion/pull/12775">here</a></p></li>
-<li><p>Run <code class="docutils literal notranslate"><span
class="pre">./dev/update_function_docs.sh</span></code> to update docs</p></li>
-</ul>
-</li>
+<li><p>You <em>should not</em> manually update the markdown document after
running the script as those manual
+changes would be overwritten on next execution</p></li>
+<li><p>Reference <a class="reference external"
href="https://github.com/apache/datafusion/issues/12740">GitHub issue</a> which
introduced this behaviour</p></li>
</ul>
</section>
<section id="how-to-display-plans-graphically">
@@ -812,10 +816,12 @@ can be displayed. For example, the following command
creates a
</pre></div>
</div>
</section>
-<section id="how-to-format-md-document">
-<h2>How to format <code class="docutils literal notranslate"><span
class="pre">.md</span></code> document<a class="headerlink"
href="#how-to-format-md-document" title="Link to this heading">#</a></h2>
-<p>We are using <code class="docutils literal notranslate"><span
class="pre">prettier</span></code> to format <code class="docutils literal
notranslate"><span class="pre">.md</span></code> files.</p>
-<p>You can either use <code class="docutils literal notranslate"><span
class="pre">npm</span> <span class="pre">i</span> <span class="pre">-g</span>
<span class="pre">prettier</span></code> to install it globally or use <code
class="docutils literal notranslate"><span class="pre">npx</span></code> to run
it as a standalone binary. Using <code class="docutils literal
notranslate"><span class="pre">npx</span></code> required a working node
environment. Upgrading to the latest prettier is r [...]
+<section id="how-to-format-md-documents">
+<h2>How to format <code class="docutils literal notranslate"><span
class="pre">.md</span></code> documents<a class="headerlink"
href="#how-to-format-md-documents" title="Link to this heading">#</a></h2>
+<p>We use <a class="reference external" href="https://prettier.io/"><code
class="docutils literal notranslate"><span
class="pre">prettier</span></code></a> to format <code class="docutils literal
notranslate"><span class="pre">.md</span></code> files.</p>
+<p>You can either use <code class="docutils literal notranslate"><span
class="pre">npm</span> <span class="pre">i</span> <span class="pre">-g</span>
<span class="pre">prettier</span></code> to install it globally or use <code
class="docutils literal notranslate"><span class="pre">npx</span></code> to run
it as a standalone binary.
+Using <code class="docutils literal notranslate"><span
class="pre">npx</span></code> requires a working node environment. Upgrading to
the latest prettier is recommended (by adding
+<code class="docutils literal notranslate"><span
class="pre">--upgrade</span></code> to the <code class="docutils literal
notranslate"><span class="pre">npm</span></code> command).</p>
<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span>$<span class="w"> </span>prettier<span
class="w"> </span>--version
<span class="m">2</span>.3.0
</pre></div>
@@ -827,13 +833,13 @@ can be displayed. For example, the following command
creates a
</section>
<section id="how-to-format-toml-files">
<h2>How to format <code class="docutils literal notranslate"><span
class="pre">.toml</span></code> files<a class="headerlink"
href="#how-to-format-toml-files" title="Link to this heading">#</a></h2>
-<p>We use <code class="docutils literal notranslate"><span
class="pre">taplo</span></code> to format <code class="docutils literal
notranslate"><span class="pre">.toml</span></code> files.</p>
-<p>For Rust developers, you can install it via:</p>
+<p>We use <a class="reference external"
href="https://taplo.tamasfe.dev/"><code class="docutils literal
notranslate"><span class="pre">taplo</span></code></a> to format <code
class="docutils literal notranslate"><span class="pre">.toml</span></code>
files.</p>
+<p>To install via cargo:</p>
<div class="highlight-sh notranslate"><div
class="highlight"><pre><span></span>cargo<span class="w"> </span>install<span
class="w"> </span>taplo-cli<span class="w"> </span>--locked
</pre></div>
</div>
<blockquote>
-<div><p>Refer to the <a class="reference external"
href="https://taplo.tamasfe.dev/cli/installation/binary.html">Installation
section</a> on other ways to install it.</p>
+<div><p>Refer to the <a class="reference external"
href="https://taplo.tamasfe.dev/cli/installation/binary.html">taplo
installation documentation</a> for other ways to install it.</p>
</div></blockquote>
<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span>$<span class="w"> </span>taplo<span
class="w"> </span>--version
taplo<span class="w"> </span><span class="m">0</span>.9.0
@@ -846,18 +852,15 @@ taplo<span class="w"> </span><span class="m">0</span>.9.0
</section>
<section id="how-to-update-protobuf-gen-dependencies">
<h2>How to update protobuf/gen dependencies<a class="headerlink"
href="#how-to-update-protobuf-gen-dependencies" title="Link to this
heading">#</a></h2>
-<p>The prost/tonic code can be generated by running <code class="docutils
literal notranslate"><span class="pre">./regen.sh</span></code>, which in turn
invokes the Rust binary located in <code class="docutils literal
notranslate"><span class="pre">./gen</span></code></p>
+<p>For the <code class="docutils literal notranslate"><span
class="pre">proto</span></code> and <code class="docutils literal
notranslate"><span class="pre">proto-common</span></code> crates, the
prost/tonic code is generated by running their respective <code class="docutils
literal notranslate"><span class="pre">./regen.sh</span></code> scripts,
+which in turn invokes the Rust binary located in <code class="docutils literal
notranslate"><span class="pre">./gen</span></code>.</p>
<p>This is necessary after modifying the protobuf definitions or altering the
dependencies of <code class="docutils literal notranslate"><span
class="pre">./gen</span></code>, and requires a
valid installation of <a class="reference external"
href="https://github.com/protocolbuffers/protobuf#protocol-compiler-installation">protoc</a>
(see <a class="reference external"
href="https://datafusion.apache.org/contributor-guide/getting_started.html#protoc-installation">installation
instructions</a> for details).</p>
-<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span>./regen.sh
-</pre></div>
-</div>
-</section>
-<section id="how-to-add-edit-documentation-for-udfs">
-<h2>How to add/edit documentation for UDFs<a class="headerlink"
href="#how-to-add-edit-documentation-for-udfs" title="Link to this
heading">#</a></h2>
-<p>Documentations for the UDF documentations are generated from code (related
<a class="reference external"
href="https://github.com/apache/datafusion/issues/12740">github issue</a>). To
generate markdown run <code class="docutils literal notranslate"><span
class="pre">./update_function_docs.sh</span></code>.</p>
-<p>This is necessary after adding new UDF implementation or modifying existing
implementation which requires to update documentation.</p>
-<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span>./dev/update_function_docs.sh
+<div class="highlight-bash notranslate"><div
class="highlight"><pre><span></span><span class="c1"># From repository
root</span>
+<span class="c1"># proto-common</span>
+./datafusion/proto-common/regen.sh
+<span class="c1"># proto</span>
+./datafusion/proto/regen.sh
</pre></div>
</div>
</section>
@@ -911,13 +914,11 @@ valid installation of <a class="reference external"
href="https://github.com/pro
<nav class="bd-toc-nav page-toc"
aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-update-the-version-of-rust-used-in-ci-tests">How to update the
version of Rust used in CI tests</a></li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-add-a-new-scalar-function">How to add a new scalar
function</a></li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-add-a-new-aggregate-function">How to add a new aggregate
function</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-new-functions">Adding new functions</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-display-plans-graphically">How to display plans
graphically</a></li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-format-md-document">How to format <code class="docutils literal
notranslate"><span class="pre">.md</span></code> document</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-format-md-documents">How to format <code class="docutils literal
notranslate"><span class="pre">.md</span></code> documents</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-format-toml-files">How to format <code class="docutils literal
notranslate"><span class="pre">.toml</span></code> files</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-update-protobuf-gen-dependencies">How to update protobuf/gen
dependencies</a></li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#how-to-add-edit-documentation-for-udfs">How to add/edit documentation
for UDFs</a></li>
</ul>
</nav></div>
diff --git a/library-user-guide/functions/adding-udfs.html
b/library-user-guide/functions/adding-udfs.html
index b9390d08ef..9ea6ad1c66 100644
--- a/library-user-guide/functions/adding-udfs.html
+++ b/library-user-guide/functions/adding-udfs.html
@@ -942,8 +942,8 @@ for the same input.</p></li>
</section>
</section>
</section>
-<section id="adding-a-async-scalar-udf">
-<h2>Adding a Async Scalar UDF<a class="headerlink"
href="#adding-a-async-scalar-udf" title="Link to this heading">#</a></h2>
+<section id="adding-an-async-scalar-udf">
+<h2>Adding an Async Scalar UDF<a class="headerlink"
href="#adding-an-async-scalar-udf" title="Link to this heading">#</a></h2>
<p>An Async Scalar UDF allows you to implement user-defined functions that
support
asynchronous execution, such as performing network or I/O operations within the
UDF.</p>
@@ -1404,15 +1404,15 @@ for the same input.</p></li>
</div>
</section>
</section>
-<section id="adding-a-user-defined-table-function">
-<h2>Adding a User-Defined Table Function<a class="headerlink"
href="#adding-a-user-defined-table-function" title="Link to this
heading">#</a></h2>
+<section id="adding-a-table-udf">
+<h2>Adding a Table UDF<a class="headerlink" href="#adding-a-table-udf"
title="Link to this heading">#</a></h2>
<p>A User-Defined Table Function (UDTF) is a function that takes parameters
and returns a <code class="docutils literal notranslate"><span
class="pre">TableProvider</span></code>.</p>
<p>Because we’re returning a <code class="docutils literal notranslate"><span
class="pre">TableProvider</span></code>, in this example we’ll use the <code
class="docutils literal notranslate"><span class="pre">MemTable</span></code>
data source to represent a table.
This is a simple struct that holds a set of RecordBatches in memory and treats
them as a table. In your case, this would
be replaced with your own struct that implements <code class="docutils literal
notranslate"><span class="pre">TableProvider</span></code>.</p>
<p>While this is a simple example for illustrative purposes, UDTFs have a lot
of potential use cases. And can be
-particularly useful for reading data from external sources and interactive
analysis. For example, see the [example][4]
-for a working example that reads from a CSV file. As another example, you
could use the built-in UDTF <code class="docutils literal notranslate"><span
class="pre">parquet_metadata</span></code>
+particularly useful for reading data from external sources and interactive
analysis. See the <a class="reference external"
href="https://github.com/apache/datafusion/blob/main/datafusion-examples/examples/simple_udtf.rs">working
example</a>
+which reads from a CSV file. As another example, you could use the built-in
UDTF <code class="docutils literal notranslate"><span
class="pre">parquet_metadata</span></code>
in the CLI to read the metadata from a Parquet file.</p>
<div class="highlight-console notranslate"><div
class="highlight"><pre><span></span><span class="go">> select filename,
row_group_id, row_group_num_rows, row_group_bytes, stats_min, stats_max from
parquet_metadata('./benchmarks/data/hits.parquet') where column_id =
17 limit 10;</span>
<span
class="go">+--------------------------------+--------------+--------------------+-----------------+-----------+-----------+</span>
@@ -1626,7 +1626,7 @@ validation of the input <code class="docutils literal
notranslate"><span class="
</li>
</ul>
</li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-a-async-scalar-udf">Adding a Async Scalar UDF</a><ul class="nav
section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-an-async-scalar-udf">Adding an Async Scalar UDF</a><ul class="nav
section-nav flex-column">
<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>
@@ -1638,7 +1638,7 @@ 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="#registering-an-aggregate-udf">Registering an Aggregate UDF</a></li>
</ul>
</li>
-<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-a-user-defined-table-function">Adding a User-Defined Table
Function</a><ul class="nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link"
href="#adding-a-table-udf">Adding a Table UDF</a><ul class="nav section-nav
flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#writing-the-udtf">Writing the UDTF</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link"
href="#registering-and-using-the-udtf">Registering and Using the UDTF</a></li>
</ul>
diff --git a/library-user-guide/functions/index.html
b/library-user-guide/functions/index.html
index 042be06629..bd1d69736d 100644
--- a/library-user-guide/functions/index.html
+++ b/library-user-guide/functions/index.html
@@ -702,10 +702,10 @@
<ul>
<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-a-async-scalar-udf">Adding a Async 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#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-user-defined-table-function">Adding a
User-Defined Table Function</a></li>
+<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#adding-a-table-udf">Adding a Table UDF</a></li>
<li class="toctree-l2"><a class="reference internal"
href="adding-udfs.html#custom-expression-planning">Custom Expression
Planning</a></li>
</ul>
</li>
diff --git a/searchindex.js b/searchindex.js
index fe2df49ea4..2890f095cd 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles":{"!=":[[59,"op-neq"]],"!~":[[59,"op-re-not-match"]],"!~*":[[59,"op-re-not-match-i"]],"!~~":[[59,"id19"]],"!~~*":[[59,"id20"]],"#":[[59,"op-bit-xor"]],"%":[[59,"op-modulo"]],"&":[[59,"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"]],"*":[[59,"op-multiply"]],"+":[[59,"op-plus"]],"-":[[59,"op-minus"]],"/":[[59,"op-divide"]],"<":[[59,"op-lt"]],"<
[...]
\ No newline at end of file
+Search.setIndex({"alltitles":{"!=":[[59,"op-neq"]],"!~":[[59,"op-re-not-match"]],"!~*":[[59,"op-re-not-match-i"]],"!~~":[[59,"id19"]],"!~~*":[[59,"id20"]],"#":[[59,"op-bit-xor"]],"%":[[59,"op-modulo"]],"&":[[59,"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"]],"*":[[59,"op-multiply"]],"+":[[59,"op-plus"]],"-":[[59,"op-minus"]],"/":[[59,"op-divide"]],"<":[[59,"op-lt"]],"<
[...]
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]