Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 16/02/2012 17:55:53
- benoithb
- Membre
problème avec opérateur d'intersection de tableau d'entier
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
#2 16/02/2012 18:07:02
- gleu
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
À 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
#3 16/02/2012 18:15:58
- rjuju
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
Il s'agit probablement du contrib intarray : http://docs.postgresql.fr/9.1/intarray.html
Julien.
https://rjuju.github.io/
Hors ligne
#4 16/02/2012 18:59:21
- benoithb
- Membre
Re : problème avec opérateur d'intersection de tableau d'entier
oui, excusez-moi c'est avec l'usage de la contrib intarray
Hors ligne
#5 16/02/2012 19:16:48
- rjuju
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
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
#6 16/02/2012 23:45:39
- gleu
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
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
#7 17/02/2012 00:18:53
- gleu
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
Pour ceux qui veulent suivre la discussion sur pgsql-hackers, c'est sur http://archives.postgresql.org/pgsql-ha … g00678.php
Guillaume.
Hors ligne
#8 17/02/2012 00:20:33
- rjuju
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
Ah merci beaucoup gleu
Julien.
https://rjuju.github.io/
Hors ligne
#9 17/02/2012 09:24:17
- gleu
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
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
#10 17/02/2012 09:36:35
- benoithb
- Membre
Re : problème avec opérateur d'intersection de tableau d'entier
merci à tous.
Je vais attendre le 27 février, j'ai constaté ce bug en phase de dev.
Hors ligne
#11 18/02/2012 00:44:39
- rjuju
- Administrateur
Re : problème avec opérateur d'intersection de tableau d'entier
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