Projet

Général

Profil

Anomalie #6654

pg_copy_from(): Copy command failed: ERROR: missing data for column 'sicon'

Ajouté par Jérôme Augé il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Intégré
Priorité:
Normal
Assigné à:
Version cible:
Début:
03/11/2016
Echéance:
% réalisé:

100%

Version source:
Solution proposée:

Il faut aussi supprimer les caractères non imprimables classiques du titre (Doc::refreshTitle)

Principaux fichiers impactés:
Complexité:
Contrôle:
Thème:
Socle technique
Régression:
Non
Jalons: 3.2 R17

Description

- Soit un document A ayant un CR "\r", ou un LF "\n", ou dans son titre (e.g. "AAA\rAAA")
- Quand on crée un document B qui référence A (via un attribut de type docid), alors lors de la sauvegarde du document B on obtient une erreur sur le document :

{DB0001} query error : ERROR: current transaction is aborted, commands ignored until end of transaction block

release savepoint "dcp:initrelation581afb45a70a4" 

L'erreur côté serveur est :

PHP Warning:  pg_copy_from(): Copy command failed: ERROR:  missing data for column "sicon"\nCONTEXTE : COPY docrel, 
line 6: "1540\t185901\tReptiles\tAAA" in /var/www/test/FDL/Class.DocRel.php on line 186

La requête SQL en erreur est :

2016-11-03 09:54:29 CET CONTEXT:  COPY docrel, line 6: "1540    185901  Reptiles        AAA" 
2016-11-03 09:54:29 CET STATEMENT:  COPY docrel FROM STDIN DELIMITERS E'        ' WITH NULL AS E'\\N'

On remarque que le COPY SQL s'arrête après le premier "AAA" et ne comporte pas le titre complet "@AAA\rAAA" : le CR, ou le LF, semblent marquer la fin de l’instruction de COPY, et masque alors les valeurs suivantes sicon, cicon, etc.

Historique

#1 Mis à jour par Jérôme Augé il y a plus de 2 ans

  • Description mis à jour (diff)

#2 Mis à jour par Jérôme Augé il y a plus de 2 ans

Actuellement seuls les caractères "\n" sont supprimé du titre des documents : peut-être faudrait-il étendre ce nettoyage pour supprimer tous les caractères de contrôle ?

Il n'est pas forcément nécessaire de les supprimer s'ils sont correctement échappés...

Actuellement le titre "\N" donnera NULL ("\N" étant la séquence pour indiquer la valeur SQL NULL) : il faut donc échapper les "\" dans le titre pour qu'ils ne soient pas interprétés. Ensuite échapper les caractères CR, LF et TAB

function esc($str) {
        $str = str_replace("\\", "\\\\", $str);
        $str = str_replace("\r", "\\r", $str);
        $str = str_replace("\n", "\\n", $str);
        $str = str_replace("\t", "\\t", $str);
        return $str;
}
 

La logique d'échappement à appliquer est décrite sur https://www.postgresql.org/docs/9.2/static/sql-copy.html#AEN66944 :

Backslash characters (\) can be used in the COPY data to quote data characters that might otherwise be taken as row or column delimiters. In particular, the following characters must be preceded by a backslash if they appear as part of a column value: backslash itself, newline, carriage return, and the current delimiter character.

#3 Mis à jour par Marc Claverie il y a plus de 2 ans

  • Version cible mis à 3.2.23
  • Assigné à mis à Éric Brison

#4 Mis à jour par Éric Brison il y a plus de 2 ans

  • Assigné à changé de Éric Brison à Jérôme Augé
  • Statut changé de Nouveau à Assigné

#5 Mis à jour par Éric Brison il y a plus de 2 ans

  • Solution proposée mis à jour (diff)

#6 Mis à jour par Jérôme Augé il y a plus de 2 ans

  • % réalisé changé de 0 à 10

#7 Mis à jour par Jérôme Augé il y a plus de 2 ans

  • % réalisé changé de 10 à 100

#8 Mis à jour par Éric Brison il y a plus de 2 ans

  • Statut changé de Assigné à Intégré

Appliqué par commit internal-platfrom:commit:7f8713e09124fbdf8b374adb4a6b04d88dd1c87f.

Formats disponibles : Atom PDF