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

initdb:initialiserer pg_authid ... FATAL:forkert antal indeksudtryk

Jeg løb ind i det samme problem efter kompilering af postgresql 8.1.4 med gcc 4.9.3.

Problemet ser ud til at være den måde, postgres bruger til at repræsentere arrays med variabel længde:

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

I nogle tilfælde, for sløjfer, der har adgang til 'værdier', antager GCC, at de højst vil udføre én iteration. Sløjfer som nedenstående (udtrukket fra postgres's kildekode):

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

kan ende med at blive reduceret til noget som:

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

som udledt ved at se på assembler genereret til det:

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

Problemet forsvandt efter genkompilering af postgres med denne optimering deaktiveret ved at bruge -fno-aggressive-loop-optimizations.



  1. Sådan tilføjes 1 til værdien af ​​en kolonne i en eksisterende række i mysql

  2. Fordele og sikkerhed i Amazon Relational Database Service

  3. Indlæsning af data fra en tekstfil til en tabel i oracle

  4. shell-script for at finde filnavn og linjeantal for hver fil, indsæt nu denne post i Oracle-tabellen