27. Codes d'erreur
Chaque erreur que MIRAJ renvoie porte trois informations : un code numérique, un SQLSTATE à 5 caractères et un message dans la langue de la session. Cette page liste les codes numériques que le moteur peut produire, avec leur SQLSTATE et le libellé français exact du catalogue de messages, ainsi qu'une explication de la cause typique et, quand c'est utile, une piste de correction.
Précision de méthode : chaque ligne de ce chapitre a été vérifiée directement dans le code du moteur (catalogue de messages et table des codes). Quand le comportement exact d'un code n'a pas pu être confirmé avec certitude, cela est signalé explicitement plutôt que de risquer un libellé inventé.
1. Comment lire une erreur MIRAJ#
Une erreur renvoyée par le moteur ou par le serveur réseau se présente sous la forme :
ERROR 1146 (42S02): La table 'ventes.clients' n'existe pas- 1146 est le code numérique, propre à MIRAJ (repris d'une numérotation historique bien établie dans l'écosystème SQL, pour rester familier aux outils existants) ;
- 42S02 est le SQLSTATE, une norme indépendante du moteur (voir §3) ;
- le texte est le message, produit à partir d'un gabarit du catalogue (
resources/french.jsonpar défaut) dans lequel les%sont été remplacés par les valeurs de l'erreur (nom de table, de colonne, etc.).
2. Table de référence des codes d'erreur#
Les codes ci-dessous sont ceux que le catalogue de messages du moteur définit effectivement (fichier crates/miraj-core/resources/french.json, table des codes crates/miraj-core/src/error.rs). Le message français est celui du catalogue, mot pour mot (%s = valeur substituée à l'exécution : nom de table, de colonne, etc.).
2.1 Erreurs de syntaxe et d'analyse#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1064 | 42000 | Erreur de syntaxe SQL ; vérifiez le manuel de votre version de Miraj pour la syntaxe correcte près de '%s' à la ligne %s | Construction SQL invalide, mot-clé mal placé, syntaxe non prise en charge, ou profondeur d'imbrication de requête dépassée (au-delà de 1 000 niveaux) | Relire l'instruction autour du texte cité par « near » ; vérifier les parenthèses et virgules |
| 1065 | 42000 | La requête est vide | Instruction vide envoyée au serveur | Vérifier que le client n'envoie pas une chaîne vide |
| 1139 | 42000 | Erreur « %s » dans l'expression régulière | Motif invalide passé à REGEXP, REGEXP_REPLACE, etc. | Corriger le motif ; le détail de l'erreur du moteur d'expressions régulières est repris dans %s |
| 1210 | HY000 | Arguments incorrects pour %s | Argument(s) d'une fonction ou instruction incompatibles avec sa signature | Vérifier le nombre et le type des arguments |
| 1221 | HY000 | Utilisation incorrecte de %s et %s | Combinaison de deux constructions incompatibles dans la même instruction | Séparer les deux constructions ou consulter la documentation de l'instruction concernée |
| 1235 | 42000 | Cette version de Miraj ne prend pas encore en charge '%s' | Construction syntaxiquement valide mais non implémentée dans cette version | Utiliser une construction équivalente prise en charge |
| 1305 | 42000 | %s %s n'existe pas | Appel d'une fonction inconnue (FUNCTION f n'existe pas) ; ROLLUP et CUBE ne sont pas des fonctions : ils ne s'écrivent que dans un GROUP BY | Corriger le nom ; vérifier la liste des chapitres 9 et 6 |
| 1582 | 42000 | Nombre de paramètres incorrect dans l'appel de la fonction native '%s' | Nombre d'arguments hors de l'arité de la fonction (GROUPING() sans argument, COLUMN_GET à deux arguments…) | Vérifier la signature au chapitre 9 |
| 1111 | HY000 | Utilisation invalide d'une fonction d'agrégation | Agrégat, ou GROUPING(), dans un WHERE ou sans GROUP BY | Déplacer la condition dans HAVING ; GROUPING() ne s'emploie qu'avec GROUP BY (§8.17) |
| 3580 | HY000 | L'argument n°%s de la fonction GROUPING ne figure pas dans GROUP BY | GROUPING(p) alors que p n'est pas une expression du GROUP BY | Passer à GROUPING les expressions du GROUP BY telles qu'écrites |
| 3667 | 42000 | Toute fonction table doit avoir un alias | FROM JSON_TABLE(...) sans alias | Ajouter [AS] alias |
| 3668 | HY000 | Les références latérales de '%s' exigent une jointure INNER ou LEFT | JSON_TABLE dont le document cite une table placée avant, jointe par RIGHT JOIN | Utiliser la virgule, JOIN ou LEFT JOIN |
| 1253 | 42000 | La collation '%s' n'est pas valide pour le jeu de caractères '%s' | Interclassement d'un autre jeu (CHARACTER SET latin1 COLLATE utf8mb4_unicode_ci, 'a' COLLATE utf8_bin sur un texte utf8mb4) | Prendre un interclassement utf8mb4_… (voir le chapitre Interclassements) |
| 1267 | HY000 | Mélange illégal de collations (%s,%s) et (%s,%s) pour l'opération '%s' | Deux textes d'interclassements qui ne s'accordent pas (colonne utf8mb4_unicode_ci contre colonne utf8mb4_general_ci, deux COLLATE explicites différents) | Ajouter COLLATE nom à l'un des opérandes |
| 1270 | HY000 | Mélange illégal de collations (%s,%s), (%s,%s), (%s,%s) pour l'opération '%s' | Même cas avec trois opérandes (IN, CASE, REPLACE) | Idem |
| 1271 | HY000 | Mélange illégal de collations pour l'opération '%s' | Même cas avec quatre opérandes ou plus, ou colonnes d'un UNION | Idem |
| 1273 | HY000 | Collation inconnue : '%s' | Nom d'interclassement non pris en charge (utf8mb4_0900_ai_ci, *_as_cs, linguistiques) | utf8mb4_general_ci, utf8mb4_unicode_ci ou utf8mb4_bin |
| 1302 | HY000 | Déclarations contradictoires : '%s' et '%s' | Colonne déclarée BINARY avec un COLLATE autre que binaire | Garder l'un des deux |
| 1407 | 42000 | SQLSTATE incorrect : '%s' | SIGNAL/RESIGNAL SQLSTATE '...' avec une valeur qui n'est pas un code à 5 caractères valide | Utiliser un SQLSTATE conforme (5 caractères, classe différente de 00, 01, XA) |
2.2 Erreurs de schéma (bases, tables, colonnes, index)#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 29 | HY000 | Fichier '%s' introuvable (code : %s) | Fichier attendu par le moteur absent du disque (table, journal...) | Vérifier le chemin et les droits d'accès au dossier de données |
| 1004 | HY000 | Impossible de créer le fichier '%s' (errno : %s) | Écriture disque impossible (droits, disque plein, chemin invalide) | Vérifier l'espace disque et les droits sur le dossier de données |
| 1005 | HY000 | Impossible de créer la table '%s' (errno : %s) | Échec d'écriture du fichier .mrj à la création | Vérifier l'espace disque et les droits |
| 1007 | HY000 | Impossible de créer la base '%s' ; elle existe déjà | CREATE DATABASE sans IF NOT EXISTS sur une base existante | Ajouter IF NOT EXISTS ou choisir un autre nom |
| 1008 | HY000 | Impossible de supprimer la base '%s' ; elle n'existe pas | DROP DATABASE sans IF EXISTS sur une base absente | Ajouter IF EXISTS ou vérifier le nom |
| 1034 | HY000 | Fichier de la table '%s' incorrect ; essayez de la réparer (%s) | Fichier .mrj corrompu ou tronqué | Exécuter REPAIR TABLE (voir la section correspondante du manuel) |
| 1044 | 42000 | Accès refusé pour l'utilisateur '%s'@'%s' à la base de données '%s' | Compte sans privilège sur la base (contrôlé à chaque USE et à la poignée de main) | Accorder un privilège de base avec GRANT |
| 1045 | 28000 | Accès refusé pour l'utilisateur '%s'@'%s' (mot de passe utilisé : %s) | Identifiants invalides à la connexion | Vérifier le compte et le mot de passe |
| 1046 | 3D000 | Aucune base de données sélectionnée | Instruction nécessitant une base courante exécutée sans USE | Exécuter USE <base> avant l'instruction, ou qualifier les objets |
| 1049 | 42000 | Base de données '%s' inconnue | USE ou référence à une base qui n'existe pas | Vérifier l'orthographe ou créer la base |
| 1050 | 42S01 | La table '%s' existe déjà | CREATE TABLE sans IF NOT EXISTS sur un nom déjà pris (table ou vue) | Ajouter IF NOT EXISTS, ou DROP / CREATE OR REPLACE |
| 1051 | 42S02 | Table '%s' inconnue | Référence à une table absente (contexte sans nom de base explicite) | Vérifier le nom et la base courante |
| 1052 | 23000 | La colonne '%s' dans %s est ambiguë | Colonne présente dans plusieurs tables de la requête sans qualification | Qualifier la colonne (table.colonne) |
| 1054 | 42S22 | Colonne '%s' inconnue dans '%s' | Nom de colonne mal orthographié ou colonne inexistante dans le contexte cité | Vérifier DESCRIBE <table> ou information_schema.COLUMNS |
| 1060 | 42S21 | Nom de colonne '%s' en double | Deux colonnes du même nom dans une même définition de table ou un CREATE TABLE … SELECT | Renommer l'une des colonnes ou lui donner un alias |
| 1061 | 42000 | Nom de clé '%s' en double | Deux index/clés du même nom sur la table | Choisir un autre nom d'index |
| 1066 | 42000 | Table ou alias non unique : '%s' | Même nom de table ou d'alias utilisé deux fois dans une requête | Donner un alias distinct à chaque occurrence |
| 1102 | 42000 | Nom de base de données incorrect : '%s' | Nom hors des règles (longueur, caractères autorisés) | Utiliser des caractères ASCII, chiffres, _, $ et espace (jamais en dernière position), 64 octets au plus |
| 1103 | 42000 | Nom de table incorrect : '%s' | Même règle que 1102, appliquée au nom de table | Idem |
| 1109 | 42S02 | Table '%s' inconnue dans %s | Table référencée absente dans le contexte précisé (%s : clause, jointure...) | Vérifier le nom de la table dans cette clause |
| 1146 | 42S02 | La table '%s.%s' n'existe pas | Table absente de la base indiquée | Vérifier le nom et la base, ou la créer |
| 1166 | 42000 | Nom de colonne incorrect : '%s' | Nom de colonne hors des règles d'identifiant | Renommer selon les règles |
| 1170 | 42000 | La colonne BLOB/TEXT '%s' est utilisée dans une clé sans longueur de clé | BLOB/TEXT utilisée comme colonne de clé primaire, UNIQUE ou index | Utiliser une colonne de longueur bornée, ou une colonne générée à partir d'un extrait |
| 1280 | 42000 | Nom d'index incorrect : '%s' | Nom d'index invalide ou trop long | Raccourcir ou corriger le nom |
| 1031 | HY000 | Le moteur de stockage %s de la table %s n'a pas cette option | Fonction non prise en charge par une table disque (ENGINE = Aria, MyISAM, DISK) : index vectoriel, partitionnement | Garder la table en mémoire (ENGINE = InnoDB ou sans clause ENGINE) |
| 1214 | HY000 | Le type de table utilisé ne prend pas en charge les index FULLTEXT | Index FULLTEXT ou de trigrammes sur une table disque (y compris un dump MariaDB en ENGINE=MyISAM avec index FULLTEXT) | Retirer la clause ENGINE ou la remplacer par ENGINE = InnoDB |
| 1266 | HY000 | Moteur de stockage %s utilisé pour la table '%s' | Avertissement : ENGINE = Aria / MyISAM / DISK sur une table temporaire, qui reste en mémoire | Aucune action : la table temporaire est créée en mémoire |
| 1286 | 42000 | Moteur de stockage '%s' inconnu | SET default_storage_engine d'un nom de moteur inconnu | Utiliser MIRAJ, InnoDB, MEMORY, Aria, MyISAM ou DISK |
| 3162 | HY000 | Le compte %s n'existe pas. | Rôle/compte cité qui n'existe pas | Vérifier CREATE USER / le nom exact du compte |
| 3163 | HY000 | Le compte %s existe déjà. | CREATE USER sur un compte déjà défini | Utiliser IF NOT EXISTS ou choisir un autre nom |
2.3 Erreurs de contraintes et de données#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1048 | 23000 | La colonne '%s' ne peut pas être NULL | INSERT/UPDATE fournissant NULL à une colonne NOT NULL sans valeur implicite disponible | Fournir une valeur, ou revoir la contrainte NOT NULL |
| 1062 | 23000 | Doublon '%s' pour la clé '%s' | Violation d'une clé primaire ou UNIQUE | Utiliser INSERT IGNORE, REPLACE ou ON DUPLICATE KEY UPDATE si le doublon est attendu |
| 1068 | 42000 | Plusieurs clés primaires définies | Deux clauses PRIMARY KEY dans une même définition de table | N'en garder qu'une |
| 1136 | 21S01 | Le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne %s | INSERT ... VALUES (...) avec un nombre de valeurs différent du nombre de colonnes | Faire correspondre les deux listes |
| 1138 | 22004 | Utilisation incorrecte de la valeur NULL | NULL utilisé là où il n'est pas permis (ex. valeur d'une contrainte) | Retirer le NULL ou revoir l'expression |
| 1171 | 42000 | Toutes les parties d'une clé primaire doivent être NOT NULL ; utilisez UNIQUE pour accepter NULL | Colonne nullable incluse dans une PRIMARY KEY | Rendre la colonne NOT NULL ou utiliser une contrainte UNIQUE |
| 1172 | 42000 | Le résultat compte plus d'une ligne | Sous-requête scalaire ou SELECT ... INTO recevant plusieurs lignes | Ajouter une condition qui ramène le résultat à une ligne, ou utiliser LIMIT 1 en connaissance de cause |
| 1215 | HY000 | Impossible d'ajouter la contrainte de clé étrangère | Définition de clé étrangère invalide (types incompatibles, index manquant côté parent...) | Vérifier les types des colonnes et l'existence d'un index sur la colonne référencée |
| 1242 | 21000 | La sous-requête renvoie plus d'une ligne | Sous-requête utilisée en contexte scalaire (=, SELECT ... INTO) qui rend plusieurs lignes | Restreindre la sous-requête ou utiliser IN / EXISTS |
| 1264 | 22003 | Valeur hors limites pour la colonne '%s' à la ligne %s | Valeur numérique hors de la plage du type déclaré | Utiliser un type plus large ou corriger la valeur |
| 1292 | 22007 | Valeur %s incorrecte tronquée : '%s' | Conversion échouée avec troncature (ex. chaîne non numérique convertie en nombre) | Corriger la valeur source ou son format |
| 1365 | 22012 | Division par zéro | Division ou modulo par 0 | Protéger l'expression (CASE WHEN ... != 0) ou accepter le résultat NULL selon le mode SQL |
| 1366 | 22007 | Valeur %s incorrecte : '%s' pour la colonne %s à la ligne %s | Valeur incompatible avec le type de la colonne à l'écriture | Corriger la valeur ou le type de colonne |
| 1406 | 22001 | Données trop longues pour la colonne '%s' à la ligne %s | Chaîne plus longue que la longueur déclarée de la colonne | Agrandir la colonne ou tronquer la valeur en amont |
| 1451 | 23000 | Impossible de supprimer ou de modifier une ligne parente : une contrainte de clé étrangère échoue (%s) | Suppression/modification d'une ligne encore référencée par une table enfant | Supprimer/modifier d'abord les lignes enfants, ou revoir l'action ON DELETE/ON UPDATE |
| 1452 | 23000 | Impossible d'ajouter ou de modifier une ligne enfant : une contrainte de clé étrangère échoue (%s) | Insertion/modification référençant une ligne parente inexistante | Insérer d'abord la ligne parente, ou vérifier la valeur de la clé étrangère |
| 4084 | HY000 | La séquence '%s.%s' est épuisée | NEXTVAL au-delà de MAXVALUE (ou MINVALUE) d'une séquence sans CYCLE | ALTER SEQUENCE … RESTART, élargir les bornes ou ajouter CYCLE |
| 4085 | HY000 | La séquence '%s.%s' a une valeur hors limites pour ses options | MINVALUE ≥ MAXVALUE, START hors des bornes, CACHE négatif… | Corriger les options |
| 4087 | HY000 | '%s.%s' n'est pas une SEQUENCE | SHOW CREATE SEQUENCE ou ALTER SEQUENCE sur une table ou une vue | Viser une séquence |
| 4089 | HY000 | SEQUENCE inconnue : '%s' | DROP SEQUENCE d'une séquence absente | DROP SEQUENCE IF EXISTS |
| 4091 | HY000 | INSERT incorrect dans une SEQUENCE | INSERT, UPDATE ou DELETE visant une séquence | ALTER SEQUENCE ou SETVAL |
| 1298 | HY000 | Fuseau horaire inconnu ou incorrect : '%s' | SET time_zone ou SET GLOBAL time_zone avec un nom absent de la base IANA, ou un décalage hors de -13:59 à +14:00 ; CONVERT_TZ rend NULL dans ce cas, sans erreur | Écrire SYSTEM, un décalage ±HH:MM ou un nom IANA (Europe/Paris) |
| 3665 | 22035 | Valeur absente pour la colonne '%s' de JSON_TABLE | Colonne JSON_TABLE déclarée ERROR ON EMPTY dont le chemin ne désigne rien | Écrire NULL ON EMPTY ou DEFAULT '...' ON EMPTY |
| 3666 | 2203F | Impossible de placer un tableau ou un objet dans la colonne scalaire '%s' de JSON_TABLE | Colonne scalaire JSON_TABLE ... ERROR ON ERROR dont le chemin désigne un tableau ou un objet | Viser une valeur scalaire, ou déclarer la colonne JSON |
| 3669 | 22003 | Valeur hors limites pour la colonne '%s' de JSON_TABLE | Valeur trop grande pour le type de la colonne JSON_TABLE | Élargir le type de la colonne |
| 4146 | HY000 | %s doit être de type %s pour la table versionnée %s | Colonne de période d'une table WITH SYSTEM VERSIONING qui n'est ni TIMESTAMP ni DATETIME (chapitre 11) | Corriger le type |
| 4174 | HY000 | La table %s n'est pas versionnée par le système | FOR SYSTEM_TIME, DELETE HISTORY ou DROP SYSTEM VERSIONING sur une table ordinaire | ALTER TABLE ... ADD SYSTEM VERSIONING |
| 4185 | HY000 | La table %s est déjà versionnée par le système | ADD SYSTEM VERSIONING sur une table déjà versionnée | Rien à faire |
| 3141 | 22032 | Texte JSON invalide dans l'argument %s de la fonction %s : "%s" à la position %s. | Document passé à une fonction JSON qui n'est pas du JSON valide (la raison et la position sont données) | Corriger le document ; JSON_VALID permet d'écarter les lignes invalides |
| 3143 | 42000 | Expression de chemin JSON invalide. L'erreur se situe vers le caractère %s. | Chemin JSON mal écrit ('$.', 'a', '$[1'...) | Commencer par $ et suivre la syntaxe des chemins (chapitre 9.10) |
| 3146 | 22032 | Type de données invalide pour un document JSON dans l'argument %s de la fonction %s... | Nombre ou date passé là où un document JSON est attendu | Passer un texte JSON, ou convertir la valeur par JSON_ARRAY / JSON_QUOTE |
| 3149 | 42000 | Ici, un chemin ne peut contenir ni les jetons * et **, ni une plage de tableau. | Joker ou plage dans le chemin d'une fonction de modification, de JSON_VALUE, JSON_KEYS, JSON_LENGTH ou JSON_CONTAINS | Désigner une seule valeur |
| 3153 | 42000 | Le chemin '$' n'est pas permis ici. | JSON_REMOVE(doc, '$') | Désigner un membre ou une case |
| 3154 | 42000 | L'argument oneOrAll de %s n'accepte que les valeurs 'one' ou 'all'. | Mode de JSON_CONTAINS_PATH / JSON_SEARCH mal écrit | Écrire 'one' ou 'all' |
| 3156 | 22018 | Valeur JSON invalide pour une conversion en %s depuis la colonne %s à la ligne %s | JSON_VALUE ... ERROR ON ERROR sur une valeur non convertible ou non scalaire | Revoir le type de RETURNING, ou choisir NULL / DEFAULT ON ERROR |
| 3157 | 22032 | Le document JSON dépasse la profondeur maximale. | Plus de 100 niveaux d'imbrication | Aplatir le document |
| 3158 | 22032 | Un document JSON ne peut pas avoir de membre dont le nom est NULL. | Clé NULL dans JSON_OBJECT ou JSON_OBJECTAGG | Écarter les lignes dont la clé est NULL |
| 3165 | 42000 | Le chemin ne désigne pas une case de tableau. | Chemin de JSON_ARRAY_INSERT qui ne finit pas par [n] | Terminer le chemin par une case |
| 3966 | 22035 | Aucune valeur trouvée par '%s' au chemin indiqué. | JSON_VALUE ... ERROR ON EMPTY sur un chemin qui ne désigne rien | Choisir NULL / DEFAULT ON EMPTY, ou vérifier le chemin |
| 4025 | 23000 | La CONTRAINTE %s a échoué pour %s.%s | Ligne refusée par une contrainte CHECK | Corriger la valeur pour satisfaire la contrainte, ou revoir la contrainte |
2.4 Erreurs de privilèges#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1044 | 42000 | Accès refusé pour l'utilisateur '%s'@'%s' à la base de données '%s' | Contrôle de niveau base (voir §2.2) | Accorder le privilège de base nécessaire |
| 1142 | 42000 | Commande %s refusée à l'utilisateur '%s'@'%s' pour la table '%s' | Contrôle de niveau table, avant même la résolution du nom | Accorder le privilège de table nécessaire (SELECT, INSERT...) |
| 1143 | 42000 | Commande %s refusée à l'utilisateur '%s'@'%s' pour la colonne '%s' de la table '%s' | Le compte n'a le privilège que sur certaines colonnes de la table, pas sur celle que l'instruction lit ou écrit (chapitre 14, privilèges par colonne) | Accorder le privilège sur la colonne (GRANT SELECT (col) ON base.table) ou sur la table |
| 1144 | 42000 | Commande GRANT/REVOKE invalide ; consultez le manuel pour savoir quels privilèges s'appliquent à ce niveau | GRANT/REVOKE d'un privilège à un niveau où il n'a pas de sens (ex. privilège de table au niveau global) | Utiliser le niveau adapté au privilège |
| 1040 | 08004 | Trop de connexions | max_connections connexions déjà ouvertes : paquet d'erreur envoyé à la place de la poignée de main | Fermer des connexions inutiles ou relever --max-connections / SET GLOBAL max_connections |
| 1129 | HY000 | L'hôte '%s' est bloqué après de trop nombreux échecs de connexion ; débloquez-le par 'FLUSH HOSTS' | max_connect_errors échecs d'authentification consécutifs depuis cette adresse (blocage de 15 minutes) | Corriger le mot de passe du client fautif, puis FLUSH HOSTS depuis une connexion ouverte |
| 1135 | HY000 | Impossible de créer un nouveau fil pour la connexion (%s) | Le système refuse un fil de plus (mémoire, limite de processus) | Réduire max_connections ou la charge de la machine |
| 1227 | 42000 | Accès refusé ; il faut le privilège %s pour cette opération | Contrôle de niveau global (SUPER, RELOAD, SHUTDOWN...) ; SYSTEM_USER pour modifier un compte qui le détient (le root initial) | Accorder le privilège global nommé dans le message |
| 1524 | HY000 | Le greffon '%s' n'est pas chargé | IDENTIFIED WITH (ou VIA) un autre greffon que le greffon natif (caching_sha2_password, auth_socket…) | Utiliser IDENTIFIED BY 'mot de passe' ou IDENTIFIED WITH miraj_password BY ... |
| 3523 | HY000 | Compte ou rôle inconnu %s@%s | SET ROLE ou GRANT/REVOKE sur un rôle qui n'existe pas | Créer le rôle avec CREATE ROLE ou corriger le nom |
| 3530 | HY000 | %s@%s n'est pas accordé à %s@%s | SET ROLE sur un rôle non accordé au compte courant | Accorder le rôle avec GRANT <rôle> TO <compte> |
| 3619 | HY000 | Niveau de privilège invalide pour %s | Privilège dynamique demandé hors du niveau global | Accorder au niveau global (ON *.*) |
Les privilèges par colonne (GRANT SELECT (colonne) ON ...) et par routine ne sont pas implémentés dans cette version : aucune erreur de ce type précis n'est donc émise pour ce cas.
2.5 Erreurs de transaction et de concurrence#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1205 | HY000 | Délai d'attente du verrou dépassé ; réessayez la transaction | LOCK TABLES, SELECT ... FOR UPDATE NOWAIT/WAIT n, ou attente d'un verrou de table au-delà de lock_wait_timeout | Réessayer la transaction ; envisager de réduire la durée des transactions concurrentes |
| 1213 | 40001 | Interblocage détecté lors de la prise du verrou ; réessayez la transaction | Concurrence entre transactions sur les mêmes lignes (MIRAJ n'attend jamais : ce code couvre aussi bien un vrai interblocage qu'un simple conflit de version MV-OCC après 3 tentatives internes). Rendu aussi par un COMMIT dont une mise à jour différée ne peut plus s'appliquer (ligne supprimée, condition du WHERE devenue fausse, ligne tenue par une autre transaction, ligne lue puis modifiée par une autre transaction) | Réessayer la transaction côté client ; MIRAJ n'ayant pas d'attente bloquante, ce code apparaît plus souvent que sur un moteur à verrous classiques. Un COMMIT peut aussi rendre le code d'une erreur de calcul découverte en recalculant une mise à jour différée (1264, 1048, 4025…) : la transaction est alors annulée en entier (chapitre 13, §13.2) |
| 1792 | 25006 | Impossible d'exécuter l'instruction dans une transaction en lecture seule (READ ONLY). | Écriture tentée dans une transaction ouverte en READ ONLY, ou sur un secondaire de cluster (voir §2.6) | Ouvrir une transaction en lecture-écriture, ou écrire sur le nœud primaire |
| 1927 | 70100 | La connexion a été arrêtée | Connexion terminée par KILL ou par le serveur | Se reconnecter |
| 1969 | 70100 | Requête interrompue : limite de durée de %s s dépassée | max_statement_time ou l'indication MAX_EXECUTION_TIME dépassés | Optimiser la requête ou augmenter la limite si elle est légitime |
| 1095 | HY000 | Vous n'êtes pas propriétaire de la connexion %s | KILL d'une connexion qui n'appartient pas au compte courant, sans le privilège nécessaire | Utiliser un compte disposant du privilège adéquat, ou cibler sa propre connexion |
| 1094 | HY000 | Identifiant de connexion inconnu : %s | KILL avec un identifiant de connexion qui n'existe plus | Vérifier l'identifiant avec SHOW PROCESSLIST |
| 1099 | HY000 | La table '%s' est verrouillée en lecture (READ) et ne peut pas être modifiée | Écriture tentée sur une table verrouillée en lecture par LOCK TABLES | Verrouiller en écriture (WRITE) ou attendre la fin du verrou |
| 1100 | HY000 | La table '%s' n'a pas été verrouillée par LOCK TABLES | Table utilisée dans une session sous LOCK TABLES sans avoir été elle-même verrouillée | Ajouter la table à la liste de LOCK TABLES |
2.6 Erreurs de cluster et de réplication (édition Cluster)#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1290 | HY000 | Le serveur fonctionne avec l'option %s et ne peut pas exécuter cette instruction | Tentative d'écriture sur un nœud secondaire en lecture seule, ou option serveur incompatible avec l'instruction | Écrire sur le nœud primaire du cluster ; consulter SHOW CLUSTER STATUS |
| 9002 | HY000 | %s demande l'édition Miraj Cluster | Fonctionnalité de partitionnement effectif (segments, EXCHANGE PARTITION sur HASH/KEY...) utilisée hors édition Cluster | Passer à l'édition Cluster, ou se limiter aux fonctions de partitionnement disponibles en édition Entreprise (définition acceptée, stockage non partitionné) |
| 9003 | HY000 | Promotion refusée : %s | SET GLOBAL cluster_role = 'primary' refusé après sonde des autres nœuds : primaire encore joignable, autre promotion en cours, pair qui voit encore le primaire, pair plus avancé qui ne garde plus la partie manquante du journal, bases différentes, écritures confirmées aux clients (réplication semi-synchrone) tenues par aucun nœud joignable, retard supérieur à max_promotion_lag_mb, base en attente de réamorçage après une table réécrite hors journal par le primaire (waiting to be copied again), nœud FENCED ou en cours d'amorçage ; en mode raft (élection automatique), refus d'un votant (node n2 refused: not up to date on database shop (epoch 4 < 5), candidate lacks database …, already voted for …), absence de majorité joignable (cluster has no quorum: 1 of 3 members reachable) ou élection déjà en cours (le motif précis suit les deux-points, en anglais) | Selon le motif : rétrograder d'abord l'ancien primaire ('secondary'), promouvoir un autre secondaire, ou forcer en acceptant la perte (SET GLOBAL cluster_role = 'force_primary') ; voir le chapitre 16, §16.4 |
| 9004 | HY000 | Réplication synchrone : %s | Réplication semi-synchrone (@@cluster_sync_commit à RECEIVED, APPLIED ou MAJORITY) : accusés des secondaires non reçus dans @@cluster_sync_timeout ou trop peu de secondaires connectés (avertissement avec la conduite FALLBACK, erreur avec ERROR), attente annulée par KILL QUERY (avertissement), nœud rétrogradé ou écarté pendant l'attente (erreur ; quorum lost quand un leader élu rend son rôle faute de majorité, mode raft). L'écriture est toujours validée sur le primaire (motif en anglais après les deux-points) | Ne pas rejouer l'écriture sans relire (risque de doublon) ; vérifier les secondaires (SHOW CLUSTER STATUS, colonne SYNC) ; voir le chapitre 16, §16.8 |
| 9005 | HY000 | Limite de données de Miraj Express atteinte (%s) : supprimez des données ou utilisez l'édition Entreprise | Édition Express : le total des tables atteint 20 Go et l'instruction ferait grossir les données (INSERT, REPLACE, LOAD DATA, UPDATE, CREATE TABLE, ALTER TABLE) | Supprimer des données (DELETE, TRUNCATE, DROP, toujours permis) ou passer à l'édition Entreprise ou Cluster |
| 1194 | HY000 | La table '%s' est marquée comme endommagée et doit être réparée (%s) | Cas particulier : lecture d'une table partitionnée en segments par l'édition Cluster depuis une édition qui ne sait pas la lire | Ouvrir la table depuis un serveur en édition Cluster |
2.7 Erreurs propres à MIRAJ (éditions, événements de changement et vecteurs)#
Ces codes n'existent dans aucun autre moteur SQL ; ils sont propres à MIRAJ.
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 9001 | HY000 | %s n'est pas disponible dans l'édition Miraj Express | Fonctionnalité réservée à l'édition Entreprise ou Cluster utilisée en édition Express (ex. parallélisme intra-requête) | Passer à l'édition Entreprise ou Cluster si la fonctionnalité est nécessaire |
| 9002 | HY000 | %s demande l'édition Miraj Cluster | Voir §2.6 | Voir §2.6 |
| 9003 | HY000 | Promotion refusée : %s | Voir §2.6 | Voir §2.6 |
| 9004 | HY000 | Réplication synchrone : %s | Voir §2.6 | Voir §2.6 |
| 9005 | HY000 | Limite de données de Miraj Express atteinte (%s) | Voir §2.6 | Voir §2.6 |
| 9006 | 25000 | WAIT FOR CHANGES n'est pas permis dans une transaction | WAIT FOR CHANGES dans une transaction explicite, ou dans une transaction implicite (autocommit = 0) qui a écrit | Valider ou annuler la transaction avant d'attendre ; attendre sur une connexion dédiée (chapitre 20) |
| 9007 | HY000 | Cette session n'a aucun abonnement LISTEN actif | WAIT FOR CHANGES sans LISTEN préalable sur la session, ou après UNLISTEN * | S'abonner (LISTEN TABLE …, LISTEN canal) avant d'attendre |
| 9008 | HY000 | Trop d'abonnements LISTEN (%s permis) | Plus de change_events_max_listeners abonnements sur une même session | Retirer des abonnements (UNLISTEN) ou relever change_events_max_listeners |
| 9009 | HY000 | La table '%s' n'a pas de clé primaire : seuls les événements de table sont transmis | Avertissement de LISTEN TABLE sur une table sans clé primaire : ses écritures ne donnent que des événements BULK | Ajouter une clé primaire pour recevoir un événement par ligne |
| 9010 | 22001 | La charge de NOTIFY dépasse %s octets | Charge de NOTIFY ou de MIRAJ_NOTIFY() plus longue que change_events_max_payload | Envoyer une charge plus courte (un identifiant plutôt que les données) ou relever change_events_max_payload |
| 9011 | HY000 | Limite de données de Miraj Developer atteinte (%s) : supprimez des données ou utilisez l'édition Cluster | Édition Developer : le total des tables atteint 20 Go et l'instruction ferait grossir les données (INSERT, REPLACE, LOAD DATA, UPDATE, CREATE TABLE, ALTER TABLE) | Supprimer des données (DELETE, TRUNCATE, DROP, toujours permis) ou passer à l'édition Cluster |
| 9033 | HY000 | Le compte '%s'@'%s' peut se connecter depuis d'autres machines et n'a pas de mot de passe : donnez-lui-en un (IDENTIFIED BY) ou réglez require_password = OFF | CREATE USER d'un compte joignable à distance sans mot de passe, ou ALTER USER / SET PASSWORD qui lui retire le sien, sous require_password = ON | Donner un mot de passe au compte, ou SET GLOBAL require_password = OFF |
| 9012 | HY000 | L'édition Miraj Developer est limitée à 24 heures d'utilisation continue : redémarrez le serveur pour continuer | Édition Developer : 24 heures se sont écoulées depuis le démarrage du processus ; toute instruction est refusée, les données restent intactes | Redémarrer miraj-server (ou l'application qui embarque le moteur) ; le décompte repart de zéro |
| 9034 | HY000 | %s n'est pas permis au niveau d'accès MCP %s | Session ouverte par un jeton MCP : instruction au-dessus du niveau du jeton (INSERT avec un jeton READ, DDL avec un jeton WRITE…), y compris dans le corps d'une routine ou d'un déclencheur ; gestion des jetons depuis une session MCP, quel que soit le niveau | Utiliser un jeton d'un niveau suffisant, ou gérer les jetons par le port principal (chapitre 19, §19.5) |
| 9035 | HY000 | Le jeton '%s' existe déjà | CREATE MCP TOKEN ou CREATE API TOKEN avec un nom déjà pris sur le serveur, par n'importe quel compte et pour l'une ou l'autre famille de jetons (comparaison sans égard à la casse) | Choisir un autre nom, ou supprimer l'ancien jeton (DROP MCP TOKEN, DROP API TOKEN) |
| 9036 | HY000 | Jeton inconnu '%s' | DROP MCP TOKEN, DROP API TOKEN ou ALTER API TOKEN d'un jeton qui n'existe pas dans cette famille (avertissement avec IF EXISTS) | Vérifier le nom avec SHOW MCP TOKENS ou SHOW API TOKENS |
| 9037 | HY000 | La partition %s ne peut pas être placée sur le nœud '%s', qui n'est pas membre d'un cluster actif | PARTITION … NODE 'id' hors cluster actif, nœud hors de members ou identifiant invalide | Vérifier cluster.toml et l'identifiant du nœud (§16.10) |
| 9038 | HY000 | La partition %s de %s est tenue par le nœud %s, injoignable : %s | Lecture ou écriture d'une partition dédiée à un nœud arrêté, injoignable ou qui ne répond pas dans fragment_timeout_ms | Relancer le nœud ; élaguer la requête aux partitions disponibles |
| 9039 | HY000 | %s écrirait dans des partitions tenues par plusieurs nœuds (%s) ; une instruction ou une transaction ne peut écrire … | Instruction qui touche les partitions de plusieurs nœuds ; transaction qui écrit ici et chez un autre nœud, ou chez deux autres nœuds (l'instruction seule échoue) | Découper l'instruction par nœud ; une transaction par nœud écrit |
| 9041 | HY000 | %s n'est pas pris en charge sur %s tant que la partition %s est tenue par le nœud %s | Opération non prise en charge sur une table à partition dédiée (§16.10.9) | Voir §16.10.10 |
| 9042 | HY000 | Le nœud %s a refusé la demande sur le fragment : %s | Définition différente entre nœuds, partition non tenue | Attendre la fin de la réplication du DDL, vérifier le placement |
| 9043 | HY000 | Aucun nœud disponible pour les connexions %s | Envoyée par miraj-proxy à la place de la poignée de main : aucun primaire (élection en cours, nœuds injoignables) pour le port d'écriture (RW), aucun nœud sain pour le port de lecture (RO) | Se reconnecter après quelques secondes ; consulter miraj-proxy status et le journal du proxy (chapitre 22) |
| 9044 | HY000 | Le chemin %s %s est déjà utilisé par l'endpoint %s | CREATE ENDPOINT dont la méthode et la forme du chemin (segments fixes égaux, paramètres aux mêmes places) sont déjà prises par un autre endpoint, toutes bases confondues | Choisir un autre chemin, ou remplacer l'endpoint existant (chapitre 23, §23.4.2) |
| 9045 | HY000 | Chemin d'endpoint invalide '%s' : %s | Chemin sans / initial, segment vide ou avec un caractère interdit, paramètre {nom} mal écrit ou répété, chemin sous /api ou /mcp, plus de 255 caractères | Corriger le chemin (chapitre 23, §23.4.2) |
| 9046 | HY000 | Paramètre d'endpoint '%s' : %s | Appel d'un endpoint sans valeur pour un paramètre qui n'a pas de DEFAULT (missing value), ou avec un paramètre qu'il ne déclare pas (unknown parameter) ; rendue en statut HTTP 400 | Fournir la valeur (chemin, requête ou corps JSON), ou déclarer le paramètre dans PARAMS |
| 9047 | HY000 | L'accès REST %s n'est pas permis pour %s | Requête REST d'une famille (endpoints, tables, SQL) ou d'un endpoint que le jeton (CREATE API TOKEN … ACCESS) ou les connexions par mot de passe (rest_basic_access) ne permettent pas ; rendue en statut HTTP 403 | Élargir l'accès du jeton (ALTER API TOKEN … ACCESS) ou rest_basic_access (chapitre 23, §23.3) |
| 9048 | HY000 | L'hôte '%s' ne peut pas se connecter tant que la base système est indisponible : seules les connexions locales sont acceptées | Connexion d'une adresse autre que la boucle locale (port principal, REST, MCP) à un serveur qui a démarré sans pouvoir ouvrir sa base système miraj ; rendue en statut HTTP 403 par REST et MCP | Se connecter depuis la machine du serveur ; lire la ligne BASE SYSTÈME INDISPONIBLE du journal du serveur, corriger la cause (fichier tenu, disque, droits) et redémarrer (chapitre 15, §15.4.4) |
| 6133 | HY000 | La colonne non scalaire (vecteur par exemple) '%s' ne peut pas servir de clé. | VECTOR(n) utilisée en clé primaire, UNIQUE ou index | Ne pas indexer la colonne vectorielle ; indexer une colonne dérivée si besoin |
| 6138 | HY000 | Données impossibles à convertir en vecteur valide : '%s' | Valeur non convertible en VECTOR(n) | Corriger le format de la valeur (forme texte […] ou binaire) |
| 7600 | 22000 | dimensions de vecteurs différentes %s et %s | Opération entre deux vecteurs de dimensions différentes | Utiliser des vecteurs de même dimension |
| 7601 | 22000 | %s dimensions attendues, et non %s | Vecteur écrit dans une colonne VECTOR(n) avec une dimension différente de n | Ajuster le nombre de composantes |
| 7602 | 22P02 | syntaxe incorrecte pour le type vector : "%s" | Forme texte d'un vecteur invalide | Utiliser la forme [v1, v2, ...] |
| 7603 | 22000 | NaN interdit dans un vecteur | Composante NaN dans un vecteur | Retirer les valeurs NaN en amont |
| 7604 | 22000 | valeur infinie interdite dans un vecteur | Composante infinie dans un vecteur | Retirer les valeurs infinies en amont |
| 4206 | HY000 | Impossible de déterminer le type de distance de VEC_DISTANCE : aucun index trouvé | VEC_DISTANCE appelée sans index vectoriel sur l'une de ses colonnes | Créer un VECTOR INDEX sur la colonne (chapitre 10) ou écrire la métrique : VEC_DISTANCE_EUCLIDEAN, VEC_DISTANCE_COSINE |
2.8 Erreurs internes et diverses#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1024 | HY000 | Erreur de lecture du fichier '%s' (errno : %s) | Erreur disque à la lecture d'un fichier du moteur | Vérifier le disque, restaurer depuis une sauvegarde si le fichier est endommagé |
| 1026 | HY000 | Erreur d'écriture du fichier '%s' (errno : %s) | Erreur disque à l'écriture (disque plein, droits...) | Vérifier l'espace disque et les droits |
| 1028 | HY000 | Tri interrompu : %s | ORDER BY interrompu (ex. par KILL ou une limite de lignes examinées) | Voir le message pour la cause précise ; relancer si l'interruption n'était pas voulue |
| 1105 | HY000 | Erreur inconnue : %s | Erreur interne inattendue (bogue du moteur, fichier de définitions de routines/déclencheurs corrompu...) | Signaler l'erreur avec le contexte complet ; vérifier l'intégrité des fichiers de la base concernée |
| 1148 | 42000 | Cette commande n'est pas autorisée avec cette version du serveur | Commande refusée par le protocole réseau (ex. LOCAL INFILE refusé par un client qui ne l'accepte pas) | Vérifier la configuration du client |
| 1193 | HY000 | Variable système inconnue : '%s' | SET/SELECT @@variable sur un nom de variable qui n'existe pas | Vérifier le nom exact dans SHOW VARIABLES |
| 1231 | 42000 | La variable '%s' ne peut pas recevoir la valeur '%s' | Valeur hors du domaine attendu pour une variable système | Consulter la documentation de la variable pour les valeurs admises |
| 1235 | 42000 | Cette version de Miraj ne prend pas encore en charge '%s' | Voir §2.1 : fonctionnalité non encore implémentée | Utiliser une construction équivalente prise en charge |
3. Le SQLSTATE#
Le SQLSTATE est un code à exactement 5 caractères (chiffres et lettres majuscules), normalisé indépendamment de MIRAJ et partagé par la plupart des moteurs SQL. Une application peut s'y fier pour un traitement générique, sans connaître le libellé ni même le code numérique propre à MIRAJ — utile pour porter un code écrit contre un autre moteur SQL.
Quelques classes à connaître :
| SQLSTATE | Signification | Exemples de codes MIRAJ |
|---|---|---|
42000 (et les 42Sxx) | Erreur de syntaxe ou de règle d'accès (« syntax error or access rule violation ») | 1064, 1049, 1050, 1051, 1054 |
23000 | Violation de contrainte d'intégrité | 1048, 1062, 1451, 1452, 4025 |
3D000 | Base de données non sélectionnée | 1046 |
28000 | Autorisation invalide (authentification) | 1045 |
40001 | Transaction annulée en série (interblocage ou conflit de concurrence) | 1213 |
22000 et dérivés (22001, 22003, 22007, 22012...) | Erreur de données (« data exception ») : troncature, dépassement, division par zéro | 1264, 1292, 1365, 1366, 1406 |
25006 | Instruction interdite en transaction en lecture seule | 1792 |
70100 | Instruction interrompue (SQLSTATE d'une convention répandue dans l'écosystème SQL, reprise par MIRAJ) | 1317, 1927, 1969 |
HY000 | Erreur générale, sans classe SQLSTATE plus précise | la majorité des erreurs propres au moteur (1004, 1105, 1193, 9001, 9002, 9003, 9004, 9005...) |
Usage recommandé côté application : un pilote (ODBC, JDBC, ADO.NET...) expose en général le SQLSTATE à côté du code natif. Pour un traitement portable entre moteurs (retenter une transaction en cas de 40001, distinguer une erreur de contrainte 23000 d'une erreur de syntaxe 42000), s'appuyer sur le SQLSTATE. Pour un diagnostic précis propre à MIRAJ (afficher un message adapté, distinguer deux causes qui partagent le même SQLSTATE), s'appuyer sur le code numérique de cette page.
Quand aucun SQLSTATE plus spécifique n'est défini pour un code, MIRAJ renvoie HY000 par défaut (y compris pour un code totalement inconnu du catalogue).
Un code déclenché par une routine stockée avec SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '...' porte le SQLSTATE choisi par la routine plutôt que celui associé au code numérique générique de SIGNAL — c'est le mécanisme normal pour lever une erreur applicative avec un SQLSTATE personnalisé (classe 45 réservée à cet usage).
4. Langue des messages#
Les messages d'erreur de MIRAJ existent en plusieurs langues : français, anglais, et huit langues supplémentaires (chinois, hindi, espagnol, arabe, portugais, russe, allemand, japonais). Cette page documente le libellé français, langue de référence de ce manuel.
Pour obtenir les messages en anglais (ou dans une autre langue disponible) :
- au démarrage du serveur ou en ligne de commande, l'option de langue du moteur sélectionne le catalogue utilisé pour toute la session ;
- chaque erreur peut aussi être reformulée dans une langue donnée sans changer la langue de la session, si l'API ou l'outil utilisé expose cette fonctionnalité (retraduction à la demande depuis le code et les arguments de l'erreur) ;
- des fichiers
<langue>.jsondéposés à côté de l'exécutable du serveur permettent de compléter ou de remplacer les traductions embarquées, y compris pour ajouter une langue non listée ci-dessus.
Le code numérique et le SQLSTATE d'une erreur ne changent jamais avec la langue : seul le texte du message est traduit. Une application qui teste le code ou le SQLSTATE (plutôt que le texte du message) fonctionne donc à l'identique quelle que soit la langue configurée sur le serveur.