微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – initdb:初始化pg_authid …致命:索引表达式数量错误

我是Postgresql的新手.我正在尝试在我的系统中安装Postgresql.我的操作系统是Ubuntu,下面发布的是我的错误

将使用区域设置en_US.UTF-8初始化数据库群集.
因此,数据库编码已设置为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"

帮帮我!!
谢谢!

用gcc 4.9.3编译postgresql 8.1.4后遇到了同样的问题.

问题似乎是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-aggressive-loop-optimizations禁用了该优化,问题就消失了.

原文地址:https://www.jb51.cc/postgresql/191670.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐