Descripción
Primeros pasos
Uso
Política de versionado
- La versión mayor se incrementa por cambios en la API
- La versión menor se incrementa por cambios de SQL compatibles con versiones anteriores
- La versión de parche se incrementa por cambios únicamente en el binario
- La versión de la biblioteca (definida por
PG_MODULE_MAGICen PostgreSQL 18 y posteriores) incluye la versión semántica completa, visible en la salida de la funciónpgch_version()o de la función de Postgrespg_get_loaded_modules(). - La versión de la extensión (definida en el archivo de control) incluye solo las versiones mayor
y menor, visibles en la tabla
pg_catalog.pg_extension, en la salida de la funciónpg_available_extension_versions()y en\dx pg_clickhouse.
v0.1.0 a v0.1.1, beneficia a todas las bases de datos que han cargado v0.1 y
no necesitan ejecutar ALTER EXTENSION para beneficiarse de la actualización.
Por otro lado, una versión que incrementa la versión menor o mayor
irá acompañada de scripts de actualización de SQL, y todas las bases de datos existentes que contengan
la extensión deben ejecutar ALTER EXTENSION pg_clickhouse UPDATE para beneficiarse de
la actualización.
Referencia de SQL DDL
CREATE EXTENSION
WITH SCHEMA para instalarlo en un esquema específico (recomendado):
ALTER EXTENSION
-
Después de instalar una nueva versión de pg_clickhouse, use la cláusula
UPDATE: -
Use
SET SCHEMApara mover la extensión a un nuevo esquema:
DROP EXTENSION
CASCADE para eliminarlos también:
CREATE SERVER
driver: El controlador de conexión de ClickHouse que se usará, ya sea “binary” o “http”. Obligatorio.dbname: La base de datos de ClickHouse que se usará al conectarse. El valor predeterminado es “default”.fetch_size: Tamaño aproximado del lote en bytes para HTTP streaming. Los lotes se dividen en los límites de las filas. El valor predeterminado es50000000(50 MB).0desactiva el streaming y almacena en búfer la respuesta completa. Las tablas foráneas pueden sobrescribir este valor.host: El nombre de host del servidor de ClickHouse. El valor predeterminado es “localhost”;port: El puerto del servidor de ClickHouse al que conectarse. Los valores predeterminados son los siguientes:- 9440 si
driveres “binary” yhostes un host de ClickHouse Cloud - 9004 si
driveres “binary” yhostno es un host de ClickHouse Cloud - 8443 si
driveres “http” yhostes un host de ClickHouse Cloud - 8123 si
driveres “http” yhostno es un host de ClickHouse Cloud
- 9440 si
ALTER SERVER
DROP SERVER
CASCADE para
eliminar también esas dependencias:
CREATE USER MAPPING
taxi_srv:
user: El nombre del usuario de ClickHouse. El valor predeterminado es “default”.password: La contraseña del usuario de ClickHouse.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO para limitar la importación a tablas concretas:
EXCEPT para excluir tablas:
CREATE FOREIGN TABLE
database: El nombre de la base de datos remota. De forma predeterminada, usa la base de datos definida para el servidor foráneo.fetch_size: Tamaño aproximado del lote en bytes para HTTP streaming. Anula elfetch_sizea nivel de servidor. El valor predeterminado es50000000(50 MB).0desactiva el streaming y almacena en el búfer la respuesta completa.table_name: El nombre de la tabla remota. De forma predeterminada, usa el nombre especificado para la tabla foránea.engine: El motor de tabla usado por la tabla de ClickHouse. ParaCollapsingMergeTree()yAggregatingMergeTree(), pg_clickhouse aplica automáticamente los parámetros a las expresiones de función ejecutadas en la tabla.
-
column_name: El nombre de la columna en ClickHouse, que se usa con preferencia sobre el nombre del atributo de PostgreSQL al reconstruir consultas e inserciones. Es útil para asignar nombres de columna de PostgreSQL en minúsculas y sin comillas a columnas de ClickHouse sensibles a mayúsculas y minúsculas; por ejemplo: -
AggregateFunction: El nombre de la función de agregación aplicada a una columna de [AggregateFunction Type]. Asigne el tipo de dato al tipo de ClickHouse pasado a la función y especifique el nombre de la función de agregación mediante la opción de columna correspondiente; pg_clickhouse añadirá automáticamenteMergea la función de agregación que evalúe la columna. -
SimpleAggregateFunction: El nombre de la función de agregación aplicada a una columna de [SimpleAggregateFunction Type]. Asigne el tipo de dato al tipo de ClickHouse pasado a la función y especifique el nombre de la función de agregación mediante la opción de columna correspondiente.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE para eliminarlos también:
Referencia de SQL DML
EXPLAIN
VERBOSE provoca que se emita la consulta “Remote SQL” de ClickHouse:
SELECT
nodes y hacemos JOIN con ella en lugar de con la tabla remota:
node_id en lugar de por la columna local, y luego unirnos
a la tabla de búsqueda más adelante:
node_id en origen, lo que reduce
el número de filas que deben traerse de vuelta a Postgres de 1000 (todas
ellas) a solo 8, una por cada nodo.
PREPARE, EXECUTE, DEALLOCATE
{param:type}:
parámetros:
INSERT
COPY
⚠️ Limitaciones de la API de inserción por lotes pg_clickhouse aún no ha implementado compatibilidad con la API de inserción por lotes del FDW de PostgreSQL. Por lo tanto, COPY actualmente usa sentencias INSERT para insertar registros. Esto se mejorará en una versión futura.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings permite establecer la configuración de
ClickHouse que se aplicará a las consultas posteriores. Ejemplo:
join_use_nulls 1, group_by_use_nulls 1, final 1. Establézcalo en una
cadena vacía para volver a usar la configuración del servidor de ClickHouse.
date_time_output_format: el driver HTTP requiere que sea “iso”format_tsv_null_representation: el driver HTTP requiere el valor predeterminadooutput_format_tsv_crlf_end_of_lineel driver HTTP requiere el valor predeterminado
pg_clickhouse.session_settings; usa precarga de bibliotecas compartidas o
simplemente uno de los objetos de la extensión para asegurarte de que se cargue.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex controla si pg_clickhouse
transfiere las funciones y los operadores de expresiones regulares. Lo hace de forma predeterminada;
establezca este parámetro en false para evitarlo:
ALTER ROLE
SET de ALTER ROLE para precargar pg_clickhouse
y/o SET sus parámetros para roles específicos:
RESET de ALTER ROLE para restablecer la precarga de pg_clickhouse
y/o los parámetros:
Precarga
session_preload_libraries
Tipos de datos
| ClickHouse | PostgreSQL | Notas |
|---|---|---|
| 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 | Produce errores con valores > BIGINT max |
| UInt8 | smallint | |
| UUID | uuid |
BYTEA
SELECT final producirá como salida:
Referencia de funciones y operadores
Funciones
clickhouse_raw_query
host=localhost port=8123. Los parámetros de conexión
admitidos son:
host: El host al que conectarse; obligatorio.port: El puerto HTTP al que conectarse; el valor predeterminado es8123, a menos quehostsea un host de ClickHouse Cloud, en cuyo caso el valor predeterminado es8443dbname: El nombre de la base de datos a la que conectarse.username: El nombre de usuario con el que conectarse; el valor predeterminado esdefaultpassword: La contraseña que se usará para autenticarse; de forma predeterminada no hay contraseña
EXECUTE a esta función; considere GRANTar
acceso solo a los roles que realmente necesiten ejecutar consultas ad hoc de ClickHouse,
por ejemplo, un rol de administrador de ClickHouse dedicado:
Útil para consultas que no devuelven registros, pero las consultas que sí devuelven valores
se devolverán como un único valor de texto:
Funciones con pushdown
pg_clickhouse aplica pushdown a un subconjunto de las funciones integradas de PostgreSQL usadas
en expresiones condicionales (cláusulas HAVING y WHERE). Ese subconjunto se corresponde con los equivalentes de ClickHouse
de la siguiente manera:
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: funciones matemáticas de ClickHouse con el mismo nombre.asin,acos,atanh,acoshno se ejecutan mediante pushdown: PG genera un error con valores fuera de rango, mientras que CH devuelveNaN.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): las mismas correspondencias quedate_partdate(timestamp)&date(timestamptz): toDate (representado como alias de CHdate)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + índice 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 o replaceRegexpOne si está presente la banderagregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: sintaxis de subcolumnasjson_extract_path: toJSONString + sintaxis de subcolumnasjsonb_extract_path_text: sintaxis de subcolumnasjsonb_extract_path: toJSONString + sintaxis de subcolumnasbit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt): formatDateTime cuandofmtes una constante de cadena y cada una de sus palabras clave tiene un equivalente fiel en ClickHouse. Consulte to_char() en las Notas de compatibilidad para ver las palabras clave admitidas. De lo contrario, la función se evalúa localmente en PostgreSQL.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now y 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: Se pasa como valor desde la función de PostgreSQL.CURRENT_SCHEMA: Se pasa como valor desde una función de PostgreSQL.CURRENT_CATALOG: Se pasa como valor de la función de PostgreSQL.CURRENT_USER: Se pasa como valor desde una función de PostgreSQL.USER: Se pasa como valor de la función de PostgreSQL.CURRENT_ROLE: Se pasa como valor de una función de PostgreSQL.SESSION_USER: Se pasa como valor desde una función de PostgreSQL.
Operadores de pushdown
- Segmento de Array (
arr[L:U]): arraySlice @>(Array contiene): hasAll<@(Array contenido en): hasAll&&(solapamiento de Arrays): hasAny~(coincidencia de regexp): match!~(sin coincidencia de regexp): match~*(regexp sin distinción entre mayúsculas y minúsculas sin coincidencia): match!~*(regexp sin distinción entre mayúsculas y minúsculas no coincide): match->>(JSON/JSONB extrae el elemento como texto): sintaxis de sub-columnas->(JSON/JSONB extrae): toJSONString + sintaxis de sub-columnas
Funciones personalizadas
pg_clickhouse proporcionan pushdown de consultas externas
para determinadas funciones de ClickHouse que no tienen equivalentes en PostgreSQL. Si
alguna de estas funciones no se puede ejecutar mediante pushdown, generará una excepción.
Pushdown de extensiones
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
Conversiones de tipo pushdown
CAST(x AS bigint) para
tipos de datos compatibles. En el caso de tipos incompatibles, el pushdown fallará; si x en este
ejemplo es un UInt64 de ClickHouse, ClickHouse se negará a convertir el valor.
Para hacer pushdown de conversiones de tipo a tipos de datos incompatibles, pg_clickhouse proporciona
las siguientes funciones. Generan una excepción en PostgreSQL si no se
ejecutan con pushdown.
Agregaciones pushdown
Agregaciones personalizadas
pg_clickhouse proporcionan
pushdown de consultas externas para algunas funciones de agregación de ClickHouse que no
tienen equivalentes en PostgreSQL. Si alguna de estas funciones no puede aplicarse
mediante pushdown, generará una excepción.
Agregados de conjunto ordenado con pushdown
ORDER BY como argumentos. Por ejemplo, esta consulta de PostgreSQL:
ORDER BY, DESC y NULLS FIRST,
no son compatibles y producirán un error.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Funciones de ventana con pushdown
OVER (PARTITION BY ... ORDER BY ...), incluidas las especificaciones de frame cuando
corresponde.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(con cláusulaOVER)
row_number, rank, dense_rank, ntile, cume_dist,
percent_rank) omiten su cláusula de frame durante la delegación porque ClickHouse
rechaza las especificaciones de frame en estas funciones.
Notas de compatibilidad
Expresiones regulares
-
PostgreSQL admite expresiones regulares POSIX, mientras que ClickHouse admite
expresiones regulares RE2. Tenga en cuenta las diferencias de comportamiento: use RE2
cuando la expresión regular vaya a evaluarse en ClickHouse (p. ej., en una
cláusula
WHERE) y POSIX cuando vaya a evaluarse en Postgres (p. ej., en una cláusulaSELECT). -
pg_clickhouse hace pushdown de los [flags de regex] de Postgres anteponiéndolos a la
expresión regular de ClickHouse dentro de
(?). Por ejemplo:Se convierte enTenga en cuenta la inclusión de-s; esto alinea el comportamiento con las expresiones regulares de Postgres al desactivars, que ClickHouse habilita de forma predeterminada. pg_clickhouse no incluirá-ssi los flags de la llamada a la función de Postgres incluyens. Desafortunadamente, este comportamiento rompe la compatibilidad de algunas expresiones regulares en Postgres 24 y versiones anteriores. -
Los únicos flags que ambos admiten y que, por lo tanto, pueden usarse cuando se evalúan en
ClickHouse son:
i: sin distinción entre mayúsculas y minúsculasm: modo multilínea:s: hace que.coincida con\np: coincidencia parcial sensible a saltos de línea (se trata igual ques)t: sintaxis estricta (la predeterminada, eliminada por pg_clickhouse)
- Cualquier otro flag pasado a funciones de expresiones regulares hará que la función no se envíe mediante pushdown.
-
La excepción es
regexp_replace(), que también admite el flagg. Cuandogestá establecido, pg_clickhouse usareplaceRegexpAll()en lugar dereplaceRegexpOne()y elimina el flag antes de anteponer los demás flags. -
El argumento de reemplazo de
regexp_replace()de Postgres admite\¶ referirse a la coincidencia completa, mientras que ClickHouse usa\0para la coincidencia completa. Asegúrese de usar\0cuando la función se envíe mediante pushdown a ClickHouse.
to_char()
to_char() para timestamp y timestamp with time zone
solo se delega a ClickHouse formatDateTime cuando el argumento de formato
es una string constant no NULL en la que cada palabra clave de PostgreSQL tiene un
equivalente en ClickHouse idéntico byte por byte. Si el formato es dinámico
(no es una Const), o contiene alguna palabra clave o modifier no compatible, la
llamada vuelve a evaluarse localmente en PostgreSQL; nunca se intenta delegar
con una traducción parcial, por lo que la salida sigue siendo compatible con PG.
Las formas de to_char() de dos argumentos sobre numeric, interval y otros
tipos que no son de timestamp nunca se delegan; ClickHouse formatDateTime solo
da formato a valores de fecha y hora.
Palabras clave traducidas
| PostgreSQL | ClickHouse | Significado |
|---|---|---|
YYYY, yyyy | %Y | año de 4 dígitos |
YY, yy | %y | año de 2 dígitos |
MM, mm | %m | mes con ceros a la izquierda (01–12) |
DD, dd | %d | día del mes con ceros a la izquierda (01–31) |
DDD, ddd | %j | día del año con ceros a la izquierda (001–366) |
HH24, hh24 | %H | hora en formato de 24 horas con ceros a la izquierda (00–23) |
HH, hh, HH12, hh12 | %I | hora en formato de 12 horas con ceros a la izquierda (01–12) |
MI, mi | %i | minuto con ceros a la izquierda (00–59) |
SS, ss | %S | segundo con ceros a la izquierda (00–59) |
Q, q | %Q | trimestre (1–4) |
Mon | %b | nombre abreviado del mes, p. ej., Oct |
Dy | %a | nombre abreviado del día de la semana, p. ej., Mon |
AM, PM | %p | indicador AM/PM, siempre en mayúsculas |
Texto entre comillas y literales
"..." se conserva tal cual, y cualquier % literal
se duplica como %% para escapar el prefijo de especificador de ClickHouse. Un \" fuera de
las comillas también se conserva como un literal ". Dentro de "...", la barra invertida
solo escapa "; las demás secuencias con barra invertida se tratan como texto literal.
David E. Wheeler