diff --git a/django/db/models/base.py b/django/db/models/base.py
index f94d25c..2653244 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -351,7 +351,9 @@ class Model(object):
         if pk_set:
             # Determine whether a record with the primary key already exists.
             if (force_update or (not force_insert and
-                    manager.filter(pk=pk_val).extra(select={'a': 1}).values('a').order_by())):
+                    manager.filter(pk=pk_val).\
+						extra(select=False, where=False, params=False, tables=False, order_by=False).\
+						extra(select={'a': 1}).values('a').order_by())):
                 # It does already exist, so do an UPDATE.
                 if force_update or non_pks:
                     values = [(f, None, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks]
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index b4525f1..4d32924 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1649,14 +1649,28 @@ class Query(object):
                 select_pairs[name] = (entry, entry_params)
             # This is order preserving, since self.extra_select is a SortedDict.
             self.extra_select.update(select_pairs)
+        elif select is not None:
+            self.extra_select = SortedDict()
+
         if where:
             self.extra_where += tuple(where)
+        elif where is not None:
+            self.extra_where = ()
+
         if params:
             self.extra_params += tuple(params)
+        elif params is not None:
+            self.extra_where = ()
+            
         if tables:
             self.extra_tables += tuple(tables)
+        elif tables is not None:
+            self.extra_tables = ()
+
         if order_by:
             self.extra_order_by = order_by
+        elif order_by is not None:
+            self.extra_order_by = ()
 
     def trim_extra_select(self, names):
         """
diff --git a/tests/modeltests/extra_save/__init__.py b/tests/modeltests/extra_save/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/modeltests/extra_save/models.py b/tests/modeltests/extra_save/models.py
new file mode 100644
index 0000000..cb7ca10
--- /dev/null
+++ b/tests/modeltests/extra_save/models.py
@@ -0,0 +1,47 @@
+"""test for bug #8990
+"""
+
+from django.db import models
+
+class Shelf(models.Model):
+    name = models.CharField(max_length=50)
+
+    def __unicode__(self):
+        return u"%s the shelf" % self.name
+
+
+class BookManager(models.Manager):
+    def get_query_set(self):
+        return super(BookManager, self).get_query_set().\
+            select_related('shelf').\
+            extra(select={'shelf_name': 'extra_save_shelf.name'})
+
+
+class Book(models.Model):
+    name = models.CharField(max_length=50)
+    shelf = models.ForeignKey(Shelf)
+
+    objects = BookManager()
+
+    def __unicode__(self):
+        return u"%s the book" % self.name
+
+
+__test__ = {'API_TESTS':"""
+>>> shelf = Shelf(name="Foo")
+>>> shelf.save()
+>>> book = Book(name="bar", shelf=shelf)
+>>> book.save()              # initial save works fine
+
+>>> Book.objects.get(pk=1)   # querying works as well
+<Book: bar the book>
+
+# subsequent saves work too...
+>>> book.save()
+
+# ...instead of failing with:
+#Traceback (most recent call last):
+#    ...
+#OperationalError: no such column: extra_save_shelf.name
+"""
+}
\ No newline at end of file
