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::keyringpermite que uma extensão leia segredos do keyring do servidor. - Armazenamento de arquivos privado da extensão —
vsql::preview::storagedá 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.
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.

