2014-08-30 8 views
5

Jestem nowy PostgreSql.I'm próbuje zainstalować PostgreSQL w moim systemie operacyjnym system.My jest Ubuntu, Poniżej pisał to mój błądInitDB: inicjowanie pg_authid ... FATAL: błędny numer indeksu wyrażenia

Klaster bazy danych zostanie zainicjowany locale en_US.UTF-8. Domyślne kodowanie bazy danych zostało odpowiednio ustawione na UTF8.

creating directory p01/pgsql/data ... ok 
creating subdirectories ... ok 
selecting default max_connections ... 100 
selecting default shared_buffers/max_fsm_pages ... 24MB/153600 
creating configuration files ... ok 
creating template1 database in p01/pgsql/data/base/1 ... ok 
initializing pg_authid ... FATAL: wrong number of index expressions 
STATEMENT: CREATE TRIGGER pg_sync_pg_database AFTER INSERT OR UPDATE OR DELETE ON 

pg_database FOR EACH STATEMENT EXECUTE PROCEDURE flatfile_update_trigger(); 

child process exited with exit code 1 
initdb: removing data directory "p01/pgsql/data" 

Pomóż mi! Dzięki!

+1

Co to jest pg_sync_pg_database i flatfile_update_trigger stuff? Jaką wersję pakietów instalujesz i czy jest w nich coś jeszcze? –

+1

Myślę, że rozwiązanie twojego problemu [tutaj] (http://www.postgresql.org/message-id/[email protected]). – Rhim

+0

Jest tu fatalny brak danych. Wersja PostgreSQL? Jak to zainstalowałeś - pakiety/źródło, skąd? Dokładna wersja Ubuntu? * Co wypróbowałeś przed wysłaniem *? (biorąc pod uwagę, że link posty Rhim jest ** drugi hit Google ** dla komunikatu o błędzie)? To powiedziawszy, dziękuję za faktyczne opublikowanie odpowiedniego wyjścia dziennika z dokładnym komunikatem o błędzie i równomierne formatowanie go. –

Odpowiedz

3

@Rhim wydaje się być poprawny - you've hit what was assumed to be a compiler bug. Możesz zaktualizować do najnowszych pakietów gcc następnie make clean, ponownie uruchomić configure z jako argument, a następnie ponownie skompilować.

BTW sugeruje, że kompilujesz PostgreSQL w wersji 8.4 lub starszej, ponieważ pg_sync_pg_database nie pojawia się w wersji 9.0 lub nowszej. Musisz też kompilować na nowszym hoście. Ponieważ PostgreSQL 8.4 wkrótce będzie wycofany z eksploatacji i nie będzie obsługiwany, prawdopodobnie nie jest to dobry pomysł.

Sugeruje to również, że skompilowałeś własną wersję, zamiast używać pakietów. Powinieneś używać raczej http://apt.postgresql.org/ niż kompilować własne, chyba że masz konkretny powód.

3

wpadłem na ten sam problem podczas budowania CentOS 5 wersji PostgreSQL (8.2) do 7 (3.10.0-229.el7.x86_64 CentOS).

nie byłem w stanie zrobić to praca z gcc-4.8.3 przy użyciu sztuczki CFLAGS = "- O1", ale przełączenie na clang (3.4.2) jako kompilator (CC = clang) działało dla mnie (i działało na domyślnym poziomie optymalizacji -O2).

4

Wpadłem na ten sam problem po kompilowaniu PostgreSQL 8.1.4 z gcc 4.9.3.

Problem wydaje się być sposobem postgres używa do reprezentowania zmiennej długości tablic:

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, na pętli dostępu do „wartości”, GCC zakłada, że ​​zrobią co najwyżej jednej iteracji. Pętle jak ten poniżej (wyciąg z kodem źródłowym PostgreSQL'S):

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

może skończyć się zmniejszonym coś jak:

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

jak wywnioskować patrząc na asemblerze wygenerowany dla niego:

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

Problem zniknął po ponownym skompilowaniu postgrena z wyłączoną optymalizacją przy użyciu optymalizacji -fno-agresywnej pętli.

+0

Nowsze wersje PostgreSQL używają wartości [], jeśli są obsługiwane przez kompilator, zamiast wartości [1]. –