sql >> Databasteknik >  >> RDS >> PostgreSQL

initdb:initierar pg_authid ... FATAL:fel antal indexuttryck

Jag stötte på samma problem efter att ha kompilerat postgresql 8.1.4 med gcc 4.9.3.

Problemet verkar vara hur postgres använder för att representera arrayer med variabel längd:

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 vissa fall, för loopar som har åtkomst till "värden", antar GCC att de kommer att göra en iteration som mest. Slingor som den nedan (utdragna från postgres källkod):

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

kan sluta reduceras till något som:

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

som härleds genom att titta på assemblern som skapats för den:

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

Problemet försvann efter att ha kompilerat om postgres med den optimeringen inaktiverad genom att använda -fno-aggressive-loop-optimizations.



  1. Tolka resultat från Explain Analyze i Postgres

  2. Hur återanvänder jag Oracle-sekvensluckor i primärnyckelkolumnen?

  3. SQL Server variabel omfattning i en lagrad procedur

  4. Spring-Hibernate med flera datakällor/databas