Mirajv1.0
FR

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.json par défaut) dans lequel les %s ont é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#

CodeSQLSTATEMessageCause typiquePiste de correction
106442000Erreur de syntaxe SQL ; vérifiez le manuel de votre version de Miraj pour la syntaxe correcte près de '%s' à la ligne %sConstruction 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
106542000La requête est videInstruction vide envoyée au serveurVérifier que le client n'envoie pas une chaîne vide
113942000Erreur « %s » dans l'expression régulièreMotif 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
1210HY000Arguments incorrects pour %sArgument(s) d'une fonction ou instruction incompatibles avec sa signatureVérifier le nombre et le type des arguments
1221HY000Utilisation incorrecte de %s et %sCombinaison de deux constructions incompatibles dans la même instructionSéparer les deux constructions ou consulter la documentation de l'instruction concernée
123542000Cette version de Miraj ne prend pas encore en charge '%s'Construction syntaxiquement valide mais non implémentée dans cette versionUtiliser une construction équivalente prise en charge
130542000%s %s n'existe pasAppel 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 BYCorriger le nom ; vérifier la liste des chapitres 9 et 6
158242000Nombre 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
1111HY000Utilisation invalide d'une fonction d'agrégationAgrégat, ou GROUPING(), dans un WHERE ou sans GROUP BYDéplacer la condition dans HAVING ; GROUPING() ne s'emploie qu'avec GROUP BY (§8.17)
3580HY000L'argument n°%s de la fonction GROUPING ne figure pas dans GROUP BYGROUPING(p) alors que p n'est pas une expression du GROUP BYPasser à GROUPING les expressions du GROUP BY telles qu'écrites
366742000Toute fonction table doit avoir un aliasFROM JSON_TABLE(...) sans aliasAjouter [AS] alias
3668HY000Les références latérales de '%s' exigent une jointure INNER ou LEFTJSON_TABLE dont le document cite une table placée avant, jointe par RIGHT JOINUtiliser la virgule, JOIN ou LEFT JOIN
125342000La 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)
1267HY000Mé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
1270HY000Mé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
1271HY000Mélange illégal de collations pour l'opération '%s'Même cas avec quatre opérandes ou plus, ou colonnes d'un UNIONIdem
1273HY000Collation 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
1302HY000Déclarations contradictoires : '%s' et '%s'Colonne déclarée BINARY avec un COLLATE autre que binaireGarder l'un des deux
140742000SQLSTATE incorrect : '%s'SIGNAL/RESIGNAL SQLSTATE '...' avec une valeur qui n'est pas un code à 5 caractères valideUtiliser un SQLSTATE conforme (5 caractères, classe différente de 00, 01, XA)

2.2 Erreurs de schéma (bases, tables, colonnes, index)#

CodeSQLSTATEMessageCause typiquePiste de correction
29HY000Fichier '%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
1004HY000Impossible 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
1005HY000Impossible de créer la table '%s' (errno : %s)Échec d'écriture du fichier .mrj à la créationVérifier l'espace disque et les droits
1007HY000Impossible de créer la base '%s' ; elle existe déjàCREATE DATABASE sans IF NOT EXISTS sur une base existanteAjouter IF NOT EXISTS ou choisir un autre nom
1008HY000Impossible de supprimer la base '%s' ; elle n'existe pasDROP DATABASE sans IF EXISTS sur une base absenteAjouter IF EXISTS ou vérifier le nom
1034HY000Fichier 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)
104442000Accè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
104528000Accès refusé pour l'utilisateur '%s'@'%s' (mot de passe utilisé : %s)Identifiants invalides à la connexionVérifier le compte et le mot de passe
10463D000Aucune base de données sélectionnéeInstruction nécessitant une base courante exécutée sans USEExécuter USE <base> avant l'instruction, ou qualifier les objets
104942000Base de données '%s' inconnueUSE ou référence à une base qui n'existe pasVérifier l'orthographe ou créer la base
105042S01La 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
105142S02Table '%s' inconnueRéférence à une table absente (contexte sans nom de base explicite)Vérifier le nom et la base courante
105223000La colonne '%s' dans %s est ambiguëColonne présente dans plusieurs tables de la requête sans qualificationQualifier la colonne (table.colonne)
105442S22Colonne '%s' inconnue dans '%s'Nom de colonne mal orthographié ou colonne inexistante dans le contexte citéVérifier DESCRIBE <table> ou information_schema.COLUMNS
106042S21Nom de colonne '%s' en doubleDeux colonnes du même nom dans une même définition de table ou un CREATE TABLE … SELECTRenommer l'une des colonnes ou lui donner un alias
106142000Nom de clé '%s' en doubleDeux index/clés du même nom sur la tableChoisir un autre nom d'index
106642000Table ou alias non unique : '%s'Même nom de table ou d'alias utilisé deux fois dans une requêteDonner un alias distinct à chaque occurrence
110242000Nom 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
110342000Nom de table incorrect : '%s'Même règle que 1102, appliquée au nom de tableIdem
110942S02Table '%s' inconnue dans %sTable référencée absente dans le contexte précisé (%s : clause, jointure...)Vérifier le nom de la table dans cette clause
114642S02La table '%s.%s' n'existe pasTable absente de la base indiquéeVérifier le nom et la base, ou la créer
116642000Nom de colonne incorrect : '%s'Nom de colonne hors des règles d'identifiantRenommer selon les règles
117042000La 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 indexUtiliser une colonne de longueur bornée, ou une colonne générée à partir d'un extrait
128042000Nom d'index incorrect : '%s'Nom d'index invalide ou trop longRaccourcir ou corriger le nom
1031HY000Le moteur de stockage %s de la table %s n'a pas cette optionFonction non prise en charge par une table disque (ENGINE = Aria, MyISAM, DISK) : index vectoriel, partitionnementGarder la table en mémoire (ENGINE = InnoDB ou sans clause ENGINE)
1214HY000Le type de table utilisé ne prend pas en charge les index FULLTEXTIndex 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
1266HY000Moteur de stockage %s utilisé pour la table '%s'Avertissement : ENGINE = Aria / MyISAM / DISK sur une table temporaire, qui reste en mémoireAucune action : la table temporaire est créée en mémoire
128642000Moteur de stockage '%s' inconnuSET default_storage_engine d'un nom de moteur inconnuUtiliser MIRAJ, InnoDB, MEMORY, Aria, MyISAM ou DISK
3162HY000Le compte %s n'existe pas.Rôle/compte cité qui n'existe pasVérifier CREATE USER / le nom exact du compte
3163HY000Le compte %s existe déjà.CREATE USER sur un compte déjà définiUtiliser IF NOT EXISTS ou choisir un autre nom

2.3 Erreurs de contraintes et de données#

CodeSQLSTATEMessageCause typiquePiste de correction
104823000La colonne '%s' ne peut pas être NULLINSERT/UPDATE fournissant NULL à une colonne NOT NULL sans valeur implicite disponibleFournir une valeur, ou revoir la contrainte NOT NULL
106223000Doublon '%s' pour la clé '%s'Violation d'une clé primaire ou UNIQUEUtiliser INSERT IGNORE, REPLACE ou ON DUPLICATE KEY UPDATE si le doublon est attendu
106842000Plusieurs clés primaires définiesDeux clauses PRIMARY KEY dans une même définition de tableN'en garder qu'une
113621S01Le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne %sINSERT ... VALUES (...) avec un nombre de valeurs différent du nombre de colonnesFaire correspondre les deux listes
113822004Utilisation incorrecte de la valeur NULLNULL utilisé là où il n'est pas permis (ex. valeur d'une contrainte)Retirer le NULL ou revoir l'expression
117142000Toutes les parties d'une clé primaire doivent être NOT NULL ; utilisez UNIQUE pour accepter NULLColonne nullable incluse dans une PRIMARY KEYRendre la colonne NOT NULL ou utiliser une contrainte UNIQUE
117242000Le résultat compte plus d'une ligneSous-requête scalaire ou SELECT ... INTO recevant plusieurs lignesAjouter une condition qui ramène le résultat à une ligne, ou utiliser LIMIT 1 en connaissance de cause
1215HY000Impossible d'ajouter la contrainte de clé étrangèreDé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
124221000La sous-requête renvoie plus d'une ligneSous-requête utilisée en contexte scalaire (=, SELECT ... INTO) qui rend plusieurs lignesRestreindre la sous-requête ou utiliser IN / EXISTS
126422003Valeur hors limites pour la colonne '%s' à la ligne %sValeur numérique hors de la plage du type déclaréUtiliser un type plus large ou corriger la valeur
129222007Valeur %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
136522012Division par zéroDivision ou modulo par 0Protéger l'expression (CASE WHEN ... != 0) ou accepter le résultat NULL selon le mode SQL
136622007Valeur %s incorrecte : '%s' pour la colonne %s à la ligne %sValeur incompatible avec le type de la colonne à l'écritureCorriger la valeur ou le type de colonne
140622001Données trop longues pour la colonne '%s' à la ligne %sChaîne plus longue que la longueur déclarée de la colonneAgrandir la colonne ou tronquer la valeur en amont
145123000Impossible 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 enfantSupprimer/modifier d'abord les lignes enfants, ou revoir l'action ON DELETE/ON UPDATE
145223000Impossible 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 inexistanteInsérer d'abord la ligne parente, ou vérifier la valeur de la clé étrangère
4084HY000La séquence '%s.%s' est épuiséeNEXTVAL au-delà de MAXVALUE (ou MINVALUE) d'une séquence sans CYCLEALTER SEQUENCE … RESTART, élargir les bornes ou ajouter CYCLE
4085HY000La séquence '%s.%s' a une valeur hors limites pour ses optionsMINVALUE ≥ MAXVALUE, START hors des bornes, CACHE négatif…Corriger les options
4087HY000'%s.%s' n'est pas une SEQUENCESHOW CREATE SEQUENCE ou ALTER SEQUENCE sur une table ou une vueViser une séquence
4089HY000SEQUENCE inconnue : '%s'DROP SEQUENCE d'une séquence absenteDROP SEQUENCE IF EXISTS
4091HY000INSERT incorrect dans une SEQUENCEINSERT, UPDATE ou DELETE visant une séquenceALTER SEQUENCE ou SETVAL
1298HY000Fuseau 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)
366522035Valeur absente pour la colonne '%s' de JSON_TABLEColonne JSON_TABLE déclarée ERROR ON EMPTY dont le chemin ne désigne rienÉcrire NULL ON EMPTY ou DEFAULT '...' ON EMPTY
36662203FImpossible de placer un tableau ou un objet dans la colonne scalaire '%s' de JSON_TABLEColonne scalaire JSON_TABLE ... ERROR ON ERROR dont le chemin désigne un tableau ou un objetViser une valeur scalaire, ou déclarer la colonne JSON
366922003Valeur hors limites pour la colonne '%s' de JSON_TABLEValeur trop grande pour le type de la colonne JSON_TABLEÉlargir le type de la colonne
4146HY000%s doit être de type %s pour la table versionnée %sColonne de période d'une table WITH SYSTEM VERSIONING qui n'est ni TIMESTAMP ni DATETIME (chapitre 11)Corriger le type
4174HY000La table %s n'est pas versionnée par le systèmeFOR SYSTEM_TIME, DELETE HISTORY ou DROP SYSTEM VERSIONING sur une table ordinaireALTER TABLE ... ADD SYSTEM VERSIONING
4185HY000La table %s est déjà versionnée par le systèmeADD SYSTEM VERSIONING sur une table déjà versionnéeRien à faire
314122032Texte 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
314342000Expression 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)
314622032Type 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 attenduPasser un texte JSON, ou convertir la valeur par JSON_ARRAY / JSON_QUOTE
314942000Ici, 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_CONTAINSDésigner une seule valeur
315342000Le chemin '$' n'est pas permis ici.JSON_REMOVE(doc, '$')Désigner un membre ou une case
315442000L'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'
315622018Valeur JSON invalide pour une conversion en %s depuis la colonne %s à la ligne %sJSON_VALUE ... ERROR ON ERROR sur une valeur non convertible ou non scalaireRevoir le type de RETURNING, ou choisir NULL / DEFAULT ON ERROR
315722032Le document JSON dépasse la profondeur maximale.Plus de 100 niveaux d'imbricationAplatir le document
315822032Un 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
316542000Le 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
396622035Aucune valeur trouvée par '%s' au chemin indiqué.JSON_VALUE ... ERROR ON EMPTY sur un chemin qui ne désigne rienChoisir NULL / DEFAULT ON EMPTY, ou vérifier le chemin
402523000La CONTRAINTE %s a échoué pour %s.%sLigne refusée par une contrainte CHECKCorriger la valeur pour satisfaire la contrainte, ou revoir la contrainte

2.4 Erreurs de privilèges#

CodeSQLSTATEMessageCause typiquePiste de correction
104442000Accè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
114242000Commande %s refusée à l'utilisateur '%s'@'%s' pour la table '%s'Contrôle de niveau table, avant même la résolution du nomAccorder le privilège de table nécessaire (SELECT, INSERT...)
114342000Commande %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
114442000Commande GRANT/REVOKE invalide ; consultez le manuel pour savoir quels privilèges s'appliquent à ce niveauGRANT/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
104008004Trop de connexionsmax_connections connexions déjà ouvertes : paquet d'erreur envoyé à la place de la poignée de mainFermer des connexions inutiles ou relever --max-connections / SET GLOBAL max_connections
1129HY000L'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
1135HY000Impossible 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
122742000Accès refusé ; il faut le privilège %s pour cette opérationContrô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
1524HY000Le 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 ...
3523HY000Compte ou rôle inconnu %s@%sSET ROLE ou GRANT/REVOKE sur un rôle qui n'existe pasCréer le rôle avec CREATE ROLE ou corriger le nom
3530HY000%s@%s n'est pas accordé à %s@%sSET ROLE sur un rôle non accordé au compte courantAccorder le rôle avec GRANT <rôle> TO <compte>
3619HY000Niveau de privilège invalide pour %sPrivilège dynamique demandé hors du niveau globalAccorder 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#

CodeSQLSTATEMessageCause typiquePiste de correction
1205HY000Délai d'attente du verrou dépassé ; réessayez la transactionLOCK TABLES, SELECT ... FOR UPDATE NOWAIT/WAIT n, ou attente d'un verrou de table au-delà de lock_wait_timeoutRéessayer la transaction ; envisager de réduire la durée des transactions concurrentes
121340001Interblocage détecté lors de la prise du verrou ; réessayez la transactionConcurrence 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)
179225006Impossible 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
192770100La connexion a été arrêtéeConnexion terminée par KILL ou par le serveurSe reconnecter
196970100Requête interrompue : limite de durée de %s s dépasséemax_statement_time ou l'indication MAX_EXECUTION_TIME dépassésOptimiser la requête ou augmenter la limite si elle est légitime
1095HY000Vous n'êtes pas propriétaire de la connexion %sKILL d'une connexion qui n'appartient pas au compte courant, sans le privilège nécessaireUtiliser un compte disposant du privilège adéquat, ou cibler sa propre connexion
1094HY000Identifiant de connexion inconnu : %sKILL avec un identifiant de connexion qui n'existe plusVérifier l'identifiant avec SHOW PROCESSLIST
1099HY000La 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 TABLESVerrouiller en écriture (WRITE) ou attendre la fin du verrou
1100HY000La table '%s' n'a pas été verrouillée par LOCK TABLESTable utilisée dans une session sous LOCK TABLES sans avoir été elle-même verrouilléeAjouter la table à la liste de LOCK TABLES

2.6 Erreurs de cluster et de réplication (édition Cluster)#

CodeSQLSTATEMessageCause typiquePiste de correction
1290HY000Le serveur fonctionne avec l'option %s et ne peut pas exécuter cette instructionTentative 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
9002HY000%s demande l'édition Miraj ClusterFonctionnalité de partitionnement effectif (segments, EXCHANGE PARTITION sur HASH/KEY...) utilisée hors édition ClusterPasser à l'édition Cluster, ou se limiter aux fonctions de partitionnement disponibles en édition Entreprise (définition acceptée, stockage non partitionné)
9003HY000Promotion refusée : %sSET 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
9004HY000Réplication synchrone : %sRé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
9005HY000Limite 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
1194HY000La 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 lireOuvrir 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.

CodeSQLSTATEMessageCause typiquePiste de correction
9001HY000%s n'est pas disponible dans l'édition Miraj ExpressFonctionnalité 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
9002HY000%s demande l'édition Miraj ClusterVoir §2.6Voir §2.6
9003HY000Promotion refusée : %sVoir §2.6Voir §2.6
9004HY000Réplication synchrone : %sVoir §2.6Voir §2.6
9005HY000Limite de données de Miraj Express atteinte (%s)Voir §2.6Voir §2.6
900625000WAIT FOR CHANGES n'est pas permis dans une transactionWAIT FOR CHANGES dans une transaction explicite, ou dans une transaction implicite (autocommit = 0) qui a écritValider ou annuler la transaction avant d'attendre ; attendre sur une connexion dédiée (chapitre 20)
9007HY000Cette session n'a aucun abonnement LISTEN actifWAIT FOR CHANGES sans LISTEN préalable sur la session, ou après UNLISTEN *S'abonner (LISTEN TABLE …, LISTEN canal) avant d'attendre
9008HY000Trop d'abonnements LISTEN (%s permis)Plus de change_events_max_listeners abonnements sur une même sessionRetirer des abonnements (UNLISTEN) ou relever change_events_max_listeners
9009HY000La table '%s' n'a pas de clé primaire : seuls les événements de table sont transmisAvertissement de LISTEN TABLE sur une table sans clé primaire : ses écritures ne donnent que des événements BULKAjouter une clé primaire pour recevoir un événement par ligne
901022001La charge de NOTIFY dépasse %s octetsCharge de NOTIFY ou de MIRAJ_NOTIFY() plus longue que change_events_max_payloadEnvoyer une charge plus courte (un identifiant plutôt que les données) ou relever change_events_max_payload
9011HY000Limite 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
9033HY000Le 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 = OFFCREATE USER d'un compte joignable à distance sans mot de passe, ou ALTER USER / SET PASSWORD qui lui retire le sien, sous require_password = ONDonner un mot de passe au compte, ou SET GLOBAL require_password = OFF
9012HY000L'é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 intactesRedémarrer miraj-server (ou l'application qui embarque le moteur) ; le décompte repart de zéro
9034HY000%s n'est pas permis au niveau d'accès MCP %sSession 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 niveauUtiliser un jeton d'un niveau suffisant, ou gérer les jetons par le port principal (chapitre 19, §19.5)
9035HY000Le 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)
9036HY000Jeton 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
9037HY000La partition %s ne peut pas être placée sur le nœud '%s', qui n'est pas membre d'un cluster actifPARTITION … NODE 'id' hors cluster actif, nœud hors de members ou identifiant invalideVérifier cluster.toml et l'identifiant du nœud (§16.10)
9038HY000La partition %s de %s est tenue par le nœud %s, injoignable : %sLecture ou écriture d'une partition dédiée à un nœud arrêté, injoignable ou qui ne répond pas dans fragment_timeout_msRelancer le nœud ; élaguer la requête aux partitions disponibles
9039HY000%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
9041HY000%s n'est pas pris en charge sur %s tant que la partition %s est tenue par le nœud %sOpération non prise en charge sur une table à partition dédiée (§16.10.9)Voir §16.10.10
9042HY000Le nœud %s a refusé la demande sur le fragment : %sDéfinition différente entre nœuds, partition non tenueAttendre la fin de la réplication du DDL, vérifier le placement
9043HY000Aucun nœud disponible pour les connexions %sEnvoyé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)
9044HY000Le chemin %s %s est déjà utilisé par l'endpoint %sCREATE 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 confonduesChoisir un autre chemin, ou remplacer l'endpoint existant (chapitre 23, §23.4.2)
9045HY000Chemin d'endpoint invalide '%s' : %sChemin 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èresCorriger le chemin (chapitre 23, §23.4.2)
9046HY000Paramètre d'endpoint '%s' : %sAppel 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 400Fournir la valeur (chemin, requête ou corps JSON), ou déclarer le paramètre dans PARAMS
9047HY000L'accès REST %s n'est pas permis pour %sRequê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)
9048HY000L'hôte '%s' ne peut pas se connecter tant que la base système est indisponible : seules les connexions locales sont acceptéesConnexion 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 MCPSe 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)
6133HY000La colonne non scalaire (vecteur par exemple) '%s' ne peut pas servir de clé.VECTOR(n) utilisée en clé primaire, UNIQUE ou indexNe pas indexer la colonne vectorielle ; indexer une colonne dérivée si besoin
6138HY000Données impossibles à convertir en vecteur valide : '%s'Valeur non convertible en VECTOR(n)Corriger le format de la valeur (forme texte […] ou binaire)
760022000dimensions de vecteurs différentes %s et %sOpération entre deux vecteurs de dimensions différentesUtiliser des vecteurs de même dimension
760122000%s dimensions attendues, et non %sVecteur écrit dans une colonne VECTOR(n) avec une dimension différente de nAjuster le nombre de composantes
760222P02syntaxe incorrecte pour le type vector : "%s"Forme texte d'un vecteur invalideUtiliser la forme [v1, v2, ...]
760322000NaN interdit dans un vecteurComposante NaN dans un vecteurRetirer les valeurs NaN en amont
760422000valeur infinie interdite dans un vecteurComposante infinie dans un vecteurRetirer les valeurs infinies en amont
4206HY000Impossible 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 colonnesCré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#

CodeSQLSTATEMessageCause typiquePiste de correction
1024HY000Erreur de lecture du fichier '%s' (errno : %s)Erreur disque à la lecture d'un fichier du moteurVérifier le disque, restaurer depuis une sauvegarde si le fichier est endommagé
1026HY000Erreur d'écriture du fichier '%s' (errno : %s)Erreur disque à l'écriture (disque plein, droits...)Vérifier l'espace disque et les droits
1028HY000Tri interrompu : %sORDER 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
1105HY000Erreur inconnue : %sErreur 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
114842000Cette commande n'est pas autorisée avec cette version du serveurCommande 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
1193HY000Variable système inconnue : '%s'SET/SELECT @@variable sur un nom de variable qui n'existe pasVérifier le nom exact dans SHOW VARIABLES
123142000La variable '%s' ne peut pas recevoir la valeur '%s'Valeur hors du domaine attendu pour une variable systèmeConsulter la documentation de la variable pour les valeurs admises
123542000Cette version de Miraj ne prend pas encore en charge '%s'Voir §2.1 : fonctionnalité non encore implémentéeUtiliser 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 :

SQLSTATESignificationExemples 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
23000Violation de contrainte d'intégrité1048, 1062, 1451, 1452, 4025
3D000Base de données non sélectionnée1046
28000Autorisation invalide (authentification)1045
40001Transaction 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éro1264, 1292, 1365, 1366, 1406
25006Instruction interdite en transaction en lecture seule1792
70100Instruction interrompue (SQLSTATE d'une convention répandue dans l'écosystème SQL, reprise par MIRAJ)1317, 1927, 1969
HY000Erreur générale, sans classe SQLSTATE plus précisela 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>.json dé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.