

# Uso de PL/Rust para escribir funciones de PostgreSQL en lenguaje Rust
<a name="PostgreSQL.Concepts.General.Using.PL_Rust"></a>

PL/Rust es una extensión del lenguaje Rust de confianza para PostgreSQL. Puede usarlo para procedimientos almacenados, funciones y otro código de procedimiento que se pueda llamar desde SQL. La extensión de lenguaje PL/Rust está disponible en las siguientes versiones:
+ RDS para PostgreSQL 17.1 y otras versiones 17 posteriores
+ RDS para PostgreSQL 16.1 y versiones 16 posteriores
+ RDS para PostgreSQL, 15.2-R2 y versiones 15 posteriores
+ RDS para PostgreSQL, 14.9 y versiones 14 posteriores
+ RDS para PostgreSQL, 13.12 y versiones 13 posteriores

Para obtener más información, consulte [PL/Rust](https://github.com/tcdi/plrust#readme) en GitHub.

**Topics**
+ [Configuración de PL/Rust](#PL_Rust-setting-up)
+ [Creación de funciones con PL/Rust](#PL_Rust-create-function)
+ [Uso de cajas con PL/Rust](#PL_Rust-crates)
+ [Limitaciones de PL/Rust](#PL_Rust-limitations)

## Configuración de PL/Rust
<a name="PL_Rust-setting-up"></a>

Para instalar la extensión plrust en la instancia de base de datos, agregue plrust al parámetro `shared_preload_libraries` en el grupo de parámetros de base de datos asociado con la instancia de base de datos. Con la extensión plrust instalada, puede crear funciones. 

Para modificar el parámetro `shared_preload_libraries`, la instancia de base de datos debe asociarse al grupo de parámetros personalizado. Para obtener información sobre la creación de un grupo de parámetros de base de datos personalizado, consulte [Grupos de parámetros para Amazon RDS](USER_WorkingWithParamGroups.md).

Puede instalar la extensión plrust mediante la Consola de administración de AWS o la AWS CLI.

En los pasos siguientes se supone que la instancia de base de datos está asociada a un grupo de parámetros de base de datos personalizado.

### Consola
<a name="PL_Rust-setting-up.CON"></a>

**Instalar la extensión plrust en el parámetro `shared_preload_libraries`**

Realice los siguientes pasos con una cuenta que sea miembro del grupo `rds_superuser` (rol).

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon RDS en [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. En el panel de navegación, elija **Databases** (Bases de datos).

1. Elija el nombre de la instancia de base de datos para ver los detalles.

1. Abra la pestaña **Configuración** de la instancia de base de datos y busque el enlace del grupo de parámetros de instancias de base de datos.

1. Elija el enlace para abrir los parámetros personalizados asociados a la instancia de base de datos. 

1. En el campo de búsqueda **Parámetros**, escriba `shared_pre` para buscar el parámetro `shared_preload_libraries`.

1. Seleccione **Edit parameters** (Editar parámetros) para acceder a los valores de las propiedades.

1. Añada plrust a la lista en el campo **Valores**. Utilice una coma para separar los elementos de la lista de valores.

1. Reinicie la instancia de base de datos para que los cambios en el parámetro `shared_preload_libraries` surtan efecto. El reinicio inicial puede requerir tiempo adicional para completarse.

1. Cuando la instancia esté disponible, compruebe si se ha inicializado plrust. Use `psql` para conectarse a la instancia de base de datos y ejecute el siguiente comando.

   ```
   SHOW shared_preload_libraries;
   ```

   El resultado debería tener un aspecto similar al siguiente:

   ```
   shared_preload_libraries 
   --------------------------
   rdsutils,plrust
   (1 row)
   ```

### AWS CLI
<a name="PL_Rust-setting-up-CLI"></a>

**Instale la extensión plrust en el parámetro shared\$1preload\$1libraries.**

Realice los siguientes pasos con una cuenta que sea miembro del grupo `rds_superuser` (rol).

1. Use el comando [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) de AWS CLI para añadir plrust al parámetro `shared_preload_libraries`.

   ```
   aws rds modify-db-parameter-group \
      --db-parameter-group-name custom-param-group-name \
      --parameters "ParameterName=shared_preload_libraries,ParameterValue=plrust,ApplyMethod=pending-reboot" \
      --region aws-region
   ```

1. Use el comando [reboot-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/reboot-db-instance) de AWS CLI para reiniciar la instancia de base de datos e inicializar la biblioteca plrust. El reinicio inicial puede requerir tiempo adicional para completarse.

   ```
   aws rds reboot-db-instance \
       --db-instance-identifier your-instance \
       --region aws-region
   ```

1. Cuando la instancia esté disponible, compruebe si se ha inicializado plrust. Use `psql` para conectarse a la instancia de base de datos y ejecute el siguiente comando.

   ```
   SHOW shared_preload_libraries;
   ```

   El resultado debería tener un aspecto similar al siguiente:

   ```
   shared_preload_libraries
   --------------------------
   rdsutils,plrust
   (1 row)
   ```

## Creación de funciones con PL/Rust
<a name="PL_Rust-create-function"></a>

PL/Rust compilará la función como biblioteca dinámica, la cargará y la ejecutará.

La siguiente función de Rust filtra los múltiplos de una matriz.

```
postgres=> CREATE LANGUAGE plrust;
CREATE EXTENSION
```

```
CREATE OR REPLACE FUNCTION filter_multiples(a BIGINT[], multiple BIGINT) RETURNS BIGINT[]
    IMMUTABLE STRICT
    LANGUAGE PLRUST AS
$$
    Ok(Some(a.into_iter().filter(|x| x.unwrap() % multiple != 0).collect()))
$$;
        
WITH gen_values AS (
SELECT ARRAY(SELECT * FROM generate_series(1,100)) as arr)
SELECT filter_multiples(arr, 3)
from gen_values;
```

## Uso de cajas con PL/Rust
<a name="PL_Rust-crates"></a>

En RDS para PostgreSQL versiones 16.3-R2 y posteriores, 15.7-R2 y versiones 15 posteriores, 14.12-R2 y versiones 14 posteriores y 13.15-R2 y versiones 13 y posteriores, PL/Rust admite cajas adicionales:
+ `url` 
+ `regex` 
+ `serde` 
+ `serde_json` 

En RDS para PostgreSQL versiones 15.5-R2 y posteriores, 14.10-R2 y versiones 14 posteriores y 13.13-R2 y versiones 13 posteriores, PL/Rust admite dos cajas adicionales:
+ `croaring-rs` 
+ `num-bigint` 

A partir de las versiones 15.4, 14.9 y 13.12 de Amazon RDS para PostgreSQL, PL/Rust admite las siguientes cajas:
+ `aes` 
+ `ctr` 
+ `rand` 

Estas cajas solo admiten las funciones predeterminadas. Es posible que las nuevas versiones de RDS para PostgreSQL contengan versiones actualizadas de las cajas y que las versiones anteriores de las cajas ya no sean compatibles.

Siga las prácticas recomendadas para realizar una actualización de una versión principal y comprobar si las funciones de PL/Rust son compatibles con la nueva versión principal. Para obtener más información, consulte el blog [Best practices for upgrading Amazon RDS to major and minor versions of PostgreSQL](https://aws.amazon.com/blogs/database/best-practices-for-upgrading-amazon-rds-to-major-and-minor-versions-of-postgresql/) y [Actualización del motor de base de datos de PostgreSQL para Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html) en la Guía del usuario de Amazon RDS. 

Encontrará ejemplos del uso de dependencias al crear una función de PL/Rust en [Use dependencies](https://tcdi.github.io/plrust/use-plrust.html#use-dependencies).

## Limitaciones de PL/Rust
<a name="PL_Rust-limitations"></a>

De forma predeterminada, los usuarios de bases de datos no pueden usar PL/Rust. Para proporcionar acceso a PL/Rust, conéctese como usuario con el privilegio rds\$1superuser y ejecute el siguiente comando:

```
postgres=> GRANT USAGE ON LANGUAGE PLRUST TO user;
```