PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

initdb :initialisation de pg_authid ... FATAL :nombre incorrect d'expressions d'index

J'ai rencontré le même problème après avoir compilé postgresql 8.1.4 avec gcc 4.9.3.

Le problème semble être la façon dont postgres utilise pour représenter les tableaux de longueur variable :

typedef struct
{
    int32       size;           /* these fields must match ArrayType! */
    int         ndim;
    int         flags;
    Oid         elemtype;
    int         dim1;
    int         lbound1;
    int2        values[1];      /* VARIABLE LENGTH ARRAY */
} int2vector;                   /* VARIABLE LENGTH STRUCT */

Dans certains cas, pour les boucles accédant aux "valeurs", GCC suppose qu'elles feront une itération au plus. Boucles comme celle ci-dessous (extraite du code source de postgres) :

ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
    ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];

pourrait finir par être réduit à quelque chose comme :

ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
    ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];

comme déduit en regardant l'assembleur généré pour cela :

.L161:
    testl   %r12d, %r12d
    movl    %r12d, 4(%rbx)
    jle .L162
    movzwl  40(%r13), %eax
    movw    %ax, 8(%rbx)
.L162:

Le problème a disparu après la recompilation de postgres avec cette optimisation désactivée en utilisant -fno-aggressive-loop-optimizations.