commit a320dfb62343214fb488fa94119e78a264558bb2
Author: Damien Tournoud <damien@commerceguys.com>
Date:   Wed Jan 25 14:54:39 2012 +0100

    Test for: Field foreign key support is totally broken.

diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.test b/modules/field/modules/field_sql_storage/field_sql_storage.test
index 773de3d..ec7e1cb 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.test
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.test
@@ -407,21 +407,35 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase {
    * Test foreign key support.
    */
   function testFieldSqlStorageForeignKeys() {
-    // Create a decimal field.
     $field_name = 'testfield';
-    $field = array('field_name' => $field_name, 'type' => 'text');
+    $foreign_key_name = 'shape';
+    $field = array('field_name' => $field_name, 'type' => 'shape', 'settings' => array('foreign_key_name' => $foreign_key_name));
     $field = field_create_field($field);
+
+    // Retrieve the field and instance with field_info and verify the foreign
+    // keys are in place.
+    $field = field_info_field($field_name);
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, t('Foreign key table name preserved through CRUD'));
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', t('Foreign key column name preserved through CRUD'));
+
+    // Update the field settings, it should update the foreign key definition too.
+    $foreign_key_name = 'color';
+    $field['settings']['foreign_key_name'] = $foreign_key_name;
+    field_update_field($field);
+
     // Retrieve the field and instance with field_info and verify the foreign
     // keys are in place.
     $field = field_info_field($field_name);
-    $this->assertEqual($field['foreign keys']['format']['table'], 'filter_format', t('Foreign key table name preserved through CRUD'));
-    $this->assertEqual($field['foreign keys']['format']['columns']['format'], 'format', t('Foreign key column name preserved through CRUD'));
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, t('Foreign key table name modified after update'));
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', t('Foreign key column name modified after update'));
+
     // Now grab the SQL schema and verify that too.
     $schema = drupal_get_schema(_field_sql_storage_tablename($field));
     $this->assertEqual(count($schema['foreign keys']), 1, t("There is 1 foreign key in the schema"));
     $foreign_key = reset($schema['foreign keys']);
-    $filter_column = _field_sql_storage_columnname($field['field_name'], 'format');
-    $this->assertEqual($foreign_key['table'], 'filter_format', t('Foreign key table name preserved in the schema'));
-    $this->assertEqual($foreign_key['columns'][$filter_column], 'format', t('Foreign key column name preserved in the schema'));
+    debug($foreign_key);
+    $foreign_key_column = _field_sql_storage_columnname($field['field_name'], $foreign_key_name);
+    $this->assertEqual($foreign_key['table'], $foreign_key_name, t('Foreign key table name preserved in the schema'));
+    $this->assertEqual($foreign_key['columns'][$foreign_key_column], 'id', t('Foreign key column name preserved in the schema'));
   }
 }
diff --git a/modules/field/tests/field_test.field.inc b/modules/field/tests/field_test.field.inc
index b8a2939..e2dc666 100644
--- a/modules/field/tests/field_test.field.inc
+++ b/modules/field/tests/field_test.field.inc
@@ -28,7 +28,9 @@ function field_test_field_info() {
     'shape' => array(
       'label' => t('Shape'),
       'description' => t('Another dummy field type.'),
-      'settings' => array(),
+      'settings' => array(
+        'foreign_key_name' => 'shape',
+      ),
       'instance_settings' => array(),
       'default_widget' => 'test_field_widget',
       'default_formatter' => 'field_test_default',
diff --git a/modules/field/tests/field_test.install b/modules/field/tests/field_test.install
index 5957561..b6b7d51 100644
--- a/modules/field/tests/field_test.install
+++ b/modules/field/tests/field_test.install
@@ -145,6 +145,14 @@ function field_test_field_schema($field) {
           'not null' => FALSE,
         ),
       ),
+      'foreign keys' => array(
+        // This is a dummy foreign key definition, references a table that
+        // doesn't exist, but that's not a problem.
+        $field['settings']['foreign_key_name'] => array(
+          'table' => $field['settings']['foreign_key_name'],
+          'columns' => array( $field['settings']['foreign_key_name'] => 'id' ),
+        ),
+      ),
     );
   }
 }

commit d52e13be06f19556e6dbc54d96db59e17851c4b0
Author: Damien Tournoud <damien@commerceguys.com>
Date:   Wed Jan 25 14:54:54 2012 +0100

    Fix for field foreign key support is totally broken.

diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc
index ff39f22..5712ea5 100644
--- a/modules/field/field.crud.inc
+++ b/modules/field/field.crud.inc
@@ -246,6 +246,8 @@ function field_update_field($field) {
   $schema += array('columns' => array(), 'indexes' => array());
   // 'columns' are hardcoded in the field type.
   $field['columns'] = $schema['columns'];
+  // 'foreign keys' are hardcoded in the field type.
+  $field['foreign keys'] = $schema['foreign keys'];
   // 'indexes' can be both hardcoded in the field type, and specified in the
   // incoming $field definition.
   $field += array(
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index 2ed7835..f45ea0a 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -188,7 +188,7 @@ function _field_sql_storage_schema($field) {
   foreach ($field['foreign keys'] as $specifier => $specification) {
     $real_name = _field_sql_storage_indexname($field['field_name'], $specifier);
     $current['foreign keys'][$real_name]['table'] = $specification['table'];
-    foreach ($specification['columns'] as $column => $referenced) {
+    foreach ($specification['columns'] as $column_name => $referenced) {
       $sql_storage_column = _field_sql_storage_columnname($field['field_name'], $column_name);
       $current['foreign keys'][$real_name]['columns'][$sql_storage_column] = $referenced;
     }
