#3623: select_related(depth=n) for low n gives corrupt results
-------------------------------+--------------------------------------------
Reporter:  [EMAIL PROTECTED]  |       Owner:  adrian               
  Status:  new                 |   Component:  Database wrapper     
 Version:  SVN                 |    Keywords:  select_related, depth
   Stage:  Unreviewed          |   Has_patch:  0                    
-------------------------------+--------------------------------------------
 Hi,
 
 I've found that in some cases select_related(depth=n) returns different
 results from select_related.
 
 Here's a slice of my model:
 
 ----
 class Lval(models.Model):[[BR]]
     var_id = models.IntegerField(null=True, db_index=True)[[BR]]
     printed = models.CharField(maxlength=100, core=True)[[BR]]
     rep_size = models.IntegerField(null=True)[[BR]]
     declared_at = models.ForeignKey(Program_point, null=True)[[BR]]
 
 
 class Access(models.Model):[[BR]]
     lval = models.ForeignKey(Lval, related_name="reads_writes")[[BR]]
     accessed_through = models.ForeignKey(Call_path)[[BR]]
     occurs_at = models.ForeignKey(Program_point)[[BR]]
     locks = models.ManyToManyField(Lval,
 filter_interface=models.VERTICAL)[[BR]]
 
 
 class Race(models.Model):[[BR]]
     access1 = models.ForeignKey(Access, core=True,
 related_name="racy1")[[BR]]
     access2 = models.ForeignKey(Access, core=True,
 related_name="racy2")[[BR]]
     note = models.ForeignKey(Note, core=True, null=True)[[BR]]
     labels = models.ManyToManyField(Label,
 filter_interface=models.VERTICAL)[[BR]]
 
 
 class Race_cluster(models.Model):[[BR]]
     races = models.ManyToManyField(Race,
 filter_interface=models.VERTICAL)[[BR]]
     run = models.ForeignKey(Run)[[BR]]
     def program(self):[[BR]]
         return str(self.run.code)[[BR]]
     def first_race(self):[[BR]]
         return str(self.races.all()[0])[[BR]]
 
 
 ----
 
 when i run the following code:
 
 r = Run.objects.get(id=27)[[BR]]
 this_run = Race_cluster.objects.filter(run = r)[[BR]]
 for rc in this_run:[[BR]]
    races = rc.races.select_related()[[BR]]
    lval = races[0].access2.lval[[BR]]
    print lval.var_id[[BR]]
 
 I get:
 
 320931
 324744
 365766
 440030
 426104
 282968
 19893
 45442 ...
 
 (which is fine...)
 
 but if I change it to select_related(depth=2)
 
 I get:
 
 fs/dcache.c
 fs/bio.c
 fs/proc/generic.c
 include/asm/processor.h
 mm/slab.c
 fs/block_dev.c
 net/rxrpc/transport.c
 net/ipv4/igmp.c
 lib/kobject.c
 kernel/auditsc.c
 fs/nfs/nfs4state.c ...
 
 which is weird...
 
 depth=3 gives me:
 
 296
 297
 298
 281
 301
 302
 309
 310
 315
 316 ...
 
 which is also different
 
 finally, depth=4 gives
 
 320931
 324744
 365766
 440030
 426104
 282968
 19893
 45442 ...
 
 which is the same as an unbounded select_related().
 
 Also, if I change one line from:[[BR]]
 
 lval = races[0].access2.lval[[BR]]
 
 to[[BR]]
 
 lval = races[0].access1.lval[[BR]]
 
 
 it works fine w/ depth=2, etc.
 
 I'm not sure if it was meant to work with low depths, but it seems like it
 should still work. The problem might be some funkyness w/ possibly null
 foreign keys in my model? BTW, this is running on top of MySQL. Let me
 know if you need more info. Thanks.
 
 Jan Voung

-- 
Ticket URL: <http://code.djangoproject.com/ticket/3623>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to