PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

initdb:Initialisierung von pg_authid ... FATAL:falsche Anzahl von Indexausdrücken

Ich bin auf das gleiche Problem gestoßen, nachdem ich postgresql 8.1.4 mit gcc 4.9.3 kompiliert habe.

Das Problem scheint die Art und Weise zu sein, wie Postgres verwendet wird, um Arrays mit variabler Länge darzustellen:

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 einigen Fällen geht GCC bei for-Schleifen, die auf „Werte“ zugreifen, davon aus, dass sie höchstens eine Iteration durchführen. Schleifen wie die folgende (aus dem Quellcode von Postgres extrahiert):

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

könnte am Ende auf etwas wie:

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

wie aus dem dafür generierten Assembler abgeleitet:

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

Das Problem verschwand nach der Neukompilierung von Postgres mit deaktivierter Optimierung durch Verwendung von -fno-aggressive-loop-optimizations.