﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
31246	"select_for_update() with ""of"" uses wrong tables from (multi-level) model inheritance."	Abhijeet Viswa	Abhijeet Viswa	"Two different bugs related to model inheritance:
1.
Consider the following models:

{{{
class A(models.Model):
    field1 = models.IntegerField()

class B(A):
    field2 = models.IntegerField()

class C(models.Model):
    b = models.ForeignKey(B, on_delete=models.CASCADE)
}}}

{{{
queryset = C.objects.select_related('b').select_for_update(of=('b'))
}}}

The above queryet generates the following query:
{{{
SELECT ""selectforupdate_c"".""id"",
       ""selectforupdate_c"".""b_id"",
       ""selectforupdate_a"".""id"",
       ""selectforupdate_a"".""field1"",
       ""selectforupdate_b"".""a_ptr_id"",
       ""selectforupdate_b"".""field2""
FROM   ""selectforupdate_c""
       INNER JOIN ""selectforupdate_b""
               ON ( ""selectforupdate_c"".""b_id"" =
                  ""selectforupdate_b"".""a_ptr_id"" )
       INNER JOIN ""selectforupdate_a""
               ON ( ""selectforupdate_b"".""a_ptr_id"" = ""selectforupdate_a"".""id"" )
FOR UPDATE OF ""selectforupdate_a""
}}}
The `of` clause in the generated SQL references the model `a` instead of `b`

2.
 Consider the following models:
 
{{{
class A(models.Model):
    field1 = models.IntegerField()

class B(A):
     field2 = models.IntegerField()
 
class C(B):
    field_c = models.IntegerField()
}}}

{{{
queryset = C.objects.all().select_for_update(of=('b_ptr', 'b_ptr__a_ptr'))
}}}
 
The above queryset crashes with the following crashlog: 

{{{
Traceback (most recent call last):
  File ""/home/abhijeet/git-repos/django/django/core/management/base.py"", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File ""/home/abhijeet/git-repos/django/django/core/management/base.py"", line 369, in execute
   output = self.handle(*args, **options)
  File ""/home/abhijeet/django_contrib/selectforupdate/management/commands/debug.py"", line 12, in handle
    print(queryset.query)
  File ""/home/abhijeet/git-repos/django/django/db/models/sql/query.py"", line 257, in __str__
    sql, params = self.sql_with_params()
  File ""/home/abhijeet/git-repos/django/django/db/models/sql/query.py"", line 265, in sql_with_params
    return self.get_compiler(DEFAULT_DB_ALIAS).as_sql()
  File ""/home/abhijeet/git-repos/django/django/db/models/sql/compiler.py"", line 555, in as_sql
    of=self.get_select_for_update_of_arguments(),
  File ""/home/abhijeet/git-repos/django/django/db/models/sql/compiler.py"", line 1036, in get_select_for_update_of_arguments
    select_index = klass_info['select_fields'][0]
IndexError: list index out of range
}}}

This is related to #30953"	Bug	assigned	Database layer (models, ORM)	2.2	Release blocker		select_for_update mti relations		Accepted	1	0	1	1	0	0
