Skip to main content
Duas extensões de referência são fornecidas no repositório do SDK Rust: um exemplo mínimo que contém apenas uma função e um tipo personalizado completo com aritmética, ordenação e hashing. Código-fonte: examples/ em vsql-rust-sdk

vsql_rot13 — Extensão Apenas com Função

A extensão Rust mais simples possível: uma VDF que recebe uma STRING e retorna uma STRING. Uso:

Estrutura de Diretórios

Implementação

Arquivo: src/lib.rs
Padrões principais:
  • As VDFs recebem &[InValue] e retornam VdfReturn, sendo ambos enums seguros do Rust
  • NULL é uma variante de primeira classe em ambos os lados; faça o pattern-match diretamente
  • A macro extension! gera os pontos de entrada em C que o servidor chama no momento do carregamento
  • func! declara a assinatura SQL; os tipos de argumento e de retorno usam villagesql::Type::*

Manifesto

Arquivo: manifest.json

vsql_rational — Tipo Personalizado com Aritmética

Um tipo personalizado completo: números racionais armazenados como (numerator, denominator) em forma reduzida, com funções aritméticas, ordenação e hashing. Uso:

Formato de Armazenamento Binário

rational armazena 16 bytes (little-endian):
  • Bytes 0–7: numerador (i64)
  • Bytes 8–15: denominador (i64)
Os valores são sempre armazenados em forma reduzida (GCD = 1) com um denominador positivo.

Funções do Sistema de Tipos

Arquivo: src/lib.rs O tipo registra quatro operações: encode (string → bytes), decode (bytes → string), compare (para ORDER BY) e hash (para indexação).

Implementações de VDF

As VDFs que recebem um tipo personalizado recebem InValue::Custom(&[u8]) e decodificam os bytes por conta própria:

Registro

A macro extension! registra tanto o tipo quanto suas funções em uma única declaração:
Padrões principais:
  • villagesql::custom!("name") referencia um tipo personalizado como argumento ou retorno
  • custom_type! registra o tipo junto com suas funções encode/decode/compare/hash
  • default: "0/1" é o padrão intrínseco: o servidor chama encode() nessa string na inicialização do tipo, portanto ela deve ser um valor válido
  • persisted_length deve corresponder ao comprimento em bytes que encode() retorna
  • deterministic: true permite que o otimizador dobre chamadas constantes

Padrões Principais de Implementação


Testes

Ambos os exemplos usam MTR (o MySQL Test Runner) assim como as extensões em C++:
Gere ou atualize os resultados esperados com --record.

Próximos Passos

Criando Extensões em Rust

Instalação do SDK, compilação e a macro extension!

Tipos Personalizados em Rust

Aprofundamento em encode, decode, compare e hash

Referência da API Rust

InValue, VdfReturn e a superfície da macro

Código-Fonte dos Exemplos

Código-fonte completo de vsql_rot13 e vsql_rational