Descrição
Primeiros passos
Uso
Política de versionamento
- A versão major é incrementada em caso de mudanças na API
- A versão minor é incrementada em caso de mudanças de SQL compatíveis com versões anteriores
- A versão patch é incrementada em caso de mudanças apenas no binário
- A versão da biblioteca (definida por
PG_MODULE_MAGICno PostgreSQL 18 e superior) 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 major
e minor, 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.
Por outro lado, uma versão que incrementa as versões minor ou major
será acompanhada de scripts de atualização de SQL, e todos os bancos de dados existentes que contêm
a extensão devem 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
-
Após 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).0desabilita o streaming e armazena a resposta completa em buffer. Tabelas externas 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 limitar 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 servidor externo.fetch_size: Tamanho aproximado do lote em bytes para HTTP streaming. Substitui ofetch_sizeno nível do servidor. O padrão é50000000(50 MB).0desabilita o streaming e mantém a resposta completa em buffer.table_name: O nome da tabela remota. O padrão é o nome especificado para a tabela externa.engine: O table engine usado pela tabela do 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 Type. 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 que avalia a coluna. -
SimpleAggregateFunction: O nome da função de agregação aplicada a uma coluna do tipo SimpleAggregateFunction Type. 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 faz com que a
consulta “Remote SQL” do ClickHouse seja exibida:
SELECT
nodes e fazemos o JOIN com ela em vez da tabela remota:
node_id em vez da coluna local e, em seguida, fazer join
com a tabela de referência mais tarde:
node_id, reduzindo
o número de linhas que precisam ser trazidas de volta ao Postgres de 1000 (todas
elas) para apenas 8, uma para cada nó.
PREPARE, EXECUTE, DEALLOCATE
{param:type}:
parâmetros:
INSERT
COPY
⚠️ Limitações da API de batch O pg_clickhouse ainda não implementou suporte à API de insert em batch do PostgreSQL FDW. Assim, COPY atualmente usa instruções INSERT para inserir registros. Isso será melhorado 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 do 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 para pré-carregar pg_clickhouse
e/ou SET seus parâmetros para roles específicos:
RESET de ALTER ROLE para redefinir o pré-carregamento
e/ou os parâmetros do pg_clickhouse:
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 | Erros para valores > BIGINT max |
| 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 conceder GRANT
acesso apenas a roles que realmente precisem executar consultas ad hoc no ClickHouse,
por exemplo, um role de administrador dedicado do ClickHouse:
Útil para consultas que não retornam registros, mas consultas que retornam valores
são retornadas como um único valor de texto:
Funções de pushdown
pg_clickhouse faz pushdown de um subconjunto das funções nativas do PostgreSQL usadas
em condições (cláusulas HAVING e WHERE). Esse subconjunto tem os seguintes equivalentes
no ClickHouse:
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 têm pushdown: o PG gera erro para entradas 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 (exibido como alias do CHdate)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: tamanhoarray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + indexação de 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 subcolunasjson_extract_path: toJSONString + sintaxe de subcolunasjsonb_extract_path_text: sintaxe de subcolunasjsonb_extract_path: toJSONString + sintaxe de subcolunasbit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt): formatDateTime quandofmté uma string constante em que cada palavra-chave tem 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 é avaliada 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 da função do PostgreSQL.CURRENT_USER: Passado como valor da função do PostgreSQL.USER: Passado como valor de uma função do PostgreSQL.CURRENT_ROLE: Passado como valor de uma função do PostgreSQL.SESSION_USER: Passado como valor da função PostgreSQL.
Operadores de pushdown
- Fatia de array (
arr[L:U]): arraySlice @>(array contém): hasAll<@(array contido em): hasAll&&(sobreposição entre arrays): hasAny~(correspondência com regexp): match!~(sem correspondência com regexp): match~*(correspondência com regexp sem diferenciar maiúsculas de minúsculas): match!~*(sem correspondência com regexp sem diferenciar maiúsculas de minúsculas): match->>(JSON/JSONB extrai elemento como texto): sintaxe de subcoluna->(JSON/JSONB extrai): toJSONString + sintaxe de subcoluna
Funções personalizadas
pg_clickhouse fornecem
pushdown de consultas externas para determinadas funções do ClickHouse sem
equivalentes no PostgreSQL. Se alguma dessas funções não puder passar por pushdown, ela gerará 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-arg): editDistanceUTF8
Casts com pushdown
CAST(x AS bigint) para
tipos de dados compatíveis. Para tipos incompatíveis, o pushdown falhará; 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 seguintes funções. Elas geram uma exceção no PostgreSQL se não forem
executadas via 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 o pushdown aplicado,
será gerada uma exceção.
Agregações de conjunto ordenado com pushdown
ORDER BY como argumentos. Por exemplo, esta consulta PostgreSQL:
ORDER BY, DESC e NULLS FIRST,
não são compatíveis 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.
Observações sobre compatibilidade
Expressões regulares
-
O PostgreSQL oferece suporte a [POSIX Regular Expressions], enquanto o ClickHouse oferece suporte a
RE2 Regular Expressions. Fique atento às diferenças de comportamento: escreva 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 das [Regex flags] do Postgres, prefixando-as à
expressão regular do ClickHouse dentro de
(?). Por exemplo:Torna-seObserve a inclusão de-s; isso alinha o comportamento com o das expressões regulares do Postgres ao desabilitars, que o ClickHouse habilita por padrão. O pg_clickhouse não incluirá-sse as flags 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. -
As únicas flags compatíveis com ambos e que, portanto, podem ser usadas quando avaliadas pelo
ClickHouse são:
i: sem diferenciar maiúsculas de minúsculasm: modo multilinha:s: faz.corresponder a\np: correspondência parcial sensível a nova linha (tratada da mesma forma ques)t: sintaxe restrita (o padrão, removida pelo pg_clickhouse)
- Quaisquer outras flags passadas para funções de expressão regular farão com que a função não seja enviada por pushdown.
-
A exceção é
regexp_replace(), que também oferece suporte à flagg. Quandogestá definida, o pg_clickhouse usareplaceRegexpAll()em vez dereplaceRegexpOne()e remove a flag antes de prefixar as demais. -
O argumento de substituição de
regexp_replace()no Postgres aceita\¶ se referir à correspondência inteira, enquanto no ClickHouse\0representa 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ó faz pushdown para o ClickHouse formatDateTime quando o argumento de formato
é uma constante de string não NULL em que cada palavra-chave do PostgreSQL tem um
equivalente byte a byte idêntico no ClickHouse. Se o formato for dinâmico
(não for um Const) ou contiver qualquer palavra-chave ou modificador sem suporte, a
chamada volta para a 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 PG.
As formas de to_char() com dois argumentos para numeric, interval e outros
tipos que não sejam timestamp nunca fazem 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 em formato de 24 horas com zero à esquerda (00–23) |
HH, hh, HH12, hh12 | %I | hora em 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 AM/PM, sempre em maiúsculas |
Texto entre aspas e literais
"..." é passado literalmente, com qualquer % literal
duplicado para %% 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