

# Usar PL/Rust para escrever funções do PostgreSQL na linguagem Rust
<a name="PostgreSQL.Concepts.General.Using.PL_Rust"></a>

O PL/Rust é uma extensão de linguagem Rust confiável para o PostgreSQL. Você pode usá-lo para procedimentos armazenados, funções e outros códigos processuais que podem ser chamados do SQL. A extensão de linguagem PL/Rust está disponível nas seguintes versões:
+ RDS para PostgreSQL 17.1 e versões 17 posteriores
+ RDS para PostgreSQL 16.1 e versões 16 posteriores
+ RDS para PostgreSQL 15.2-R2 e versões 15 posteriores
+ RDS para PostgreSQL 14.9 e versões 14 posteriores
+ RDS para PostgreSQL 13.12 e versões 13 posteriores

Para obter mais informações, consulte [PL/Rust](https://github.com/tcdi/plrust#readme) no GitHub.

**Topics**
+ [Configurar o PL/Rust](#PL_Rust-setting-up)
+ [Criar funções com o PL/Rust](#PL_Rust-create-function)
+ [Usar caixas com PL/Rust](#PL_Rust-crates)
+ [Limitações do PL/Rust](#PL_Rust-limitations)

## Configurar o PL/Rust
<a name="PL_Rust-setting-up"></a>

Para instalar a extensão plrust da instância de banco de dados, adicione o plrust ao parâmetro `shared_preload_libraries` no grupo de parâmetros de banco de dados associado à instância de banco de dados. Com a extensão plrust instalada, é possível criar funções. 

Para modificar o parâmetro `shared_preload_libraries`, a instância de banco de dados deve estar associada a um grupo de parâmetros personalizado. Para obter mais informações sobre como criar um grupo de parâmetros de banco de dados personalizado, consulte [Grupos de parâmetros para Amazon RDS](USER_WorkingWithParamGroups.md).

É possível instalar a extensão plrust usando o Console de gerenciamento da AWS ou a AWS CLI.

As etapas a seguir pressupõem que a instância de banco de dados esteja associada a um grupo de parâmetros de banco de dados personalizado.

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

**Instalar a extensão plrust no parâmetro `shared_preload_libraries`**

Conclua as etapas a seguir usando uma conta que seja membro do grupo (perfil) `rds_superuser`.

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon RDS em [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. No painel de navegação, escolha **Bancos de dados**.

1. Escolha o nome da instância de banco de dados para mostrar os detalhes.

1. Abra a guia **Configuração** da instância de banco de dados e encontre o link do grupo de parâmetros da instância de banco de dados.

1. Clique no link para abrir os parâmetros personalizados associados à instância de banco. 

1. No campo **Parâmetros**, digite `shared_pre` para encontrar o parâmetro **`shared_preload_libraries`**.

1. Selecione **Edit parameters** (Editar parâmetros) para acessar os valores das propriedades.

1. Adicione plrust à lista no campo **Valores**. Use uma vírgula para separar itens na lista de valores.

1. Reinicialize a instância de banco de dados para que a alteração no parâmetro `shared_preload_libraries` tenha efeito. A reinicialização inicial pode exigir mais tempo para ser concluída.

1. Quando a instância estiver disponível, verifique se plrust foi inicializado. Use `psql` para se conectar à instância de banco de dados e execute o comando a seguir.

   ```
   SHOW shared_preload_libraries;
   ```

   O resultado deve ser semelhante ao seguinte:

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

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

**Instalar a extensão plrust no parâmetro shared\$1preload\$1libraries**

Conclua as etapas a seguir usando uma conta que seja membro do grupo (perfil) `rds_superuser`.

1. Utilize o comando [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) da AWS CLI para adicionar plrust ao 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 o comando [reboot-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/reboot-db-instance) da AWS CLI para reinicializar a instância de banco de dados e inicializar a biblioteca plrust. A reinicialização inicial pode exigir mais tempo para ser concluída.

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

1. Quando a instância estiver disponível, é possível verificar se plrust foi inicializado. Use `psql` para se conectar à instância de banco de dados e execute o comando a seguir.

   ```
   SHOW shared_preload_libraries;
   ```

   O resultado deve ser semelhante ao seguinte:

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

## Criar funções com o PL/Rust
<a name="PL_Rust-create-function"></a>

O PL/Rust compilará a função como uma biblioteca dinâmica, a carregará e a executará.

A função do Rust a seguir filtra múltiplos de uma 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;
```

## Usar caixas com PL/Rust
<a name="PL_Rust-crates"></a>

No RDS para PostgreSQL versões 16.3-R2 e posterior, 15.7-R2 e versões 15 posteriores, 14.12-R2 e versões 14 posteriores e 13.15-R2 e versões 13 posteriores, o PL/Rust é compatível com caixas adicionais:
+ `url` 
+ `regex` 
+ `serde` 
+ `serde_json` 

No RDS para PostgreSQL versões 15.5-R2 e posterior, 14.10-R2 e versões 14 posteriores e 13.13-R2 e versões 13 posteriores, o PL/Rust é compatível com duas caixas adicionais:
+ `croaring-rs` 
+ `num-bigint` 

A partir das versões 15.4, 14.9 e 13.12 do Amazon RDS para PostgreSQL, o PL/Rust comporta as seguintes caixas:
+ `aes` 
+ `ctr` 
+ `rand` 

Somente os recursos padrão são comportados para essas caixas. As novas versões do RDS para PostgreSQL poderão conter versões de caixa atualizadas, ao passo que as mais antigas podem deixar de ter suporte.

Siga as práticas recomendadas para realizar uma atualização de versão principal e testar se suas funções do PL/Rust são compatíveis com a nova versão principal. Para obter mais informações, consulte a publicação de blog [Práticas recomendadas para atualizar o Amazon RDS para versões principais e secundárias do PostgreSQL](https://aws.amazon.com/blogs/database/best-practices-for-upgrading-amazon-rds-to-major-and-minor-versions-of-postgresql/) e [Atualizar o mecanismo de banco de dados PostgreSQL para Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html) no “Guia do usuário do Amazon RDS”. 

Exemplos de uso de dependências ao criar uma função PL/Rust estão disponíveis em [Usar dependências](https://tcdi.github.io/plrust/use-plrust.html#use-dependencies).

## Limitações do PL/Rust
<a name="PL_Rust-limitations"></a>

Por padrão, os usuários do banco de dados não podem usar PL/Rust. Para fornecer acesso ao PL/Rust, conecte-se como usuário com o privilégio rds\$1superuser e execute o seguinte comando:

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