> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-86180b7b.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentación sobre funciones definidas por el usuario (UDFs)

# Funciones definidas por el usuario (UDFs)

export const ExperimentalBadge = () => {
  return <div className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Experimental feature. <u><a href="/docs/beta-and-experimental-features#experimental-features">Learn more.</a></u>
        </div>;
};

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Not supported in ClickHouse Cloud
        </div>;
};

export const PrivatePreviewBadge = () => {
  return <div className="privatePreviewBadge">
            <div className="privatePreviewIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M5.33301 6.66667V4.66667V4.66667C5.33301 3.194 6.52701 2 7.99967 2V2C9.47234 2 10.6663 3.194 10.6663 4.66667V4.66667V6.66667" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path d="M8.00033 9.33337V11.3334" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path fillRule="evenodd" clipRule="evenodd" d="M11.333 14H4.66634C3.92967 14 3.33301 13.4033 3.33301 12.6666V7.99996C3.33301 7.26329 3.92967 6.66663 4.66634 6.66663H11.333C12.0697 6.66663 12.6663 7.26329 12.6663 7.99996V12.6666C12.6663 13.4033 12.0697 14 11.333 14Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            {'Private preview in ClickHouse Cloud'}
        </div>;
};

<div id="udfs-user-defined-functions">
  # UDFs Funciones definidas por el usuario
</div>

ClickHouse admite varios tipos de funciones definidas por el usuario (UDFs):

* [Executable UDFs](#executable-user-defined-functions) inician un programa o script externo (Python, Bash, etc.) y envían bloques de datos a través de STDIN / STDOUT. Úselas para integrar código o herramientas existentes sin recompilar ClickHouse. Tienen una mayor sobrecarga por llamada en comparación con las opciones dentro del proceso y son más adecuadas para lógica más pesada o cuando se requiere un entorno de ejecución diferente.
* [SQL UDFs](#sql-user-defined-functions) se definen con `CREATE FUNCTION` únicamente en SQL. Se insertan o expanden en el plan de consulta (sin cambiar de proceso), lo que las hace ligeras e ideales para reutilizar lógica de expresiones o simplificar columnas calculadas complejas.
* [Experimental WebAssembly UDFs](#webassembly-user-defined-functions) ejecutan código compilado en WebAssembly dentro de un entorno aislado en el proceso del servidor. Ofrecen una menor sobrecarga por llamada que los ejecutables externos, con mejor aislamiento que las extensiones nativas, lo que las hace adecuadas para algoritmos personalizados escritos en lenguajes que pueden compilarse a WASM (p. ej., C/C++/Rust).

<div id="executable-user-defined-functions">
  ## Funciones ejecutables definidas por el usuario
</div>

<Note>
  Esta funcionalidad está disponible en vista previa privada en ClickHouse Cloud.
  Póngase en contacto con soporte de ClickHouse en [https://clickhouse.cloud/support](https://clickhouse.cloud/support) para obtener acceso.
</Note>

ClickHouse puede invocar cualquier programa ejecutable externo o script para procesar datos.

La configuración de las funciones ejecutables definidas por el usuario puede encontrarse en uno o varios archivos XML.
La ruta de la configuración se especifica en el parámetro [`user_defined_executable_functions_config`](/es/reference/settings/server-settings/settings#user_defined_executable_functions_config).

La configuración de una función contiene las siguientes opciones:

| Parámetro                     | Descripción                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | Obligatorio | Valor predeterminado   |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ---------------------- |
| `name`                        | Nombre de la función                                                                                                                                                                                                                                                                                                                                                                                                                                                          | Sí          | -                      |
| `command`                     | Nombre del script que se debe ejecutar, o comando si `execute_direct` es false                                                                                                                                                                                                                                                                                                                                                                                                | Sí          | -                      |
| `argument`                    | Descripción del argumento con el `type` y, opcionalmente, el `name` del argumento. Cada argumento se describe en un ajuste independiente. Es necesario especificar el nombre si los nombres de los argumentos forman parte de la serialización en un formato de función definida por el usuario como [Native](/es/reference/formats/Native) o [JSONEachRow](/es/reference/formats/JSON/JSONEachRow)                                                                           | Sí          | `c` + argument\_number |
| `format`                      | Un [formato](/es/reference/formats) en el que se pasan los argumentos al comando. Se espera que la salida del comando también use el mismo formato                                                                                                                                                                                                                                                                                                                            | Sí          | -                      |
| `return_type`                 | El tipo del valor devuelto                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Sí          | -                      |
| `return_name`                 | Nombre del valor devuelto. Es necesario especificar el nombre de retorno si forma parte de la serialización en un formato de función definida por el usuario como [Native](/es/reference/formats/Native) o [JSONEachRow](/es/reference/formats/JSON/JSONEachRow)                                                                                                                                                                                                              | Opcional    | `result`               |
| `type`                        | Un tipo ejecutable. Si `type` está establecido en `executable`, se inicia un único comando. Si está establecido en `executable_pool`, se crea un pool de comandos                                                                                                                                                                                                                                                                                                             | Sí          | -                      |
| `max_command_execution_time`  | Tiempo máximo de ejecución, en segundos, para procesar un bloque de datos. Este ajuste solo es válido para comandos `executable_pool`                                                                                                                                                                                                                                                                                                                                         | Opcional    | `10`                   |
| `command_termination_timeout` | Tiempo, en segundos, durante el cual un comando debe finalizar después de que se cierre su pipe. Transcurrido ese tiempo, se envía `SIGTERM` al proceso que ejecuta el comando                                                                                                                                                                                                                                                                                                | Opcional    | `10`                   |
| `command_read_timeout`        | Tiempo de espera para leer datos del stdout del comando, en milisegundos                                                                                                                                                                                                                                                                                                                                                                                                      | Opcional    | `10000`                |
| `command_write_timeout`       | Tiempo de espera para escribir datos en el stdin del comando, en milisegundos                                                                                                                                                                                                                                                                                                                                                                                                 | Opcional    | `10000`                |
| `pool_size`                   | Tamaño del pool de comandos                                                                                                                                                                                                                                                                                                                                                                                                                                                   | Opcional    | `16`                   |
| `send_chunk_header`           | Controla si se debe enviar el recuento de filas antes de enviar un fragmento de datos al proceso                                                                                                                                                                                                                                                                                                                                                                              | Opcional    | `false`                |
| `execute_direct`              | Si `execute_direct` = `1`, `command` se buscará dentro de la carpeta user\_scripts especificada por [user\_scripts\_path](/es/reference/settings/server-settings/settings#user_scripts_path). Se pueden especificar argumentos adicionales del script usando espacios en blanco como separador. Ejemplo: `script_name arg1 arg2`. Si `execute_direct` = `0`, `command` se pasa como argumento a `bin/sh -c`                                                                   | Opcional    | `1`                    |
| `lifetime`                    | Intervalo de recarga de una función, en segundos. Si está establecido en `0`, la función no se recarga                                                                                                                                                                                                                                                                                                                                                                        | Opcional    | `0`                    |
| `deterministic`               | Si la función es determinista (devuelve el mismo resultado para la misma entrada)                                                                                                                                                                                                                                                                                                                                                                                             | Opcional    | `false`                |
| `stderr_reaction`             | Cómo manejar la salida de stderr del comando. Valores: `none` (ignorar), `log` (registrar inmediatamente todo stderr), `log_first` (registrar los primeros 4 KiB después de finalizar), `log_last` (registrar los últimos 4 KiB después de finalizar), `throw` (lanzar una excepción inmediatamente ante cualquier salida en stderr). Al usar `log_first` o `log_last` con un código de salida distinto de cero, el contenido de stderr se incluye en el mensaje de excepción | Opcional    | `log_last`             |
| `check_exit_code`             | Si es true, ClickHouse comprobará el código de salida del comando. Un código de salida distinto de cero provoca una excepción                                                                                                                                                                                                                                                                                                                                                 | Opcional    | `true`                 |

El comando debe leer los argumentos desde `STDIN` y escribir el resultado en `STDOUT`. El comando debe procesar los argumentos de forma iterativa. Es decir, después de procesar un fragmento de argumentos, debe esperar al siguiente fragmento.

<div id="executable-user-defined-functions">
  ## Funciones ejecutables definidas por el usuario
</div>

<div id="examples">
  ## Ejemplos
</div>

<div id="udf-inline">
  ### UDF a partir de un script inline
</div>

Cree `test_function_sum` manualmente, estableciendo `execute_direct` en `0` mediante una configuración XML o YAML.

<Tabs>
  <Tab title="XML">
    Archivo `test_function.xml` (`/etc/clickhouse-server/test_function.xml` con la configuración de rutas predeterminada).

    ```xml title="/etc/clickhouse-server/test_function.xml" theme={null}
    <functions>
        <function>
            <type>executable</type>
            <name>test_function_sum</name>
            <return_type>UInt64</return_type>
            <argument>
                <type>UInt64</type>
                <name>lhs</name>
            </argument>
            <argument>
                <type>UInt64</type>
                <name>rhs</name>
            </argument>
            <format>TabSeparated</format>
            <command>cd /; clickhouse-local --input-format TabSeparated --output-format TabSeparated --structure 'x UInt64, y UInt64' --query "SELECT x + y FROM table"</command>
            <execute_direct>0</execute_direct>
            <deterministic>true</deterministic>
        </function>
    </functions>
    ```
  </Tab>

  <Tab title="YAML">
    Archivo `test_function.yaml` (`/etc/clickhouse-server/test_function.yaml` con la configuración de rutas predeterminada).

    ```yml title="/etc/clickhouse-server/test_function.yaml" theme={null}
    functions:
      type: executable
      name: test_function_sum
      return_type: UInt64
      argument:
        - type: UInt64
          name: lhs
        - type: UInt64
          name: rhs
      format: TabSeparated
      command: 'cd /; clickhouse-local --input-format TabSeparated --output-format TabSeparated --structure ''x UInt64, y UInt64'' --query "SELECT x + y FROM table"'
      execute_direct: 0
      deterministic: true
    ```
  </Tab>
</Tabs>

<br />

```sql title="Query" theme={null}
SELECT test_function_sum(2, 2);
```

```text title="Result" theme={null}
┌─test_function_sum(2, 2)─┐
│                       4 │
└─────────────────────────┘
```

<div id="udf-python">
  ### UDF a partir de un script de Python
</div>

En este ejemplo, creamos una UDF que lee un valor de `STDIN` y lo devuelve como una cadena.

Cree `test_function` mediante una configuración XML o YAML.

<Tabs>
  <Tab title="XML">
    Archivo `test_function.xml` (`/etc/clickhouse-server/test_function.xml` con la ruta predeterminada).

    ```xml title="/etc/clickhouse-server/test_function.xml" theme={null}
    <functions>
        <function>
            <type>executable</type>
            <name>test_function_python</name>
            <return_type>String</return_type>
            <argument>
                <type>UInt64</type>
                <name>value</name>
            </argument>
            <format>TabSeparated</format>
            <command>test_function.py</command>
        </function>
    </functions>
    ```
  </Tab>

  <Tab title="YAML">
    Archivo `test_function.yaml` (`/etc/clickhouse-server/test_function.yaml` con la ruta predeterminada).

    ```yml title="/etc/clickhouse-server/test_function.yaml" theme={null}
    functions:
      type: executable
      name: test_function_python
      return_type: String
      argument:
        - type: UInt64
          name: value
      format: TabSeparated
      command: test_function.py
    ```
  </Tab>
</Tabs>

<br />

Cree el archivo de script `test_function.py` dentro de la carpeta `user_scripts` (`/var/lib/clickhouse/user_scripts/test_function.py` con la ruta predeterminada).

```python theme={null}
#!/usr/bin/python3

import sys

if __name__ == '__main__':
    for line in sys.stdin:
        print("Value " + line, end='')
        sys.stdout.flush()
```

```sql title="Query" theme={null}
SELECT test_function_python(toUInt64(2));
```

```text title="Result" theme={null}
┌─test_function_python(2)─┐
│ Value 2                 │
└─────────────────────────┘
```

<div id="udf-stdin">
  ### Leer dos valores de `STDIN` y devolver su suma como un objeto JSON
</div>

Cree `test_function_sum_json` con argumentos con nombre y el formato [JSONEachRow](/es/reference/formats/JSON/JSONEachRow) mediante configuración XML o YAML.

<Tabs>
  <Tab title="XML">
    Archivo `test_function.xml` (`/etc/clickhouse-server/test_function.xml` con la ruta predeterminada).

    ```xml title="/etc/clickhouse-server/test_function.xml" theme={null}
    <functions>
        <function>
            <type>executable</type>
            <name>test_function_sum_json</name>
            <return_type>UInt64</return_type>
            <return_name>result_name</return_name>
            <argument>
                <type>UInt64</type>
                <name>argument_1</name>
            </argument>
            <argument>
                <type>UInt64</type>
                <name>argument_2</name>
            </argument>
            <format>JSONEachRow</format>
            <command>test_function_sum_json.py</command>
        </function>
    </functions>
    ```
  </Tab>

  <Tab title="YAML">
    Archivo `test_function.yaml` (`/etc/clickhouse-server/test_function.yaml` con la ruta predeterminada).

    ```yml title="/etc/clickhouse-server/test_function.yaml" theme={null}
    functions:
      type: executable
      name: test_function_sum_json
      return_type: UInt64
      return_name: result_name
      argument:
        - type: UInt64
          name: argument_1
        - type: UInt64
          name: argument_2
      format: JSONEachRow
      command: test_function_sum_json.py
    ```
  </Tab>
</Tabs>

<br />

Cree el archivo de script `test_function_sum_json.py` dentro de la carpeta `user_scripts` (`/var/lib/clickhouse/user_scripts/test_function_sum_json.py` con la ruta predeterminada).

```python theme={null}
#!/usr/bin/python3

import sys
import json

if __name__ == '__main__':
    for line in sys.stdin:
        value = json.loads(line)
        first_arg = int(value['argument_1'])
        second_arg = int(value['argument_2'])
        result = {'result_name': first_arg + second_arg}
        print(json.dumps(result), end='\n')
        sys.stdout.flush()
```

```sql title="Query" theme={null}
SELECT test_function_sum_json(2, 2);
```

```text title="Result" theme={null}
┌─test_function_sum_json(2, 2)─┐
│                            4 │
└──────────────────────────────┘
```

<div id="udf-parameters-in-command">
  ### Usar parámetros en la opción `command`
</div>

Las funciones definidas por el usuario ejecutables pueden aceptar parámetros constantes configurados en la opción `command` (esto solo funciona para funciones definidas por el usuario de tipo `executable`).
También requiere la opción `execute_direct` para garantizar que no exista ninguna vulnerabilidad por expansión de argumentos del shell.

<Tabs>
  <Tab title="XML">
    Archivo `test_function_parameter_python.xml` (`/etc/clickhouse-server/test_function_parameter_python.xml` con la ruta predeterminada).

    ```xml title="/etc/clickhouse-server/test_function_parameter_python.xml" theme={null}
    <functions>
        <function>
            <type>executable</type>
            <execute_direct>true</execute_direct>
            <name>test_function_parameter_python</name>
            <return_type>String</return_type>
            <argument>
                <type>UInt64</type>
            </argument>
            <format>TabSeparated</format>
            <command>test_function_parameter_python.py {test_parameter:UInt64}</command>
        </function>
    </functions>
    ```
  </Tab>

  <Tab title="YAML">
    Archivo `test_function_parameter_python.yaml` (`/etc/clickhouse-server/test_function_parameter_python.yaml` con la ruta predeterminada).

    ```yml title="/etc/clickhouse-server/test_function_parameter_python.yaml" theme={null}
    functions:
      type: executable
      execute_direct: true
      name: test_function_parameter_python
      return_type: String
      argument:
        - type: UInt64
      format: TabSeparated
      command: test_function_parameter_python.py {test_parameter:UInt64}
    ```
  </Tab>
</Tabs>

<br />

Cree el archivo de script `test_function_parameter_python.py` dentro de la carpeta `user_scripts` (`/var/lib/clickhouse/user_scripts/test_function_parameter_python.py` con la ruta predeterminada).

```python theme={null}
#!/usr/bin/python3

import sys

if __name__ == "__main__":
    for line in sys.stdin:
        print("Parameter " + str(sys.argv[1]) + " value " + str(line), end="")
        sys.stdout.flush()
```

```sql title="Query" theme={null}
SELECT test_function_parameter_python(1)(2);
```

```text title="Result" theme={null}
┌─test_function_parameter_python(1)(2)─┐
│ Parameter 1 value 2                  │
└──────────────────────────────────────┘
```

<div id="udf-shell-script">
  ### UDF desde un script de shell
</div>

En este ejemplo, creamos un script de shell que multiplica cada valor por 2.

<Tabs>
  <Tab title="XML">
    Archivo `test_function_shell.xml` (`/etc/clickhouse-server/test_function_shell.xml` con la ruta predeterminada).

    ```xml title="/etc/clickhouse-server/test_function_shell.xml" theme={null}
    <functions>
        <function>
            <type>executable</type>
            <name>test_shell</name>
            <return_type>String</return_type>
            <argument>
                <type>UInt8</type>
                <name>value</name>
            </argument>
            <format>TabSeparated</format>
            <command>test_shell.sh</command>
        </function>
    </functions>
    ```
  </Tab>

  <Tab title="YAML">
    Archivo `test_function_shell.yaml` (`/etc/clickhouse-server/test_function_shell.yaml` con la ruta predeterminada).

    ```yml title="/etc/clickhouse-server/test_function_shell.yaml" theme={null}
    functions:
      type: executable
      name: test_shell
      return_type: String
      argument:
        - type: UInt8
          name: value
      format: TabSeparated
      command: test_shell.sh
    ```
  </Tab>
</Tabs>

<br />

Cree el archivo de script `test_shell.sh` dentro de la carpeta `user_scripts` (`/var/lib/clickhouse/user_scripts/test_shell.sh` con la ruta predeterminada).

```bash title="/var/lib/clickhouse/user_scripts/test_shell.sh" theme={null}
#!/bin/bash

while read read_data;
    do printf "$(expr $read_data \* 2)\n";
done
```

```sql title="Query" theme={null}
SELECT test_shell(number) FROM numbers(10);
```

```text title="Result" theme={null}
    ┌─test_shell(number)─┐
 1. │ 0                  │
 2. │ 2                  │
 3. │ 4                  │
 4. │ 6                  │
 5. │ 8                  │
 6. │ 10                 │
 7. │ 12                 │
 8. │ 14                 │
 9. │ 16                 │
10. │ 18                 │
    └────────────────────┘
```

<div id="error-handling">
  ## Manejo de errores
</div>

Algunas funciones pueden lanzar una excepción si los datos no son válidos.
En ese caso, la consulta se cancela y se devuelve un mensaje de error al cliente.
En el procesamiento distribuido, cuando se produce una excepción en uno de los servidores, los demás servidores también intentan cancelar la consulta.

<div id="evaluation-of-argument-expressions">
  ## Evaluación de las expresiones de los argumentos
</div>

En casi todos los lenguajes de programación, puede que uno de los argumentos no se evalúe para ciertos operadores.
Normalmente, se trata de los operadores `&&`, `||` y `?:`.
En ClickHouse, los argumentos de las funciones (operadores) siempre se evalúan.
Esto se debe a que se evalúan partes enteras de las columnas de una sola vez, en lugar de calcular cada fila por separado.

<div id="performing-functions-for-distributed-query-processing">
  ## Ejecución de funciones para el procesamiento distribuido de consultas
</div>

En el procesamiento distribuido de consultas, se realizan en servidores remotos tantas etapas del procesamiento de la consulta como sea posible, y el resto de las etapas (la fusión de resultados intermedios y todo lo posterior) se realiza en el servidor solicitante.

Esto significa que las funciones pueden ejecutarse en distintos servidores.
Por ejemplo, en la consulta `SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),`

* si una `distributed_table` tiene al menos dos segmentos, las funciones 'g' y 'h' se ejecutan en servidores remotos, y la función 'f' se ejecuta en el servidor solicitante.
* si una `distributed_table` tiene solo un segmento, todas las funciones 'f', 'g' y 'h' se ejecutan en el servidor de ese segmento.

El resultado de una función normalmente no depende del servidor en el que se ejecute. Sin embargo, a veces esto sí es importante.
Por ejemplo, las funciones que trabajan con diccionarios usan el diccionario que existe en el servidor en el que se están ejecutando.
Otro ejemplo es la función `hostName`, que devuelve el nombre del servidor en el que se está ejecutando, para poder hacer `GROUP BY` por servidores en una consulta `SELECT`.

Si una función de una consulta se ejecuta en el servidor solicitante, pero necesita ejecutarla en servidores remotos, puede envolverla en una función de agregación 'any' o añadirla a una clave de `GROUP BY`.

<div id="sql-user-defined-functions">
  ## Funciones SQL definidas por el usuario
</div>

Las funciones personalizadas a partir de expresiones lambda se pueden crear mediante la [sentencia CREATE FUNCTION](/es/reference/statements/create/function). Para eliminar estas funciones, utilice la [sentencia DROP FUNCTION](/es/reference/statements/drop#drop-function).

<div id="webassembly-user-defined-functions">
  ## Funciones definidas por el usuario de WebAssembly
</div>

Las funciones definidas por el usuario (UDFs) de WebAssembly (WASM) permiten ejecutar código personalizado compilado a WebAssembly dentro del proceso del servidor de ClickHouse.

<div id="quick-start">
  ### Inicio rápido
</div>

Habilite la compatibilidad experimental con WebAssembly en la configuración de ClickHouse:

```xml theme={null}
<clickhouse>
    <allow_experimental_webassembly_udf>true</allow_experimental_webassembly_udf>
</clickhouse>
```

Inserte el módulo WASM compilado en la tabla del sistema:

```sql theme={null}
INSERT INTO system.webassembly_modules (name, code)
SELECT 'my_module', base64Decode('AGFzbQEAAAA...');
```

Cree una función con su módulo WASM:

```sql theme={null}
CREATE FUNCTION my_function
LANGUAGE WASM
ABI ROW_DIRECT
FROM 'my_module'
ARGUMENTS (x UInt32, y UInt32)
RETURNS UInt32;
```

Utilice la función en sus consultas:

```sql theme={null}
SELECT my_function(10, 20);
```

<div id="more-information">
  ### Más información
</div>

Consulta la documentación sobre [funciones definidas por el usuario de WebAssembly](/es/reference/functions/regular-functions/wasm_udf) para más información.

<div id="related-content">
  ## Contenido relacionado
</div>

* [Funciones definidas por el usuario en ClickHouse Cloud](https://clickhouse.com/blog/user-defined-functions-clickhouse-udfs)
