diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out
new file mode 100644
index 0000000000000000000000000000000000000000..9437fd085a275f8744242ddb70bfabefb8fca301
--- /dev/null
+++ b/src/test/regress/expected/date.out
@@ -0,0 +1,144 @@
+--
+-- DATE
+--
+CREATE TABLE DATE_TBL (f1 date);
+INSERT INTO DATE_TBL VALUES ('1957-04-09');
+INSERT INTO DATE_TBL VALUES ('1957-06-13');
+INSERT INTO DATE_TBL VALUES ('1996-02-28');
+INSERT INTO DATE_TBL VALUES ('1996-02-29');
+INSERT INTO DATE_TBL VALUES ('1996-03-01');
+INSERT INTO DATE_TBL VALUES ('1996-03-02');
+INSERT INTO DATE_TBL VALUES ('1997-02-28');
+INSERT INTO DATE_TBL VALUES ('1997-02-29');
+ERROR:  Bad date external representation '1997-02-29'
+INSERT INTO DATE_TBL VALUES ('1997-03-01');
+INSERT INTO DATE_TBL VALUES ('1997-03-02');
+INSERT INTO DATE_TBL VALUES ('2000-04-01');
+INSERT INTO DATE_TBL VALUES ('2000-04-02');
+INSERT INTO DATE_TBL VALUES ('2000-04-03');
+INSERT INTO DATE_TBL VALUES ('2038-04-08');
+INSERT INTO DATE_TBL VALUES ('2039-04-09');
+INSERT INTO DATE_TBL VALUES ('2040-04-10');
+SELECT f1 AS "Fifteen" FROM DATE_TBL;
+  Fifteen   
+------------
+ 04-09-1957
+ 06-13-1957
+ 02-28-1996
+ 02-29-1996
+ 03-01-1996
+ 03-02-1996
+ 02-28-1997
+ 03-01-1997
+ 03-02-1997
+ 04-01-2000
+ 04-02-2000
+ 04-03-2000
+ 04-08-2038
+ 04-09-2039
+ 04-10-2040
+(15 rows)
+
+SELECT f1 AS "Nine" FROM DATE_TBL WHERE f1 < '2000-01-01';
+    Nine    
+------------
+ 04-09-1957
+ 06-13-1957
+ 02-28-1996
+ 02-29-1996
+ 03-01-1996
+ 03-02-1996
+ 02-28-1997
+ 03-01-1997
+ 03-02-1997
+(9 rows)
+
+SELECT f1 AS "Three" FROM DATE_TBL
+  WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01';
+   Three    
+------------
+ 04-01-2000
+ 04-02-2000
+ 04-03-2000
+(3 rows)
+
+--
+-- Simple math
+-- Leave most of it for the horology tests
+--
+SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL;
+ Days From 2K 
+--------------
+       -15607
+       -15542
+        -1403
+        -1402
+        -1401
+        -1400
+        -1037
+        -1036
+        -1035
+           91
+           92
+           93
+        13977
+        14343
+        14710
+(15 rows)
+
+SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL;
+ Days From Epoch 
+-----------------
+           -4650
+           -4585
+            9554
+            9555
+            9556
+            9557
+            9920
+            9921
+            9922
+           11048
+           11049
+           11050
+           24934
+           25300
+           25667
+(15 rows)
+
+SELECT date 'yesterday' - date 'today' AS "One day";
+ One day 
+---------
+      -1
+(1 row)
+
+SELECT date 'today' - date 'tomorrow' AS "One day";
+ One day 
+---------
+      -1
+(1 row)
+
+SELECT date 'yesterday' - date 'tomorrow' AS "Two days";
+ Two days 
+----------
+       -2
+(1 row)
+
+SELECT date 'tomorrow' - date 'today' AS "One day";
+ One day 
+---------
+       1
+(1 row)
+
+SELECT date 'today' - date 'yesterday' AS "One day";
+ One day 
+---------
+       1
+(1 row)
+
+SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
+ Two days 
+----------
+        2
+(1 row)
+
diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out
index f026b93fa8daf01194fe58b2c4d85955b7d3b9f8..ec847574744563365262713bb2e5909d29e27146 100644
--- a/src/test/regress/expected/horology.out
+++ b/src/test/regress/expected/horology.out
@@ -2,6 +2,48 @@
 -- HOROLOGY
 --
 --
+-- date, time arithmetic
+--
+SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
+         Date + Time          
+------------------------------
+ Tue Feb 03 04:05:06 1981 PST
+(1 row)
+
+SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST";
+       Date + Time PST        
+------------------------------
+ Sun Feb 03 04:05:06 1991 PST
+(1 row)
+
+SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC";
+       Date + Time UTC        
+------------------------------
+ Fri Feb 02 20:05:06 2001 PST
+(1 row)
+
+SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years";
+        Add Two Years         
+------------------------------
+ Wed Feb 03 00:00:00 1993 PST
+(1 row)
+
+SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years";
+      Subtract Two Years      
+------------------------------
+ Mon Dec 13 00:00:00 1999 PST
+(1 row)
+
+SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time";
+        Subtract Time         
+------------------------------
+ Sat Feb 02 19:54:54 1991 PST
+(1 row)
+
+SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC";
+ERROR:  Unable to identify an operator '-' for types 'date' and 'timetz'
+	You will have to retype this query using an explicit cast
+--
 -- timestamp, interval arithmetic
 --
 SELECT timestamp '1996-03-01' - interval '1 second' AS "Feb 29";
diff --git a/src/test/regress/expected/time.out b/src/test/regress/expected/time.out
new file mode 100644
index 0000000000000000000000000000000000000000..e28da20ec134346e3a94080f38e6f62d38bfa378
--- /dev/null
+++ b/src/test/regress/expected/time.out
@@ -0,0 +1,183 @@
+--
+-- TIME
+--
+CREATE TABLE TIME_TBL (f1 time, f2 time with time zone);
+INSERT INTO TIME_TBL VALUES ('00:00', '00:00 PDT');
+INSERT INTO TIME_TBL VALUES ('01:00', '01:00 PDT');
+INSERT INTO TIME_TBL VALUES ('02:03', '02:03 PDT');
+INSERT INTO TIME_TBL VALUES ('11:59', '11:59 PDT');
+INSERT INTO TIME_TBL VALUES ('12:00', '12:00 PDT');
+INSERT INTO TIME_TBL VALUES ('12:01', '12:01 PDT');
+INSERT INTO TIME_TBL VALUES ('23:59', '23:59 PDT');
+INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM', '11:59:59.99 PM PDT');
+SELECT f1 AS "Time", f2 AS "Time TZ" FROM TIME_TBL;
+   Time   |   Time TZ   
+----------+-------------
+ 00:00:00 | 00:00:00-07
+ 01:00:00 | 01:00:00-07
+ 02:03:00 | 02:03:00-07
+ 11:59:00 | 11:59:00-07
+ 12:00:00 | 12:00:00-07
+ 12:01:00 | 12:01:00-07
+ 23:59:00 | 23:59:00-07
+ 23:59:59 | 23:59:59-07
+(8 rows)
+
+SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07';
+  Three   
+----------
+ 00:00:00
+ 01:00:00
+ 02:03:00
+(3 rows)
+
+SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07';
+   Five   
+----------
+ 11:59:00
+ 12:00:00
+ 12:01:00
+ 23:59:00
+ 23:59:59
+(5 rows)
+
+SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00';
+ None 
+------
+(0 rows)
+
+SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00';
+  Eight   
+----------
+ 00:00:00
+ 01:00:00
+ 02:03:00
+ 11:59:00
+ 12:00:00
+ 12:01:00
+ 23:59:00
+ 23:59:59
+(8 rows)
+
+--
+-- TIME simple math
+--
+SELECT f1 + time '00:01' AS "Eight" FROM TIME_TBL;
+       Eight        
+--------------------
+ @ 1 min
+ @ 1 hour 1 min
+ @ 2 hours 4 mins
+ @ 12 hours
+ @ 12 hours 1 min
+ @ 12 hours 2 mins
+ @ 1 day
+ @ 1 day 59.99 secs
+(8 rows)
+
+SELECT f1 + time '01:00' AS "Eight" FROM TIME_TBL;
+           Eight            
+----------------------------
+ @ 1 hour
+ @ 2 hours
+ @ 3 hours 3 mins
+ @ 12 hours 59 mins
+ @ 13 hours
+ @ 13 hours 1 min
+ @ 1 day 59 mins
+ @ 1 day 59 mins 59.99 secs
+(8 rows)
+
+SELECT f1 + time '00:00:01.11' AS "Eight" FROM TIME_TBL;
+            Eight             
+------------------------------
+ @ 1.11 secs
+ @ 1 hour 1.11 secs
+ @ 2 hours 3 mins 1.11 secs
+ @ 11 hours 59 mins 1.11 secs
+ @ 12 hours 1.11 secs
+ @ 12 hours 1 min 1.11 secs
+ @ 23 hours 59 mins 1.11 secs
+ @ 1 day 1.10 secs
+(8 rows)
+
+SELECT f1 + time '00:00:59.99' AS "Eight" FROM TIME_TBL;
+             Eight             
+-------------------------------
+ @ 59.99 secs
+ @ 1 hour 59.99 secs
+ @ 2 hours 3 mins 59.99 secs
+ @ 11 hours 59 mins 59.99 secs
+ @ 12 hours 59.99 secs
+ @ 12 hours 1 min 59.99 secs
+ @ 23 hours 59 mins 59.99 secs
+ @ 1 day 59.98 secs
+(8 rows)
+
+SELECT f1 - '00:01' AS "Eight" FROM TIME_TBL;
+             Eight             
+-------------------------------
+ @ 1 min ago
+ @ 59 mins
+ @ 2 hours 2 mins
+ @ 11 hours 58 mins
+ @ 11 hours 59 mins
+ @ 12 hours
+ @ 23 hours 58 mins
+ @ 23 hours 58 mins 59.99 secs
+(8 rows)
+
+SELECT f1 - '01:00' AS "Eight" FROM TIME_TBL;
+             Eight             
+-------------------------------
+ @ 1 hour ago
+ @ 0
+ @ 1 hour 3 mins
+ @ 10 hours 59 mins
+ @ 11 hours
+ @ 11 hours 1 min
+ @ 22 hours 59 mins
+ @ 22 hours 59 mins 59.99 secs
+(8 rows)
+
+SELECT f1 - '00:00:01.11' AS "Eight" FROM TIME_TBL;
+             Eight             
+-------------------------------
+ @ 1.11 secs ago
+ @ 59 mins 58.89 secs
+ @ 2 hours 2 mins 58.89 secs
+ @ 11 hours 58 mins 58.89 secs
+ @ 11 hours 59 mins 58.89 secs
+ @ 12 hours 58.89 secs
+ @ 23 hours 58 mins 58.89 secs
+ @ 23 hours 59 mins 58.88 secs
+(8 rows)
+
+SELECT f1 - '00:00:59.99' AS "Eight" FROM TIME_TBL;
+            Eight             
+------------------------------
+ @ 59.99 secs ago
+ @ 59 mins 0.01 secs
+ @ 2 hours 2 mins 0.01 secs
+ @ 11 hours 58 mins 0.01 secs
+ @ 11 hours 59 mins 0.01 secs
+ @ 12 hours 0.01 secs
+ @ 23 hours 58 mins 0.01 secs
+ @ 23 hours 59 mins
+(8 rows)
+
+--
+-- TIME WITH TIME ZONE simple math
+--
+/*
+-- Not yet implemented
+-- Thomas 2000-09-09
+SELECT f2 + time '00:01' AS "" FROM TIME_TBL;
+SELECT f2 + time '01:00' AS "" FROM TIME_TBL;
+SELECT f2 + time '00:00:01.11' AS "" FROM TIME_TBL;
+SELECT f2 + '00:00:59.99' AS "" FROM TIME_TBL;
+SELECT f2 - '00:01' AS "" FROM TIME_TBL;
+SELECT f2 - '01:00' AS "" FROM TIME_TBL;
+SELECT f2 - '00:00:01.11' AS "" FROM TIME_TBL;
+SELECT f2 - '00:00:59.99' AS "" FROM TIME_TBL;
+*/
diff --git a/src/test/regress/output/misc.source b/src/test/regress/output/misc.source
index dba952f86375e00ee18992edd013bf305f0c06ba..a39f70a315b3f428c11f4d1e7cc02c74ac219c3d 100644
--- a/src/test/regress/output/misc.source
+++ b/src/test/regress/output/misc.source
@@ -587,6 +587,7 @@ SELECT user_relns() AS user_relns
  copy_tbl
  d
  d_star
+ date_tbl
  default_seq
  default_tbl
  defaultexpr_tbl
@@ -648,12 +649,13 @@ SELECT user_relns() AS user_relns
  tenk1
  tenk2
  text_tbl
+ time_tbl
  timestamp_tbl
  tinterval_tbl
  toyemp
  varchar_tbl
  xacttest
-(90 rows)
+(92 rows)
 
 --SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))) AS equip_name;
 --
diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9e98041ce81604a5e1ee79717341af3b6d31ff71
--- /dev/null
+++ b/src/test/regress/sql/date.sql
@@ -0,0 +1,50 @@
+--
+-- DATE
+--
+
+CREATE TABLE DATE_TBL (f1 date);
+
+INSERT INTO DATE_TBL VALUES ('1957-04-09');
+INSERT INTO DATE_TBL VALUES ('1957-06-13');
+INSERT INTO DATE_TBL VALUES ('1996-02-28');
+INSERT INTO DATE_TBL VALUES ('1996-02-29');
+INSERT INTO DATE_TBL VALUES ('1996-03-01');
+INSERT INTO DATE_TBL VALUES ('1996-03-02');
+INSERT INTO DATE_TBL VALUES ('1997-02-28');
+INSERT INTO DATE_TBL VALUES ('1997-02-29');
+INSERT INTO DATE_TBL VALUES ('1997-03-01');
+INSERT INTO DATE_TBL VALUES ('1997-03-02');
+INSERT INTO DATE_TBL VALUES ('2000-04-01');
+INSERT INTO DATE_TBL VALUES ('2000-04-02');
+INSERT INTO DATE_TBL VALUES ('2000-04-03');
+INSERT INTO DATE_TBL VALUES ('2038-04-08');
+INSERT INTO DATE_TBL VALUES ('2039-04-09');
+INSERT INTO DATE_TBL VALUES ('2040-04-10');
+
+SELECT f1 AS "Fifteen" FROM DATE_TBL;
+
+SELECT f1 AS "Nine" FROM DATE_TBL WHERE f1 < '2000-01-01';
+
+SELECT f1 AS "Three" FROM DATE_TBL
+  WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01';
+
+--
+-- Simple math
+-- Leave most of it for the horology tests
+--
+
+SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL;
+
+SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL;
+
+SELECT date 'yesterday' - date 'today' AS "One day";
+
+SELECT date 'today' - date 'tomorrow' AS "One day";
+
+SELECT date 'yesterday' - date 'tomorrow' AS "Two days";
+
+SELECT date 'tomorrow' - date 'today' AS "One day";
+
+SELECT date 'today' - date 'yesterday' AS "One day";
+
+SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql
index 58cad2050551acdac3e3eb740df5f572ff8ca9ea..aaaf14faf3a6e087ab24fc7d1f6cdebee856e6eb 100644
--- a/src/test/regress/sql/horology.sql
+++ b/src/test/regress/sql/horology.sql
@@ -2,6 +2,24 @@
 -- HOROLOGY
 --
 
+--
+-- date, time arithmetic
+--
+
+SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
+
+SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST";
+
+SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC";
+
+SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years";
+
+SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years";
+
+SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time";
+
+SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC";
+
 --
 -- timestamp, interval arithmetic
 --
diff --git a/src/test/regress/sql/run_check.tests b/src/test/regress/sql/run_check.tests
index b3caf933f05685edbd06475d0d61630a6bb812dc..ae848c91977d5f7ad5ff3439ea786ed2315787f1 100644
--- a/src/test/regress/sql/run_check.tests
+++ b/src/test/regress/sql/run_check.tests
@@ -29,6 +29,8 @@ parallel	group2
  	test	path
  	test	polygon
  	test	circle
+ 	test	date
+ 	test	time
  	test	interval
  	test	timestamp
  	test	reltime
diff --git a/src/test/regress/sql/tests b/src/test/regress/sql/tests
index 69f928b005fa95b01f6a02d5ddf85823ce563542..2dc72a7e5753a81126089ecdc24d907571e6cc53 100644
--- a/src/test/regress/sql/tests
+++ b/src/test/regress/sql/tests
@@ -18,6 +18,8 @@ path
 polygon
 circle
 geometry
+date
+time
 interval
 timestamp
 reltime
diff --git a/src/test/regress/sql/time.sql b/src/test/regress/sql/time.sql
new file mode 100644
index 0000000000000000000000000000000000000000..dbb72c0ba8ae395405f9a9f303369df36a7d3ece
--- /dev/null
+++ b/src/test/regress/sql/time.sql
@@ -0,0 +1,68 @@
+--
+-- TIME
+--
+
+CREATE TABLE TIME_TBL (f1 time, f2 time with time zone);
+
+INSERT INTO TIME_TBL VALUES ('00:00', '00:00 PDT');
+INSERT INTO TIME_TBL VALUES ('01:00', '01:00 PDT');
+INSERT INTO TIME_TBL VALUES ('02:03', '02:03 PDT');
+INSERT INTO TIME_TBL VALUES ('11:59', '11:59 PDT');
+INSERT INTO TIME_TBL VALUES ('12:00', '12:00 PDT');
+INSERT INTO TIME_TBL VALUES ('12:01', '12:01 PDT');
+INSERT INTO TIME_TBL VALUES ('23:59', '23:59 PDT');
+INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM', '11:59:59.99 PM PDT');
+
+SELECT f1 AS "Time", f2 AS "Time TZ" FROM TIME_TBL;
+
+SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07';
+
+SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07';
+
+SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00';
+
+SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00';
+
+--
+-- TIME simple math
+--
+
+SELECT f1 + time '00:01' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 + time '01:00' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 + time '00:00:01.11' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 + time '00:00:59.99' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 - '00:01' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 - '01:00' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 - '00:00:01.11' AS "Eight" FROM TIME_TBL;
+
+SELECT f1 - '00:00:59.99' AS "Eight" FROM TIME_TBL;
+
+--
+-- TIME WITH TIME ZONE simple math
+--
+
+/*
+-- Not yet implemented
+-- Thomas 2000-09-09
+SELECT f2 + time '00:01' AS "" FROM TIME_TBL;
+
+SELECT f2 + time '01:00' AS "" FROM TIME_TBL;
+
+SELECT f2 + time '00:00:01.11' AS "" FROM TIME_TBL;
+
+SELECT f2 + '00:00:59.99' AS "" FROM TIME_TBL;
+
+SELECT f2 - '00:01' AS "" FROM TIME_TBL;
+
+SELECT f2 - '01:00' AS "" FROM TIME_TBL;
+
+SELECT f2 - '00:00:01.11' AS "" FROM TIME_TBL;
+
+SELECT f2 - '00:00:59.99' AS "" FROM TIME_TBL;
+*/