From: | Ilya Urikh <ilya(dot)urikh(at)gmail(dot)com> |
---|---|
To: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Problem with using snprintf in C-function |
Date: | 2009-10-17 14:40:24 |
Message-ID: | adf175f70910170740v32272f54s29f9d1bebd283684@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Pavel,
Could you provide some example? I don't really understand which placeholder
I can use.
On Sun, Oct 18, 2009 at 1:20 AM, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>wrote:
> 2009/10/17 Ilya Urikh <ilya(dot)urikh(at)gmail(dot)com>:
> > 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);
> >
>
> Hello
>
> my reply is little bit offtopic. Why you convert date values to
> string? You can use placeholders and execute query with parameters in
> native format. It's more simply and safe.
>
> Regards
> Pavel Stehule
>
>
>
>
> > 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.
> >
>
--
Best regards,
Ilya Urikh.
From | Date | Subject | |
---|---|---|---|
Next Message | Pavel Stehule | 2009-10-17 15:39:39 | Re: Problem with using snprintf in C-function |
Previous Message | Peter Geoghegan | 2009-10-17 14:36:52 | Re: pgadmin3 hangs during dump |