28. 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 du serveur. Cette page liste les codes numériques que le moteur produit, avec leur SQLSTATE et le libellé français exact du message, ainsi qu'une explication de la cause typique et, quand c'est utile, une piste de correction.
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 :
ERREUR 1146 (42S02) : La table 'ventes.clients' n'existe pas(C'est la présentation de la console miraj-cli en français ; d'autres clients écrivent ERROR 1146 (42S02): ….)
- 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 dans lequel les
%sont été remplacés par les valeurs de l'erreur (nom de table, de colonne, etc.).
Un avertissement (niveau Warning ou Note) porte lui aussi un code de cette page ; l'instruction réussit et SHOW WARNINGS le liste :
SELECT CAST('abc' AS SIGNED);
SHOW WARNINGS;+-----------------------+
| CAST('abc' AS SIGNED) |
+-----------------------+
| 0 |
+-----------------------+
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'abc' |
+---------+------+------------------------------------------+2. Table de référence des codes d'erreur#
Le message français est donné 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 |
| 7620 | 54001 | Instruction trop complexe : plus de %s éléments de syntaxe dans un même script (découpez-le en plusieurs instructions) | Texte envoyé d'un bloc de plus de 2 millions d'éléments de syntaxe ou de 8 millions de jetons : INSERT … VALUES ou liste IN de plusieurs millions de valeurs, gros script envoyé en une fois (chapitre 16, §16.4.5) | Découper en plusieurs instructions, ou envoyer le script instruction par instruction (miraj-cli connecté à un serveur, miraj-dump restore) |
| 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 10 et 7 |
| 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 10 |
| 4009 | HY000 | La spécification de fenêtre nommée '%s' n'est pas définie | OVER w ou OVER (w ...) sans fenêtre w dans la clause WINDOW du même bloc, ou définie après celle qui la reprend | Définir la fenêtre dans la clause WINDOW du bloc, avant de la reprendre (chapitre 9, §9.18) |
| 4010 | HY000 | Plusieurs spécifications de fenêtre portent le même nom '%s' | Deux fenêtres de même nom dans une clause WINDOW (la casse ne compte pas) | Donner un nom distinct à chaque fenêtre |
| 4011 | HY000 | Une spécification de fenêtre qui en reprend une autre ('%s') ne peut pas contenir de liste de partition | OVER (w PARTITION BY ...) | Écrire le PARTITION BY dans la fenêtre nommée |
| 4012 | HY000 | La spécification de fenêtre reprise '%s' contient déjà une liste de tri | OVER (w ORDER BY ...) alors que w a déjà un ORDER BY | Retirer l'un des deux ORDER BY |
| 4013 | HY000 | La spécification de fenêtre reprise '%s' ne peut pas contenir de cadre | OVER (w ...) alors que w a un cadre ROWS ou RANGE | Écrire OVER w, ou placer le cadre dans la fenêtre qui reprend w |
| 4019 | HY000 | Un cadre de type RANGE demande une clause ORDER BY à une seule clé de tri | Cadre RANGE à décalage (n PRECEDING, INTERVAL n unité FOLLOWING...) dans une fenêtre sans ORDER BY ou à plusieurs clés de tri | Trier la fenêtre sur une seule clé, ou employer ROWS |
| 4021 | HY000 | Un cadre de type RANGE demande un type numérique | Décalage numérique d'un cadre RANGE sur une clé de tri qui n'est pas numérique | Sur une date, écrire INTERVAL n unité PRECEDING ; sinon trier sur une clé numérique |
| 4099 | HY000 | Le constructeur de table utilisé a un nombre de valeurs différent d'une ligne à l'autre | VALUES (1, 2), (3) employé comme requête : toutes les lignes n'ont pas le même nombre de valeurs | Donner le même nombre de valeurs à chaque ligne |
| 4100 | HY000 | La référence de colonne '%s' ne peut pas être utilisée dans un constructeur de table | Colonne citée dans une ligne d'un VALUES (...) employé comme requête, même celle d'une requête englobante | Écrire une sous-requête dans la ligne, ou un SELECT à la place du VALUES |
| 4180 | HY000 | FETCH ... WITH TIES exige la présence d'une clause ORDER BY | FETCH FIRST n ROWS WITH TIES dans un bloc sans ORDER BY : les ex æquo ne sont définis que par un tri | Ajouter l'ORDER BY, ou écrire ONLY |
| 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 (§9.17) |
| 1222 | 21000 | Les SELECT utilisés n'ont pas le même nombre de colonnes | Membres d'une UNION, INTERSECT ou EXCEPT qui n'ont pas le même nombre de colonnes (SELECT 1 UNION SELECT 1, 2) | Donner la même liste de colonnes à chaque membre |
| 1241 | 21000 | L'opérande doit contenir %s colonne(s) | Constructeur de ligne comparé à une valeur ou à une sous-requête d'une autre largeur ((1,2) = 1, (id, nom) = (SELECT id …)) | Comparer des listes de même largeur |
| 1176 | 42000 | La clé '%s' n'existe pas dans la table '%s' | USE INDEX, FORCE INDEX ou IGNORE INDEX d'un index inconnu de la table | Vérifier le nom avec SHOW INDEX FROM table |
| 1191 | HY000 | Aucun index FULLTEXT ne correspond à la liste de colonnes | MATCH (…) AGAINST (…) sur des colonnes que ne couvre aucun index FULLTEXT | Créer l'index FULLTEXT sur exactement ces colonnes |
| 1243 | HY000 | Identifiant de requête préparée inconnu (%s) donné à %s | EXECUTE ou DEALLOCATE PREPARE d'un nom qui n'a pas été préparé dans la session | PREPARE nom FROM '…' d'abord |
| 3636 | HY000 | Requête récursive interrompue après %s itérations. Augmentez @@cte_max_recursion_depth | Expression de table récursive (WITH RECURSIVE) sans condition d'arrêt, ou plus profonde que cte_max_recursion_depth (1000 par défaut) | Ajouter la condition d'arrêt, ou relever cte_max_recursion_depth |
| 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 |
| 4177 | HY000 | 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 |
| 1115 | 42000 | Jeu de caractères inconnu : '%s' | Jeu de caractères inconnu dans SET NAMES, SET CHARACTER SET ou SET character_set_client / _results / _connection / _server / _database (SET NAMES klingon) | utf8mb4 (ou un jeu reconnu, ou DEFAULT) |
| 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 : La collation 'utf8mb3_bin' n'est pas valide pour le jeu de caractères 'utf8mb4') | Prendre un interclassement utf8mb4_… (voir le chapitre Interclassements) |
| 1267, 1270, 1271 | HY000 | Mélange illégal de collations | Jamais levés par MIRAJ : un mélange sans vainqueur se compare sous l'interclassement le plus large (chapitre Interclassements, § 13.3) | — |
| 1273 | HY000 | Collation inconnue : '%s' | Nom d'interclassement non pris en charge (utf8mb4_0900_ai_ci, *_as_cs, linguistiques) dans une définition de colonne, de table ou une expression ; dans SET NAMES … COLLATE et SET collation_connection, collation_server ou collation_database, seul un nom qui ne se rattache à aucun jeu reconnu (klingon_ci) est refusé, les autres étant acceptés sous l'interclassement général (avertissement 1273 pour SET collation_connection) | 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 '...' d'une routine 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 |
| 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 |
| 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 | DROP TABLE d'une table absente, sans IF EXISTS (Table 'ventes.nope' inconnue) | 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é | Colonne BLOB entière ou colonne géométrique (POINT…) en clé primaire, colonne géométrique dans un index ordinaire | Utiliser une colonne de longueur bornée, une clé UNIQUE (qui admet un BLOB entier), ou un index SPATIAL pour une géométrie |
| 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 export 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. | Avertissement de DROP USER IF EXISTS, ALTER USER IF EXISTS ou DROP ROLE IF EXISTS sur un compte ou un rôle absent (le texte de l'avertissement est Authorization ID 'zz'@'%' does not exist.) | Aucune : le compte est passé, les autres sont traités |
| 3163 | HY000 | Le compte %s existe déjà. | Avertissement de CREATE USER IF NOT EXISTS ou CREATE ROLE IF NOT EXISTS sur un compte ou un rôle existant | Aucune ; sans IF NOT EXISTS, l'erreur est 1396 (§2.4) |
| 1063 | 42000 | Spécification de colonne incorrecte pour la colonne '%s' | Attribut incompatible avec le type de la colonne, par exemple colonnes d'une PERIOD FOR qui ne sont pas des dates (chapitre 12) | Corriger le type ou l'attribut |
| 1067 | 42000 | Valeur par défaut invalide pour '%s' | DEFAULT impossible à convertir dans le type de la colonne (a INT DEFAULT 'abc') | Donner une valeur par défaut du bon type |
| 1072 | 42000 | La colonne de clé '%s' n'existe pas dans la table | Index ou clé qui cite une colonne absente de la table (KEY (b)) | Corriger le nom de la colonne |
| 1075 | 42000 | Définition de table incorrecte ; il ne peut y avoir qu'une seule colonne auto-incrémentée et elle doit être une clé | Deux colonnes AUTO_INCREMENT, ou une colonne AUTO_INCREMENT qui n'est en tête d'aucun index | Garder une seule colonne AUTO_INCREMENT et l'indexer (PRIMARY KEY) |
| 1091 | 42000 | Impossible de supprimer %s %s ; vérifiez qu'il existe | ALTER TABLE … DROP COLUMN, DROP INDEX, DROP CONSTRAINT ou DROP INDEX … ON t d'un élément absent | Vérifier le nom ; avec IF EXISTS, simple note 1091 |
| 1110 | 42000 | Colonne '%s' indiquée deux fois | Même colonne pour le début et la fin d'une PERIOD FOR | Donner deux colonnes distinctes |
| 1505 | HY000 | Gestion de partitions impossible sur une table non partitionnée | ALTER TABLE … DROP / TRUNCATE / … PARTITION sur une table qui n'est pas partitionnée | Vérifier la table visée |
| 1526 | HY000 | Aucune partition de la table ne reçoit la valeur %s | Ligne d'une table PARTITION BY RANGE ou LIST qu'aucune partition ne couvre | Ajouter une partition (VALUES LESS THAN MAXVALUE, DEFAULT) |
| 1826 | HY000 | Nom de contrainte %s en double '%s' | Deux contraintes de même nom dans une table (CONSTRAINT k CHECK … deux fois) | Renommer l'une des contraintes |
| 1829 | HY000 | Impossible de supprimer la colonne '%s' : elle est nécessaire à la contrainte de clé étrangère '%s' de la table '%s' | ALTER TABLE parent DROP COLUMN d'une colonne référencée par une clé étrangère d'une autre table | Supprimer d'abord la clé étrangère de la table enfant |
| 3730 | HY000 | Impossible de supprimer la table '%s' référencée par la contrainte de clé étrangère '%s' de la table '%s'. | DROP TABLE d'une table parente encore référencée | Supprimer d'abord la table enfant ou sa clé étrangère (ou SET foreign_key_checks = 0) |
| 3821 | HY000 | La contrainte de vérification '%s' est introuvable dans la table. | ALTER TABLE … DROP CHECK d'une contrainte absente | Vérifier le nom dans SHOW CREATE TABLE |
| 4092 | 42S02 | VIEW inconnue : '%s' | DROP VIEW d'une vue absente, sans IF EXISTS | DROP VIEW IF EXISTS |
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 |
| 1093 | HY000 | La table '%s' est indiquée deux fois, comme cible de '%s' et comme source séparée de données | Sous-requête de la clause RETURNING d'un INSERT, REPLACE ou DELETE qui lit la table écrite (§8.9) | Lire la table par une instruction séparée, après l'écriture |
| 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 |
| 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) ; aussi Incorrect vector value : octets ou texte qui ne forment pas un vecteur de la colonne VECTOR(n) (chapitre 6) | Corriger la valeur source ou son format |
| 4078 | HY000 | Cannot cast '%s' as 'vector' in assignment of %s | Nombre ou date affecté à une colonne VECTOR(n) (INSERT … VALUES (1, 12), UPDATE … SET v = 12), refusé dès la préparation, même sans ligne écrite ; avertissement hors mode strict | Écrire le vecteur en texte '[…]', par VEC_FromText ou en octets |
| 1365 | 22012 | Division par zéro | Division ou modulo par 0 dans une écriture (INSERT, UPDATE) quand sql_mode contient ERROR_FOR_DIVISION_BY_ZERO et un mode strict ; avec ERROR_FOR_DIVISION_BY_ZERO seul, ou dans un SELECT, avertissement et résultat NULL ; sans ce mode, NULL sans avertissement | 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, en mode strict ('z' dans une colonne INT) | 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 |
| 4082 | HY000 | La variable de ligne '%s' n'a pas de champ '%s' | champ ligne.colonne absent de la ligne d'une boucle FOR ligne IN … | corriger le nom, ou donner un alias à la colonne dans la requête de la boucle |
| 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 |
| 4089 | 42S02 | '%s.%s' n'est pas une SEQUENCE | SHOW CREATE SEQUENCE, ALTER SEQUENCE, NEXTVAL / LASTVAL / SETVAL ou DEFAULT NEXTVAL(…) sur une table ou une vue, contrôlés à l'ouverture de l'instruction même s'ils ne sont jamais évalués | Viser une séquence |
| 4090 | 42S02 | '%s.%s' n'est pas une SEQUENCE | DROP SEQUENCE d'une table (note avec IF EXISTS) | DROP TABLE |
| 1965 | 42S02 | '%s.%s' est une vue | DROP SEQUENCE d'une vue (note avec IF EXISTS) | DROP VIEW |
| 4091 | 42S02 | SEQUENCE inconnue : '%s' | DROP SEQUENCE ou ALTER SEQUENCE d'une séquence absente (note avec IF EXISTS) ; appel de séquence inconnue qui précède toute table de l'instruction (SELECT NEXTVAL(s)) — après une table, ou dans une fonction ou un déclencheur : 1146 | DROP SEQUENCE IF EXISTS, vérifier le nom |
| 4093 | HY000 | INSERT incorrect dans une SEQUENCE. Seul un INSERT sur une seule table est possible dans un objet séquence (…). Pour modifier la SEQUENCE, utilisez ALTER SEQUENCE. | INSERT, UPDATE ou DELETE visant une séquence | ALTER SEQUENCE ou SETVAL |
| 1256 | HY000 | Taille des données décompressées trop grande ; la taille maximale est %s (la longueur des données décompressées est probablement corrompue) | Avertissement d'UNCOMPRESS (résultat NULL) : la longueur annoncée par l'en-tête dépasse max_allowed_packet | Vérifier que la valeur vient bien de COMPRESS et n'a pas été tronquée ou convertie en texte |
| 1258 | HY000 | ZLIB : pas assez de place dans le tampon de sortie (la longueur des données décompressées est probablement corrompue) | Avertissement d'UNCOMPRESS (résultat NULL) : le flux rend plus d'octets que la longueur annoncée | Idem |
| 1259 | HY000 | ZLIB : données d'entrée corrompues | Avertissement d'UNCOMPRESS ou d'UNCOMPRESSED_LENGTH (résultat NULL) : valeur de quatre octets au plus, flux zlib corrompu ou tronqué | Idem ; ranger les valeurs compressées dans une colonne VARBINARY ou BLOB |
| 1300 | HY000 | Chaîne de caractères %s invalide : '%s' | Avertissement de CHR(code) (résultat NULL) : les octets de code ne forment pas un caractère du jeu | Donner le code du caractère dans son encodage (CHR(50089) pour é), ou employer CHAR(code) |
| 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) |
| 4176 | HY000 | Impossible de donner une valeur à la colonne '%s' de JSON_TABLE '%s'. | Colonne JSON_TABLE déclarée ERROR ON EMPTY dont le chemin ne désigne rien | Écrire NULL ON EMPTY ou DEFAULT '...' ON EMPTY |
| 4178 | HY000 | Impossible de placer un tableau ou un objet dans la colonne scalaire '%s' de JSON_TABLE '%s'. | 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 |
| 4179 | HY000 | Impossible de placer plusieurs valeurs désignées par le chemin dans la colonne '%s' de JSON_TABLE '%s'. | Colonne JSON_TABLE ... ERROR ON ERROR dont le chemin (joker, plage) désigne plusieurs valeurs | Désigner une seule valeur, ou passer par NESTED PATH |
| 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 12) | Corriger le type |
| 4119 | HY000 | Interdit sur la table versionnée %s.%s. Changez @@system_versioning_alter_history pour poursuivre l'ALTER. | ALTER TABLE qui change les colonnes d'une table versionnée | SET system_versioning_alter_history = KEEP |
| 4124 | HY000 | La table %s n'est pas versionnée par le système | FOR SYSTEM_TIME, DELETE HISTORY, PARTITION BY SYSTEM_TIME ou DROP SYSTEM VERSIONING sur une table ordinaire | ALTER TABLE ... ADD SYSTEM VERSIONING |
| 4127 | HY000 | Paramètres invalides pour la table partitionnée %s : valeur incorrecte pour '%s' | INTERVAL / LIMIT nul, STARTS qui n'est pas un instant | Corriger la clause PARTITION BY SYSTEM_TIME |
| 4128 | HY000 | Partitions incorrectes pour %s : au moins une partition HISTORY et exactement une dernière partition CURRENT sont requises | pas de partition HISTORY, CURRENT absente, double ou pas en dernier ; retrait de CURRENT ou de la dernière HISTORY | Garder au moins une HISTORY et une CURRENT en dernier |
| 4131 | HY000 | Impossible de faire DROP SYSTEM VERSIONING sur la table %s partitionnée BY SYSTEM_TIME | DROP SYSTEM VERSIONING | ALTER TABLE ... REMOVE PARTITIONING d'abord |
| 4135 | 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 |
| 4152 à 4158 | HY000 | Périodes applicatives | table temporaire, types différents, deux périodes, colonne générée ou système, période inconnue, colonne de période dans SET, DROP CONSTRAINT de la période | Voir le chapitre 12, §12.6 et §12.7 |
| 4170, 4171 | HY000 | Clé WITHOUT OVERLAPS | colonne de la période citée dans la clé, index non unique | Voir le chapitre 12, §12.8 |
| 4037 / 4038 | HY000 | Fin inattendue du texte JSON dans l'argument %s de la fonction '%s' / Erreur de syntaxe dans le texte JSON de l'argument %s de la fonction '%s' à la position %s | Document passé à une fonction JSON qui n'est pas du JSON valide : avertissement et résultat NULL (erreur pour JSON_TABLE) | Corriger le document ; JSON_VALID permet d'écarter les lignes invalides |
| 4041 / 4042 | HY000 | Fin inattendue du chemin JSON dans l'argument %s de la fonction '%s' / Erreur de syntaxe dans le chemin JSON de l'argument %s de la fonction '%s' à la position %s | Chemin JSON mal écrit ('$.', 'a', '$[1'...) : avertissement et résultat NULL (erreur pour JSON_TABLE) | Commencer par $ et suivre la syntaxe des chemins (chapitre 9.10) |
| 4036 | HY000 | Caractère interdit en JSON dans l'argument %s de la fonction '%s' à la position %s | Caractère de contrôle (tabulation, saut de ligne...) non échappé dans une chaîne d'un document : avertissement et résultat NULL (erreur pour JSON_TABLE) | Échapper le caractère (\t, \n) |
| 4044 | HY000 | Jokers et plages interdits dans le chemin JSON de l'argument %s de la fonction '%s' | Joker ou plage dans le chemin d'une fonction de modification, JSON_KEYS, JSON_LENGTH ou JSON_CONTAINS : avertissement et résultat NULL | Désigner une seule valeur |
| 4051 | HY000 | Le chemin '$' est interdit dans l'argument %s de la fonction '%s'. | JSON_REMOVE(doc, '$') : avertissement et résultat NULL | Désigner un membre ou une case |
| 4193 | HY000 | Valeur invalide pour le mot-clé %s | JSON_SCHEMA_VALID dont le schéma donne à type une valeur inconnue (integer compris) | Écrire number, string, object, array, boolean ou null |
| 4046 | HY000 | L'argument %s de la fonction '%s' doit valoir "one" ou "all". | Mode de JSON_CONTAINS_PATH / JSON_SEARCH mal écrit : avertissement et résultat NULL | É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 |
| 1364 | HY000 | Le champ '%s' n'a pas de valeur par défaut | INSERT qui ne donne pas de valeur à une colonne NOT NULL sans DEFAULT, en mode strict | Fournir la valeur, ou donner un DEFAULT à la colonne |
| 1369 | 44000 | Échec de CHECK OPTION %s.%s | INSERT ou UPDATE au travers d'une vue WITH CHECK OPTION d'une ligne que la vue ne montrerait pas | Écrire une ligne qui satisfait le WHERE de la vue |
| 1690 | 22003 | La valeur %s est hors limites dans '%s' | Calcul entier qui dépasse son type (9223372036854775807 + 1 : La valeur BIGINT est hors limites dans '9223372036854775807 + 1') | Convertir en DECIMAL avant le calcul, ou réduire les valeurs |
| 1701 | 42000 | Impossible de vider une table référencée par une contrainte de clé étrangère (%s) | TRUNCATE TABLE d'une table parente | DELETE FROM, ou supprimer d'abord la clé étrangère |
| 1265 | 01000 | Données tronquées pour la colonne '%s' à la ligne %s | Avertissement hors mode strict : chaîne trop longue raccourcie, valeur ajustée à la colonne (en mode strict : 1406 ou 1366) | Vérifier la donnée ; SHOW WARNINGS donne la colonne et la ligne |
| 1441 | 22008 | Fonction de date : dépassement du champ %s | Avertissement d'un calcul de date hors de l'intervalle admis (DATE_ADD('9999-12-31', INTERVAL 1 DAY)) : résultat NULL | Vérifier les bornes du calcul |
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.%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 15, 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 |
| 1141 | 42000 | Aucun droit de ce type n'est défini pour l'utilisateur '%s' sur l'hôte '%s' | REVOKE au niveau global d'un privilège que le compte n'a pas | Vérifier SHOW GRANTS FOR compte |
| 1396 | HY000 | L'opération %s a échoué pour %s | CREATE USER ou CREATE ROLE d'un compte qui existe déjà, DROP USER, DROP ROLE ou ALTER USER d'un compte absent ; aucun compte de la liste n'est traité | IF NOT EXISTS / IF EXISTS (avertissements 3163 / 3162) |
| 1410 | 42000 | Vous n'êtes pas autorisé à créer un compte avec GRANT | GRANT … TO un compte qui n'existe pas | CREATE USER d'abord |
| 3118 | HY000 | Accès refusé pour l'utilisateur '%s'@'%s'. Le compte est verrouillé. | Connexion à un compte ACCOUNT LOCK | ALTER USER … ACCOUNT UNLOCK |
| 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 |
| 1043 | 08S01 | le client exige TLS ; le serveur n'a pas de certificat, voir --tls-cert | Client réglé pour exiger le chiffrement (pilote en mode SSL obligatoire) face à un serveur démarré sans certificat ; la connexion est ensuite fermée et le journal du serveur porte le même message | Fournir un certificat au serveur (--tls-cert, --tls-key, chapitre 16), ou se connecter sans exiger TLS |
| 3159 | 08004 | Les connexions non chiffrées sont refusées : le serveur exige TLS (--require-tls). | Client non chiffré face à un serveur doté d'un certificat (TLS exigé dès qu'un certificat est fourni, sauf --allow-plain-with-tls) | Activer TLS dans le client |
| 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 |
| 1370 | 42000 | Commande %s refusée à l'utilisateur '%s'@'%s' pour la routine '%s' | Appel d'une procédure ou d'une fonction sans EXECUTE sur elle, sa base ou au niveau global ; GRANT sur une routine sans l'option GRANT sur elle | GRANT EXECUTE ON PROCEDURE base.nom TO … (ou ON base.*) |
| 1403 | 42000 | Aucun droit de ce type n'est défini pour l'utilisateur '%s' sur l'hôte '%s' pour la routine '%s' | REVOKE … ON PROCEDURE | FUNCTION base.nom d'un droit que le compte n'a pas sur cette routine | Vérifier SHOW GRANTS FOR compte ; REVOKE IF EXISTS |
| 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 *.*) |
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, verrou global de lecture d'une autre session (FLUSH TABLES WITH READ LOCK), 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 14, §14.2) |
| 1397 | XAE04 | XAER_NOTA : XID inconnu | XA END / XA PREPARE avec un autre XID que celui de la branche de la session ; XA COMMIT / XA ROLLBACK d'un XID inconnu ou tenu par une autre session encore ouverte | Vérifier le XID ; une branche n'est reprise par une autre session qu'une fois préparée et sa session fermée |
| 1398 | XAE05 | XAER_INVAL : arguments invalides (ou commande non prise en charge) | XA START '', XA START … JOIN, XA END … SUSPEND, XA COMMIT … ONE PHASE d'une branche préparée | Utiliser un gtrid non vide ; valider une branche préparée sans ONE PHASE |
| 1399 | XAE07 | XAER_RMFAIL : la commande ne peut pas être exécutée quand la transaction globale est dans l'état %s | Instruction interdite dans l'état de la branche (chapitre 14, §14.5) : COMMIT ou DDL en ACTIVE, lecture d'une table en IDLE ou PREPARED, XA PREPARE hors IDLE | Suivre l'enchaînement XA START → XA END → XA PREPARE → XA COMMIT |
| 1400 | XAE09 | XAER_OUTSIDE : du travail est fait hors de la transaction globale | XA START avec une transaction ordinaire ouverte (ou autocommit = 0 après une instruction) ou sous LOCK TABLES ; XA COMMIT / XA ROLLBACK d'une autre branche dans ces conditions | Valider ou annuler la transaction ouverte, UNLOCK TABLES, ou SET autocommit = 1 |
| 1402 | XA100 | XA_RBROLLBACK : la branche de transaction a été annulée | Reprise d'une branche préparée qui n'avait rien écrit : elle a été close avec sa session | Aucune action : la branche n'avait aucun effet |
| 1440 | XAE08 | XAER_DUPID : le XID existe déjà | XA START d'un XID tenu par une autre branche (encore ouverte, ou préparée et détachée) | Choisir un autre XID, ou résoudre la branche existante (XA RECOVER) |
| 1614 | XA102 | XA_RBDEADLOCK : la branche de transaction a été annulée : un interblocage a été détecté | XA PREPARE dont la preuve des lectures échoue ; branche dont la transaction a été annulée par un conflit (XA END, XA COMMIT, instruction sur une table) | XA ROLLBACK si la branche existe encore, puis rejouer la transaction |
| 1791 | HY000 | Nom de format de XA RECOVER inconnu : '%s' | XA RECOVER FORMAT = '…' autre que RAW ou SQL | Utiliser RAW (défaut) ou SQL |
| 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 |
| 1568 | 25001 | %s ne peut pas être fixé pendant une transaction en cours | SET TRANSACTION ISOLATION LEVEL …, SET TRANSACTION READ ONLY ou SET @@transaction_read_only (sans portée) dans une transaction ouverte | Le placer avant START TRANSACTION, ou écrire SET SESSION … |
| 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 |
| 1192 | HY000 | Impossible d'exécuter cette commande : la session tient des tables verrouillées ou une transaction active | FLUSH TABLES WITH READ LOCK (ou FLUSH TABLES t … WITH READ LOCK | FOR EXPORT) sous LOCK TABLES | UNLOCK TABLES d'abord |
| 1223 | HY000 | Impossible d'exécuter la requête : la session tient un verrou de lecture incompatible | Écriture (DML, DDL, comptes, LOCK TABLES … WRITE, RESTORE) par la session qui tient le verrou global de lecture (FLUSH TABLES WITH READ LOCK) | UNLOCK TABLES, puis écrire |
| 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 17, §17.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 17, §17.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.6 bis Erreurs du journal binaire et de la réplication par journal binaire#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1186 | HY000 | Journal binaire fermé, RESET MASTER impossible | RESET MASTER sans --log-bin | Démarrer le serveur avec --log-bin |
| 1198 | HY000 | Cette opération est impossible tant que la réplication tourne ; exécuter d'abord STOP SLAVE | CHANGE MASTER, RESET SLAVE, SET GLOBAL gtid_slave_pos ou sql_slave_skip_counter pendant que les fils du réplica tournent | STOP SLAVE, puis recommencer |
| 1200 | HY000 | Le serveur n'est pas configuré comme réplica ; corriger la configuration ou utiliser CHANGE MASTER TO | START SLAVE, STOP SLAVE ou RESET SLAVE sans CHANGE MASTER TO préalable (ou moteur embarqué) | CHANGE MASTER TO … |
| 1220 | HY000 | Erreur à l'exécution de la commande %s : %s | SHOW BINLOG EVENTS sur un fichier inconnu ou à une position qui n'est pas le début d'un événement | Lire les positions par SHOW BINLOG EVENTS sans FROM |
| 1236 | HY000 | Erreur fatale %s de la source à la lecture du journal binaire : '%s' | Côté source : journal désactivé, fichier inconnu, position GTID absente (fichiers purgés) ou au-delà du journal ; côté réplica : Last_IO_Error | Réamorcer le réplica depuis une copie, puis SET GLOBAL gtid_slave_pos |
| 1373 | HY000 | Fichier cible absent de l'index du journal binaire | PURGE BINARY LOGS TO d'un fichier inconnu | Choisir un nom de SHOW BINARY LOGS |
| 1381 | HY000 | Le journal binaire n'est pas activé | SHOW BINARY LOGS, PURGE BINARY LOGS sans --log-bin | Démarrer avec --log-bin |
| 1950 | HY000 | Tentative de journaliser le GTID %s, dont le numéro de séquence ne suit pas celui du GTID existant %s, alors que gtid_strict_mode est activé | gtid_strict_mode = ON et séquence imposée (gtid_seq_no) qui ne suit pas celle du domaine ; la transaction est annulée | Corriger gtid_seq_no ou couper gtid_strict_mode |
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) : supprimez des données ou utilisez l'édition Entreprise | 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 21) |
| 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 | Plafond de données de Miraj Developer atteint (%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 20, §20.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 (§17.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 que les partitions d'un seul nœud | 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 |
| 9040 | HY000 | La transaction qui écrit les partitions tenues par le nœud %s a été annulée par ce nœud : %s | Transaction qui écrit chez un autre nœud restée inactive plus de fragment_timeout_ms (§17.10.5) : annulée ici aussi | Rejouer la transaction ; augmenter fragment_timeout_ms |
| 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 (§17.10.9) | Voir §17.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 23) |
| 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 24, §24.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 24, §24.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 24, §24.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 16, §16.4.4) |
| 9051 | HY000 | Option '%s' invalide pour l'index de texte : %s | Index FULLTEXT dont un poids de colonne (designation WEIGHT n) est nul, négatif ou non numérique (a weight must be a positive number) ; l'option citée est la colonne et son poids tels qu'écrits | Écrire un nombre réel strictement positif, ou retirer WEIGHT (poids 1) (chapitre 7) |
| 9052 | HY000 | La distance floue %s est hors limites (0 à 2) | Recherche floue en mode booléen dont le suffixe collé au mot dépasse 2 (MATCH … AGAINST ('sirop~3' IN BOOLEAN MODE)) | Écrire mot~1 ou mot~2 (~0 : mot exact) ; voir chapitre 9, §9.22 |
| 9054 | HY000 | Le nœud %s utilise le langage SQL %s mais le cluster utilise %s : tous les nœuds d'un cluster doivent avoir le même langage (sql_mode) | Adhésion d'un nœud de cluster dont l'élément POSTGRESQL de sql_mode diffère de celui du primaire ; refus consigné par les deux nœuds (server.log) | Donner le même sql_mode (langage) à tous les nœuds ; voir chapitre 17 et 27.12 |
| 9055 | 01000 | %s | Avertissement (note) : RAISE NOTICE d'une routine écrite en PL/pgSQL ; un client PostgreSQL le reçoit en avis NOTICE (SQLSTATE 00000) | — ; voir 30.13 |
| 9056 | 01000 | %s | Avertissement : RAISE WARNING d'une routine écrite en PL/pgSQL (avis WARNING) | — ; voir 30.13 |
| 9057 | 01000 | %s | Avertissement (note) : RAISE INFO d'une routine écrite en PL/pgSQL (avis INFO) | — ; voir 30.13 |
| 9058 | 2BP01 | impossible de supprimer la fonction %s car d'autres objets en dépendent : déclencheur %s (utiliser DROP ... CASCADE) | DROP FUNCTION en langage PostgreSQL d'une fonction qu'appellent des déclencheurs | DROP FUNCTION … CASCADE (supprime aussi les déclencheurs), ou supprimer d'abord les déclencheurs ; voir 30.13 |
| 9059 | HY000 | %s demande une licence Miraj valide (état de la licence : %s) ; voir SHOW LICENSE | Fonction de l'édition Entreprise (événements de changement, MCP, journal binaire, archivage du journal) demandée à un serveur sans licence en règle | SHOW LICENSE, puis installer ou renouveler la licence ; voir chapitre 31 |
| 9060 | HY000 | %s demande une licence Miraj Cluster valide (état de la licence : %s) ; voir SHOW LICENSE | PARTITION … NODE, SET GLOBAL cluster_role ou cluster_sync_* avec une licence qui ne couvre pas l'édition Cluster | Installer une licence Cluster ; voir 31.7 |
| 9061 | HY000 | Plafond de données de %s atteint : ce serveur n'a pas de licence Miraj valide ; installez le fichier de licence (miraj.lic) ou supprimez des données | Serveur Entreprise ou Cluster sans licence dont les données atteignent 20 Go ; une licence expirée ne plafonne pas | Installer la licence (--install-license), ou supprimer des données ; voir 31.4 |
| 9062 | HY000 | Licence refusée : %s | FLUSH LICENSE sur un fichier illisible, modifié ou lié à une autre machine ; la licence en place continue de servir | Réinstaller le fichier reçu ; voir 31.2 |
| 9063 | HY000 | Nœud %s refusé : la licence %s permet %s nœud(s) dans le cluster | Cluster qui compte plus de nœuds que sa licence ; refus consigné par le primaire | Licence pour davantage de nœuds, ou retirer un nœud de members ; voir 31.7 |
| 9064 | HY000 | Nœud %s refusé : sa licence (%s) n'est pas celle du cluster (%s) | Fichier miraj.lic différent sur ce nœud ; refus consigné par le primaire | Installer sur ce nœud la licence du cluster ; voir 31.7 |
| 9065 | HY000 | %s n'est pas disponible dans l'édition Miraj Developer | Chiffrement des données au repos demandé en édition Developer (data_encryption, ENCRYPTION='Y', dossier chiffré) | Utiliser l'édition Entreprise ou Cluster (chapitre 25) |
| 9066 | HY000 | %s exige le chiffrement des données, qui n'a pas été activé à l'initialisation de ce serveur | ENCRYPTION='Y' ou ALTER INSTANCE ROTATE MASTER KEY sur un dossier de données non chiffré | Le chiffrement s'active à l'initialisation d'un dossier neuf (chapitre 25, §25.2) |
| 9067 | HY001 | Mémoire du serveur insuffisante : les instructions en cours sur le serveur dépasseraient max_server_memory (%s) ; réessayez plus tard | Tris, regroupements, DISTINCT, fenêtres et jointures de toutes les instructions en cours dépasseraient ensemble max_server_memory (moitié de la mémoire physique par défaut) ; condition passagère, qui dépend des autres sessions (53200 en langage PostgreSQL) | Réessayer plus tard ; relever max_server_memory (SET GLOBAL) ; voir 16.4.5 |
| 9085 | HY000 | Document XML mal formé à la ligne %s : %s | Fichier de LOAD XML mal formé (balise non fermée ou croisée, entité inconnue, attribut sans guillemets…) ; rien n'est chargé | Corriger le document à la ligne indiquée ; voir 8.8 |
| 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 11) 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é |
| 1021 | HY000 | Disque plein (%s) : l'écriture a été refusée, libérez de l'espace puis réessayez | Espace libre du volume des données sous min_free_disk_space (512 Mio par défaut), ou volume réellement plein ; l'écriture refusée n'a aucun effet (53100 en langage PostgreSQL) | Libérer de la place (DELETE, TRUNCATE, DROP restent permis) ; voir 16.4.5 |
| 1026 | HY000 | Erreur d'écriture du fichier '%s' (errno : %s) | Erreur disque à l'écriture (droits...) ; en particulier, vidage sur disque du journal en échec : le journal de la base est arrêté, plus aucune écriture n'y est acceptée (58030 en langage PostgreSQL) | Vérifier le disque et les droits ; pour un journal arrêté, corriger la cause puis redémarrer le serveur (11.4.2) |
| 1038 | HY001 | Mémoire de tri insuffisante : l'instruction dépasse max_statement_memory (%s) | Tri d'une instruction au-delà de max_statement_memory (2 Gio par défaut) ; la session reste utilisable (53200 en langage PostgreSQL) | Restreindre la requête (WHERE, LIMIT), ou relever max_statement_memory pour la session ; voir 16.4.5 |
| 1114 | HY000 | La table '%s' est pleine | Regroupement, DISTINCT, fenêtre, opération ensembliste, jointure par hachage ou résultat intermédiaire au-delà de max_statement_memory (la table citée est alors #sql_tmp (…)) ; ou disque plein pendant l'écriture d'une table (53100 en langage PostgreSQL dans les deux cas) | Comme 1038, ou comme 1021 pour un disque plein |
| 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 ; pour une variable booléenne (autocommit, read_only, local_infile, et aussi celles acceptées sans effet comme unique_checks, sql_notes, sql_safe_updates, big_tables), toute valeur autre que ON, OFF, 1, 0, TRUE, FALSE ou DEFAULT (SET autocommit = 2, = 'yes', = NULL) ; la variable garde sa valeur | 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 |
2.9 Erreurs des programmes stockés (procédures, fonctions, déclencheurs, événements)#
| Code | SQLSTATE | Message | Cause typique | Piste de correction |
|---|---|---|---|---|
| 1304 | 42000 | %s %s existe déjà | CREATE PROCEDURE ou CREATE FUNCTION d'un nom déjà pris dans la base (PROCEDURE pr existe déjà) | CREATE OR REPLACE, IF NOT EXISTS, ou un autre nom |
| 1305 | 42000 | %s %s n'existe pas | CALL d'une procédure absente (PROCEDURE shop.nopr n'existe pas), GRANT sur une routine absente, ROLLBACK TO SAVEPOINT d'un point inconnu (SAVEPOINT nom n'existe pas) | Vérifier le nom et la base |
| 1318 | 42000 | Nombre d'arguments incorrect pour %s %s : %s attendus, %s reçus | CALL ou appel de fonction avec trop ou trop peu d'arguments | Vérifier la liste des paramètres (SHOW CREATE PROCEDURE) |
| 1320 | 42000 | Aucun RETURN dans la FUNCTION %s | CREATE FUNCTION dont le corps ne contient aucun RETURN | Ajouter le RETURN |
| 1321 | 2F005 | La FUNCTION %s s'est terminée sans RETURN | Exécution d'une fonction qui atteint la fin de son corps sans passer par un RETURN | Ajouter un RETURN sur chaque chemin |
| 1326 | 24000 | Le curseur n'est pas ouvert | FETCH ou CLOSE d'un curseur avant son OPEN | OPEN d'abord |
| 1329 | 02000 | Aucune donnée : aucune ligne lue, sélectionnée ou traitée | FETCH après la dernière ligne d'un curseur sans gestionnaire NOT FOUND | DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1 |
| 1339 | 20000 | Aucun cas ne correspond dans l'instruction CASE | Instruction CASE d'une routine sans ELSE dont aucune branche ne s'applique | Ajouter une branche ELSE |
| 1359 | HY000 | Le déclencheur '%s' existe déjà | CREATE TRIGGER d'un nom déjà pris | CREATE OR REPLACE TRIGGER, ou un autre nom |
| 1360 | HY000 | Le déclencheur n'existe pas | DROP TRIGGER d'un déclencheur absent | DROP TRIGGER IF EXISTS |
| 1422 | HY000 | Validation explicite ou implicite interdite dans une fonction stockée ou un déclencheur | COMMIT, ROLLBACK, DDL ou gestion des comptes dans le corps d'une fonction ou d'un déclencheur | Déplacer l'instruction dans une procédure appelée hors déclencheur |
| 1442 | HY000 | Impossible de modifier la table '%s' dans une fonction stockée ou un déclencheur : elle est déjà utilisée par l'instruction qui l'a appelé | Déclencheur (ou fonction) qui écrit dans la table de l'instruction qui l'a déclenché | Écrire dans une autre table, ou faire le calcul par SET NEW.col dans un déclencheur BEFORE |
| 1537 | HY000 | L'événement '%s' existe déjà | CREATE EVENT d'un nom déjà pris | CREATE EVENT IF NOT EXISTS ou ALTER EVENT |
| 1539 | HY000 | Événement inconnu '%s' | DROP EVENT ou ALTER EVENT d'un événement absent | DROP EVENT IF EXISTS |
| 1644 | 45000 (celui du SIGNAL) | texte de MESSAGE_TEXT | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Stock insuffisant' dans une routine : ERREUR 1644 (45000) : Stock insuffisant | Erreur applicative voulue ; la traiter par un gestionnaire (DECLARE … HANDLER FOR SQLSTATE '45000') ou côté client |
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).
3.1 Instance en langage PostgreSQL#
Sur une instance en langage PostgreSQL (§ 16.10, chapitre 30), le client ne reçoit que le SQLSTATE et le message : les codes que les pilotes PostgreSQL reconnaissent remplacent le SQLSTATE générique du code MIRAJ.
| SQLSTATE | Signification | Codes MIRAJ ou cas |
|---|---|---|
42601 | erreur de syntaxe | 1064 ; aussi la syntaxe propre à MIRAJ refusée (accents graves, LIMIT a, b, &&…), dont le message nomme la construction (« … is MIRAJ syntax, not accepted in the PostgreSQL language ») ; paramètre ? ou :nom dans une requête préparée |
0A000 | fonctionnalité non prise en charge | 1235 ; construction PL/pgSQL hors du sous-ensemble pris en charge (le message la nomme), CREATE EVENT, colonne de type tableau, vue récursive… |
22P02 | valeur écrite illisible | 'peut-être'::boolean, '\xZZ'::bytea, intervalle mal écrit |
42P01, 42703, 23505, 23502, 23503, 23514 | table absente, colonne inconnue, doublon, NULL interdit, clé étrangère, CHECK | 1146, 1054, 1062, 1048, 1451/1452, 4025 |
42P06, 3F000 | base (schéma) déjà existante ; inconnue, absente à la suppression ou non choisie | 1007 ; 1049, 1008, 1046 |
3D000 | base inconnue nommée à la connexion (avis, la session s'ouvre sans base courante) | paramètre database |
22023 | options d'une séquence incohérentes | 4085 |
54000 | limite dépassée : profondeur d'une expression récursive, nombre de lignes de generate_series | 3636 |
54001 | instruction trop complexe | 7620 |
53100 | disque plein, table pleine | 1021, 1114 (aussi quand max_statement_memory la provoque) |
53200 | mémoire insuffisante | 1038, 9067 |
58030 | erreur d'entrée-sortie : journal arrêté par un vidage sur disque en échec | 1026 |
42P07 | table déjà existante | 1050 |
42501 | droit insuffisant | 1044, 1142, 1143, 1227 |
55P03 | attente de verrou dépassée | 1205 |
57014 | requête annulée | 1317, 3024 (Ctrl-C, KILL QUERY, délai) |
25P01 | DECLARE … CURSOR hors d'un bloc de transaction | curseur WITHOUT HOLD |
25P02 | bloc de transaction en échec | instruction autre que la fin du bloc après une erreur |
34000 | portail ou curseur inconnu | FETCH, CLOSE, Execute |
26000, 42P05, 42P03 | instruction préparée inconnue, nom déjà pris, curseur déjà ouvert | protocole étendu, DECLARE |
42P11 | définition de curseur invalide | DECLARE c CURSOR FOR INSERT … (instruction sans lignes), SCROLL et NO SCROLL ensemble |
55000 | objet dans un état incorrect | lastval() avant tout numéro servi à la session, currval avant nextval, recul d'un curseur NO SCROLL |
428C9 | colonne non affectable | valeur écrite dans une colonne GENERATED ALWAYS AS IDENTITY (sans OVERRIDING SYSTEM VALUE) ou dans une colonne générée |
42P10 | liste de colonnes incohérente | ON CONFLICT sans contrainte d'unicité arbitre, trop d'alias de colonnes (AS x (a, b)), DISTINCT ON qui ne commence pas l'ORDER BY |
42883 | fonction ou opérateur inexistant | fonction inconnue, mauvais nombre ou type d'arguments (lower(1)) |
42804 | type incompatible | chaîne de bits écrite dans une colonne d'un autre type, résultat d'une fonction ensembliste d'une autre structure |
22012 | division par zéro | 1 / 0, mod(x, 0) |
55P02 | paramètre non modifiable dans la session | SET shared_buffers, max_connections… |
57P01, 57P05, 25P03 | connexion fermée par le serveur (FATAL) | KILL, pg_terminate_backend, arrêt du serveur ; délai d'inactivité ; délai d'inactivité dans une transaction |
42602, 58P02 | chemin relatif, fichier existant | COPY … TO 'fichier' |
22021 | texte qui n'est pas en UTF-8 | client_encoding autre qu'UTF-8 |
28000, 28P01 | connexion refusée, mot de passe faux | 1045, TLS exigé |
08P01 | violation du protocole | message mal formé, paquet trop long (1153) |
XX000 | erreur interne ou sans équivalent | codes de SQLSTATE HY000 |
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) :
- l'option
--langdemiraj-server(en,fr,zh,hi,es,ar,pt,ru,de,ja), ou demiraj-cliouvert sur un dossier de données, choisit la langue des messages d'erreur et des avertissements (SHOW WARNINGS, langage MIRAJ :Données tronquées pour la colonne 'v' à la ligne 1pour 1265 en français) ; en langage MIRAJ, les avertissements et notes listés parSHOW WARNINGSsont rédigés dans la même langue que les erreurs (par exemple, sous--lang fr,Warning | 1265 | Données tronquées pour la colonne 'v' à la ligne 1), leur code restant le même ; - 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.