Skip to main content
O VillageSQL Extension Framework (VEF) dá a uma extensão acesso ao funcionamento interno do banco de dados de uma forma definida. O PostgreSQL tem o framework de extensões mais maduro de todos os bancos de dados de código aberto, então esta página o usa como ponto de referência para lhe dar uma noção das capabilities atuais e planejadas do VEF. Você deve ler esta página como um retrato de um momento, e não como o estado final. O VEF muda a cada versão. Igualar exatamente as capabilities de hook do PostgreSQL não é o objetivo. MySQL e PostgreSQL são bancos de dados diferentes e as necessidades de seus usuários muitas vezes também são diferentes.

Capabilities específicas do VillageSQL

Parte do que o VEF oferece não tem nada com que se comparar nas tabelas abaixo, seja porque o MySQL é construído de forma diferente, seja porque os autores de extensões do VillageSQL precisavam de algo que o PostgreSQL não dá às suas próprias extensões.
  • Acesso ao keyringvsql::preview::keyring permite que uma extensão leia segredos do keyring do servidor.
  • Armazenamento de arquivos privado da extensãovsql::preview::storage dá a uma extensão um lugar gerenciado em disco. As extensões do PostgreSQL gerenciam seus próprios arquivos, sem uma API do lado do servidor para isso.
  • Handlers de protocolo alternativos#299 permitiria que uma extensão atendesse clientes por algo diferente do protocolo de rede do MySQL.
Duas outras capabilities existem por causa de como o MySQL é construído. A observação de escrita e flush do log binário (#297) e a observação de canais de replicação (#341) leem tanto o log binário do MySQL quanto seus canais de replicação multi-origem. O PostgreSQL cobre terreno comparável através da decodificação lógica no WAL e de sua maquinaria de assinaturas, que é um design diferente com propósito semelhante.

Como ler as tabelas

Toda linha que não está marcada como Disponível vincula a issue do GitHub onde esse trabalho é acompanhado e discutido. Qualquer coisa marcada como Disponível através de uma capability Preview requer vsql_allow_preview_extensions = ON — consulte Capabilities Preview.

C++ e Rust

Você pode escrever uma extensão do VillageSQL em C++ ou em Rust. O VEF é a capability do lado do servidor e cada SDK é uma ligação sobre ele; as ligações Rust são mais novas, então algumas capabilities são alcançáveis apenas a partir do C++ por enquanto.

Interfaces plugáveis

São essas interfaces, e não os hooks mais adiante, que servem de base para as extensões mais conhecidas do PostgreSQL. Elas também são a parte do framework que o VEF cobre de forma mais completa, então comece por aqui. on_init() e on_deinit() são executados dentro da extensão sem acesso ao servidor, diferentemente de _PG_init. Eles servem para configuração local, como escolher pointers de função específicos da CPU. A configuração que precisa falar com o servidor pertence à etapa de população de uma capability. vsql::preview::sql_query tem três limites que afetam qualquer extensão construída em torno de SPI. As instruções não aceitam parâmetros de vínculo, então os valores precisam ser escapados manualmente (#627). Uma extensão recebe uma única sessão em vez de sessões concorrentes (#626). E ela não pode ser chamada de dentro de uma VDF (#597).

Variáveis de hook

Um hook é um ponto em que o servidor entrega o controle a uma extensão no meio de uma instrução, permitindo que ela leia ou altere o que o servidor está prestes a fazer. O PostgreSQL declara um conjunto fixo deles como pointers de função globais; as tabelas abaixo cobrem todos eles, agrupados pela etapa do processamento da consulta em que cada um dispara.

Análise sintática e DDL

Planejador

Executor

As extensões do PostgreSQL que precisam de detalhe por operador o obtêm envolvendo o ExecutorRun_hook no nível do nó. No VEF isso é um trabalho separado, acompanhado em #340.

EXPLAIN

Autenticação e segurança

As extensões do PostgreSQL usam o ClientAuthentication_hook para dois trabalhos diferentes, e o VEF cobre um deles. Uma extensão pode implementar um método de autenticação próprio através da capability vsql::preview::auth, que é a base sobre a qual o vsql-oauth2 é construído. Ela ainda não consegue observar o resultado de uma autenticação que não tratou, que é como funcionam o auth_delay e os rastreadores de login malsucedido do PostgreSQL. Essa parte é a #464. O PostgreSQL mapeia identidades externas para contas de banco de dados através do pg_ident.conf, e não de um hook. O VEF cobre isso através da mesma capability vsql::preview::auth: set_active_roles() permite que um plugin de autenticação atribua papéis à sessão assim que ele resolve uma identidade externa, e auto_grant_roles() registra um callback que concede papéis automaticamente com base nas claims de um token. Ambos são declarados em villagesql/sdk/include/villagesql/preview/auth.h.

Registro em log

Inicialização e memória compartilhada

Gerenciador de funções

Conte para nós o que você precisa

Nós priorizamos este trabalho com base no que os autores de extensões pedem. Se algo acima está bloqueando uma extensão que você quer construir, adicione um 👍 à sua issue e descreva seu caso de uso em um comentário.