sql >> Base de Datos >  >> RDS >> PostgreSQL

initdb:inicializando pg_authid ... FATAL:número incorrecto de expresiones de índice

Me encontré con el mismo problema después de compilar postgresql 8.1.4 con gcc 4.9.3.

El problema parece ser la forma en que Postgres utiliza para representar matrices de longitud 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 */

En algunos casos, para los bucles que acceden a 'valores', GCC asume que realizarán una iteración como máximo. Bucles como el siguiente (extraído del código fuente de postgres):

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

podría terminar reduciéndose a algo como:

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

como se deduce mirando el ensamblador generado para ello:

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

El problema desapareció después de volver a compilar Postgres con esa optimización deshabilitada usando -fno-aggressive-loop-optimizations.