Pular para o conteúdo principal
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 keyring — vsql::preview::keyring permite que uma extensão leia segredos do keyring do servidor.
  • Armazenamento de páginas do InnoDB — vsql::preview::storage permite que uma extensão crie segmentos do InnoDB e leia e escreva suas páginas através do buffer pool, com redo logging.
  • Handlers de protocolo alternativos — #299 permitiria que uma extensão atendesse clientes por algo diferente do protocolo de rede do MySQL.
Duas outras capabilities estão planejadas 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, na linha ou na nota abaixo da tabela. Qualquer coisa marcada como Disponível através de uma capability Preview requer vsql_allow_preview_extensions = ON — consulte Capabilities Preview. vsql::preview::auth e vsql::preview::statement_event também estão disponíveis apenas para uma extensão compilada contra a ABI de desenvolvimento (-DVSQL_USE_DEV_ABI=ON).

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 com as capabilities declaradas pela extensão ativas: on_init() depois que o servidor as populou, e on_deinit() antes de ele as despopular, de modo que um hook pode ler uma variável de sistema registrada. Eles também servem para configuração local, como escolher pointers de função específicos da CPU. 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 prepare papéis para a sessão assim que ele resolve uma identidade externa, e roles_mode() registra um callback, consultado novamente a cada login, que decide se o servidor apenas ativa os papéis preparados, também os concede, ou sincroniza as concessões da conta para corresponder (um DEFAULT ROLE fixado pelo operador sobrevive a uma sincronização). 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.