 includes/database/mysql/schema.inc             |    6 ++
 includes/database/pgsql/schema.inc             |    6 ++
 includes/database/sqlite/schema.inc            |    6 ++
 modules/simpletest/tests/database_test.install |   16 ++++
 modules/simpletest/tests/database_test.test    |  103 ++++++++++++++++++++++++
 5 files changed, 137 insertions(+), 0 deletions(-)

diff --git includes/database/mysql/schema.inc includes/database/mysql/schema.inc
index 3a68155..bab2f78 100644
--- includes/database/mysql/schema.inc
+++ includes/database/mysql/schema.inc
@@ -236,6 +236,12 @@ class DatabaseSchema_mysql extends DatabaseSchema {
 
       'blob:big'        => 'LONGBLOB',
       'blob:normal'     => 'BLOB',
+
+      'date:normal'     => 'DATE',
+
+      'datetime:normal' => 'DATETIME',
+
+      'time:normal'     => 'TIME',
     );
     return $map;
   }
diff --git includes/database/pgsql/schema.inc includes/database/pgsql/schema.inc
index cda525b..a038d51 100644
--- includes/database/pgsql/schema.inc
+++ includes/database/pgsql/schema.inc
@@ -246,6 +246,12 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
       'blob:big' => 'bytea',
       'blob:normal' => 'bytea',
 
+      'date:normal' => 'date',
+
+      'datetime:normal' => 'timestamp without time zone',
+
+      'time:normal'     => 'time without time zone',
+
       'serial:tiny' => 'serial',
       'serial:small' => 'serial',
       'serial:medium' => 'serial',
diff --git includes/database/sqlite/schema.inc includes/database/sqlite/schema.inc
index 13881e0..5129c23 100644
--- includes/database/sqlite/schema.inc
+++ includes/database/sqlite/schema.inc
@@ -216,6 +216,12 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
 
       'blob:big'        => 'BLOB',
       'blob:normal'     => 'BLOB',
+
+      'date:normal'     => 'DATE',
+
+      'time:normal'   => 'TIME',
+
+      'datetime:normal' => 'TIMESTAMP',
     );
     return $map;
   }
diff --git modules/simpletest/tests/database_test.install modules/simpletest/tests/database_test.install
index 08db2e3..24fdeec 100644
--- modules/simpletest/tests/database_test.install
+++ modules/simpletest/tests/database_test.install
@@ -156,6 +156,22 @@ function database_test_schema() {
     'primary key' => array('tid'),
   );
 
+  $schema['test_date'] = array(
+    'description' => 'A simple table including a datetime field for testing datetime behavior.',
+    'fields' => array(
+      'id' => array(
+        'description' => 'Simple unique ID.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'dummy_date' => array(
+        'description' => 'A dummy datetime field.',
+        'type' => 'datetime',
+      ),
+    ),
+    'primary key' => array('id'),
+    );
+
   $schema['test_null'] = array(
     'description' => 'Basic test table for NULL value handling.',
     'fields' => array(
diff --git modules/simpletest/tests/database_test.test modules/simpletest/tests/database_test.test
index c6c61df..47a2949 100644
--- modules/simpletest/tests/database_test.test
+++ modules/simpletest/tests/database_test.test
@@ -3120,6 +3120,109 @@ class DatabaseTransactionTestCase extends DatabaseTestCase {
 
 
 /**
+ * Test proposed new data types for the schema API.
+ */
+class DatabaseExtraTypesTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Extra Types tests',
+      'description' => 'Test the Extra Types.',
+      'group' => 'Database',
+    );
+  }
+
+
+  /**
+   * Test the date data type.
+   */
+   function testDateField() {
+     try {
+       $date_table = array(
+         'fields' => array(
+           'date_field' => array(
+             'description' => t('Test Date field'),
+             'type' => 'date',
+             'not null' => FALSE,
+           ),
+         ),
+       );
+       db_create_table('date_table', $date_table);
+       $this->assertTrue(db_table_exists('date_table'), t('Created table with date field'));
+
+       db_insert('date_table')->fields(array('date_field'))
+         ->values(array('date_field' => '2001-01-01'))
+         ->values(array('date_field' => '1856-12-31'))
+         ->values(array('date_field' => '2100-06-30'))
+         ->execute();
+
+       $num_records = (int) db_query('SELECT COUNT(*) FROM {date_table}')->fetchField();
+       $this->assertEqual($num_records, 3, t('Inserted 3 records, and counted 3 records'));
+       $res = db_query('SELECT date_field from {date_table} ORDER BY date_field');
+
+       $date = $res->fetch()->date_field;
+       $this->assertEqual($date, '1856-12-31', t('Date retrieved in order @date', array('@date' => $date)));
+       $date = $res->fetch()->date_field;
+       $this->assertEqual($date, '2001-01-01', t('Date retrieved in order @date', array('@date' => $date)));
+       $date = $res->fetch()->date_field;
+       $this->assertEqual($date, '2100-06-30', t('Date retrieved in order @date', array('@date' => $date)));
+
+
+       db_drop_table('date_table');
+       $this->assertFalse(db_table_exists('date_table'), t('Dropped table with date field'));
+
+     } catch (Exception $e) {
+       $this->fail($e->getMessage());
+     }
+
+   }
+
+  /**
+   * Test the time data type.
+   */
+   function testTimeField() {
+     try {
+       $time_table = array(
+         'fields' => array(
+           'time_field' => array(
+             'description' => t('Test Time field'),
+             'type' => 'time',
+             'not null' => FALSE,
+           ),
+         ),
+       );
+       db_create_table('time_table', $time_table);
+       $this->assertTrue(db_table_exists('time_table'), t('Created table with time field'));
+
+       db_insert('time_table')->fields(array('time_field'))
+         ->values(array('time_field' => '12:59:00'))
+         ->values(array('time_field' => '00:01:00'))
+         ->values(array('time_field' => '23:17:00'))
+         ->execute();
+
+       $num_records = (int) db_query('SELECT COUNT(*) FROM {time_table}')->fetchField();
+       $this->assertEqual($num_records, 3, t('Inserted 3 records, and counted 3 records'));
+       $res = db_query('SELECT time_field from {time_table} ORDER BY time_field');
+
+       $time = $res->fetch()->time_field;
+       $this->assertEqual($time, '00:01:00', t('Time retrieved in order @time', array('@time' => $time)));
+       $time = $res->fetch()->time_field;
+       $this->assertEqual($time, '12:59:00', t('Time retrieved in order @time', array('@time' => $time)));
+       $time = $res->fetch()->time_field;
+       $this->assertEqual($time, '23:17:00', t('Time retrieved in order @time', array('@time' => $time)));
+
+       db_drop_table('time_table');
+       $this->assertFalse(db_table_exists('time_table'), t('Dropped table with time field'));
+     } catch (Exception $e) {
+       $this->fail($e->getMessage());
+     }
+
+  }
+
+}
+
+
+/**
  * Check the sequences API.
  */
 class DatabaseNextIdCase extends DrupalWebTestCase {
