Index: src/test/regress/expected/interval.out =================================================================== RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/interval.out,v retrieving revision 1.17 diff -c -r1.17 interval.out *** src/test/regress/expected/interval.out 4 Sep 2006 01:26:28 -0000 1.17 --- src/test/regress/expected/interval.out 5 Sep 2006 11:53:34 -0000 *************** *** 208,213 **** --- 208,279 ---- | 34 years | 6 years (45 rows) + -- Test multiplication and division with intervals. + -- Floating point arithmetic rounding errors can lead to unexpected results, + -- though the code attempts to do the right thing and round up to days and + -- minutes to avoid results such as '3 days 24:00 hours' or '14:20:60'. + -- Note that it is expected for some day components to be greater than 29 and + -- some time components be greater than 23:59:59 due to how intervals are + -- stored internally. + CREATE TABLE INTERVAL_MULDIV_TBL (span interval); + COPY INTERVAL_MULDIV_TBL FROM STDIN; + SELECT span * 0.3 AS product + FROM INTERVAL_MULDIV_TBL; + product + ------------------------------------ + 1 year 12 days 122:24:00 + -1 years -12 days +93:36:00 + -3 days -14:24:00 + 2 mons 13 days 01:22:28.80 + -10 mons +120 days 37:28:21.6567 + 1 mon 6 days + 4 mons 6 days + 24 years 11 mons 320 days 16:48:00 + (8 rows) + + SELECT span * 8.2 AS product + FROM INTERVAL_MULDIV_TBL; + product + --------------------------------------------- + 28 years 104 days 2961:36:00 + -28 years -104 days +2942:24:00 + -98 days -09:36:00 + 6 years 1 mon -197 days +93:34:27.20 + -24 years -7 mons +3946 days 640:15:11.9498 + 2 years 8 mons 24 days + 9 years 6 mons 24 days + 682 years 7 mons 8215 days 19:12:00 + (8 rows) + + SELECT span / 10 AS quotient + FROM INTERVAL_MULDIV_TBL; + quotient + ---------------------------------- + 4 mons 4 days 40:48:00 + -4 mons -4 days +31:12:00 + -1 days -04:48:00 + 25 days -15:32:30.40 + -3 mons +30 days 12:29:27.2189 + 12 days + 1 mon 12 days + 8 years 3 mons 126 days 21:36:00 + (8 rows) + + SELECT span / 100 AS quotient + FROM INTERVAL_MULDIV_TBL; + quotient + ------------------------- + 12 days 13:40:48 + -12 days -06:28:48 + -02:52:48 + 2 days 10:26:44.96 + -6 days +01:14:56.72189 + 1 day 04:48:00 + 4 days 04:48:00 + 9 mons 39 days 16:33:36 + (8 rows) + + DROP TABLE INTERVAL_MULDIV_TBL; SET DATESTYLE = 'postgres'; SELECT '' AS ten, * FROM INTERVAL_TBL; ten | f1 Index: src/test/regress/sql/interval.sql =================================================================== RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/interval.sql,v retrieving revision 1.10 diff -c -r1.10 interval.sql *** src/test/regress/sql/interval.sql 4 Sep 2006 01:26:28 -0000 1.10 --- src/test/regress/sql/interval.sql 5 Sep 2006 11:53:34 -0000 *************** *** 59,64 **** --- 59,99 ---- WHERE r1.f1 > r2.f1 ORDER BY r1.f1, r2.f1; + + -- Test multiplication and division with intervals. + -- Floating point arithmetic rounding errors can lead to unexpected results, + -- though the code attempts to do the right thing and round up to days and + -- minutes to avoid results such as '3 days 24:00 hours' or '14:20:60'. + -- Note that it is expected for some day components to be greater than 29 and + -- some time components be greater than 23:59:59 due to how intervals are + -- stored internally. + + CREATE TABLE INTERVAL_MULDIV_TBL (span interval); + COPY INTERVAL_MULDIV_TBL FROM STDIN; + 41 mon 12 days 360:00 + -41 mon -12 days +360:00 + -12 days + 9 mon -27 days 12:34:56 + -3 years 482 days 76:54:32.189 + 4 mon + 14 mon + 999 mon 999 days + \. + + SELECT span * 0.3 AS product + FROM INTERVAL_MULDIV_TBL; + + SELECT span * 8.2 AS product + FROM INTERVAL_MULDIV_TBL; + + SELECT span / 10 AS quotient + FROM INTERVAL_MULDIV_TBL; + + SELECT span / 100 AS quotient + FROM INTERVAL_MULDIV_TBL; + + DROP TABLE INTERVAL_MULDIV_TBL; + SET DATESTYLE = 'postgres'; SELECT '' AS ten, * FROM INTERVAL_TBL;