sql >> データベース >  >> RDS >> PostgreSQL

initdb:pg_authidを初期化しています...致命的:インデックス式の数が間違っています

    postgresql8.1.4をgcc4.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 */
    

    場合によっては、「値」にアクセスするforループの場合、GCCは最大で1回の反復を実行すると想定します。以下のようなループ(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:
    

    -fno-aggressive-loop-optimizationsを使用して最適化を無効にしてpostgresを再コンパイルすると、問題は解決しました。



    1. SQLAlchemyの大文字と小文字を区別しないINベースの検索クエリ?

    2. 複数のインデックスを組み合わせたPostgres

    3. クエリ結果をテーブルに出力する

    4. アイドル状態のmysql接続を終了する