Pular para o conteúdo principal

Descrição

pg_clickhouse é uma extensão do PostgreSQL que permite executar consultas remotamente em bancos de dados do ClickHouse, incluindo um foreign data wrapper. É compatível com o PostgreSQL 13 ou superior e o ClickHouse 23 ou superior.

Primeiros passos

A forma mais simples de testar o pg_clickhouse é usar a [imagem Docker], que contém a imagem Docker padrão do PostgreSQL com as extensões pg_clickhouse e [re2][extensão re2]:
Consulte o tutorial para começar a importar tabelas do ClickHouse e delegar consultas ao ClickHouse.

Uso

Política de versionamento

pg_clickhouse segue o [Versionamento Semântico] em suas versões públicas.
  • A versão principal é incrementada para mudanças na API
  • A versão secundária é incrementada para mudanças de SQL compatíveis com versões anteriores
  • A versão de correção é incrementada para mudanças apenas no binário
Depois de instalado, o PostgreSQL acompanha duas variações da versão:
  • A versão da biblioteca (definida por PG_MODULE_MAGIC no PostgreSQL 18 e superiores) inclui a versão semântica completa, visível na saída da função pgch_version() ou da função pg_get_loaded_modules() do Postgres.
  • A versão da extensão (definida no arquivo de controle) inclui apenas as versões principal e secundária, visíveis na tabela pg_catalog.pg_extension, na saída da função pg_available_extension_versions() e em \dx pg_clickhouse.
Na prática, isso significa que uma versão que incrementa a versão de correção, por exemplo, de v0.1.0 para v0.1.1, beneficia todos os bancos de dados que carregaram v0.1 e não precisam executar ALTER EXTENSION para aproveitar a atualização. Já uma versão que incrementa a versão secundária ou principal virá acompanhada de scripts de atualização SQL, e todos os bancos de dados existentes que contêm a extensão deverão executar ALTER EXTENSION pg_clickhouse UPDATE para aproveitar a atualização.

Referência de SQL DDL

As expressões SQL DDL a seguir usam o pg_clickhouse.

CREATE EXTENSION

Use CREATE EXTENSION para adicionar a extensão pg_clickhouse a um banco de dados:
Use WITH SCHEMA para instalá-la em um esquema específico (recomendado):

ALTER EXTENSION

Use ALTER EXTENSION para modificar a extensão pg_clickhouse. Exemplos:
  • Depois de instalar uma nova versão do pg_clickhouse, use a cláusula UPDATE:
  • Use SET SCHEMA para mover a extensão para um novo esquema:

DROP EXTENSION

Use DROP EXTENSION para remover pg_clickhouse de um banco de dados:
Este comando falha se houver objetos que dependam de pg_clickhouse. Use a cláusula CASCADE para removê-los também:

CREATE SERVER

Use CREATE SERVER para criar um servidor externo que se conecta a um servidor ClickHouse. Exemplo:
As opções compatíveis são:
  • driver: O driver de conexão do ClickHouse a ser usado: “binary” ou “http”. Obrigatório.
  • compression: Compressão do protocolo nativo para o driver “binary”, uma entre “none”, “lz4” ou “zstd”. O padrão é “lz4”. Ignorada pelo driver “http”.
  • dbname: O banco de dados do ClickHouse a ser usado na conexão. O padrão é “default”.
  • fetch_size: Tamanho aproximado do lote em bytes para HTTP streaming. Os lotes são divididos nos limites das linhas. O padrão é 50000000 (50 MB). 0 desativa o streaming e armazena a resposta completa em buffer. Tabelas estrangeiras podem substituir esse valor.
  • host: O nome do host do servidor ClickHouse. O padrão é “localhost”;
  • port: A porta à qual se conectar no servidor ClickHouse. Os padrões são os seguintes:
    • 9440 se driver for “binary” e host for um host do ClickHouse Cloud
    • 9004 se driver for “binary” e host não for um host do ClickHouse Cloud
    • 8443 se driver for “http” e host for um host do ClickHouse Cloud
    • 8123 se driver for “http” e host não for um host do ClickHouse Cloud
  • min_tls_version: Versão mínima do protocolo TLS a ser negociada em conexões que usam TLS. Uma entre TLSv1, TLSv1.1, TLSv1.2 ou TLSv1.3. O padrão é o mínimo da própria biblioteca TLS. Aplica-se a ambos os drivers.
  • secure: Controla o uso de TLS na conexão. Uma entre:
    • auto (padrão): usa TLS quando host é um host do ClickHouse Cloud ou port é uma porta segura; caso contrário, plaintext.
    • on (ou true/yes/1): sempre usa TLS. O padrão de port é 8443 (“http”) ou 9440 (“binary”).
    • off (ou false/no/0): nunca usa TLS. O padrão de port é 8123 (“http”) ou 9000 (“binary”).

ALTER SERVER

Use ALTER SERVER para modificar um servidor externo. Exemplo:
As opções são as mesmas do CREATE SERVER.

DROP SERVER

Use o DROP SERVER para remover um servidor externo:
Esse comando falha se houver quaisquer outros objetos que dependam do servidor. Use CASCADE para também remover essas dependências:

CREATE USER MAPPING

Use CREATE USER MAPPING para mapear um usuário do PostgreSQL a um usuário do ClickHouse. Por exemplo, para mapear o usuário atual do PostgreSQL ao usuário remoto do ClickHouse ao se conectar ao servidor externo taxi_srv:
As opções compatíveis são:
  • user: O nome do usuário do ClickHouse. O valor padrão é “default”.
  • password: A senha do usuário do ClickHouse.

ALTER USER MAPPING

Use ALTER USER MAPPING para alterar a definição de um mapeamento de usuário:
As opções são as mesmas de CREATE USER MAPPING.

DROP USER MAPPING

Use o comando DROP USER MAPPING para remover um mapeamento de usuário:

IMPORT FOREIGN SCHEMA

Use IMPORT FOREIGN SCHEMA para importar todas as tabelas definidas em um banco de dados do ClickHouse como tabelas estrangeiras em um esquema do PostgreSQL:
Use LIMIT TO para restringir a importação a tabelas específicas:
Use EXCEPT para excluir tabelas:
pg_clickhouse recuperará uma lista de todas as tabelas no banco de dados ClickHouse especificado (“demo” nos exemplos acima), recuperará as definições das colunas de cada uma e executará comandos CREATE FOREIGN TABLE para criar as tabelas externas. As colunas serão definidas usando os tipos de dados suportados e, quando isso for detectável, as opções suportadas por CREATE FOREIGN TABLE.
Preservação de maiúsculas e minúsculas em identificadores importadosIMPORT FOREIGN SCHEMA executa quote_identifier() nos nomes de tabelas e colunas que importa, o que coloca aspas duplas em identificadores com caracteres maiúsculos ou espaços em branco. Portanto, esses nomes de tabelas e colunas devem ser colocados entre aspas duplas em consultas do PostgreSQL. Nomes com apenas letras minúsculas e sem espaços em branco não precisam ser colocados entre aspas.Por exemplo, dada esta tabela do ClickHouse:
IMPORT FOREIGN SCHEMA cria esta tabela externa:
Portanto, as consultas devem usar aspas de forma adequada, por exemplo,
Para criar objetos com nomes diferentes ou totalmente em minúsculas (e, portanto, sem distinção entre maiúsculas e minúsculas), use CREATE FOREIGN TABLE.

CREATE FOREIGN TABLE

Use CREATE FOREIGN TABLE para criar uma tabela externa capaz de consultar dados de um banco de dados do ClickHouse:
As opções de tabela compatíveis são:
  • database: O nome do banco de dados remoto. O padrão é o banco de dados definido para o foreign server.
  • fetch_size: Tamanho aproximado do batch, em bytes, para HTTP streaming. Substitui o fetch_size no nível do servidor. O padrão é 50000000 (50 MB). 0 desabilita o streaming e armazena a resposta completa em buffer.
  • table_name: O nome da tabela remota. O padrão é o nome especificado para a foreign table.
  • engine: O [engine da tabela] usado pela tabela ClickHouse. Para CollapsingMergeTree() e AggregatingMergeTree(), o pg_clickhouse aplica automaticamente os parâmetros às expressões de função executadas na tabela.
Use o tipo de dado apropriado para o tipo de dado remoto do ClickHouse de cada coluna. As opções de coluna compatíveis são:
  • column_name: O nome da coluna no lado do ClickHouse, usado em vez do nome do atributo do PostgreSQL ao reconstruir consultas e inserções. Útil para mapear nomes de colunas do PostgreSQL em minúsculas e sem aspas para colunas do ClickHouse sensíveis a maiúsculas e minúsculas, por exemplo:
  • AggregateFunction: O nome da função de agregação aplicada a uma coluna do [tipo AggregateFunction]. Mapeie o tipo de dado para o tipo do ClickHouse passado à função e especifique o nome da função de agregação por meio da opção de coluna apropriada; o pg_clickhouse acrescentará automaticamente Merge à função de agregação usada para avaliar a coluna.
  • SimpleAggregateFunction: O nome da função de agregação aplicada a uma coluna do [tipo SimpleAggregateFunction]. Mapeie o tipo de dado para o tipo do ClickHouse passado à função e especifique o nome da função de agregação por meio da opção de coluna apropriada.

ALTER FOREIGN TABLE

Use ALTER FOREIGN TABLE para alterar a definição de uma tabela externa:
As opções de tabela e coluna suportadas são as mesmas do CREATE FOREIGN TABLE.

DROP FOREIGN TABLE

Use DROP FOREIGN TABLE para remover uma tabela externa:
Este comando falha se houver objetos que dependam da tabela externa. Use a cláusula CASCADE para removê-los também:

Referência de SQL DML

As expressões DML em SQL abaixo podem usar pg_clickhouse. Os exemplos dependem destas tabelas do ClickHouse:

EXPLAIN

O comando EXPLAIN funciona como esperado, mas a opção VERBOSE aciona a emissão da consulta “Remote SQL” do ClickHouse:
Esta consulta é repassada ao ClickHouse por meio de um nó de plano “Foreign Scan”, o SQL remoto.

SELECT

Use a instrução SELECT para executar consultas em tabelas pg_clickhouse, assim como em qualquer outra tabela:
pg_clickhouse procura transferir a execução da consulta para o ClickHouse o máximo possível, incluindo funções de agregação. Use EXPLAIN para determinar o nível de pushdown. Para a consulta acima, por exemplo, toda a execução é transferida para o ClickHouse
pg_clickhouse também faz o pushdown de junções para tabelas do mesmo servidor remoto:
Fazer join com uma tabela local gerará consultas menos eficientes sem um ajuste criterioso. Neste exemplo, fazemos uma cópia local da tabela nodes e fazemos join com ela em vez de usar a tabela remota:
Nesse caso, podemos delegar uma parte maior da agregação ao ClickHouse, agrupando por node_id em vez da coluna local e, depois, fazer join com a tabela de lookup:
O nó “Foreign Scan” agora faz o pushdown da agregação por node_id, reduzindo o número de linhas que precisam ser trazidas de volta para o Postgres de 1000 (todas elas) para apenas 8, uma para cada nó.

PREPARE, EXECUTE, DEALLOCATE

A partir da v0.1.2, o pg_clickhouse oferece suporte a consultas parametrizadas, criadas principalmente com o comando PREPARE:
Use EXECUTE normalmente para executar uma instrução preparada:
A execução parametrizada impede que o http driver converta corretamente os fusos horários de DateTime em versões do ClickHouse anteriores à 25.8, quando o [bug subjacente] foi [corrigido]. Observe que, às vezes, o PostgreSQL usa um plano de consulta parametrizado mesmo sem usar PREPARE. Para consultas que exijam conversão precisa de fuso horário, e quando a atualização para a versão 25.8 ou posterior não for uma opção, use o driver binário.
O pg_clickhouse faz o pushdown das agregações, como de costume, como pode ser visto na saída detalhada de EXPLAIN:
Observe que ele enviou os valores de data completos, e não os placeholders de parâmetro. Isso se aplica às cinco primeiras requisições, como descrito nas notas do PostgreSQL [sobre PREPARE]. Na sexta execução, ele envia os [parâmetros de consulta] no estilo {param:type} do ClickHouse: parameters:
Use DEALLOCATE para liberar uma instrução preparada:

INSERT

Use o comando INSERT para inserir valores em uma tabela remota do ClickHouse:

COPY

Use o comando COPY para inserir um lote de linhas em uma tabela remota do ClickHouse:
⚠️ Limitações da API de Batch pg_clickhouse ainda não implementou suporte à API de inserção em lote do FDW do PostgreSQL. Portanto, COPY atualmente usa instruções INSERT para inserir registros. Isso será aprimorado em uma versão futura.

LOAD

Use LOAD para carregar a biblioteca compartilhada pg_clickhouse:
Normalmente, n’ao é necessário usar LOAD, pois o Postgres carregará pg_clickhouse automaticamente na primeira vez em que qualquer um dos seus recursos (funções, foreign tables etc.) for usado. A única situação em que pode ser útil usar LOAD pg_clickhouse é para SET os parâmetros do pg_clickhouse antes de executar consultas que dependam deles.

SET

Use SET para definir os parâmetros personalizados de configuração do pg_clickhouse.

pg_clickhouse.session_settings

O parâmetro pg_clickhouse.session_settings configura as [configurações do ClickHouse] a serem aplicadas às consultas subsequentes. Exemplo:
O padrão é join_use_nulls 1, group_by_use_nulls 1, final 1. Defina como uma string vazia para voltar às configurações do servidor ClickHouse.
A sintaxe é uma lista de pares chave/valor delimitada por vírgulas, separados por um ou mais espaços. As chaves devem corresponder às [configurações do ClickHouse]. Escape os espaços, as vírgulas e as barras invertidas nos valores com uma barra invertida:
Ou use valores entre aspas simples para não precisar escapar espaços e vírgulas; considere usar dollar quoting para evitar a necessidade de usar aspas duplas:
Se a legibilidade for importante e você precisar definir muitas configurações, use várias linhas, por exemplo:
Algumas configurações serão ignoradas nos casos em que possam interferir na operação do próprio pg_clickhouse. Entre elas estão:
  • date_time_output_format: o driver HTTP exige que seja “iso”
  • format_tsv_null_representation: o driver HTTP exige o valor padrão
  • output_format_tsv_crlf_end_of_line o driver HTTP exige o valor padrão
Fora isso, o pg_clickhouse não valida as configurações, apenas as repassa ao ClickHouse em cada consulta. Assim, ele oferece suporte a todas as configurações de cada versão do ClickHouse. Observe que o pg_clickhouse deve ser carregado antes de definir pg_clickhouse.session_settings; use [pré-carregamento de biblioteca compartilhada] ou simplesmente use um dos objetos da extensão para garantir que ele seja carregado.

pg_clickhouse.pushdown_regex

O parâmetro pg_clickhouse.pushdown_regex controla se o pg_clickhouse faz pushdown de funções e operadores de expressão regular. Isso ocorre por padrão; defina esse parâmetro como false para impedir esse pushdown:
Consulte Expressões regulares para obter mais detalhes.

ALTER ROLE

Use o comando SET de ALTER ROLE’s para pré-carregar o pg_clickhouse e/ou SET seus parâmetros para roles específicos:
Use o comando RESET de ALTER ROLE para redefinir o pré-carregamento do pg_clickhouse e/ou os parâmetros:

Pré-carregamento

Se toda ou quase toda conexão com o Postgres precisar usar o pg_clickhouse, considere usar o [pré-carregamento de biblioteca compartilhada] para carregá-lo automaticamente:

session_preload_libraries

Carrega a biblioteca compartilhada a cada nova conexão com o PostgreSQL:
Útil para aproveitar as atualizações sem reiniciar o servidor: basta se reconectar. Também pode ser configurado para usuários ou roles específicos por meio de ALTER ROLE.

shared_preload_libraries

Carrega a biblioteca compartilhada no processo principal do PostgreSQL durante a inicialização:
Útil para economizar memória e reduzir a sobrecarga em cada sessão, mas exige que o cluster seja reiniciado quando a biblioteca for atualizada.

Tipos de dados

O pg_clickhouse mapeia os seguintes tipos de dados do ClickHouse para tipos de dados do PostgreSQL. IMPORT FOREIGN SCHEMA usa o primeiro tipo do PostgreSQL para a coluna ao importar colunas; tipos adicionais podem ser usados em instruções CREATE FOREIGN TABLE:
ClickHousePostgreSQLObservações
Boolboolean
Datedate
Date32date
DateTimetimestamptz
Decimalnumeric
Float32real
Float64double precision
IPv4inet
IPv6inet
Int16smallint
Int32integer
Int64bigint
Int8smallint
JSONjsonb, json
Stringtext, bytea
UInt16integer
UInt32bigint
UInt64bigintErro para valores > máximo de BIGINT
UInt8smallint
UUIDuuid
Notas e detalhes adicionais vêm a seguir.

BYTEA

O ClickHouse não oferece um equivalente ao tipo BYTEA do PostgreSQL, mas permite que quaisquer bytes sejam armazenados no tipo String. Em geral, strings do ClickHouse devem ser mapeadas para o tipo TEXT do PostgreSQL, mas ao trabalhar com dados binários, mapeie-as para BYTEA. Exemplo:
Essa consulta SELECT final produzirá:
Observe que, se houver bytes nulos nas colunas do ClickHouse, uma tabela estrangeira que utilize colunas TEXT não exibirá os valores corretos:
Saída:
Observe que as linhas dois e três contêm valores truncados. Isso ocorre porque o PostgreSQL depende de strings terminadas em nul e não oferece suporte a nuls em suas strings. A tentativa de inserir valores binários em colunas TEXT será bem-sucedida e funcionará conforme esperado:
As colunas de texto estarão corretas:
Mas lê-los como BYTEA não funcionará:
Em geral, use colunas TEXT apenas para strings codificadas e colunas BYTEA apenas para dados binários, e nunca alterne entre elas.

Referência de funções e operadores

Funções

Essas funções fornecem a interface para executar consultas em um banco de dados ClickHouse.

clickhouse_raw_query

Conecte-se a um serviço ClickHouse por meio de sua interface HTTP, execute uma única consulta e desconecte-se. O segundo argumento opcional especifica uma string de conexão cujo padrão é host=localhost port=8123. Os parâmetros de conexão compatíveis são:
  • host: O host ao qual se conectar; obrigatório.
  • port: A porta HTTP à qual se conectar; o padrão é 8123, a menos que host seja um host do ClickHouse Cloud, caso em que o padrão é 8443
  • dbname: O nome do banco de dados ao qual se conectar.
  • username: O nome de usuário com o qual se conectar; o padrão é default
  • password: A senha usada para autenticação; o padrão é não usar senha
Por padrão, nenhuma role tem acesso EXECUTE a esta função; considere GRANT conceder acesso somente a roles que realmente precisem executar consultas ad hoc no ClickHouse, por exemplo, uma role administrativa dedicada do ClickHouse: Útil para consultas que não retornam registros, mas as consultas que retornam valores serão retornadas como um único valor de texto:

Funções com pushdown

pg_clickhouse faz pushdown de um subconjunto das funções nativas do PostgreSQL usadas em condicionais (cláusulas HAVING e WHERE). Esse subconjunto corresponde aos equivalentes no ClickHouse, da seguinte forma:

Operadores de pushdown

  • Fatiamento de Array (arr[L:U]): arraySlice
  • @> (array contém): hasAll
  • <@ (array contido em): hasAll
  • && (sobreposição de arrays): hasAny
  • ~ (correspondência com regexp): match
  • !~ (sem correspondência com regexp): match
  • ~* (regexp sem distinção entre maiúsculas e minúsculas, sem correspondência): match
  • !~* (regexp sem distinção entre maiúsculas e minúsculas, sem correspondência): match
  • ->> (extrai elemento de JSON/JSONB como texto): sintaxe de subcoluna
  • -> (extrai JSON/JSONB): toJSONString + sintaxe de subcoluna

Funções personalizadas

Estas funções personalizadas criadas por pg_clickhouse permitem o pushdown de consultas externas para determinadas funções do ClickHouse que não têm equivalentes no PostgreSQL. Se alguma dessas funções não puder ser processada via pushdown, será gerada uma exceção.

Pushdown de extensões

O pg_clickhouse reconhece funções de algumas extensões principais e de terceiros, fazendo o pushdown delas para seus equivalentes no ClickHouse.

re2

Todas as funções da [extensão re2] são convertidas 1:1 para o ClickHouse:

intarray

Uma função intarray tem pushdown para o ClickHouse:

fuzzystrmatch

Duas funções fuzzystrmatch podem ser executadas no ClickHouse:

Casts com pushdown

O pg_clickhouse faz pushdown de casts como CAST(x AS bigint) para tipos de dados compatíveis. Para tipos incompatíveis, o pushdown falha; se x, neste exemplo, for um UInt64 do ClickHouse, o ClickHouse se recusará a converter o valor. Para fazer pushdown de casts para tipos de dados incompatíveis, o pg_clickhouse fornece as funções a seguir. Elas geram uma exceção no PostgreSQL se não forem executadas com pushdown.

Funções agregadas com pushdown

Estas funções agregadas do PostgreSQL oferecem suporte a pushdown para o ClickHouse.

Agregações personalizadas

Estas funções de agregação personalizadas criadas por pg_clickhouse fornecem pushdown de consultas externas para algumas funções de agregação do ClickHouse sem equivalentes no PostgreSQL. Se alguma dessas funções não puder ter pushdown, será gerada uma exceção.

Agregações ordered-set com pushdown

Estas [funções de agregação ordered-set] são mapeadas para [funções de agregação paramétricas] do ClickHouse, passando o argumento direto como parâmetro e as expressões de ORDER BY como argumentos. Por exemplo, esta consulta PostgreSQL:
Corresponde à seguinte consulta do ClickHouse:
Observe que os sufixos não padrão DESC e NULLS FIRST de ORDER BY não têm suporte e gerarão um erro.

Funções de janela com pushdown

Estas [funções de janela] do PostgreSQL podem ser submetidas a pushdown para o ClickHouse com cláusulas OVER (PARTITION BY ... ORDER BY ...), incluindo especificações de frame quando aplicável. As funções de classificação (row_number, rank, dense_rank, ntile, cume_dist, percent_rank) omitem a cláusula de frame durante o pushdown porque o ClickHouse rejeita especificações de frame nessas funções.

Notas de compatibilidade

Expressões regulares

Embora o pg_clickhouse faça pushdown de expressões regulares para equivalentes no ClickHouse quando pg_clickhouse.pushdown_regex é true (o padrão), e se esforce para garantir um nível básico de compatibilidade, esteja ciente das diferenças entre os dois e de como o pg_clickhouse as trata.
  • O PostgreSQL oferece suporte a [Expressões Regulares POSIX], enquanto o ClickHouse oferece suporte a Expressões Regulares RE2. Fique atento às diferenças de comportamento: use RE2 quando a expressão regular for avaliada pelo ClickHouse (por exemplo, em uma cláusula WHERE) e POSIX quando ela for avaliada pelo Postgres (por exemplo, em uma cláusula SELECT).
  • pg_clickhouse aplica as [flags do Postgres] prefixando-as à expressão regular do ClickHouse dentro de (?). Por exemplo:
    Passa a ser
  • As únicas flags compatíveis com ambos e, portanto, que podem ser usadas quando interpretadas pelo ClickHouse são:
    FlagComoObservações
    iicorrespondência sem diferenciar maiúsculas de minúsculas
    mm-s^ e $ correspondem ao início/fim da linha, além do início/fim do texto
    nm-salias do Postgres para m
    p-snão permitir que . e [^x] correspondam a \n
    sspermitir que . e [^x] correspondam a \n
    tsintaxe estrita, ignorado
    wmcorrespondência parcial inversa sensível a quebras de linha
    O RE2 oferece suporte apenas a estas flags; não use nenhuma outra [flags do Postgres].
  • Esta tabela resume os efeitos das várias flags (e da ausência de flag, que é o mesmo que s) na correspondência de quebras de linha e terminações de linha. Observe que, no Postgres, m e p impedem que classes de caracteres negadas ([^xyz]) correspondam a uma quebra de linha, enquanto os equivalentes no ClickHouse não. Fora isso, os comportamentos são os mesmos no ClickHouse e no Postgres:
    Padrão aplicado a a\nbPostgresClickHouseIgual?
    a.btruetrue✔︎
    a[^x]btruetrue✔︎
    a$falsefalse✔︎
    s Flag
    (?s)a.btruetrue✔︎
    (?s)a[^x]btruetrue✔︎
    (?s)a$falsefalse✔︎
    m Flag
    (?m)a.bfalsefalse✔︎
    (?m)a[^x]btruefalse
    (?m)a$truetrue✔︎
    p Flag
    (?p)a.bfalsefalse✔︎
    (?p)a[^x]btruefalse
    (?p)a$falsefalse✔︎
    w Flag
    (?w)a.btruetrue
    (?w)a[^x]btruetrue
    (?w)a$truetrue
  • Quaisquer outras flags passadas para funções de expressão regular impedem o pushdown da função.
  • A exceção é regexp_replace(), que também aceita a flag g. Quando g está definida, pg_clickhouse usa replaceRegexpAll() em vez de replaceRegexpOne() e remove a flag antes de adicionar outras flags no início.
  • O argumento de substituição de regexp_replace() no Postgres aceita \& para se referir à correspondência inteira, enquanto no ClickHouse \0 representa a correspondência inteira. Certifique-se de usar \0 quando a função fizer pushdown para o ClickHouse.
  • Postgres regexp_match retorna NULL quando não há correspondências, enquanto as expressões delegadas retornam um array vazio. Use COALESCE() para retornar um array vazio em vez de NULL e comparar os valores de retorno de forma compatível. Por exemplo:
Para evitar qualquer ambiguidade, considere definir pg_clickhouse.pushdown_regex para impedir que expressões regulares do Postgres façam pushdown para o ClickHouse e usar a [extensão re2], para a qual o pg_clickhouse oferece suporte a pushdown direto de expressões regulares RE2 compatíveis com o ClickHouse.

to_char()

O to_char() do PostgreSQL para timestamp e timestamp with time zone só é enviado ao ClickHouse formatDateTime quando o argumento de formato é uma constante de string não NULL em que cada palavra-chave do PostgreSQL tem um equivalente idêntico byte a byte no ClickHouse. Se o formato for dinâmico (não for uma Const) ou contiver qualquer palavra-chave ou modificador sem suporte, a chamada recorre à avaliação local no PostgreSQL — o pushdown nunca é tentado com uma tradução parcial, para que a saída permaneça compatível com o PostgreSQL. As variantes de to_char() com dois argumentos aplicadas a numeric, interval e outros tipos que não sejam timestamp nunca usam pushdown; o formatDateTime do ClickHouse apenas formata valores de data e hora.

Palavras-chave traduzidas

PostgreSQLClickHouseSignificado
YYYY, yyyy%Yano com 4 dígitos
YY, yy%yano com 2 dígitos
MM, mm%mmês com zero à esquerda (01–12)
DD, dd%ddia do mês com zero à esquerda (01–31)
DDD, ddd%jdia do ano com zero à esquerda (001–366)
HH24, hh24%Hhora no formato de 24 horas com zero à esquerda (00–23)
HH, hh, HH12, hh12%Ihora no formato de 12 horas com zero à esquerda (01–12)
MI, mi%iminuto com zero à esquerda (00–59)
SS, ss%Ssegundo com zero à esquerda (00–59)
Q, q%Qtrimestre (1–4)
Mon%bnome abreviado do mês, por exemplo, Oct
Dy%anome abreviado do dia da semana, por exemplo, Mon
AM, PM%pindicador de meridiano, sempre em maiúsculas

Texto entre aspas e literais

O texto entre "..." é passado literalmente, com qualquer % literal duplicado como %% para escapar o prefixo de especificador do ClickHouse. Um \" fora das aspas também é passado como um literal ". Dentro de "...", a barra invertida escapa apenas "; outras sequências com barra invertida são tratadas como texto literal.

Autores

David E. Wheeler Copyright (c) 2025-2026, ClickHouse
Última modificação em 25 de junho de 2026