我有一个相当复杂的多线程应用程序。 PostgreSQL一直运行得非常好,直到我从PQexec切换到使用预准备语句。行为一直不稳定,有很多堆栈粉碎。在这里,我将主要功能浓缩为一个非常短的应用程序,它很快返回,但我仍然得到堆栈粉碎,主要是错误代码134和255.我可以发誓这个相同的应用程序之前工作(我有大部分数据库函数抽象进入自定义功能),但当我再次尝试时,它现在无法正常工作。
请帮忙!
#include <stdio.h>
#include <libpq-fe.h>
...
PGconn *psqldb;
int main()
{
psqldb = PQconnectdb("user=USERNAME password=PASSWORD dbname=DBNAME");
PQprepare(psqldb, "CreateUser", "INSERT into \"User\" (UserID, Email, PasswordHash, Salt, UserName) VALUES ($1, $2, $3, $4, $5)", 5, NULL);
const char *vals[5];
vals[0]="ccc";
vals[1]="aaa";
vals[2]="rrr";
vals[3]="ttt";
vals[4]="jjj";
int len[5];
len[0]=3;
len[1]=3;
len[2]=3;
len[3]=3;
len[4]=3;
PGresult *res = PQexecPrepared(psqldb,
"CreateUser",
5,
vals,
len,
NULL,
0);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "%s\n", PQerrorMessage(psqldb));
PQclear(res);
PQfinish(psqldb);
return -1;
}
PQclear(res);
fprintf(stderr, "returning\n");
PQfinish(psqldb);
return 0;
}
它确实会将数据插入到数据库中,因为我多次运行时会遇到唯一的键约束错误
ERROR: duplicate key value violates unique constraint "User_pkey"
DETAIL: Key (userid)=(ccc) already exists.
Process finished with exit code 255
在终端我得到了
*** stack smashing detected ***
有什么想法吗?