MergeTree sem de fato construí-las ou armazená-las. Elas existem apenas dentro da sessão atual e são listadas pelo EXPLAIN WHATIF.
O EXPLAIN WHATIF estima projeções hipotéticas normais (ordenadas): quantas marcas e linhas a leitura da projeção acessaria em uma consulta e se o otimizador a escolheria em vez da tabela base. Nem toda projeção é estimada — projeções de agregação e projeções com uma cláusula WHERE são dois exemplos disso —, e um candidato não estimado é listado com o respectivo motivo. Consulte EXPLAIN WHATIF para ver a lista completa. As projeções hipotéticas da sessão também ficam visíveis em system.hypothetical_projections.
CREATE HYPOTHETICAL PROJECTION
ALTER TABLE ... ADD PROJECTION, e a definição é validada exatamente da mesma forma, de modo que uma projeção rejeitada aqui também não poderia ter sido materializada. Nada é construído ou gravado — apenas a descrição é armazenada, na sessão atual.
name— nome da projeção; deve ser único dentro de(database, table)nesta sessão e não pode colidir com uma projeção real existente na tabela.- O corpo aceita as mesmas formas de uma projeção real: uma projeção de reordenação com
ORDER BY, uma de agregação comGROUP BY, uma filtrada comWHERE, ou a forma de índice de projeçãoINDEX <expression> TYPE <projection_index_type>. WITH SETTINGS (...)é aceito e preservado; as configurações ficam visíveis emsystem.hypothetical_projections.
MergeTree em um banco de dados Atomic (ela precisa ter um UUID), porque o armazenamento da sessão indexa as entradas pelo UUID da tabela. As restrições impostas por um ADD PROJECTION real também valem aqui: tabelas com UNIQUE KEY, modos de mesclagem não-Ordinary sob deduplicate_merge_projection_mode = throw, MergeTree com sintaxe antiga e discos imutáveis são rejeitados.
Exemplo
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL INDEXES faz o inverso.
Escopo e ciclo de vida
- Projeções hipotéticas existem apenas na sessão atual — não são visíveis para outras sessões e são descartadas quando a sessão termina.
- Definir ou remover uma delas não constrói nenhuma projeção e nunca afeta as queries comuns feitas na tabela.
- Inspecione as projeções hipotéticas da sessão atual por meio de
system.hypothetical_projections.
Privilégios necessários
CREATE HYPOTHETICAL PROJECTION exige o privilégio ALTER ADD PROJECTION na tabela — o mesmo exigido pelo ALTER TABLE ... ADD PROJECTION real — porque valida a definição em relação às colunas da tabela. EXPLAIN WHATIF exige SELECT em nível de coluna nas colunas da projeção para estimá-la, como já ocorre com CREATE HYPOTHETICAL INDEX.
DROP HYPOTHETICAL PROJECTION exige o mesmo privilégio, de modo que nomear uma tabela em um drop não revele se ela existe ou é elegível, e EXPLAIN WHATIF verifica novamente esse privilégio antes de validar uma definição armazenada em relação à tabela. DROP ALL HYPOTHETICAL PROJECTIONS não nomeia nenhuma tabela e não exige privilégio algum.