Vous n'êtes pas identifié(e).
environnement postgresql 9.0.6 et 9.1.2
pourquoi ci-dessous {1} n'est pas retourné comme étant l'intersection des deux tableaux ci-dessous :
bdd=# select ARRAY[-1,3,1] & ARRAY[1, 2];
?column?
----------
{}
(1 row)
alors que :
bdd=# select ARRAY[-1,3,1] & ARRAY[1, 2, -1];
?column?
----------
{-1,1}
(1 row)
.. fonctionne bien.
ainsi que
bdd=# select ARRAY[-1, 3, 1] & ARRAY[-1, 2];
?column?
----------
{-1}
(1 row)
... fonctionne bien aussi
Hors ligne
À ma connaissance, l'opérateur & n'existe pas entre deux tableaux, comme indiqué ci-dessous :
postgres=# select array[1, 2, 3] & array[1, 2];
ERROR: operator does not exist: integer[] & integer[]
LINE 1: select array[1, 2, 3] & array[1, 2];
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Avez-vous défini vous-même cet opérateur ?
Guillaume.
Hors ligne
Il s'agit probablement du contrib intarray : http://docs.postgresql.fr/9.1/intarray.html
Julien.
https://rjuju.github.io/
Hors ligne
oui, excusez-moi c'est avec l'usage de la contrib intarray
Hors ligne
Je peux me tromper mais je crois qu'il y a un bug dans la fonction associée (http://doxygen.postgresql.org/__int_8h. … 4c71f0be2a) sur le test
*(dr - 1) != db[j]
qui pose soucis, le pointeur dr n'ayant pas encore été incrémentée lors du premier passage.
Je suppose que dans le cas où la première valeur d'intersection trouvée est 1 (et que 1 n'est pas la plus petite valeur d'un des tableaux) cela annule ce test.
Si quelqu'un peut confirmer ?
Julien.
https://rjuju.github.io/
Hors ligne
Pfiou, impressionnant. Je crois que tu as trouvé le problème. Je viens de travailler à un correctif. Je l'ai envoyé sur la liste pgsql-hackers, on verra bien leur réaction
Néanmoins, le voici si vous voulez le tester :
diff --git a/contrib/intarray/_int_tool.c b/contrib/intarray/_int_tool.c
index 79f018d..4d7a1f2 100644
--- a/contrib/intarray/_int_tool.c
+++ b/contrib/intarray/_int_tool.c
@@ -159,7 +159,7 @@ inner_int_inter(ArrayType *a, ArrayType *b)
i++;
else if (da[i] == db[j])
{
- if (i + j == 0 || (i + j > 0 && *(dr - 1) != db[j]))
+ if (i + j == 0 || (i + j > 0 && (dr - ARRPTR(r)) == 0) || (i + j > 0 && *(dr - 1) != db[j]))
*dr++ = db[j];
i++;
j++;
En tout cas, sur la branche en cours de développement, ça règle bien le problème.
Guillaume.
Hors ligne
Pour ceux qui veulent suivre la discussion sur pgsql-hackers, c'est sur http://archives.postgresql.org/pgsql-ha … g00678.php
Guillaume.
Hors ligne
Ah merci beaucoup gleu
Julien.
https://rjuju.github.io/
Hors ligne
Une journée qui commence bien. Une version cosmétiquement différente du correctif a été appliquée (http://git.postgresql.org/gitweb/?p=pos … bf16738739). benoithb, vous pouvez l'appliquer sur les sources de la 9.1 ou de la 9.0 (et même sur toutes les versions jusqu'à la 8.3) sans soucis si vous pouvez compiler votre serveur PostgreSQL. Sinon il vous faudra attendre le 27 février, date de la sortie des prochaines versions mineures.
Merci à benoithb pour avoir trouvé ce bug. Merci à rjuju pour avoir trouvé le problème dans le code source. Et merci à Tom pour avoir retravaillé mon correctif rapide.
Vraiment une journée qui commence bien :-)
Guillaume.
Hors ligne
merci à tous.
Je vais attendre le 27 février, j'ai constaté ce bug en phase de dev.
Hors ligne
Effectivement une bonne journée
Et sans oublier merci à toi gleu pour le premier patch et le transfert sur pgsql-hackers.
Dernière modification par rjuju (18/02/2012 00:46:52)
Julien.
https://rjuju.github.io/
Hors ligne