Description
Prise en main
Utilisation
Politique de versionnage
- La version majeure est incrémentée en cas de modification de l’API
- La version mineure est incrémentée en cas de modifications SQL rétrocompatibles
- La version de correctif est incrémentée pour les modifications portant uniquement sur le binaire
- La version de la bibliothèque (définie par
PG_MODULE_MAGICsur PostgreSQL 18 et versions ultérieures) inclut la version sémantique complète, visible dans la sortie de la fonctionpgch_version()ou de la fonction Postgrespg_get_loaded_modules(). - La version de l’extension (définie dans le fichier de contrôle) inclut uniquement les versions majeure
et mineure, visibles dans la table
pg_catalog.pg_extension, la sortie de la fonctionpg_available_extension_versions()et\dx pg_clickhouse.
v0.1.0 à v0.1.1, bénéficie à toutes les bases de données qui ont chargé v0.1 et
n’ont pas besoin d’exécuter ALTER EXTENSION pour profiter de la mise à niveau.
En revanche, une version qui incrémente la version mineure ou majeure
sera accompagnée de scripts de mise à niveau SQL, et toutes les bases de données existantes qui contiennent
l’extension doivent exécuter ALTER EXTENSION pg_clickhouse UPDATE pour bénéficier de
la mise à niveau.
Référence SQL DDL
CREATE EXTENSION
WITH SCHEMA pour l’installer dans un schéma spécifique (recommandé) :
ALTER EXTENSION
-
Après l’installation d’une nouvelle version de pg_clickhouse, utilisez la clause
UPDATE: -
Utilisez
SET SCHEMApour déplacer l’extension vers un nouveau schéma :
DROP EXTENSION
CASCADE pour les supprimer également :
CREATE SERVER
driver: Le pilote de connexion ClickHouse à utiliser, soit “binary”, soit “http”. Obligatoire.compression: Compression du protocole natif pour le pilote “binary”, parmi “none”, “lz4” ou “zstd”. La valeur par défaut est “lz4”. Ignoré par le pilote “http”.dbname: La base de données ClickHouse à utiliser lors de la connexion. La valeur par défaut est “default”.fetch_size: Taille approximative des lots, en octets, pour le streaming HTTP. Les lots sont découpés sur les limites des lignes. La valeur par défaut est50000000(50 MB).0désactive le streaming et met en mémoire tampon l’intégralité de la réponse. Les tables étrangères peuvent remplacer cette valeur.host: Le nom d’hôte du serveur ClickHouse. La valeur par défaut est “localhost” ;port: Le port auquel se connecter sur le serveur ClickHouse. Les valeurs par défaut sont les suivantes :- 9440 si
drivervaut “binary” et quehostest un hôte ClickHouse Cloud - 9004 si
drivervaut “binary” et quehostn’est pas un hôte ClickHouse Cloud - 8443 si
drivervaut “http” et quehostest un hôte ClickHouse Cloud - 8123 si
drivervaut “http” et quehostn’est pas un hôte ClickHouse Cloud
- 9440 si
min_tls_version: Version minimale du protocole TLS à négocier sur les connexions qui utilisent TLS. L’une deTLSv1,TLSv1.1,TLSv1.2ouTLSv1.3. La valeur par défaut est la version minimale propre à la bibliothèque TLS. S’applique aux deux pilotes.secure: Contrôle l’utilisation de TLS pour la connexion. L’une des valeurs suivantes :auto(par défaut) : utilise TLS lorsquehostest un hôte ClickHouse Cloud ou queportest un port sécurisé ; en clair sinon.on(outrue/yes/1) : utilise toujours TLS. La valeur par défaut deportest 8443 (“http”) ou 9440 (“binary”).off(oufalse/no/0) : n’utilise jamais TLS. La valeur par défaut deportest 8123 (“http”) ou 9000 (“binary”).
ALTER SERVER
DROP SERVER
CASCADE pour
supprimer également ces objets dépendants :
CREATE USER MAPPING
taxi_srv :
user: Le nom de l’utilisateur ClickHouse. La valeur par défaut est “default”.password: Le mot de passe de l’utilisateur ClickHouse.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO pour restreindre l’importation à certaines tables :
EXCEPT pour exclure des tables :
CREATE FOREIGN TABLE
database: Le nom de la base de données distante. Par défaut, il s’agit de la base de données définie pour le serveur distant.fetch_size: Taille approximative du lot en octets pour HTTP streaming. Remplace la valeurfetch_sizeau niveau du serveur. La valeur par défaut est50000000(50 MB).0désactive le streaming et met en tampon l’intégralité de la réponse.table_name: Le nom de la table distante. Par défaut, il s’agit du nom spécifié pour la table distante.engine: Le [moteur de table] utilisé par la table ClickHouse. PourCollapsingMergeTree()etAggregatingMergeTree(), pg_clickhouse applique automatiquement les paramètres aux expressions de fonction exécutées sur la table.
-
column_name: Le nom de la colonne côté ClickHouse, utilisé de préférence au nom d’attribut PostgreSQL lors de la régénération des requêtes et des insertions. Utile pour faire correspondre des noms de colonnes PostgreSQL non quotés en minuscules à des colonnes ClickHouse sensibles à la casse, par exemple : -
AggregateFunction: Le nom de la fonction d’agrégation appliquée à une colonne de [type AggregateFunction]. Faites correspondre le type de données au type ClickHouse passé à la fonction et spécifiez le nom de la fonction d’agrégation via l’option de colonne appropriée ; pg_clickhouse ajoutera automatiquementMergeà la fonction d’agrégation qui évalue la colonne. -
SimpleAggregateFunction: Le nom de la fonction d’agrégation appliquée à une colonne de [type SimpleAggregateFunction]. Faites correspondre le type de données au type ClickHouse passé à la fonction et spécifiez le nom de la fonction d’agrégation via l’option de colonne appropriée.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE pour les supprimer également :
Référence SQL DML
EXPLAIN
VERBOSE provoque l’affichage de la
requête ClickHouse “Remote SQL” :
SELECT
nodes et effectuons la jointure avec celle-ci plutôt qu’avec la table distante :
node_id plutôt que par la colonne locale, puis en effectuant la jointure
avec la table de correspondance plus tard :
node_id, réduisant
le nombre de lignes devant être rapatriées dans Postgres de 1000 (la totalité
d’entre elles) à seulement 8, une pour chaque nœud.
PREPARE, EXECUTE, DEALLOCATE
{param:type} :
parameters:
INSERT
COPY
⚠️ Limitations de l’API Batch pg_clickhouse n’a pas encore implémenté la prise en charge de l’API d’insertion par lot du FDW de PostgreSQL. Par conséquent, COPY utilise actuellement des instructions INSERT pour insérer les enregistrements. Cela sera amélioré dans une prochaine version.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings configure les [paramètre
ClickHouse] à appliquer aux requêtes suivantes. Exemple :
join_use_nulls 1, group_by_use_nulls 1, final 1. Définissez-la sur une
chaîne vide pour utiliser les paramètres du serveur ClickHouse.
date_time_output_format: le pilote « http » exige qu’il soit défini sur “iso”format_tsv_null_representation: le pilote « http » exige la valeur par défautoutput_format_tsv_crlf_end_of_linele pilote « http » exige la valeur par défaut
pg_clickhouse.session_settings ; utilisez soit le [préchargement de bibliothèque partagée], soit
simplement l’un des objets de l’extension pour garantir son chargement.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex contrôle si pg_clickhouse
déporte les fonctions et les opérateurs d’expressions régulières. C’est le comportement par défaut ;
définissez ce paramètre sur false pour éviter qu’ils ne soient déportés :
ALTER ROLE
SET d’ALTER ROLE pour précharger pg_clickhouse
et/ou SET ses paramètres pour certains rôles :
RESET de ALTER ROLE pour réinitialiser le préchargement de pg_clickhouse
et/ou les paramètres :
Préchargement
session_preload_libraries
Types de données
| ClickHouse | PostgreSQL | Notes |
|---|---|---|
| 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 | Erreur pour les valeurs > max BIGINT |
| UInt8 | smallint | |
| UUID | uuid |
BYTEA
SELECT produira :
Référence des fonctions et des opérateurs
Fonctions
clickhouse_raw_query
host=localhost port=8123. Les paramètres de connexion pris en charge
sont :
host: l’hôte auquel se connecter ; obligatoire.port: le port HTTP auquel se connecter ; la valeur par défaut est8123, sauf sihostest un hôte ClickHouse Cloud, auquel cas elle est8443dbname: le nom de la database à laquelle se connecter.username: le username à utiliser pour la connexion ; la valeur par défaut estdefaultpassword: le password à utiliser pour l’authentification ; par défaut, aucun mot de passe n’est utilisé
EXECUTE à cette fonction ; envisagez d’accorder, via GRANT,
cet accès uniquement aux rôles qui doivent légitimement exécuter des queries ClickHouse ad hoc,
par exemple un admin role ClickHouse dédié :
Utile pour les queries qui ne renvoient aucun enregistrement, mais celles qui renvoient des values
sont retournées sous la forme d’une seule valeur textuelle :
Fonctions de pushdown
pg_clickhouse applique le pushdown à un sous-ensemble des fonctions intégrées de PostgreSQL utilisées
dans les expressions conditionnelles (clauses HAVING et WHERE). Ce sous-ensemble correspond aux
équivalents ClickHouse suivants :
abs: absfactorial: factorialmod(int2/int4/int8/numeric) : modulopow&power(float8/numeric) : powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: fonctions mathématiques ClickHouse portant le même nom.asin,acos,atanh,acoshne sont pas poussées vers le bas : PG renvoie une erreur sur une entrée hors intervalle, là où CH renvoieNaN.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): mêmes correspondances quedate_partdate(timestamp)&date(timestamptz): toDate (restitué sous forme d’alias CHdate)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + indexation de tableautrim_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_match: extractGroups si l’expression régulière contient des sous-expressions entre parenthèses ; sinon extractAll puis découpé avec arraySlice.regexp_replace: replaceRegexpOne ou replaceRegexpOne lorsque l’indicateurgest présentregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: syntaxe des sous-colonnesjson_extract_path: toJSONString + syntaxe des sous-colonnesjsonb_extract_path_text: syntaxe des sous-colonnesjsonb_extract_path: toJSONString + syntaxe des sous-colonnesbit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt): formatDateTime lorsquefmtest une constante de chaîne dont chaque mot-clé possède un équivalent fidèle dans ClickHouse. Voir to_char() dans les Notes de compatibilité pour les mots-clés pris en charge. Sinon, la fonction est évaluée localement dans PostgreSQL.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now et 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: Transmise comme valeur par la fonction PostgreSQL.CURRENT_SCHEMA: Transmise comme valeur par la fonction PostgreSQL.CURRENT_CATALOG: Transmise comme valeur par la fonction PostgreSQL.CURRENT_USER: Transmise comme valeur par la fonction PostgreSQL.USER: transmis comme valeur par la fonction PostgreSQL.CURRENT_ROLE: transmis comme valeur par la fonction PostgreSQL.SESSION_USER: transmis comme valeur par la fonction PostgreSQL.
Opérateurs de pushdown
- Tranche d’Array (
arr[L:U]) : arraySlice @>(le tableau contient) : hasAll<@(tableau contenu dans) : hasAll&&(chevauchement de tableaux) : hasAny~(correspondance regexp) : match!~(absence de correspondance regexp) : match~*(absence de correspondance regexp insensible à la casse) : match!~*(absence de correspondance regexp insensible à la casse) : match->>(extraction d’un élément JSON/JSONB sous forme de texte) : syntaxe des sous-colonnes->(extraction JSON/JSONB) : toJSONString + syntaxe des sous-colonnes
Fonctions personnalisées
pg_clickhouse assurent le
pushdown des requêtes externes pour certaines fonctions ClickHouse n’ayant
pas d’équivalent dans PostgreSQL. Si l’une de ces fonctions ne peut pas
être poussée down, elle déclenchera une exception.
Pushdown des extensions
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(à 2 arguments) : editDistanceUTF8
Conversions de type avec pushdown
CAST(x AS bigint) pour les
types de données compatibles. Pour les types incompatibles, le pushdown échoue ; si x dans cet
exemple est un UInt64 de ClickHouse, ClickHouse refusera de convertir la valeur.
Pour effectuer le pushdown de conversions vers des types de données incompatibles, pg_clickhouse fournit
les fonctions suivantes. Elles lèvent une exception dans PostgreSQL si elles ne sont pas
pushed down.
Agrégats en pushdown
Agrégats personnalisés
pg_clickhouse assurent le
pushdown des requêtes externes pour certaines fonctions d’agrégation ClickHouse
sans équivalent dans PostgreSQL. Si l’une de ces fonctions ne peut pas faire l’objet d’un pushdown, une exception sera levée.
Agrégats d’ensemble ordonné en pushdown
ORDER BY comme arguments. Par exemple, cette requête PostgreSQL :
DESC et NULLS FIRST non définis par défaut pour ORDER BY
ne sont pas pris en charge et génèrent une erreur.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Fonctions de fenêtre avec pushdown
OVER (PARTITION BY ... ORDER BY ...), y compris les spécifications de frame lorsque
applicable.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(avec la clauseOVER)
row_number, rank, dense_rank, ntile, cume_dist,
percent_rank) omettent leur clause de frame lors du pushdown, car ClickHouse
refuse les spécifications de frame pour ces fonctions.
Notes de compatibilité
Expressions régulières
-
PostgreSQL prend en charge les [expressions régulières POSIX], tandis que ClickHouse prend en charge
les expressions régulières RE2. Tenez compte des différences de comportement : utilisez RE2
lorsque l’expression régulière est évaluée par ClickHouse (par exemple, dans une
clause
WHERE) et POSIX lorsqu’elle est évaluée par Postgres (par exemple, dans une clauseSELECT). -
pg_clickhouse répercute les [options Postgres] en les ajoutant en préfixe à l’expression régulière ClickHouse dans
(?). Par exemple :Devient -
Les seules options prises en charge par les deux, et qui peuvent donc être utilisées lorsqu’elles sont évaluées par
ClickHouse, sont :
RE2 ne prend en charge que ces options ; n’utilisez pas d’autres [options Postgres].
Flag Équiv. Remarques iicorrespondance insensible à la casse mm-s^et$correspondent au début/à la fin d’une ligne, en plus du début/de la fin du textenm-salias Postgres de mp-sempêche .et[^x]de correspondre à\nssautorise .et[^x]à correspondre à\ntsyntaxe stricte, sans effet wmcorrespondance partielle inverse sensible aux retours à la ligne -
Ce tableau résume les effets des différents modificateurs (et de l’absence de modificateur, qui
revient au même que
s) pour la correspondance des sauts de ligne et des fins de ligne. Notez que dans Postgres,metpempêchent les classes de caractères négatives ([^xyz]) de correspondre à un saut de ligne, alors que les équivalents de ClickHouse ne le font pas. Sinon, les comportements sont les mêmes dans ClickHouse que dans Postgres :Motif appliqué à a\nbPostgres ClickHouse Identique ? a.btrue true ✔︎ a[^x]btrue true ✔︎ a$false false ✔︎ Modificateur s(?s)a.btrue true ✔︎ (?s)a[^x]btrue true ✔︎ (?s)a$false false ✔︎ Modificateur m(?m)a.bfalse false ✔︎ (?m)a[^x]btrue false ✘ (?m)a$true true ✔︎ Modificateur p(?p)a.bfalse false ✔︎ (?p)a[^x]btrue false ✘ (?p)a$false false ✔︎ Modificateur w(?w)a.btrue true ✔ (?w)a[^x]btrue true ✔ (?w)a$true true ✔ - Tout autre flag transmis aux fonctions d’expression régulière empêchera le pushdown de la fonction.
-
L’exception est
regexp_replace(), qui prend aussi en charge le flagg. Lorsquegest activé, pg_clickhouse utilisereplaceRegexpAll()au lieu dereplaceRegexpOne()et supprime le flag avant d’ajouter les autres flags en préfixe. -
L’argument de remplacement de
regexp_replace()dans Postgres prend en charge\&pour désigner la correspondance complète, tandis que ClickHouse utilise\0pour la correspondance complète. Veillez à utiliser\0lorsque la fonction fait l’objet d’un pushdown vers ClickHouse. -
Postgres
regexp_matchrenvoieNULLlorsqu’il n’y a aucune correspondance, tandis que les expressions dont l’exécution est déléguée renvoient un tableau vide. UtilisezCOALESCE()pour renvoyer un tableau vide au lieu deNULLafin de comparer les valeurs de retour de manière compatible. Par exemple :
to_char()
to_char() de PostgreSQL pour timestamp et timestamp with time zone
n’est délégué à ClickHouse formatDateTime que lorsque l’argument de format
est une constante de chaîne non-NULL dont chaque mot-clé PostgreSQL a un
équivalent ClickHouse strictement identique, octet pour octet. Si le format est dynamique
(et non un Const), ou s’il contient un mot-clé ou un modificateur non pris en charge, l’appel
retombe sur une évaluation locale dans PostgreSQL — aucun pushdown n’est jamais
tenté avec une traduction partielle, de sorte que le résultat reste compatible avec PG.
Les formes à deux arguments de to_char() appliquées à numeric, interval et à d’autres
types autres que timestamp ne font jamais l’objet d’un pushdown ; ClickHouse formatDateTime ne
formate que les valeurs de date et d’heure.
Mots-clés traduits
| PostgreSQL | ClickHouse | Signification |
|---|---|---|
YYYY, yyyy | %Y | année à 4 chiffres |
YY, yy | %y | année à 2 chiffres |
MM, mm | %m | mois à 2 chiffres, complété par un zéro à gauche (01–12) |
DD, dd | %d | jour du mois à 2 chiffres, complété par un zéro à gauche (01–31) |
DDD, ddd | %j | jour de l’année à 3 chiffres, complété par un zéro à gauche (001–366) |
HH24, hh24 | %H | heure sur 24 heures, complétée par un zéro à gauche (00–23) |
HH, hh, HH12, hh12 | %I | heure sur 12 heures, complétée par un zéro à gauche (01–12) |
MI, mi | %i | minute à 2 chiffres, complétée par un zéro à gauche (00–59) |
SS, ss | %S | seconde à 2 chiffres, complétée par un zéro à gauche (00–59) |
Q, q | %Q | trimestre (1–4) |
Mon | %b | nom du mois abrégé, par ex. Oct |
Dy | %a | nom du jour de la semaine abrégé, par ex. Mon |
AM, PM | %p | indicateur AM/PM, toujours en majuscules |
Texte entre guillemets et littéraux
"..." est transmis tel quel, avec chaque %
littéral doublé en %% pour échapper au préfixe de spécificateur de ClickHouse. Un \" en dehors
des guillemets est également transmis comme un ". À l’intérieur de "...", l’antislash
n’échappe que " ; les autres séquences avec antislash sont traitées comme du texte littéral.
David E. Wheeler