Analyse syntaxique des requêtes
- Un parseur SQL complet (un analyseur par descente récursive).
- Un parseur de format de données (un parseur de flux rapide).
INSERT, qui utilise les deux parseurs.
Examinons la requête ci-dessous :
INSERT utilise les deux parseurs.
Le fragment INSERT INTO t VALUES est analysé par le parseur complet,
et les données (1, 'Hello, world'), (2, 'abc'), (3, 'def') sont analysées par le parseur de format de données, ou parseur de flux rapide.
Activer le parseur complet
Activer le parseur complet
Vous pouvez également activer le parseur complet pour les données
en utilisant le paramètre
input_format_values_interpret_expressions.Lorsque le paramètre mentionné ci-dessus est défini sur 1,
ClickHouse essaie d’abord d’analyser les valeurs avec le parseur de flux rapide.
En cas d’échec, ClickHouse essaie d’utiliser le parseur complet pour les données, en les traitant comme une expression SQL.INSERT volumineuses, qui constituent la méthode recommandée pour insérer vos données dans ClickHouse.
Lors de l’utilisation du format Values dans une requête INSERT,
il peut sembler que les données sont analysées de la même manière que les expressions dans une requête SELECT, mais ce n’est pas le cas.
Le format Values est beaucoup plus limité.
Le reste de cette section porte sur le parseur complet.
Pour plus d’informations sur les parseurs de format, consultez la section Formats.
Espaces
- Il peut y avoir un nombre quelconque de caractères d’espacement entre les éléments syntaxiques (y compris au début et à la fin d’une requête).
- Les caractères d’espacement comprennent l’espace, la tabulation, le saut de ligne, le retour chariot (CR) et le saut de page.
Commentaires
- Les commentaires de style SQL commencent par
--,#!ou#et se poursuivent jusqu’à la fin de la ligne. L’espace après--et#!peut être omis. - Commentaires de style C :
//(ou plus de 2 caractères/) suivi de texte jusqu’à la fin de la ligne. Les espaces après/ne sont pas obligatoires.- Peuvent s’étendre de
/*à*/pour les commentaires sur plusieurs lignes. Les espaces ne sont pas non plus obligatoires. - Les commentaires de style C peuvent être imbriqués.
Mots-clés
- la norme SQL. Par exemple,
SELECT,selectetSeLeCtsont tous valides. - l’implémentation de certains SGBD populaires (MySQL ou Postgres). Par exemple,
DateTimeest identique àdatetime.
Vous pouvez vérifier si un nom de type de données est sensible à la casse dans la table system.data_type_families.
table_name possède une colonne nommée "FROM" :
Identifiants
- Les noms de cluster, de base de données, de table, de partition et de colonne.
- Les fonctions.
- Les types de données.
- Les alias d’expressions.
^[a-zA-Z_][0-9a-zA-Z_]*$ et ne peuvent pas être identiques à des mots-clés.
Consultez le tableau ci-dessous pour voir des exemples d’identifiants valides et invalides :
| Identifiants valides | Identifiants invalides |
|---|---|
xyz, _internal, Id_with_underscores_123_ | 1x, tom@gmail.com, äußerst_schön |
"id", `id`.
Les mêmes règles d’échappement qui s’appliquent aux identifiants entre guillemets s’appliquent également aux littéraux de chaîne. Voir String pour plus de détails.
Littéraux
- String
- Numériques
- Composés
NULL- Heredocs (littéraux de chaîne personnalisés)
String
- en utilisant un guillemet simple en préfixe : le caractère guillemet simple
'(et uniquement ce caractère) peut alors être échappé sous la forme'', ou - en utilisant une barre oblique inverse en préfixe avec l’une des séquences d’échappement prises en charge ci-dessous, listées dans le tableau suivant.
La barre oblique inverse perd sa signification spéciale, c’est-à-dire qu’elle est interprétée littéralement si elle précède un caractère autre que ceux listés ci-dessous.
| Échappement pris en charge | Description |
|---|---|
\xHH | Spécification d’un caractère sur 8 bits suivie d’un nombre quelconque de chiffres hexadécimaux (H). |
\N | réservé, ne fait rien (par ex. SELECT 'a\Nb' renvoie ab) |
\a | alerte |
\b | retour arrière |
\e | caractère d’échappement |
\f | saut de page |
\n | saut de ligne |
\r | retour chariot |
\t | tabulation horizontale |
\v | tabulation verticale |
\0 | caractère nul |
\\ | barre oblique inverse |
\' (ou '') | guillemet simple |
\" | guillemet double |
` | accent grave |
\/ | barre oblique |
\= | signe égal |
| Caractères de contrôle ASCII (c <= 31). |
Dans les littéraux de chaîne de caractères, vous devez au minimum échapper
' et \ à l’aide des codes d’échappement \' (ou : '') et \\.Numérique
- Si le littéral est précédé d’un signe moins
-, le jeton est ignoré et le résultat est négativé après l’analyse. - Le littéral numérique est d’abord analysé comme un entier non signé sur 64 bits, à l’aide de la fonction strtoull.
- Si la valeur est précédée de
0bou de0x/0X, le nombre est analysé respectivement en binaire ou en hexadécimal. - Si la valeur est négative et que sa valeur absolue est supérieure à 263, une erreur est renvoyée.
- Si la valeur est précédée de
- En cas d’échec, la valeur est ensuite analysée comme un nombre à virgule flottante à l’aide de la fonction strtod.
- Sinon, une erreur est renvoyée.
1est analysé commeUInt8256est analysé commeUInt16.
ImportantLes valeurs entières de plus de 64 bits (Cela contourne l’algorithme ci-dessus et analyse l’entier à l’aide d’une routine prenant en charge une précision arbitraire.Sinon, le littéral sera analysé comme un nombre à virgule flottante et sera donc sujet à une perte de précision due à la troncature.
UInt128, Int128, UInt256, Int256) doivent être converties vers un type plus grand pour être analysées correctement :_ à l’intérieur des littéraux numériques sont ignorés et peuvent être utilisés pour améliorer la lisibilité.
Les littéraux numériques suivants sont pris en charge :
| Littéral numérique | Exemples |
|---|---|
| Entiers | 1, 10_000_000, 18446744073709551615, 01 |
| Décimaux | 0.1 |
| Notation exponentielle | 1e100, -1e-100 |
| Nombres à virgule flottante | 123.456, inf, nan |
| Hexadécimal | 0xc0fe |
| Chaîne hexadécimale compatible avec le standard SQL | x'c0fe' |
| Binaire | 0b1101 |
| Chaîne binaire compatible avec le standard SQL | b'1101' |
Les littéraux octaux ne sont pas pris en charge afin d’éviter les erreurs d’interprétation accidentelles.
Composés
[] : [1, 2, 3]. Les tuples se construisent avec () : (1, 'Hello, world!', 2).
Techniquement, il ne s’agit pas de littéraux, mais respectivement d’expressions utilisant l’opérateur de création de tableau et l’opérateur de création de tuple.
Un tableau doit contenir au moins un élément, et un tuple au moins deux.
Il existe un cas particulier lorsque des tuples apparaissent dans la clause
IN d’une requête SELECT.
Les résultats d’une requête peuvent inclure des tuples, mais les tuples ne peuvent pas être enregistrés dans une base de données (sauf pour les tables utilisant le moteur Memory).NULL
NULL est utilisé pour indiquer qu’une valeur est manquante.
Pour stocker NULL dans un champ de table, celui-ci doit être de type Nullable.
Voici les points à retenir concernant
NULL :- Selon le format de données (en entrée ou en sortie),
NULLpeut avoir une représentation différente. Pour plus d’informations, consultez les formats de données. - Le traitement de
NULLcomporte des subtilités. Par exemple, si au moins un des arguments d’une opération de comparaison estNULL, le résultat de cette opération est égalementNULL. Il en va de même pour la multiplication, l’addition et d’autres opérations. Nous vous recommandons de consulter la documentation de chaque opération. - Dans les requêtes, vous pouvez tester
NULLà l’aide des opérateursIS NULLetIS NOT NULL, ainsi que des fonctions associéesisNulletisNotNull.
Heredoc
$.
Par exemple :
- Une valeur située entre deux heredocs est traitée « telle quelle ».
Définition et utilisation des paramètres de requête
SET param_<name>=<value>— à l’aide d’une commandeSETdans une requête.--param_<name>='<value>'— comme argument declickhouse-clienten ligne de commande.param_<name>=<value>— comme paramètre de query string d’URL pour l’interface HTTP.
{<name>: <datatype>}, où <name> est le nom du paramètre de requête et <datatype> le type de données vers lequel il est converti.
Exemple avec la commande SET
Exemple avec la commande SET
Par exemple, le SQL suivant définit des paramètres nommés
a, b, c et d - chacun avec un type de données différent :Exemple avec clickhouse-client
Exemple avec clickhouse-client
Si vous utilisez Si le paramètre de requête représente le nom d’une base de données, d’une table, d’une fonction ou d’un autre identifiant, utilisez
clickhouse-client, les paramètres sont spécifiés sous la forme --param_name=value. Par exemple, le paramètre suivant porte le nom message et est récupéré en tant que String :Identifier comme type. Par exemple, la requête suivante renvoie les lignes d’une table nommée uk_price_paid :Exemple avec l’interface HTTP
Exemple avec l’interface HTTP
Les paramètres de requête peuvent être transmis comme paramètres de query string d’URL avec le préfixe
param_. Par exemple :Exemple avec l’interface web
Exemple avec l’interface web
L’interface web intégrée (
play.html) détecte automatiquement les placeholders de paramètres {name:Type} dans la requête et affiche des champs de saisie libellés pour chaque paramètre. Les valeurs des paramètres sont incluses dans la requête HTTP et également conservées dans l’URL de la page pour les favoris et le partage.Les paramètres de requête ne sont pas des substitutions de texte génériques pouvant être utilisées à des emplacements arbitraires dans n’importe quelle requête SQL.
Ils sont principalement conçus pour fonctionner dans les instructions
SELECT à la place d’identifiants ou de littéraux.Fonctions
().
Contrairement au SQL standard, les parenthèses sont obligatoires, même lorsque la liste d’arguments est vide.
Par exemple :
La syntaxe des fonctions d’agrégation sans paramètres est la même que celle des fonctions régulières.
Opérateurs
Types de données et moteurs de table de la base de données
CREATE s’écrivent de la même manière que les identifiants ou les fonctions.
Autrement dit, ils peuvent comporter ou non une liste d’arguments entre parenthèses.
Pour plus d’informations, consultez les sections :
Expressions
- une fonction
- un identifiant
- un littéral
- l’application d’un opérateur
- une expression entre parenthèses
- une sous-requête
- un astérisque
Alias d’expression
| Élément de syntaxe | Description | Exemple | Remarques |
|---|---|---|---|
AS | Mot-clé utilisé pour définir des alias. Vous pouvez définir l’alias d’un nom de table ou d’un nom de colonne dans une clause SELECT sans utiliser le mot-clé AS. | SELECT table_name_alias.column_name FROM table_name table_name_alias. | Dans la fonction CAST, le mot-clé AS a un autre sens. Voir la description de la fonction. |
expr | Toute expression prise en charge par ClickHouse. | SELECT column_name * 2 AS double FROM some_table | |
alias | Nom de expr. Les alias doivent respecter la syntaxe des identifiants. | SELECT "table t".column_name FROM table_name AS "table t". |
Notes sur l’utilisation
- Les alias sont globaux à une requête ou une sous-requête, et vous pouvez définir un alias dans n’importe quelle partie d’une requête pour n’importe quelle expression. Par exemple :
- Les alias n’apparaissent pas dans les sous-requêtes ni d’une sous-requête à l’autre. Par exemple, lors de l’exécution de la requête suivante, ClickHouse génère l’exception
Unknown identifier: num:
- Si un alias est défini pour les colonnes de résultat dans la clause
SELECTd’une sous-requête, ces colonnes sont visibles dans la requête externe. Par exemple :
- Faites attention aux alias qui coïncident avec des noms de colonne ou de table. Considérons l’exemple suivant :
t avec la colonne b.
Ensuite, lors de la sélection des données, nous avons défini l’alias sum(b) AS b.
Comme les alias sont globaux,
ClickHouse a remplacé le littéral b dans l’expression argMax(a, b) par l’expression sum(b).
Cette substitution a provoqué l’exception.
Vous pouvez modifier ce comportement par défaut en définissant prefer_column_name_to_alias sur
1.Astérisque
SELECT, un astérisque peut remplacer une expression.
Pour plus d’informations, consultez la section SELECT.