mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-30 15:26:52 +00:00
## Summary - Complete the SQL reference: `ATTACH DATABASE`, the `CHANGES` clause, and `dedupe()`/`duplicate_pairs()` (verified against current sophon source; these were recently renamed from `vector_dedup`/`vector_duplicate_pairs`). Fix the blob-column default-projection claim and add the previously undocumented `blob_descriptor()`. - Enrich the gated Functions draft (still `.mintignore`'d, pre-release): chained Functions over blob outputs, GPU-produced blobs, Secrets, multi-input/output binding, `code=[module]` packaging. - Upgrade the materialized-view and computed-column auto-refresh drafts with precise, verified catch-up semantics, and add the missing `ALTER MATERIALIZED VIEW` / `CREATE ... WITH(...)` sections (also gated — the automatic-refresh scheduler is still dev/staging-only). - Thread one running example (video frames → GPU extract/caption → dedup → auto-refreshing materialized view) through Functions, materialized views, and the LeRobotDataset integration guide instead of a separate tutorial. - Rename "LanceDB OSS"/"OSS" to "LanceDB Embedded"/"Embedded" throughout (52 files); activate the existing availability-comparison mechanism on `basics/offerings.mdx` for a full feature-by-feature comparison table.
115 lines
3.7 KiB
Plaintext
115 lines
3.7 KiB
Plaintext
---
|
|
title: "Function"
|
|
sidebarTitle: "Function"
|
|
description: "CREATE FUNCTION, SHOW FUNCTIONS, and DROP FUNCTION."
|
|
icon: function
|
|
keywords: ["create function", "drop function", "show functions", "sql", "udf"]
|
|
---
|
|
|
|
<Badge color="red">Enterprise</Badge> [SQL runs in LanceDB Enterprise.](/sql)
|
|
|
|
## CREATE FUNCTION {#create}
|
|
|
|
```sql
|
|
CREATE FUNCTION f(x int64) RETURNS int64
|
|
LANGUAGE python
|
|
AS 'def f(x): return x * 2'
|
|
WITH (pip = 'numpy==1.26.4', python_version = '3.11')
|
|
```
|
|
|
|
A function takes more than one parameter; each one binds a separate column
|
|
or literal where the function is called:
|
|
|
|
```sql
|
|
CREATE FUNCTION ratio(numerator float64, denominator float64) RETURNS float64
|
|
LANGUAGE python
|
|
AS 'def ratio(numerator, denominator): return numerator / denominator'
|
|
```
|
|
|
|
Parameter and result types are Arrow type names, not SQL ones: `int64`,
|
|
`float64`, `utf8`, `bool`, `date32`, and lists such as `list<float32>` or
|
|
`fixed_size_list<float32, 768>`. `BIGINT` is refused. A parameter accepts nulls
|
|
unless it is declared `NOT NULL`.
|
|
|
|
The body is Python source. Its dependencies are declared with it and are part
|
|
of the **immutable function version**. Changing one produces a new version
|
|
rather than altering the registered one, so a column filled by an earlier
|
|
version is unaffected.
|
|
|
|
| Option | |
|
|
| --- | --- |
|
|
| `pip` | pip requirements for the worker environment |
|
|
| `conda` | conda packages instead of pip |
|
|
| `conda_channels` | channels in priority order; requires `conda` |
|
|
| `python_version` | worker Python version; `3.12` when omitted, whatever Python you send the statement from |
|
|
| `gpu` | `'true'` when every execution needs a GPU |
|
|
|
|
**Errors and limits**
|
|
|
|
| | |
|
|
| --- | --- |
|
|
| `LANGUAGE` other than `python` | refused |
|
|
| `pip` and `conda` together | refused (pick one) |
|
|
| `conda_channels` without `conda` | refused |
|
|
| `gpu` set to anything but `'true'` | refused |
|
|
| An empty body | refused |
|
|
| Any other option | refused, and the message lists what is supported |
|
|
|
|
<Note>
|
|
**Enterprise job type:** `create_function`. Registration returns a job because
|
|
the function is baked into an image before the version becomes usable.
|
|
</Note>
|
|
|
|
## Call it {#call}
|
|
|
|
Once registered, a function is callable by name in any query, the same as a
|
|
built-in scalar function:
|
|
|
|
```sql
|
|
SELECT id, f(x) AS doubled FROM my_table
|
|
```
|
|
|
|
This is also the fastest way to check a new registration before binding it to
|
|
a column: call it over a few rows, or over literal arguments, before
|
|
committing to [a computed column](/sql/ddl/table#computed-column) that fills
|
|
from it.
|
|
|
|
## SHOW FUNCTIONS {#show}
|
|
|
|
```sql
|
|
SHOW FUNCTIONS
|
|
```
|
|
|
|
Lists registered functions and their versions. Since a version is immutable
|
|
and a column pins the version that fills it, this is how you find which
|
|
versions are still in use before dropping one.
|
|
|
|
## DROP FUNCTION {#drop}
|
|
|
|
```sql
|
|
DROP FUNCTION embed WITH (version = '1')
|
|
DROP FUNCTION IF EXISTS embed WITH (version = '1')
|
|
DROP FUNCTION embed WITH (version = '1', cascade = 'true')
|
|
```
|
|
|
|
`version` is required: a function is a set of immutable versions, and
|
|
dropping is always of one specific version, never "the function" as a whole.
|
|
|
|
<Warning>
|
|
Without `cascade = 'true'`, dropping a version that a column still pins fails
|
|
rather than breaking that column silently. Passing it drops the version and
|
|
lets columns pinned to it stop refreshing. They keep their last-filled
|
|
values, per [Guarantees](/basics/guarantees#jobs).
|
|
</Warning>
|
|
|
|
## What to read next {#next}
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="Function" icon="function" href="/management/function">
|
|
Registering one from the SDK, and diagnosing environment mismatches.
|
|
</Card>
|
|
<Card title="Computed columns" icon="table-columns" href="/feature-engineering/add-computed-column">
|
|
Filling a column with a function instead of an expression.
|
|
</Card>
|
|
</CardGroup>
|