PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

initdb:inicializando pg_authid ... FATAL:número incorreto de expressões de índice


Eu me deparei com o mesmo problema depois de compilar o postgresql 8.1.4 com gcc 4.9.3.

O problema parece ser a maneira como o postgres usa para representar arrays de comprimento variável:
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 */

Em alguns casos, para loops acessando 'valores', o GCC assume que eles farão no máximo uma iteração. Loops como o abaixo (extraído do código-fonte do postgres):
ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
    ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];

pode acabar sendo reduzido a algo como:
ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
    ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];

como deduzido olhando para o montador gerado para ele:
.L161:
    testl   %r12d, %r12d
    movl    %r12d, 4(%rbx)
    jle .L162
    movzwl  40(%r13), %eax
    movw    %ax, 8(%rbx)
.L162:

O problema desapareceu após a recompilação do postgres com essa otimização desabilitada usando -fno-aggressive-loop-optimizations.