Re: [PATCHES] [HACKERS] Timezone bugs

2005-07-23 Thread Bruce Momjian

Andrew pointed out that the current fix didn't handle dates that were
near daylight savings time boudaries.  This handles it properly, e.g.

test= select '2005-04-03 04:00:00'::timestamp at time zone
'America/Los_Angeles';
timezone

 2005-04-03 07:00:00-04
(1 row)

Patch attached and applied.  The new fix is cleaner too.

---

pgman wrote:
 
 OK, tricky, but fixed --- patch attached and applied, with documentation
 updates.  Here is the test query:
 
   test= select (CURRENT_DATE + '05:00'::time)::timestamp at time zone
   'Canada/Pacific';
   timezone
   
2005-07-22 08:00:00-04
   (1 row)
   
 I tested a bunch of others too, like:
 
   test= select ('2005-07-20 00:00:00'::timestamp without time zone) at
   time zone 'Europe/Paris';
   timezone
   
2005-07-19 18:00:00-04
   (1 row)
   
 and tested that for UTC also.
 
 It was hard to figure out how to cleanly adjust the time zone.  I added
 some comments explaining the process.
 
 ---
 
 Andrew - Supernews wrote:
  On 2005-07-22, Bruce Momjian pgman@candle.pha.pa.us wrote:
   
   select (CURRENT_DATE + '05:00'::time)::timestamp
  at time zone 'Canada/Pacific';
   timezone
   
2005-07-19 22:00:00+00
   (1 row)
   
   What is happening here is that 2005-07-20 05:00:00 is being cast back 7
   hours (Canada/Pacific offset), and that is 22:00 of the previous day.
  
  Which is of course completely wrong.
  
  Let's look at what should happen:
  
   (date + time) = timestamp without time zone
  
  '2005-07-20' + '05:00' = '2005-07-20 05:00:00'::timestamp
  
   (timestamp without time zone) AT TIME ZONE 'zone'
  
  When AT TIME ZONE is applied to a timestamp without time zone, it is
  supposed to keep the _same_ calendar time and return a result of type
  timestamp with time zone designating the absolute time. So in this case,
  we expect the following to happen:
  
   '2005-07-20 05:00:00'  (original timestamp)
   - '2005-07-20 05:00:00-0700'  (same calendar time in new zone)
   - '2005-07-20 12:00:00+'  (convert to client timezone (UTC))
  
  So the conversion is being done backwards, resulting in the wrong result.
  
  -- 
  Andrew, Supernews

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/date.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/date.c,v
retrieving revision 1.118
diff -c -c -r1.118 date.c
*** src/backend/utils/adt/date.c22 Jul 2005 05:03:09 -  1.118
--- src/backend/utils/adt/date.c23 Jul 2005 14:23:14 -
***
*** 301,307 
tm-tm_hour = 0;
tm-tm_min = 0;
tm-tm_sec = 0;
!   tz = DetermineLocalTimeZone(tm);
  
  #ifdef HAVE_INT64_TIMESTAMP
result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
--- 301,307 
tm-tm_hour = 0;
tm-tm_min = 0;
tm-tm_sec = 0;
!   tz = DetermineTimeZoneOffset(tm, global_timezone);
  
  #ifdef HAVE_INT64_TIMESTAMP
result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
***
*** 2231,2237 
  
GetCurrentDateTime(tm);
time2tm(time, tm, fsec);
!   tz = DetermineLocalTimeZone(tm);
  
result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
  
--- 2231,2237 
  
GetCurrentDateTime(tm);
time2tm(time, tm, fsec);
!   tz = DetermineTimeZoneOffset(tm, global_timezone);
  
result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
  
Index: src/backend/utils/adt/datetime.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v
retrieving revision 1.156
diff -c -c -r1.156 datetime.c
*** src/backend/utils/adt/datetime.c22 Jul 2005 03:46:33 -  1.156
--- src/backend/utils/adt/datetime.c23 Jul 2005 14:23:15 -
***
*** 1612,1618 
if (fmask  DTK_M(DTZMOD))
return DTERR_BAD_FORMAT;
  
!   *tzp = DetermineLocalTimeZone(tm);
}
}
  
--- 1612,1618 
if (fmask  DTK_M(DTZMOD))
return DTERR_BAD_FORMAT;
  
!   *tzp = DetermineTimeZoneOffset(tm, global_timezone);
}
}
  
***
*** 1620,1629 
  }
  
  
! /* DetermineLocalTimeZone()
   *
   * 

Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian
Rocco Altier wrote:
 This patch fixes the interval regression on my AIX box (kookaburra) by
 only doing integer math on the interval, instead of float/double math.
 
 I think this is the correct way to handle this, since it's an integer
 data type.
 
 I don't know if it will fix Olivier's problem, since I wasn't able to
 reproduce it.
 

I have changed the way I compute the remainder values --- instead of
using multiplication, I use division and then subtraction.  This should
fix your rounding problem.  Looking at your fix, I don't see how adding
USECS changes things because the factor is already a float, but I think
the problem was more the way I was computing the remainders.

Patch attached --- let me know if it does not fix your problem.

---


 Thanks,
   -rocco
 
  -Original Message-
  From: [EMAIL PROTECTED] 
  [mailto:[EMAIL PROTECTED] On Behalf Of Bruce Momjian
  Sent: Friday, July 22, 2005 10:41 AM
  To: Michael Glaesemann
  Cc: ohp@pyrenet.fr; pgsql-hackers@postgresql.org
  Subject: Re: [HACKERS] regressin failure on latest CVS
  
  
  Michael Glaesemann wrote:
   
   On Jul 22, 2005, at 6:28 PM, ohp@pyrenet.fr wrote:
   
I tried the latest cvs this morning (07/22 11:00 CET)
and interval test fails.
Here's the regression.diffs.
   
   
*** ./expected/interval.outFri Jul 22 10:32:21 2005
--- ./results/interval.outFri Jul 22 11:07:54 2005
***
*** 217,224 
  -- updating pg_aggregate.agginitval
  select avg(f1) from interval_tbl;
 avg
! -
!  @ 4 years 1 mon 10 days 4 hours 18 mins 23 secs
  (1 row)
   
  -- test long interval input
--- 217,224 
  -- updating pg_aggregate.agginitval
  select avg(f1) from interval_tbl;
avg
! 
!  @ 4 years 1 mon 9 days 4 hours 18 mins 23 secs
  (1 row)
   
  -- test long interval input
   
   Could you provide platform information? Did you build with 
  --enable- 
   integer-datetimes? Looking at the buildfarm, kookaburra 
  (AIX 5.2) is  
   also failing the interval test at the same point, but the 
  result is  
   different.
  
  Interesting.  I don't see the error with our without
  --enable-integer-datetimes.  I even tried changing my 
  timezone to Paris
  time and still could not reproduce the failure.
  
  On the AIX problem below, we are going to get rounding issues.
  
  --
  -
  
  
   http://pgbuildfarm.org/cgi-bin/show_history.pl?nm=kookaburrabr=HEAD
   
   == pgsql.36852/src/test/regress/regression.diffs  
   ===
   *** ./expected/interval.out Fri Jul 22 01:25:05 2005
   --- ./results/interval.out  Fri Jul 22 01:34:20 2005
   ***
   *** 217,224 
  -- updating pg_aggregate.agginitval
  select avg(f1) from interval_tbl;
 avg
   ! -
   !  @ 4 years 1 mon 10 days 4 hours 18 mins 23 secs
  (1 row)
   
  -- test long interval input
   --- 217,224 
  -- updating pg_aggregate.agginitval
  select avg(f1) from interval_tbl;
  avg
   ! 
   !  @ 4 years 1 mon 10 days 4 hours 18 mins 22.99 secs
  (1 row)
   
   
   Michael Glaesemann
   grzm myrealbox com
   
   
   
   ---(end of 
  broadcast)---
   TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] 
  so that your
  message can get through to the mailing list cleanly
   
  
  -- 
Bruce Momjian|  http://candle.pha.pa.us
pgman@candle.pha.pa.us   |  (610) 359-1001
+  If your life is a hard drive, |  13 Roberts Road
+  Christ can be your backup.|  Newtown Square, 
  Pennsylvania 19073
  
  ---(end of 
  broadcast)---
  TIP 4: Have you searched our list archives?
  
http://archives.postgresql.org

Content-Description: timestamp.patch

[ Attachment, skipping... ]

 
 ---(end of broadcast)---
 TIP 2: Don't 'kill -9' the postmaster

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 

Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Rocco Altier
This still does not fix the problem.

I had done my patch to try to mimic the way 8.0 had handled the math
with the remainders, but to carry it over another bucket (day).

The problem that I see is that we are taking day_remainder and
multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
the precision loss there.

I think initial division by the factor can't be helped, but repeatedly
doing more floating point math on with it is causing the rounding error.

Thanks,
-rocco

 -Original Message-
 From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
 Sent: Saturday, July 23, 2005 10:54 AM
 To: Rocco Altier
 Cc: Michael Glaesemann; pgsql-patches@postgresql.org; 
 pgsql-hackers@postgresql.org; ohp@pyrenet.fr
 Subject: Re: [HACKERS] regressin failure on latest CVS
 
 
 Rocco Altier wrote:
  This patch fixes the interval regression on my AIX box 
 (kookaburra) by
  only doing integer math on the interval, instead of 
 float/double math.
  
  I think this is the correct way to handle this, since it's 
 an integer
  data type.
  
  I don't know if it will fix Olivier's problem, since I 
 wasn't able to
  reproduce it.
  
 
 I have changed the way I compute the remainder values --- instead of
 using multiplication, I use division and then subtraction.  
 This should
 fix your rounding problem.  Looking at your fix, I don't see 
 how adding
 USECS changes things because the factor is already a float, 
 but I think
 the problem was more the way I was computing the remainders.
 
 Patch attached --- let me know if it does not fix your problem.
 
 --
 

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread ohp
I just checked latest CVS (5 mn ago) the problem is still the same,
BTW, this is on Unixware 714 and no --enable-integer-datetime

Regards
On Sat, 23 Jul 2005, Rocco Altier wrote:

 Date: Sat, 23 Jul 2005 11:15:44 -0400
 From: Rocco Altier [EMAIL PROTECTED]
 To: Bruce Momjian pgman@candle.pha.pa.us
 Cc: Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
  pgsql-hackers@postgresql.org, ohp@pyrenet.fr
 Subject: RE: [HACKERS] regressin failure on latest CVS

 This still does not fix the problem.

 I had done my patch to try to mimic the way 8.0 had handled the math
 with the remainders, but to carry it over another bucket (day).

 The problem that I see is that we are taking day_remainder and
 multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
 the precision loss there.

 I think initial division by the factor can't be helped, but repeatedly
 doing more floating point math on with it is causing the rounding error.

 Thanks,
   -rocco

  -Original Message-
  From: Bruce Momjian [mailto:[EMAIL PROTECTED]
  Sent: Saturday, July 23, 2005 10:54 AM
  To: Rocco Altier
  Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
  pgsql-hackers@postgresql.org; ohp@pyrenet.fr
  Subject: Re: [HACKERS] regressin failure on latest CVS
 
 
  Rocco Altier wrote:
   This patch fixes the interval regression on my AIX box
  (kookaburra) by
   only doing integer math on the interval, instead of
  float/double math.
  
   I think this is the correct way to handle this, since it's
  an integer
   data type.
  
   I don't know if it will fix Olivier's problem, since I
  wasn't able to
   reproduce it.
  
 
  I have changed the way I compute the remainder values --- instead of
  using multiplication, I use division and then subtraction.
  This should
  fix your rounding problem.  Looking at your fix, I don't see
  how adding
  USECS changes things because the factor is already a float,
  but I think
  the problem was more the way I was computing the remainders.
 
  Patch attached --- let me know if it does not fix your problem.
 
  --




-- 
Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
15, Chemin des Monges+33-5-61-50-97-01 (Fax)
31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
FRANCE  Email: ohp@pyrenet.fr
--
Make your life a dream, make your dream a reality. (St Exupery)

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian
ohp@pyrenet.fr wrote:
 I just checked latest CVS (5 mn ago) the problem is still the same,
 BTW, this is on Unixware 714 and no --enable-integer-datetime

Do you have the latest patch included int that version of CVS? 
Anonymous CVS has a delay, and what was the problem you were seeing, the
rounding or the day - 1 result?

---


 
 Regards
 On Sat, 23 Jul 2005, Rocco Altier wrote:
 
  Date: Sat, 23 Jul 2005 11:15:44 -0400
  From: Rocco Altier [EMAIL PROTECTED]
  To: Bruce Momjian pgman@candle.pha.pa.us
  Cc: Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
   pgsql-hackers@postgresql.org, ohp@pyrenet.fr
  Subject: RE: [HACKERS] regressin failure on latest CVS
 
  This still does not fix the problem.
 
  I had done my patch to try to mimic the way 8.0 had handled the math
  with the remainders, but to carry it over another bucket (day).
 
  The problem that I see is that we are taking day_remainder and
  multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
  the precision loss there.
 
  I think initial division by the factor can't be helped, but repeatedly
  doing more floating point math on with it is causing the rounding error.
 
  Thanks,
  -rocco
 
   -Original Message-
   From: Bruce Momjian [mailto:[EMAIL PROTECTED]
   Sent: Saturday, July 23, 2005 10:54 AM
   To: Rocco Altier
   Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
   pgsql-hackers@postgresql.org; ohp@pyrenet.fr
   Subject: Re: [HACKERS] regressin failure on latest CVS
  
  
   Rocco Altier wrote:
This patch fixes the interval regression on my AIX box
   (kookaburra) by
only doing integer math on the interval, instead of
   float/double math.
   
I think this is the correct way to handle this, since it's
   an integer
data type.
   
I don't know if it will fix Olivier's problem, since I
   wasn't able to
reproduce it.
   
  
   I have changed the way I compute the remainder values --- instead of
   using multiplication, I use division and then subtraction.
   This should
   fix your rounding problem.  Looking at your fix, I don't see
   how adding
   USECS changes things because the factor is already a float,
   but I think
   the problem was more the way I was computing the remainders.
  
   Patch attached --- let me know if it does not fix your problem.
  
   --
 
 
 
 
 -- 
 Olivier PRENANT   Tel: +33-5-61-50-97-00 (Work)
 15, Chemin des Monges+33-5-61-50-97-01 (Fax)
 31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
 FRANCE  Email: ohp@pyrenet.fr
 --
 Make your life a dream, make your dream a reality. (St Exupery)
 
 ---(end of broadcast)---
 TIP 6: explain analyze is your friend
 

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073

---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread ohp
On Sat, 23 Jul 2005, Bruce Momjian wrote:

 Date: Sat, 23 Jul 2005 11:36:43 -0400 (EDT)
 From: Bruce Momjian pgman@candle.pha.pa.us
 To: ohp@pyrenet.fr
 Cc: Rocco Altier [EMAIL PROTECTED],
  Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
  pgsql-hackers@postgresql.org
 Subject: Re: [HACKERS] regressin failure on latest CVS

 ohp@pyrenet.fr wrote:
  I just checked latest CVS (5 mn ago) the problem is still the same,
  BTW, this is on Unixware 714 and no --enable-integer-datetime

 Do you have the latest patch included int that version of CVS?
 Anonymous CVS has a delay, and what was the problem you were seeing, the
 rounding or the day - 1 result?

I was seeing (and still see) the day -1 result. However, if I ./configure
--with-integer-datetimes I see the rounding of the day.
 ---


 
  Regards
  On Sat, 23 Jul 2005, Rocco Altier wrote:
 
   Date: Sat, 23 Jul 2005 11:15:44 -0400
   From: Rocco Altier [EMAIL PROTECTED]
   To: Bruce Momjian pgman@candle.pha.pa.us
   Cc: Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
pgsql-hackers@postgresql.org, ohp@pyrenet.fr
   Subject: RE: [HACKERS] regressin failure on latest CVS
  
   This still does not fix the problem.
  
   I had done my patch to try to mimic the way 8.0 had handled the math
   with the remainders, but to carry it over another bucket (day).
  
   The problem that I see is that we are taking day_remainder and
   multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
   the precision loss there.
  
   I think initial division by the factor can't be helped, but repeatedly
   doing more floating point math on with it is causing the rounding error.
  
   Thanks,
 -rocco
  
-Original Message-
From: Bruce Momjian [mailto:[EMAIL PROTECTED]
Sent: Saturday, July 23, 2005 10:54 AM
To: Rocco Altier
Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
pgsql-hackers@postgresql.org; ohp@pyrenet.fr
Subject: Re: [HACKERS] regressin failure on latest CVS
   
   
Rocco Altier wrote:
 This patch fixes the interval regression on my AIX box
(kookaburra) by
 only doing integer math on the interval, instead of
float/double math.

 I think this is the correct way to handle this, since it's
an integer
 data type.

 I don't know if it will fix Olivier's problem, since I
wasn't able to
 reproduce it.

   
I have changed the way I compute the remainder values --- instead of
using multiplication, I use division and then subtraction.
This should
fix your rounding problem.  Looking at your fix, I don't see
how adding
USECS changes things because the factor is already a float,
but I think
the problem was more the way I was computing the remainders.
   
Patch attached --- let me know if it does not fix your problem.
   
--
  
  
  
 
  --
  Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
  15, Chemin des Monges+33-5-61-50-97-01 (Fax)
  31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
  FRANCE  Email: ohp@pyrenet.fr
  --
  Make your life a dream, make your dream a reality. (St Exupery)
 
  ---(end of broadcast)---
  TIP 6: explain analyze is your friend
 



-- 
Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
15, Chemin des Monges+33-5-61-50-97-01 (Fax)
31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
FRANCE  Email: ohp@pyrenet.fr
--
Make your life a dream, make your dream a reality. (St Exupery)

---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread ohp
I think the patch is ok now,   intervall is not failing anymore as of
18:50 CET.

However stats fails.
regression.diffs:

*** ./expected/stats.outSat Jul 23 17:18:20 2005
--- ./results/stats.out Sat Jul 23 18:55:17 2005
***
*** 53,59 
   WHERE st.relname='tenk2' AND cl.relname='tenk2';
   ?column? | ?column? | ?column? | ?column?
  --+--+--+--
!  t| t| t| t
  (1 row)

  SELECT st.heap_blks_read + st.heap_blks_hit = pr.heap_blks + cl.relpages,
--- 53,59 
   WHERE st.relname='tenk2' AND cl.relname='tenk2';
   ?column? | ?column? | ?column? | ?column?
  --+--+--+--
!  f| f| t| t
  (1 row)

  SELECT st.heap_blks_read + st.heap_blks_hit = pr.heap_blks + cl.relpages,
***
*** 62,68 
   WHERE st.relname='tenk2' AND cl.relname='tenk2';
   ?column? | ?column?
  --+--
!  t| t
  (1 row)

  -- End of Stats Test
--- 62,68 
   WHERE st.relname='tenk2' AND cl.relname='tenk2';
   ?column? | ?column?
  --+--
!  f| t
  (1 row)

  -- End of Stats Test

==

On Sat, 23 Jul 2005, Bruce Momjian wrote:

 Date: Sat, 23 Jul 2005 11:36:43 -0400 (EDT)
 From: Bruce Momjian pgman@candle.pha.pa.us
 To: ohp@pyrenet.fr
 Cc: Rocco Altier [EMAIL PROTECTED],
  Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
  pgsql-hackers@postgresql.org
 Subject: Re: [HACKERS] regressin failure on latest CVS

 ohp@pyrenet.fr wrote:
  I just checked latest CVS (5 mn ago) the problem is still the same,
  BTW, this is on Unixware 714 and no --enable-integer-datetime

 Do you have the latest patch included int that version of CVS?
 Anonymous CVS has a delay, and what was the problem you were seeing, the
 rounding or the day - 1 result?

 ---


 
  Regards
  On Sat, 23 Jul 2005, Rocco Altier wrote:
 
   Date: Sat, 23 Jul 2005 11:15:44 -0400
   From: Rocco Altier [EMAIL PROTECTED]
   To: Bruce Momjian pgman@candle.pha.pa.us
   Cc: Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
pgsql-hackers@postgresql.org, ohp@pyrenet.fr
   Subject: RE: [HACKERS] regressin failure on latest CVS
  
   This still does not fix the problem.
  
   I had done my patch to try to mimic the way 8.0 had handled the math
   with the remainders, but to carry it over another bucket (day).
  
   The problem that I see is that we are taking day_remainder and
   multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
   the precision loss there.
  
   I think initial division by the factor can't be helped, but repeatedly
   doing more floating point math on with it is causing the rounding error.
  
   Thanks,
 -rocco
  
-Original Message-
From: Bruce Momjian [mailto:[EMAIL PROTECTED]
Sent: Saturday, July 23, 2005 10:54 AM
To: Rocco Altier
Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
pgsql-hackers@postgresql.org; ohp@pyrenet.fr
Subject: Re: [HACKERS] regressin failure on latest CVS
   
   
Rocco Altier wrote:
 This patch fixes the interval regression on my AIX box
(kookaburra) by
 only doing integer math on the interval, instead of
float/double math.

 I think this is the correct way to handle this, since it's
an integer
 data type.

 I don't know if it will fix Olivier's problem, since I
wasn't able to
 reproduce it.

   
I have changed the way I compute the remainder values --- instead of
using multiplication, I use division and then subtraction.
This should
fix your rounding problem.  Looking at your fix, I don't see
how adding
USECS changes things because the factor is already a float,
but I think
the problem was more the way I was computing the remainders.
   
Patch attached --- let me know if it does not fix your problem.
   
--
  
  
  
 
  --
  Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
  15, Chemin des Monges+33-5-61-50-97-01 (Fax)
  31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
  FRANCE  Email: ohp@pyrenet.fr
  --
  Make your life a dream, make your dream a reality. (St Exupery)
 
  ---(end of broadcast)---
  TIP 6: explain analyze is your friend
 



-- 
Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
15, Chemin des Monges+33-5-61-50-97-01 (Fax)
31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
FRANCE  Email: ohp@pyrenet.fr
--
Make 

Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian

Yes, we have seen those stat tests fail randomly.  We are working on a
solution.


---

ohp@pyrenet.fr wrote:
 I think the patch is ok now,   intervall is not failing anymore as of
 18:50 CET.
 
 However stats fails.
 regression.diffs:
 
 *** ./expected/stats.out  Sat Jul 23 17:18:20 2005
 --- ./results/stats.out   Sat Jul 23 18:55:17 2005
 ***
 *** 53,59 
WHERE st.relname='tenk2' AND cl.relname='tenk2';
?column? | ?column? | ?column? | ?column?
   --+--+--+--
 !  t| t| t| t
   (1 row)
 
   SELECT st.heap_blks_read + st.heap_blks_hit = pr.heap_blks + cl.relpages,
 --- 53,59 
WHERE st.relname='tenk2' AND cl.relname='tenk2';
?column? | ?column? | ?column? | ?column?
   --+--+--+--
 !  f| f| t| t
   (1 row)
 
   SELECT st.heap_blks_read + st.heap_blks_hit = pr.heap_blks + cl.relpages,
 ***
 *** 62,68 
WHERE st.relname='tenk2' AND cl.relname='tenk2';
?column? | ?column?
   --+--
 !  t| t
   (1 row)
 
   -- End of Stats Test
 --- 62,68 
WHERE st.relname='tenk2' AND cl.relname='tenk2';
?column? | ?column?
   --+--
 !  f| t
   (1 row)
 
   -- End of Stats Test
 
 ==
 
 On Sat, 23 Jul 2005, Bruce Momjian wrote:
 
  Date: Sat, 23 Jul 2005 11:36:43 -0400 (EDT)
  From: Bruce Momjian pgman@candle.pha.pa.us
  To: ohp@pyrenet.fr
  Cc: Rocco Altier [EMAIL PROTECTED],
   Michael Glaesemann [EMAIL PROTECTED], pgsql-patches@postgresql.org,
   pgsql-hackers@postgresql.org
  Subject: Re: [HACKERS] regressin failure on latest CVS
 
  ohp@pyrenet.fr wrote:
   I just checked latest CVS (5 mn ago) the problem is still the same,
   BTW, this is on Unixware 714 and no --enable-integer-datetime
 
  Do you have the latest patch included int that version of CVS?
  Anonymous CVS has a delay, and what was the problem you were seeing, the
  rounding or the day - 1 result?
 
  ---
 
 
  
   Regards
   On Sat, 23 Jul 2005, Rocco Altier wrote:
  
Date: Sat, 23 Jul 2005 11:15:44 -0400
From: Rocco Altier [EMAIL PROTECTED]
To: Bruce Momjian pgman@candle.pha.pa.us
Cc: Michael Glaesemann [EMAIL PROTECTED], 
pgsql-patches@postgresql.org,
 pgsql-hackers@postgresql.org, ohp@pyrenet.fr
Subject: RE: [HACKERS] regressin failure on latest CVS
   
This still does not fix the problem.
   
I had done my patch to try to mimic the way 8.0 had handled the math
with the remainders, but to carry it over another bucket (day).
   
The problem that I see is that we are taking day_remainder and
multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
the precision loss there.
   
I think initial division by the factor can't be helped, but repeatedly
doing more floating point math on with it is causing the rounding error.
   
Thanks,
-rocco
   
 -Original Message-
 From: Bruce Momjian [mailto:[EMAIL PROTECTED]
 Sent: Saturday, July 23, 2005 10:54 AM
 To: Rocco Altier
 Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
 pgsql-hackers@postgresql.org; ohp@pyrenet.fr
 Subject: Re: [HACKERS] regressin failure on latest CVS


 Rocco Altier wrote:
  This patch fixes the interval regression on my AIX box
 (kookaburra) by
  only doing integer math on the interval, instead of
 float/double math.
 
  I think this is the correct way to handle this, since it's
 an integer
  data type.
 
  I don't know if it will fix Olivier's problem, since I
 wasn't able to
  reproduce it.
 

 I have changed the way I compute the remainder values --- instead of
 using multiplication, I use division and then subtraction.
 This should
 fix your rounding problem.  Looking at your fix, I don't see
 how adding
 USECS changes things because the factor is already a float,
 but I think
 the problem was more the way I was computing the remainders.

 Patch attached --- let me know if it does not fix your problem.

 --
   
   
   
  
   --
   Olivier PRENANT   Tel: +33-5-61-50-97-00 (Work)
   15, Chemin des Monges+33-5-61-50-97-01 (Fax)
   31190 AUTERIVE   +33-6-07-63-80-64 (GSM)
   FRANCE  Email: ohp@pyrenet.fr
   --
   Make your life a dream, make your dream a reality. (St Exupery)
  
   ---(end of broadcast)---
   TIP 6: explain analyze is your 

Re: [HACKERS] [PATCHES] O_DIRECT for WAL writes

2005-07-23 Thread Bruce Momjian

I have modified and attached your patch for your review.  I didn't see
any value to adding new fsync_method values because, to me, O_DIRECT is
basically just like O_SYNC except it doesn't keep a copy of the buffer
in the kernel cache.  If you are doing fsync(), I don't see how O_DIRECT
makes any sense because O_DIRECT is writing to disk on every write, and
then what is the fsync() actually doing.  This might explain why your
fsync/direct and open/direct performance numbers are almost identical.
Basically, if you are going to use O_DIRECT, why not use open_sync.

What I did was to add O_DIRECT unconditionally for all uses of O_SYNC
and O_DSYNC, so it is automatically used in those cases.  And of course,
if your operating system doens't support O_DIRECT, it isn't used.

With your posted performance numbers, perhaps we should favor
fsync_method O_SYNC on platforms that have O_DIRECT even if we don't
support OPEN_DATASYNC, but I bet most platforms that have O_DIRECT also
have O_DATASYNC.  Perhaps some folks can run testes once the patch is
applied.

---

ITAGAKI Takahiro wrote:
 Tom Lane [EMAIL PROTECTED] wrote:
 
  Yeah, this is about what I was afraid of: if you're actually fsyncing
  then you get at best one commit per disk revolution, and the negotiation
  with the OS is down in the noise.
 
 If we disable writeback-cache and use open_sync, the per-page writing
 behavior in WAL module will show up as bad result. O_DIRECT is similar
 to O_DSYNC (at least on linux), so that the benefit of it will disappear
 behind the slow disk revolution.
 
 In the current source, WAL is written as:
 for (i = 0; i  N; i++) { write(buffers[i], BLCKSZ); }
 Is this intentional? Can we rewrite it as follows?
write(buffers[0], N * BLCKSZ);
 
 In order to achieve it, I wrote a 'gather-write' patch (xlog.gw.diff).
 Aside from this, I'll also send the fixed direct io patch (xlog.dio.diff).
 These two patches are independent, so they can be applied either or both.
 
 
 I tested them on my machine and the results as follows. It shows that
 direct-io and gather-write is the best choice when writeback-cache is off.
 Are these two patches worth trying if they are used together?
 
 
 | writeback | fsync= | fdata | open_ | fsync_ | open_ 
 patch   | cache |  false |  sync |  sync | direct | direct
 +---++---+---++-
 direct io   | off   |  124.2 | 105.7 |  48.3 |   48.3 |  48.2 
 direct io   | on|  129.1 | 112.3 | 114.1 |  142.9 | 144.5 
 gather-write| off   |  124.3 | 108.7 | 105.4 |  (N/A) | (N/A) 
 both| off   |  131.5 | 115.5 | 114.4 |  145.4 | 145.2 
 
 - 20runs * pgbench -s 100 -c 50 -t 200
- with tuning (wal_buffers=64, commit_delay=500, checkpoint_segments=8)
 - using 2 ATA disks:
- hda(reiserfs) includes system and wal.
- hdc(jfs) includes database files. writeback-cache is always on.
 
 ---
 ITAGAKI Takahiro
 NTT Cyber Space Laboratories
 

[ Attachment, skipping... ]

[ Attachment, skipping... ]

 
 ---(end of broadcast)---
 TIP 5: Have you checked our extensive FAQ?
 
http://www.postgresql.org/docs/faq

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/access/transam/xlog.c
===
RCS file: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.210
diff -c -c -r1.210 xlog.c
*** src/backend/access/transam/xlog.c   23 Jul 2005 15:31:16 -  1.210
--- src/backend/access/transam/xlog.c   23 Jul 2005 16:09:12 -
***
*** 48,77 
  
  
  /*
   * This chunk of hackery attempts to determine which file sync methods
   * are available on the current platform, and to choose an appropriate
   * default method.We assume that fsync() is always available, and that
   * configure determined whether fdatasync() is.
   */
  #if defined(O_SYNC)
! #define OPEN_SYNC_FLAGO_SYNC
  #else
  #if defined(O_FSYNC)
! #define OPEN_SYNC_FLAGO_FSYNC
  #endif
  #endif
  
  #if defined(O_DSYNC)
  #if defined(OPEN_SYNC_FLAG)
! #if O_DSYNC != OPEN_SYNC_FLAG
! #define OPEN_DATASYNC_FLAGO_DSYNC
  #endif
  #else /* !defined(OPEN_SYNC_FLAG) */
  /* Win32 only has O_DSYNC */
! #define OPEN_DATASYNC_FLAGO_DSYNC
  #endif
  #endif
  
  #if defined(OPEN_DATASYNC_FLAG)
  #define DEFAULT_SYNC_METHOD_STR   open_datasync
  #define DEFAULT_SYNC_METHOD   SYNC_METHOD_OPEN
--- 48,114 
  
  
  /*
+  *Becauase O_DIRECT bypasses the kernel buffers, and because we never
+  *read those buffers except during 

Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian

Would you please try the attached patch and let me know if it fixes the
problem?  I avoided accumulating into a float8.

---

Rocco Altier wrote:
 This still does not fix the problem.
 
 I had done my patch to try to mimic the way 8.0 had handled the math
 with the remainders, but to carry it over another bucket (day).
 
 The problem that I see is that we are taking day_remainder and
 multiplying by USECS_PER_DAY.  Which is a double * int64, thus there is
 the precision loss there.
 
 I think initial division by the factor can't be helped, but repeatedly
 doing more floating point math on with it is causing the rounding error.
 
 Thanks,
   -rocco
 
  -Original Message-
  From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
  Sent: Saturday, July 23, 2005 10:54 AM
  To: Rocco Altier
  Cc: Michael Glaesemann; pgsql-patches@postgresql.org; 
  pgsql-hackers@postgresql.org; ohp@pyrenet.fr
  Subject: Re: [HACKERS] regressin failure on latest CVS
  
  
  Rocco Altier wrote:
   This patch fixes the interval regression on my AIX box 
  (kookaburra) by
   only doing integer math on the interval, instead of 
  float/double math.
   
   I think this is the correct way to handle this, since it's 
  an integer
   data type.
   
   I don't know if it will fix Olivier's problem, since I 
  wasn't able to
   reproduce it.
   
  
  I have changed the way I compute the remainder values --- instead of
  using multiplication, I use division and then subtraction.  
  This should
  fix your rounding problem.  Looking at your fix, I don't see 
  how adding
  USECS changes things because the factor is already a float, 
  but I think
  the problem was more the way I was computing the remainders.
  
  Patch attached --- let me know if it does not fix your problem.
  
  --
  
 
 ---(end of broadcast)---
 TIP 2: Don't 'kill -9' the postmaster
 

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.145
diff -c -c -r1.145 timestamp.c
*** src/backend/utils/adt/timestamp.c   23 Jul 2005 14:53:21 -  1.145
--- src/backend/utils/adt/timestamp.c   23 Jul 2005 18:45:56 -
***
*** 2309,2327 
result-time = span-time / factor;
  
/* Compute remainders */
!   month_remainder = span-month / factor - result-month;
!   day_remainder = span-day / factor - result-day;
  
/* Cascade fractions to lower units */
/* fractional months full days into days */
result-day += month_remainder * DAYS_PER_MONTH;
-   /* fractional months partial days into time */
-   day_remainder += (month_remainder * DAYS_PER_MONTH) - 
(int)(month_remainder * DAYS_PER_MONTH);
  
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time += day_remainder * USECS_PER_DAY;
  #else
!   result-time += day_remainder * SECS_PER_DAY;
result-time = JROUND(result-time);
  #endif
  
--- 2309,2328 
result-time = span-time / factor;
  
/* Compute remainders */
!   month_remainder = (span-month / factor - result-month);
!   day_remainder = (span-day / factor - result-day);
  
/* Cascade fractions to lower units */
/* fractional months full days into days */
result-day += month_remainder * DAYS_PER_MONTH;
  
+   /* fractional months partial days into time */
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time += (day_remainder + month_remainder * DAYS_PER_MONTH -
!   (int)(month_remainder * 
DAYS_PER_MONTH)) * USECS_PER_DAY;
  #else
!   result-time += (day_remainder + month_remainder * DAYS_PER_MONTH -
!   (int)(month_remainder * 
DAYS_PER_MONTH)) * SECS_PER_DAY;
result-time = JROUND(result-time);
  #endif
  

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Rocco Altier
That still does not fix it for me.

This patch is still using a computed float value (month_remainder and
day_remainder), which is cauing the rounding errors.

There are now 6 machines on the build farm that are failing from the
rounding:
Wallaroo (OSX/G4), asp(AIX/powerpc), viper(FC3/x86_64),
platypus(FBSD/amd64), kookaburra(AIX/powerpc), oriole(FC4/x86).

All of these are using enable-integer-datetimes.

What was wrong with the patch I sent?  I am doing as much as I can with
integer math.

-rocco 

 -Original Message-
 From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
 Sent: Saturday, July 23, 2005 2:51 PM
 To: Rocco Altier
 Cc: Michael Glaesemann; pgsql-patches@postgresql.org; ohp@pyrenet.fr
 Subject: Re: [HACKERS] regressin failure on latest CVS
 
 
 
 Would you please try the attached patch and let me know if it 
 fixes the
 problem?  I avoided accumulating into a float8.
 
 --
 -
 
 Rocco Altier wrote:
  This still does not fix the problem.
  
  I had done my patch to try to mimic the way 8.0 had handled the math
  with the remainders, but to carry it over another bucket (day).
  
  The problem that I see is that we are taking day_remainder and
  multiplying by USECS_PER_DAY.  Which is a double * int64, 
 thus there is
  the precision loss there.
  
  I think initial division by the factor can't be helped, but 
 repeatedly
  doing more floating point math on with it is causing the 
 rounding error.
  
  Thanks,
  -rocco
  
   -Original Message-
   From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
   Sent: Saturday, July 23, 2005 10:54 AM
   To: Rocco Altier
   Cc: Michael Glaesemann; pgsql-patches@postgresql.org; 
   pgsql-hackers@postgresql.org; ohp@pyrenet.fr
   Subject: Re: [HACKERS] regressin failure on latest CVS
   
   
   Rocco Altier wrote:
This patch fixes the interval regression on my AIX box 
   (kookaburra) by
only doing integer math on the interval, instead of 
   float/double math.

I think this is the correct way to handle this, since it's 
   an integer
data type.

I don't know if it will fix Olivier's problem, since I 
   wasn't able to
reproduce it.

   
   I have changed the way I compute the remainder values --- 
 instead of
   using multiplication, I use division and then subtraction.  
   This should
   fix your rounding problem.  Looking at your fix, I don't see 
   how adding
   USECS changes things because the factor is already a float, 
   but I think
   the problem was more the way I was computing the remainders.
   
   Patch attached --- let me know if it does not fix your problem.
   
   --
   
  
  ---(end of 
 broadcast)---
  TIP 2: Don't 'kill -9' the postmaster
  
 
 -- 
   Bruce Momjian|  http://candle.pha.pa.us
   pgman@candle.pha.pa.us   |  (610) 359-1001
   +  If your life is a hard drive, |  13 Roberts Road
   +  Christ can be your backup.|  Newtown Square, 
 Pennsylvania 19073
 

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian
Rocco Altier wrote:
 That still does not fix it for me.
 
 This patch is still using a computed float value (month_remainder and
 day_remainder), which is cauing the rounding errors.
 
 There are now 6 machines on the build farm that are failing from the
 rounding:
 Wallaroo (OSX/G4), asp(AIX/powerpc), viper(FC3/x86_64),
 platypus(FBSD/amd64), kookaburra(AIX/powerpc), oriole(FC4/x86).
 
 All of these are using enable-integer-datetimes.
 
 What was wrong with the patch I sent?  I am doing as much as I can with
 integer math.

OK, new patch, please test.  Yea, I know your patch works, but we
usually keep at it until we have a clean, understood solution.  Thanks.

---

 
   -rocco 
 
  -Original Message-
  From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
  Sent: Saturday, July 23, 2005 2:51 PM
  To: Rocco Altier
  Cc: Michael Glaesemann; pgsql-patches@postgresql.org; ohp@pyrenet.fr
  Subject: Re: [HACKERS] regressin failure on latest CVS
  
  
  
  Would you please try the attached patch and let me know if it 
  fixes the
  problem?  I avoided accumulating into a float8.
  
  --
  -
  
  Rocco Altier wrote:
   This still does not fix the problem.
   
   I had done my patch to try to mimic the way 8.0 had handled the math
   with the remainders, but to carry it over another bucket (day).
   
   The problem that I see is that we are taking day_remainder and
   multiplying by USECS_PER_DAY.  Which is a double * int64, 
  thus there is
   the precision loss there.
   
   I think initial division by the factor can't be helped, but 
  repeatedly
   doing more floating point math on with it is causing the 
  rounding error.
   
   Thanks,
 -rocco
   
-Original Message-
From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
Sent: Saturday, July 23, 2005 10:54 AM
To: Rocco Altier
Cc: Michael Glaesemann; pgsql-patches@postgresql.org; 
pgsql-hackers@postgresql.org; ohp@pyrenet.fr
Subject: Re: [HACKERS] regressin failure on latest CVS


Rocco Altier wrote:
 This patch fixes the interval regression on my AIX box 
(kookaburra) by
 only doing integer math on the interval, instead of 
float/double math.
 
 I think this is the correct way to handle this, since it's 
an integer
 data type.
 
 I don't know if it will fix Olivier's problem, since I 
wasn't able to
 reproduce it.
 

I have changed the way I compute the remainder values --- 
  instead of
using multiplication, I use division and then subtraction.  
This should
fix your rounding problem.  Looking at your fix, I don't see 
how adding
USECS changes things because the factor is already a float, 
but I think
the problem was more the way I was computing the remainders.

Patch attached --- let me know if it does not fix your problem.

--

   
   ---(end of 
  broadcast)---
   TIP 2: Don't 'kill -9' the postmaster
   
  
  -- 
Bruce Momjian|  http://candle.pha.pa.us
pgman@candle.pha.pa.us   |  (610) 359-1001
+  If your life is a hard drive, |  13 Roberts Road
+  Christ can be your backup.|  Newtown Square, 
  Pennsylvania 19073
  
 
 ---(end of broadcast)---
 TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly
 

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.145
diff -c -c -r1.145 timestamp.c
*** src/backend/utils/adt/timestamp.c   23 Jul 2005 14:53:21 -  1.145
--- src/backend/utils/adt/timestamp.c   23 Jul 2005 19:34:39 -
***
*** 2294,2300 
  {
Interval   *span = PG_GETARG_INTERVAL_P(0);
float8  factor = PG_GETARG_FLOAT8(1);
!   double  month_remainder, day_remainder;
Interval   *result;
  
result = (Interval *) palloc(sizeof(Interval));
--- 2294,2300 
  {
Interval   *span = PG_GETARG_INTERVAL_P(0);
float8  factor = PG_GETARG_FLOAT8(1);
!   double  month_remainder;
Interval   *result;
  
result = (Interval *) palloc(sizeof(Interval));
***
*** 2308,2327 

Re: [PATCHES] [HACKERS] regressin failure on latest CVS

2005-07-23 Thread Bruce Momjian
Bruce Momjian wrote:
 Rocco Altier wrote:
  That still does not fix it for me.
  
  This patch is still using a computed float value (month_remainder and
  day_remainder), which is cauing the rounding errors.
  
  There are now 6 machines on the build farm that are failing from the
  rounding:
  Wallaroo (OSX/G4), asp(AIX/powerpc), viper(FC3/x86_64),
  platypus(FBSD/amd64), kookaburra(AIX/powerpc), oriole(FC4/x86).
  
  All of these are using enable-integer-datetimes.
  
  What was wrong with the patch I sent?  I am doing as much as I can with
  integer math.
 
 OK, new patch, please test.  Yea, I know your patch works, but we
 usually keep at it until we have a clean, understood solution.  Thanks.

Sorry, new patch, previous was broken.  These are not in CVS yet.

---


   -Original Message-
   From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
   Sent: Saturday, July 23, 2005 2:51 PM
   To: Rocco Altier
   Cc: Michael Glaesemann; pgsql-patches@postgresql.org; ohp@pyrenet.fr
   Subject: Re: [HACKERS] regressin failure on latest CVS
   
   
   
   Would you please try the attached patch and let me know if it 
   fixes the
   problem?  I avoided accumulating into a float8.
   
   --
   -
   
   Rocco Altier wrote:
This still does not fix the problem.

I had done my patch to try to mimic the way 8.0 had handled the math
with the remainders, but to carry it over another bucket (day).

The problem that I see is that we are taking day_remainder and
multiplying by USECS_PER_DAY.  Which is a double * int64, 
   thus there is
the precision loss there.

I think initial division by the factor can't be helped, but 
   repeatedly
doing more floating point math on with it is causing the 
   rounding error.

Thanks,
-rocco

 -Original Message-
 From: Bruce Momjian [mailto:[EMAIL PROTECTED] 
 Sent: Saturday, July 23, 2005 10:54 AM
 To: Rocco Altier
 Cc: Michael Glaesemann; pgsql-patches@postgresql.org; 
 pgsql-hackers@postgresql.org; ohp@pyrenet.fr
 Subject: Re: [HACKERS] regressin failure on latest CVS
 
 
 Rocco Altier wrote:
  This patch fixes the interval regression on my AIX box 
 (kookaburra) by
  only doing integer math on the interval, instead of 
 float/double math.
  
  I think this is the correct way to handle this, since it's 
 an integer
  data type.
  
  I don't know if it will fix Olivier's problem, since I 
 wasn't able to
  reproduce it.
  
 
 I have changed the way I compute the remainder values --- 
   instead of
 using multiplication, I use division and then subtraction.  
 This should
 fix your rounding problem.  Looking at your fix, I don't see 
 how adding
 USECS changes things because the factor is already a float, 
 but I think
 the problem was more the way I was computing the remainders.
 
 Patch attached --- let me know if it does not fix your problem.
 
 --
 

---(end of 
   broadcast)---
TIP 2: Don't 'kill -9' the postmaster

   
   -- 
 Bruce Momjian|  http://candle.pha.pa.us
 pgman@candle.pha.pa.us   |  (610) 359-1001
 +  If your life is a hard drive, |  13 Roberts Road
 +  Christ can be your backup.|  Newtown Square, 
   Pennsylvania 19073
   
  
  ---(end of broadcast)---
  TIP 1: if posting/reading through Usenet, please send an appropriate
 subscribe-nomail command to [EMAIL PROTECTED] so that your
 message can get through to the mailing list cleanly
  
 
 -- 
   Bruce Momjian|  http://candle.pha.pa.us
   pgman@candle.pha.pa.us   |  (610) 359-1001
   +  If your life is a hard drive, |  13 Roberts Road
   +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073

 Index: src/backend/utils/adt/timestamp.c
 ===
 RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
 retrieving revision 1.145
 diff -c -c -r1.145 timestamp.c
 *** src/backend/utils/adt/timestamp.c 23 Jul 2005 14:53:21 -  1.145
 --- src/backend/utils/adt/timestamp.c 23 Jul 2005 19:34:39 -
 ***
 *** 2294,2300 
   {
   Interval   *span = PG_GETARG_INTERVAL_P(0);
   float8  factor = PG_GETARG_FLOAT8(1);
 ! double  month_remainder, day_remainder;
   Interval   *result;
   
   result = (Interval *) palloc(sizeof(Interval));
 --- 2294,2300 
   {
   Interval   *span = PG_GETARG_INTERVAL_P(0);
   float8  factor = 

[PATCHES] fix integer datetime division rounding error

2005-07-23 Thread Andrew Dunstan


The attached patch seems to fix the rounding error that is causing 
regression failures on machines with integer datetimes. (Source of error 
discovered by [EMAIL PROTECTED]).ISTM this code needs to be given some 
careful analysis - I know it makes my head spin reading it.


cheers

andrew
Index: src/backend/utils/adt/timestamp.c
===
RCS file: /home/cvsmirror/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.145
diff -c -r1.145 timestamp.c
*** src/backend/utils/adt/timestamp.c   23 Jul 2005 14:53:21 -  1.145
--- src/backend/utils/adt/timestamp.c   24 Jul 2005 00:04:08 -
***
*** 2319,2325 
day_remainder += (month_remainder * DAYS_PER_MONTH) - (int)(month_remainder * DAYS_PER_MONTH);
  
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time += day_remainder * USECS_PER_DAY;
  #else
result-time += day_remainder * SECS_PER_DAY;
result-time = JROUND(result-time);
--- 2319,2325 
day_remainder += (month_remainder * DAYS_PER_MONTH) - (int)(month_remainder * DAYS_PER_MONTH);
  
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time += rint(day_remainder * USECS_PER_DAY);
  #else
result-time += day_remainder * SECS_PER_DAY;
result-time = JROUND(result-time);

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [HACKERS] [PATCHES] Patch to fix plpython on OS X

2005-07-23 Thread Tom Lane
Michael Fuhr [EMAIL PROTECTED] writes:
 Tom Lane wrote:
 Hmm ... if it's *not* a version thing then I really do want to know
 what's causing it.  Anyone have an idea why this machine is saying
 '\u80' where everyone else's python says u'\x80' ?

 The regression tests that are failing are from the patch I submitted
 about a month ago to fix a core dump in PL/Python:

 http://archives.postgresql.org/pgsql-patches/2005-06/msg00519.php

 The tests exercise the error checking that the patch added, doing
 things that previously caused a segmentation fault but that now
 raise an exception.  Should those tests remain in place?  If so,
 should we rewrite them to avoid the version-specific Python messages
 (possibly by wrapping them in a PL/pgSQL function that traps the
 errors), or should we just leave the tests alone now that we think
 we understand what's happening?

Well, if it is just a Python version issue then all we need do is add
a variant expected-output file to match.  I was just expressing a
desire to know that for sure before we wallpaper over the symptom...

regards, tom lane

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [HACKERS] [PATCHES] Patch to fix plpython on OS X

2005-07-23 Thread Michael Fuhr
On Sat, Jul 23, 2005 at 07:58:21PM -0400, Andrew Dunstan wrote:
 Tom Lane wrote:
 Jim C. Nasby [EMAIL PROTECTED] writes:
 I don't think it's a version issue; cuckoo is at 2.4, platypus used to
 be at 2.3 but I upgraded it to 2.4 to see if that was the issue, but
 platypus kept working.
 
 Hmm ... if it's *not* a version thing then I really do want to know
 what's causing it.  Anyone have an idea why this machine is saying
 '\u80' where everyone else's python says u'\x80' ?
 
 Another OSX box on buildfarm, wallaroo, is exhibiting the same 
 behaviour, albeit currently masked by interval regression failures.

I suspect this is indeed a Python version issue:

http://archives.postgresql.org/pgsql-hackers/2005-07/msg00669.php
http://archives.postgresql.org/pgsql-hackers/2005-07/msg00684.php

It looks like the Macs have some kind of Python framework that
PL/Python is linking against even if a newer version of Python has
been installed.  Unfortunately I don't have a Mac I could use to
do any deeper investigating.

The regression tests that are failing are from the patch I submitted
about a month ago to fix a core dump in PL/Python:

http://archives.postgresql.org/pgsql-patches/2005-06/msg00519.php

The tests exercise the error checking that the patch added, doing
things that previously caused a segmentation fault but that now
raise an exception.  Should those tests remain in place?  If so,
should we rewrite them to avoid the version-specific Python messages
(possibly by wrapping them in a PL/pgSQL function that traps the
errors), or should we just leave the tests alone now that we think
we understand what's happening?

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/

---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [PATCHES] fix integer datetime division rounding error

2005-07-23 Thread Bruce Momjian
Andrew Dunstan wrote:
 
 The attached patch seems to fix the rounding error that is causing 
 regression failures on machines with integer datetimes. (Source of error 
 discovered by [EMAIL PROTECTED]).ISTM this code needs to be given some 
 careful analysis - I know it makes my head spin reading it.

Ah, brilliant!  I knew I was missing something fundamental, and the use
of rint() was it.  Strangely enough, the 8.0 code uses rint() in that
function, but for floating point intervals, and the code was buggy,
generating negative time values for division.

Patch attached and applied.  I also improved the interval multiplication
code.

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  pgman@candle.pha.pa.us   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.145
diff -c -c -r1.145 timestamp.c
*** src/backend/utils/adt/timestamp.c   23 Jul 2005 14:53:21 -  1.145
--- src/backend/utils/adt/timestamp.c   24 Jul 2005 04:34:56 -
***
*** 2244,2281 
  Datum
  interval_mul(PG_FUNCTION_ARGS)
  {
!   Interval   *span1 = PG_GETARG_INTERVAL_P(0);
float8  factor = PG_GETARG_FLOAT8(1);
Interval   *result;
  
- #ifdef HAVE_INT64_TIMESTAMP
-   int64   months;
-   int64   days;
- #else
-   double  months;
-   double  days;
- #endif
- 
result = (Interval *) palloc(sizeof(Interval));
  
!   months = span1-month * factor;
!   days = span1-day * factor;
  #ifdef HAVE_INT64_TIMESTAMP
!   result-month = months;
!   result-day = days;
!   result-time = span1-time * factor;
!   result-time += (months - result-month) * INT64CONST(30) * 
USECS_PER_DAY;
!   result-time += (days - result-day) * INT64CONST(24) * USECS_PER_HOUR;
! #else
!   result-month = (int)months;
!   result-day = (int)days;
!   result-time = JROUND(span1-time * factor);
!   /* evaluate fractional months as 30 days */
!   result-time += JROUND((months - result-month) * DAYS_PER_MONTH * 
SECS_PER_DAY);
!   /* evaluate fractional days as 24 hours */
!   result-time += JROUND((days - result-day) * HOURS_PER_DAY * 
SECS_PER_HOUR);
  #endif
  
PG_RETURN_INTERVAL_P(result);
  }
  
--- 2244,2280 
  Datum
  interval_mul(PG_FUNCTION_ARGS)
  {
!   Interval   *span = PG_GETARG_INTERVAL_P(0);
float8  factor = PG_GETARG_FLOAT8(1);
+   double  month_remainder, day_remainder;
Interval   *result;
  
result = (Interval *) palloc(sizeof(Interval));
  
!   result-month = span-month * factor;
!   result-day = span-day * factor;
! 
!   /* Compute remainders */
!   month_remainder = span-month * factor - result-month;
!   day_remainder = span-day * factor - result-day;
! 
!   /* Cascade fractions to lower units */
!   /* fractional months full days into days */
!   result-day += month_remainder * DAYS_PER_MONTH;
!   /* fractional months partial days into time */
!   day_remainder += (month_remainder * DAYS_PER_MONTH) -
!(int)(month_remainder * 
DAYS_PER_MONTH);
! 
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time = rint(span-time * factor +
!   day_remainder * USECS_PER_DAY);
! #else
!   result-time = JROUND(span-time * factor +
!   day_remainder * SECS_PER_DAY);
  #endif
  
+   result = DatumGetIntervalP(DirectFunctionCall1(interval_justify_hours,
+   
IntervalPGetDatum(result)));
PG_RETURN_INTERVAL_P(result);
  }
  
***
*** 2284,2292 
  {
/* Args are float8 and Interval *, but leave them as generic Datum */
Datum   factor = PG_GETARG_DATUM(0);
!   Datum   span1 = PG_GETARG_DATUM(1);
  
!   return DirectFunctionCall2(interval_mul, span1, factor);
  }
  
  Datum
--- 2283,2291 
  {
/* Args are float8 and Interval *, but leave them as generic Datum */
Datum   factor = PG_GETARG_DATUM(0);
!   Datum   span = PG_GETARG_DATUM(1);
  
!   return DirectFunctionCall2(interval_mul, span, factor);
  }
  
  Datum
***
*** 2316,2325 
/* fractional months full days into days */
result-day += month_remainder * DAYS_PER_MONTH;
/* fractional months partial days into time */
!   day_remainder += (month_remainder * DAYS_PER_MONTH) - 
(int)(month_remainder * DAYS_PER_MONTH);
  
  #ifdef HAVE_INT64_TIMESTAMP
!   result-time += day_remainder * USECS_PER_DAY;
  #else

[PATCHES] Regression - GNUmakefile - pg_usleep

2005-07-23 Thread Rocco Altier
Attached patch fixes the SHLIB_LINK to add pgport now that pg_usleep is
added.

This is needed for AIX to resolve symbols at compile time.

This is also to be used in conjuction with the other patch I have
pending for Makefile.aix to SHLIB_LINK instead of LIBS to compile shared
objects.

Thanks,
-rocco 


regress_makefile.patch
Description: regress_makefile.patch

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org