Descrição
Primeiros passos
Uso
Política de versionamento
- 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
- A versão da biblioteca (definida por
PG_MODULE_MAGICno PostgreSQL 18 e superiores) inclui a versão semântica completa, visível na saída da funçãopgch_version()ou da funçãopg_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çãopg_available_extension_versions()e em\dx pg_clickhouse.
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
CREATE EXTENSION
WITH SCHEMA para instalá-la em um esquema específico (recomendado):
ALTER EXTENSION
-
Depois de instalar uma nova versão do pg_clickhouse, use a cláusula
UPDATE: -
Use
SET SCHEMApara mover a extensão para um novo esquema:
DROP EXTENSION
CASCADE para removê-los também:
CREATE SERVER
driver: O driver de conexão do ClickHouse a ser usado: “binary” ou “http”. Obrigatório.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).0desativa 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
driverfor “binary” ehostfor um host do ClickHouse Cloud - 9004 se
driverfor “binary” ehostnão for um host do ClickHouse Cloud - 8443 se
driverfor “http” ehostfor um host do ClickHouse Cloud - 8123 se
driverfor “http” ehostnão for um host do ClickHouse Cloud
- 9440 se
ALTER SERVER
DROP SERVER
CASCADE para
também remover essas dependências:
CREATE USER MAPPING
taxi_srv:
user: O nome do usuário do ClickHouse. O valor padrão é “default”.password: A senha do usuário do ClickHouse.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO para restringir a importação a tabelas específicas:
EXCEPT para excluir tabelas:
CREATE FOREIGN TABLE
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 ofetch_sizeno nível do servidor. O padrão é50000000(50 MB).0desabilita 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. ParaCollapsingMergeTree()eAggregatingMergeTree(), o pg_clickhouse aplica automaticamente os parâmetros às expressões de função executadas na tabela.
-
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á automaticamenteMergeà 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
DROP FOREIGN TABLE
CASCADE para removê-los também:
Referência de SQL DML
EXPLAIN
VERBOSE aciona a emissão da consulta “Remote SQL” do ClickHouse:
SELECT
nodes e fazemos join com ela em vez de usar a tabela remota:
node_id em vez da coluna local e, depois, fazer join
com a tabela de lookup:
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
{param:type} do ClickHouse:
parameters:
INSERT
COPY
⚠️ 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
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings configura as [configurações
do ClickHouse] a serem aplicadas às consultas subsequentes. Exemplo:
join_use_nulls 1, group_by_use_nulls 1, final 1. Defina como uma
string vazia para voltar às configurações do servidor ClickHouse.
date_time_output_format: o driver HTTP exige que seja “iso”format_tsv_null_representation: o driver HTTP exige o valor padrãooutput_format_tsv_crlf_end_of_lineo driver HTTP exige o valor padrão
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
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:
ALTER ROLE
SET de ALTER ROLE’s para pré-carregar o pg_clickhouse
e/ou SET seus parâmetros para roles específicos:
RESET de ALTER ROLE para redefinir o pré-carregamento do pg_clickhouse
e/ou os parâmetros:
Pré-carregamento
session_preload_libraries
Tipos de dados
| ClickHouse | PostgreSQL | Observações |
|---|---|---|
| Bool | boolean | |
| Date | date | |
| Date32 | date | |
| DateTime | timestamptz | |
| Decimal | numeric | |
| Float32 | real | |
| Float64 | double precision | |
| IPv4 | inet | |
| IPv6 | inet | |
| Int16 | smallint | |
| Int32 | integer | |
| Int64 | bigint | |
| Int8 | smallint | |
| JSON | jsonb, json | |
| String | text, bytea | |
| UInt16 | integer | |
| UInt32 | bigint | |
| UInt64 | bigint | Erro para valores > máximo de BIGINT |
| UInt8 | smallint | |
| UUID | uuid |
BYTEA
SELECT final produzirá:
Referência de funções e operadores
Funções
clickhouse_raw_query
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 quehostseja um host do ClickHouse Cloud, caso em que o padrão é8443dbname: O nome do banco de dados ao qual se conectar.username: O nome de usuário com o qual se conectar; o padrão édefaultpassword: A senha usada para autenticação; o padrão é não usar senha
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:
abs: absfactorial: factorialmod(int2/int4/int8/numeric): módulopow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: funções matemáticas do ClickHouse com o mesmo nome.asin,acos,atanh,acoshnão são delegadas: o PG gera erro quando a entrada está fora do intervalo, enquanto o CH retornaNaN.date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
extract(field FROM source): os mesmos mapeamentos dedate_partdate(timestamp)&date(timestamptz): toDate (reapresentado como alias do CHdate)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: comprimentoarray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + acesso por índice em arraytrim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: ltrimrtrim: rtrimconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_replace: replaceRegexpOne ou replaceRegexpOne quando a flaggestiver presenteregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: sintaxe de subcolunajson_extract_path: toJSONString + sintaxe de subcolunasjsonb_extract_path_text: sintaxe de subcolunajsonb_extract_path: toJSONString + sintaxe de subcolunasbit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt): formatDateTime quandofmté uma string constant cujas palavras-chave têm todas um equivalente fiel no ClickHouse. Consulte to_char(), em Notas de compatibilidade, para ver as palavras-chave compatíveis. Caso contrário, a função é executada localmente no PostgreSQL.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now e toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: Passado como valor de uma função do PostgreSQL.CURRENT_SCHEMA: Passado como valor de uma função do PostgreSQL.CURRENT_CATALOG: Passado como valor retornado pela função do PostgreSQL.CURRENT_USER: Passado como valor da função do PostgreSQL.USER: Passado como valor por uma função do PostgreSQL.CURRENT_ROLE: Passado como valor de uma função do PostgreSQL.SESSION_USER: Passado como valor de uma função do PostgreSQL.
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
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
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(2 argumentos): editDistanceUTF8
Casts com pushdown
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
Agregações personalizadas
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
ORDER BY como argumentos. Por exemplo, esta consulta PostgreSQL:
DESC e NULLS FIRST de ORDER BY
não têm suporte e gerarão um erro.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Funções de janela com pushdown
OVER (PARTITION BY ... ORDER BY ...), incluindo especificações de frame quando
aplicável.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(com cláusulaOVER)
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
-
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áusulaSELECT). -
O pg_clickhouse faz pushdown dos [sinalizadores de regex] do Postgres, prefixando-os à
expressão regular do ClickHouse dentro de
(?). Por exemplo:Torna-seObserve a inclusão de-s; isso alinha o comportamento com as expressões regulares do Postgres ao desabilitars, que o ClickHouse ativa por padrão. O pg_clickhouse não incluirá-sse os sinalizadores na chamada da função do Postgres incluírems. Infelizmente, esse comportamento quebra a compatibilidade de algumas expressões regulares no Postgres 24 e versões anteriores. -
Os únicos sinalizadores compatíveis com ambos e, portanto, que podem ser usados quando avaliados pelo
ClickHouse, são:
i: sem distinção entre maiúsculas e minúsculasm: modo multilinha:s: faz.corresponder a\np: correspondência parcial sensível a nova linha (tratado da mesma forma ques)t: sintaxe restrita (o padrão, removido pelo pg_clickhouse)
- Quaisquer outros sinalizadores passados para funções de expressão regular farão com que a função não passe por pushdown.
-
A exceção é
regexp_replace(), que também oferece suporte ao sinalizadorg. Quandogestá definido, o pg_clickhouse usareplaceRegexpAll()em vez dereplaceRegexpOne()e remove o sinalizador antes de prefixar os outros sinalizadores. -
O argumento de substituição de
regexp_replace()no Postgres oferece suporte a\¶ se referir à correspondência inteira, enquanto no ClickHouse há suporte a\0para a correspondência inteira. Certifique-se de usar\0quando a função fizer pushdown para o ClickHouse.
to_char()
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
| PostgreSQL | ClickHouse | Significado |
|---|---|---|
YYYY, yyyy | %Y | ano com 4 dígitos |
YY, yy | %y | ano com 2 dígitos |
MM, mm | %m | mês com zero à esquerda (01–12) |
DD, dd | %d | dia do mês com zero à esquerda (01–31) |
DDD, ddd | %j | dia do ano com zero à esquerda (001–366) |
HH24, hh24 | %H | hora no formato de 24 horas com zero à esquerda (00–23) |
HH, hh, HH12, hh12 | %I | hora no formato de 12 horas com zero à esquerda (01–12) |
MI, mi | %i | minuto com zero à esquerda (00–59) |
SS, ss | %S | segundo com zero à esquerda (00–59) |
Q, q | %Q | trimestre (1–4) |
Mon | %b | nome abreviado do mês, por exemplo, Oct |
Dy | %a | nome abreviado do dia da semana, por exemplo, Mon |
AM, PM | %p | indicador de meridiano, sempre em maiúsculas |
Texto entre aspas e literais
"..." é 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.
David E. Wheeler