PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

initdb:inizializzazione pg_authid ... FATAL:numero errato di espressioni di indice

Ho riscontrato lo stesso problema dopo aver compilato postgresql 8.1.4 con gcc 4.9.3.

Il problema sembra essere il modo in cui Postgres usa per rappresentare gli array a lunghezza variabile:

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 */

In alcuni casi, per i loop che accedono a "valori", GCC presume che eseguiranno al massimo un'iterazione. Loop come quello qui sotto (estratto dal codice sorgente di Postgres):

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

potrebbe finire per essere ridotto a qualcosa del tipo:

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

come dedotto guardando l'assembler generato per esso:

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

Il problema è scomparso dopo aver ricompilato postgres con quell'ottimizzazione disabilitata utilizzando -fno-aggressive-loop-optimizations.