Vous n'êtes pas identifié(e).

#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

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 ?

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 smile

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 smile

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 smile

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)

Hors ligne

Pied de page des forums