PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

initdb:inicjalizacja pg_authid ... FATAL:nieprawidłowa liczba wyrażeń indeksu

Wpadłem na ten sam problem po skompilowaniu postgresql 8.1.4 z gcc 4.9.3.

Problemem wydaje się być sposób, w jaki postgres używa do reprezentowania tablic o zmiennej długości:

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

W niektórych przypadkach, dla pętli uzyskujących dostęp do „wartości”, GCC zakłada, że ​​wykonają co najwyżej jedną iterację. Pętle takie jak ta poniżej (wyodrębnione z kodu źródłowego postgres):

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

może zostać zredukowane do czegoś takiego:

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

jak wywnioskowałem patrząc na wygenerowany dla niego asembler:

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

Problem zniknął po ponownej kompilacji postgresa z tą optymalizacją wyłączoną za pomocą -fno-aggressive-loop-optimizations.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lista przechowywanych funkcji, które odwołują się do tabeli w PostgreSQL

  2. Wyzwalacz Postgresql przy logowaniu użytkownika

  3. Jak pracować z tabelami bez PRIMARY KEY w Hibernate?

  4. Wyodrębnij dane z bazy PostgreSQL bez użycia pg_dump

  5. Interpolacja między dwiema wartościami w jednym zapytaniu