La fonction de table eval évalue son argument en chaîne de requête, puis exécute cette chaîne comme une seule requête SELECT.
Cette fonction de table est expérimentale et désactivée par défaut. Activez-la avec le paramètre allow_experimental_eval_table_function :
Cela nécessite également l’analyseur (enable_analyzer, activé par défaut).
expression — Une expression constante qui renvoie une chaîne de requête. Les paramètres de requête et les sous-requêtes scalaires sont autorisés.
SELECT ... — Une requête SELECT qui renvoie une chaîne de requête. Cette forme est un raccourci syntaxique pour une sous-requête scalaire : eval(SELECT ...) est équivalent à eval((SELECT ...)). La requête doit donc renvoyer exactement une ligne et une colonne.
La valeur de l’expression doit être de l’un des types suivants :
String
Nullable(String)
LowCardinality(String)
LowCardinality(Nullable(String))
Si la valeur est NULL, eval lève une exception.
Renvoie le résultat de la requête SELECT générée sous forme de table.
Le schéma de sortie est déterminé lors de l’analyse de la fonction de table eval, de sorte que les requêtes externes peuvent faire référence aux noms et aux types réels des colonnes de la requête générée.
Évaluez une expression constante :
Résultat :
Utilisez un paramètre de requête :
Résultat :
Évalue une requête SELECT en entrée et renvoie le texte de la requête :
Résultat :
Utilisez le schéma généré dans la requête externe :
Résultat :
eval fonctionne uniquement avec l’analyseur de requêtes (enable_analyzer = 1).
- La requête générée doit être une unique requête
SELECT, sans options de sortie telles que INTO OUTFILE ou FORMAT. eval n’exécute pas plusieurs instructions.
- La requête générée doit être autonome : elle est résolue dans sa propre portée et ne peut pas référencer les alias
WITH ni les colonnes de la requête externe.
- La requête générée ne peut pas réutiliser la fonction de table
eval.
eval ne peut pas être utilisé comme argument d’une autre fonction de table, telle que remote('host', eval(...)). Pour exécuter la requête générée sur un serveur distant, encapsulez-la dans view : remote('host', view(SELECT * FROM eval(...))).
- L’argument est évalué une seule fois lors de l’analyse de la requête, et non une fois par ligne ou par bloc.
- Le journal des requêtes de la requête externe enregistre la requête d’origine qui contient
eval ; la requête SELECT générée n’est pas enregistrée comme une requête utilisateur distincte.
Dernière modification le 23 juillet 2026