Hi,
I have a problem with snprintf function which insert the variables to string with error.
This code I wrote for PostgreSQL 8.3.7 on Fedora 10 and it worked fine. But now I use CentOS 5.3 and PostgreSQL 8.3.8.
Function:
Datum calculateAccount(PG_FUNCTION_ARGS) {
int64 accountId = PG_GETARG_INT64(0);
DateADT startDate = PG_GETARG_DATEADT(1);
DateADT endDate = PG_GETARG_DATEADT(2);
char command[QUERY_MAX_SIZE];
char startDateStr[MAXDATELEN + 3];
char endDateStr[MAXDATELEN + 3];
snprintf(startDateStr, sizeof (startDateStr), "'%s'", DatumGetCString(DirectFunctionCall1(date_out, startDate)));
snprintf(endDateStr, sizeof (endDateStr), "'%s'", DatumGetCString(DirectFunctionCall1(date_out, endDate)));
elog(INFO, startDateStr);
elog(INFO, endDateStr);
snprintf(command, sizeof (command),
"SELECT serviceId, periodStartDate, periodEndDate\
FROM accountServiceBaseView\
WHERE accountId = %ld AND\
periodStartDate <= %s AND\
periodEndDate >= %s;",
accountId, startDateStr, endDateStr);
elog(INFO, command);
PG_RETURN_BOOL(true);
}
Result:
select calculateaccount(123, '01-01-2009', '01-02-2009');
INFO: '2009-01-01'
INFO: '2009-02-01'
INFO: SELECT serviceId, periodStartDate, periodEndDate FROM accountServiceBaseView WHERE accountId = 123 AND periodStartDate <= (null) AND periodEndDate >= '2009-01-01';
If I change the order of parameters to "periodStartDate <= %s AND periodEndDate >= %s AND accountId = %ld", all works fine. Unfortunately this method can not be applied to other functions of my module.
--
Best regards,
Ilya Urikh.