Я пытаюсь собрать и установить PostgreSQL в свою систему. Моя операционная система Debian 9 НКУ-4,9 Ниже размещена моя ошибкаКомпиляция Postgresql отключает «fno-агрессивные петли-оптимизации»?
The database cluster will be initialized with locale en_US.UTF-8. The default database encoding has accordingly been set to 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"
В другом посте, пользователь предлагает отключить «FNo-агрессивно-петля-оптимизаций». Но как я могу отключить это? Это параметр в ./configure при компиляции шрифтов. Ниже предложение:
initdb: initializing pg_authid ... FATAL: wrong number of index expressions
Я столкнулся с той же проблемой, после компиляции PostgreSQL 8.1.4 с GCC 4.9.3. Проблема, как представляется, путь Postgres использует для представления массивы переменной длины:
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 */
В некоторых случаях для петель доступ к «ценности», GCC предполагает, что они будут делать одну итерацию максимум. Контуры, как один ниже (извлеченной из исходного кода Postgres): стандарт
ii->ii_NumIndexAttrs = numKeys; for (i = 0; i < numKeys; i++) ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
может в конечном итоге сводится к чему-то вроде:
ii->ii_NumIndexAttrs = numKeys; if (numKeys) ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
, как выводил глядя на ассемблере, созданный для него:
.L161: testl %r12d, %r12d movl %r12d, 4(%rbx) jle .L162 movzwl 40(%r13), %eax movw %ax, 8(%rbx) .L162:
Проблема исчезла после повторной компиляции postgres с отключенной оптимизацией с использованием -fno-агрессивных циклов-оптимизации.
Использование 'int2 values [1];' является примером «struct hack». Стандартный способ записи: 'int values [];', превращая его в элемент гибкого массива (FAM). Компилятор не должен оптимизировать доступ к FAM так, как вы утверждаете, что он это делает. Я отмечаю, что GCC 4.9.3 старая - текущая версия - 6.3.0 (если только релиз с тех пор еще не замечен). Возможно, вы должны использовать более новый компилятор. –
Показанный код определенно имеет неопределенное поведение, и оптимизация gcc делает действительной. Возможно, существует новая версия программного обеспечения с исправленной ошибкой? –
PostgreSQL 8.1.4 довольно старый (похоже, с 2006 года); текущая версия выглядит как 9.6.1. Почему вы используете десятилетнее программное обеспечение? (GCC 4.9, похоже, с 2015 года, что является более поздним, чем я ожидал.В последнее время GCC движется быстрее, чем это было в прошлые времена. Тем не менее, GCC 5 и 6 были выпущены с 4,9, а 4.9.4 - последний релиз в семействе 4.9.x.) –