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 páginas do InnoDB —
vsql::preview::storagepermite 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.
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.