Error in from_char() for field 'D'?

From: "Brendan Jurd" <direvus(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Error in from_char() for field 'D'?
Date: 2006-11-08 20:08:33
Message-ID: 37ed240d0611081208n6926ac21r81d04cd78ae0e020@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-patches

Hey hackers,

I was doing some work in backend/utils/adt/formatting.c, and found the
following:

case DCH_D:
INVALID_FOR_INTERVAL;
if (is_to_char)
{
sprintf(inout, "%d", tm->tm_wday + 1);
if (S_THth(suf))
str_numth(p_inout, inout, S_TH_TYPE(suf));
return strlen(p_inout);
}
else
{
sscanf(inout, "%1d", &tmfc->d);
return strspace_len(inout) + 1 + SKIP_THth(suf);
}

The tm_wday field is internally stored as an integer 0 - 6, with 0
being Sunday. The 'D' formatting field, as per the documentation,
gives 1 - 7 with 1 being Sunday. So to convert tm_wday to 'D' in
to_char(), you add one. This works as expected.

However, in from_char(), the reverse is not true. Looking at the code
snippet above, the digit is scanned straight into tmfc->d unaltered
(this value is later copied directly to tm->tm_wday circa line 3394).

Unless I'm missing something, when converting to text, 'D' yields 1-7,
but when converting back from text, 'D' expects 0-6.

It's not a major problem, since there's not really a use-case for
specifying dates for conversion with the 'D' field, but this behaviour
appears to be incorrect, or at the very least, incorrectly documented.

The fix should be trivial; subtract one from tmfc->d after the call to sscanf()

Regards,
BJ

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2006-11-08 20:12:05 pgsql: Change Windows rename and unlink substitutes so that they time
Previous Message Oleg Bartunov 2006-11-08 16:34:39 Re: string_to_array eats too much memory?

Browse pgsql-patches by date

  From Date Subject
Next Message Tom Lane 2006-11-08 20:36:33 Re: BUG #2712: could not fsync segment: Permission
Previous Message Michael Meskes 2006-11-08 10:49:03 Re: BUG #2741: Double-free on error in ECPGconnect