提取时代导致数据重叠postgres

时间:2014-05-20 22:13:36

标签: c database postgresql

我正在使用postgres尝试从时间戳列中提取纪元时间

这是存储过程:

CREATE OR REPLACE FUNCTION epochtime(sampleid integer, starttime timestamp without time zone, stoptime timestamp without time zone)
 RETURNS text AS
$BODY$DECLARE
result text;
BEGIN

SELECT INTO result string_agg(concat_ws(',',epochres), ',')
FROM (
Select extract('epoch' from "Timestamp") as epochres from "Results" 
where "SampleID"=sampleid and "Timestamp" >= starttime 
and "Timestamp" <= stoptime order by "Timestamp" asc ) res;

return result;
END$BODY$
LANGUAGE plpgsql VOLATILE

调用存储过程的C函数:

static int getEpoch(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const     
objv[]){
Tcl_Obj *result;
char sampleid[15];
char repStartTime[256];
char repStopTime[256];
int length;
int lengthTwo;
int lengthThree;

if (objc != 4) {
    Tcl_WrongNumArgs(interp, 2, objv, "number of argument error");
    return TCL_ERROR;
}
strcpy(sampleid, Tcl_GetStringFromObj(objv[1], &lengthThree));
strcpy(repStartTime, Tcl_GetStringFromObj(objv[2], &length));
strcpy(repStopTime, Tcl_GetStringFromObj(objv[3], &lengthTwo));

char command[256];
PQclear(res);
strcpy(command, "Select \"epochtime\"('");
strcat(command, sampleid);
strcat(command,"','");
strcat(command, repStartTime);
strcat(command,"','");
strcat(command, repStopTime);
strcat(command, "')");
res = PQexec(conn,command);
result = Tcl_GetObjResult(interp);
Tcl_SetStringObj(result, PQgetvalue(res,0,0), strlen(PQgetvalue(res,0,0)));
return TCL_OK;

}

对于少量数据,我会说大约700个数字它工作正常,但如果我试图得到很多数字,如10000或类似的东西,它会导致程序中的分段错误,如果我在内部运行查询命令行它覆盖了所有结果,字面上数字看起来像是在彼此之上

列中的少量记录示例: Small Amount of Records

列中的大量记录示例: Large Amount of Records

像我说的一切都像是应该用少量的记录一样,但我需要它以大量的记录以相同的方式工作。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,您将所有纪元连接成一个字符串,并且当您有许多纪元时会导致缓冲区溢出。换句话说,当返回多个纪元时,结果字符串大于分配的结果内存,导致分段错误。

pgAdmin中的叠印问题只是副作用。长串的pgAdmin很糟糕。

解决方案是简单地将选择的时期作为单独的记录返回到您的C程序,并在那里进行任何连接。您应该分配一个足够大的字符串缓冲区来保存单个字符串中的所有纪元,您可以根据返回的纪元数估算,再乘以典型的纪元长度,在您的情况下看起来是10个字符(加上分隔符和空格,显然,做到12)。

但是你真的需要将所有纪元都放在一个字符串中吗?