#27864: Limit the number of terms in an admin search
--------------------------------------+------------------------------------
     Reporter:  VINAY KUMAR SHARMA    |                    Owner:  nobody
         Type:  Cleanup/optimization  |                   Status:  new
    Component:  contrib.admin         |                  Version:  1.8
     Severity:  Normal                |               Resolution:
     Keywords:  mysql                 |             Triage Stage:  Accepted
    Has patch:  0                     |      Needs documentation:  0
  Needs tests:  0                     |  Patch needs improvement:  0
Easy pickings:  0                     |                    UI/UX:  0
--------------------------------------+------------------------------------

Comment (by dryfish):

 Here is a test for admin_changelist/tests.py

 {{{
     def test_long_search_var(self):
         """
         """
         parent = Parent.objects.create(name='Mary')
         Child.objects.create(parent=parent, name='Danielle')
         Child.objects.create(parent=parent, name='Daniel')

         m = ParentAdmin(Parent, custom_site)
         request = self.factory.get('/parent/', data={SEARCH_VAR: '
 '.join(['daniel']*100)})
         request.user = self.superuser

         cl = m.get_changelist_instance(request)
         # Make sure distinct() was called
         self.assertEqual(cl.queryset.count(), 1)
 }}}


 {{{
 ======================================================================
 ERROR: test_long_search_var (admin_changelist.tests.ChangeListTests)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/usr/lib/python3.7/unittest/case.py", line 59, in testPartExecutor
     yield
   File "/usr/lib/python3.7/unittest/case.py", line 615, in run
     testMethod()
   File "/source/django/tests/admin_changelist/tests.py", line 420, in
 test_long_search_var
     cl = m.get_changelist_instance(request)
   File "/source/django/django/contrib/admin/options.py", line 742, in
 get_changelist_instance
     sortable_by,
   File "/source/django/django/contrib/admin/views/main.py", line 82, in
 __init__
     self.get_results(request)
   File "/source/django/django/contrib/admin/views/main.py", line 210, in
 get_results
     result_count = paginator.count
   File "/source/django/django/utils/functional.py", line 57, in __get__
     res = instance.__dict__[self.name] = self.func(instance)
   File "/source/django/django/core/paginator.py", line 91, in count
     return c()
   File "/source/django/django/db/models/query.py", line 391, in count
     return self.query.get_count(using=self.db)
   File "/source/django/django/db/models/sql/query.py", line 504, in
 get_count
     number = obj.get_aggregation(using, ['__count'])['__count']
   File "/source/django/django/db/models/sql/query.py", line 489, in
 get_aggregation
     result = compiler.execute_sql(SINGLE)
   File "/source/django/django/db/models/sql/compiler.py", line 1080, in
 execute_sql
     cursor.execute(sql, params)
   File "/source/django/django/db/backends/utils.py", line 67, in execute
     return self._execute_with_wrappers(sql, params, many=False,
 executor=self._execute)
   File "/source/django/django/db/backends/utils.py", line 76, in
 _execute_with_wrappers
     return executor(sql, params, many, context)
   File "/source/django/django/db/backends/utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
   File "/source/django/django/db/utils.py", line 89, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "/source/django/django/db/backends/utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
   File "/source/django/django/db/backends/sqlite3/base.py", line 383, in
 execute
     return Database.Cursor.execute(self, query, params)
 django.db.utils.OperationalError: at most 64 tables in a join

 ----------------------------------------------------------------------
 Ran 56 tests in 0.627s

 FAILED (errors=1, skipped=1)

 }}}

 print in django/db/backends/sqlite3/base.py shows this SQL and params:

 {{{
 SELECT COUNT(*) FROM (SELECT DISTINCT "admin_changelist_parent"."id" AS
 Col1, "admin_changelist_parent"."name" AS Col2 FROM
 "admin_changelist_parent" INNER JOIN "admin_changelist_child" ON
 ("admin_changelist_parent"."id" = "admin_changelist_child"."parent_id")
 INNER JOIN "admin_changelist_child" T3 ON ("admin_changelist_parent"."id"
 = T3."parent_id") INNER JOIN "admin_changelist_child" T4 ON
 ("admin_changelist_parent"."id" = T4."parent_id") INNER JOIN
 "admin_changelist_child" T5 ON ("admin_changelist_parent"."id" =
 T5."parent_id") INNER JOIN "admin_changelist_child" T6 ON
 ("admin_changelist_parent"."id" = T6."parent_id") INNER JOIN
 "admin_changelist_child" T7 ON ("admin_changelist_parent"."id" =
 T7."parent_id") INNER JOIN "admin_changelist_child" T8 ON
 ("admin_changelist_parent"."id" = T8."parent_id") INNER JOIN
 "admin_changelist_child" T9 ON ("admin_changelist_parent"."id" =
 T9."parent_id") INNER JOIN "admin_changelist_child" T10 ON
 ("admin_changelist_parent"."id" = T10."parent_id") INNER JOIN
 "admin_changelist_child" T11 ON ("admin_changelist_parent"."id" =
 T11."parent_id") INNER JOIN "admin_changelist_child" T12 ON
 ("admin_changelist_parent"."id" = T12."parent_id") INNER JOIN
 "admin_changelist_child" T13 ON ("admin_changelist_parent"."id" =
 T13."parent_id") INNER JOIN "admin_changelist_child" T14 ON
 ("admin_changelist_parent"."id" = T14."parent_id") INNER JOIN
 "admin_changelist_child" T15 ON ("admin_changelist_parent"."id" =
 T15."parent_id") INNER JOIN "admin_changelist_child" T16 ON
 ("admin_changelist_parent"."id" = T16."parent_id") INNER JOIN
 "admin_changelist_child" T17 ON ("admin_changelist_parent"."id" =
 T17."parent_id") INNER JOIN "admin_changelist_child" T18 ON
 ("admin_changelist_parent"."id" = T18."parent_id") INNER JOIN
 "admin_changelist_child" T19 ON ("admin_changelist_parent"."id" =
 T19."parent_id") INNER JOIN "admin_changelist_child" T20 ON
 ("admin_changelist_parent"."id" = T20."parent_id") INNER JOIN
 "admin_changelist_child" T21 ON ("admin_changelist_parent"."id" =
 T21."parent_id") INNER JOIN "admin_changelist_child" T22 ON
 ("admin_changelist_parent"."id" = T22."parent_id") INNER JOIN
 "admin_changelist_child" T23 ON ("admin_changelist_parent"."id" =
 T23."parent_id") INNER JOIN "admin_changelist_child" T24 ON
 ("admin_changelist_parent"."id" = T24."parent_id") INNER JOIN
 "admin_changelist_child" T25 ON ("admin_changelist_parent"."id" =
 T25."parent_id") INNER JOIN "admin_changelist_child" T26 ON
 ("admin_changelist_parent"."id" = T26."parent_id") INNER JOIN
 "admin_changelist_child" T27 ON ("admin_changelist_parent"."id" =
 T27."parent_id") INNER JOIN "admin_changelist_child" T28 ON
 ("admin_changelist_parent"."id" = T28."parent_id") INNER JOIN
 "admin_changelist_child" T29 ON ("admin_changelist_parent"."id" =
 T29."parent_id") INNER JOIN "admin_changelist_child" T30 ON
 ("admin_changelist_parent"."id" = T30."parent_id") INNER JOIN
 "admin_changelist_child" T31 ON ("admin_changelist_parent"."id" =
 T31."parent_id") INNER JOIN "admin_changelist_child" T32 ON
 ("admin_changelist_parent"."id" = T32."parent_id") INNER JOIN
 "admin_changelist_child" T33 ON ("admin_changelist_parent"."id" =
 T33."parent_id") INNER JOIN "admin_changelist_child" T34 ON
 ("admin_changelist_parent"."id" = T34."parent_id") INNER JOIN
 "admin_changelist_child" T35 ON ("admin_changelist_parent"."id" =
 T35."parent_id") INNER JOIN "admin_changelist_child" T36 ON
 ("admin_changelist_parent"."id" = T36."parent_id") INNER JOIN
 "admin_changelist_child" T37 ON ("admin_changelist_parent"."id" =
 T37."parent_id") INNER JOIN "admin_changelist_child" T38 ON
 ("admin_changelist_parent"."id" = T38."parent_id") INNER JOIN
 "admin_changelist_child" T39 ON ("admin_changelist_parent"."id" =
 T39."parent_id") INNER JOIN "admin_changelist_child" T40 ON
 ("admin_changelist_parent"."id" = T40."parent_id") INNER JOIN
 "admin_changelist_child" T41 ON ("admin_changelist_parent"."id" =
 T41."parent_id") INNER JOIN "admin_changelist_child" T42 ON
 ("admin_changelist_parent"."id" = T42."parent_id") INNER JOIN
 "admin_changelist_child" T43 ON ("admin_changelist_parent"."id" =
 T43."parent_id") INNER JOIN "admin_changelist_child" T44 ON
 ("admin_changelist_parent"."id" = T44."parent_id") INNER JOIN
 "admin_changelist_child" T45 ON ("admin_changelist_parent"."id" =
 T45."parent_id") INNER JOIN "admin_changelist_child" T46 ON
 ("admin_changelist_parent"."id" = T46."parent_id") INNER JOIN
 "admin_changelist_child" T47 ON ("admin_changelist_parent"."id" =
 T47."parent_id") INNER JOIN "admin_changelist_child" T48 ON
 ("admin_changelist_parent"."id" = T48."parent_id") INNER JOIN
 "admin_changelist_child" T49 ON ("admin_changelist_parent"."id" =
 T49."parent_id") INNER JOIN "admin_changelist_child" T50 ON
 ("admin_changelist_parent"."id" = T50."parent_id") INNER JOIN
 "admin_changelist_child" T51 ON ("admin_changelist_parent"."id" =
 T51."parent_id") INNER JOIN "admin_changelist_child" T52 ON
 ("admin_changelist_parent"."id" = T52."parent_id") INNER JOIN
 "admin_changelist_child" T53 ON ("admin_changelist_parent"."id" =
 T53."parent_id") INNER JOIN "admin_changelist_child" T54 ON
 ("admin_changelist_parent"."id" = T54."parent_id") INNER JOIN
 "admin_changelist_child" T55 ON ("admin_changelist_parent"."id" =
 T55."parent_id") INNER JOIN "admin_changelist_child" T56 ON
 ("admin_changelist_parent"."id" = T56."parent_id") INNER JOIN
 "admin_changelist_child" T57 ON ("admin_changelist_parent"."id" =
 T57."parent_id") INNER JOIN "admin_changelist_child" T58 ON
 ("admin_changelist_parent"."id" = T58."parent_id") INNER JOIN
 "admin_changelist_child" T59 ON ("admin_changelist_parent"."id" =
 T59."parent_id") INNER JOIN "admin_changelist_child" T60 ON
 ("admin_changelist_parent"."id" = T60."parent_id") INNER JOIN
 "admin_changelist_child" T61 ON ("admin_changelist_parent"."id" =
 T61."parent_id") INNER JOIN "admin_changelist_child" T62 ON
 ("admin_changelist_parent"."id" = T62."parent_id") INNER JOIN
 "admin_changelist_child" T63 ON ("admin_changelist_parent"."id" =
 T63."parent_id") INNER JOIN "admin_changelist_child" T64 ON
 ("admin_changelist_parent"."id" = T64."parent_id") INNER JOIN
 "admin_changelist_child" T65 ON ("admin_changelist_parent"."id" =
 T65."parent_id") INNER JOIN "admin_changelist_child" T66 ON
 ("admin_changelist_parent"."id" = T66."parent_id") INNER JOIN
 "admin_changelist_child" T67 ON ("admin_changelist_parent"."id" =
 T67."parent_id") INNER JOIN "admin_changelist_child" T68 ON
 ("admin_changelist_parent"."id" = T68."parent_id") INNER JOIN
 "admin_changelist_child" T69 ON ("admin_changelist_parent"."id" =
 T69."parent_id") INNER JOIN "admin_changelist_child" T70 ON
 ("admin_changelist_parent"."id" = T70."parent_id") INNER JOIN
 "admin_changelist_child" T71 ON ("admin_changelist_parent"."id" =
 T71."parent_id") INNER JOIN "admin_changelist_child" T72 ON
 ("admin_changelist_parent"."id" = T72."parent_id") INNER JOIN
 "admin_changelist_child" T73 ON ("admin_changelist_parent"."id" =
 T73."parent_id") INNER JOIN "admin_changelist_child" T74 ON
 ("admin_changelist_parent"."id" = T74."parent_id") INNER JOIN
 "admin_changelist_child" T75 ON ("admin_changelist_parent"."id" =
 T75."parent_id") INNER JOIN "admin_changelist_child" T76 ON
 ("admin_changelist_parent"."id" = T76."parent_id") INNER JOIN
 "admin_changelist_child" T77 ON ("admin_changelist_parent"."id" =
 T77."parent_id") INNER JOIN "admin_changelist_child" T78 ON
 ("admin_changelist_parent"."id" = T78."parent_id") INNER JOIN
 "admin_changelist_child" T79 ON ("admin_changelist_parent"."id" =
 T79."parent_id") INNER JOIN "admin_changelist_child" T80 ON
 ("admin_changelist_parent"."id" = T80."parent_id") INNER JOIN
 "admin_changelist_child" T81 ON ("admin_changelist_parent"."id" =
 T81."parent_id") INNER JOIN "admin_changelist_child" T82 ON
 ("admin_changelist_parent"."id" = T82."parent_id") INNER JOIN
 "admin_changelist_child" T83 ON ("admin_changelist_parent"."id" =
 T83."parent_id") INNER JOIN "admin_changelist_child" T84 ON
 ("admin_changelist_parent"."id" = T84."parent_id") INNER JOIN
 "admin_changelist_child" T85 ON ("admin_changelist_parent"."id" =
 T85."parent_id") INNER JOIN "admin_changelist_child" T86 ON
 ("admin_changelist_parent"."id" = T86."parent_id") INNER JOIN
 "admin_changelist_child" T87 ON ("admin_changelist_parent"."id" =
 T87."parent_id") INNER JOIN "admin_changelist_child" T88 ON
 ("admin_changelist_parent"."id" = T88."parent_id") INNER JOIN
 "admin_changelist_child" T89 ON ("admin_changelist_parent"."id" =
 T89."parent_id") INNER JOIN "admin_changelist_child" T90 ON
 ("admin_changelist_parent"."id" = T90."parent_id") INNER JOIN
 "admin_changelist_child" T91 ON ("admin_changelist_parent"."id" =
 T91."parent_id") INNER JOIN "admin_changelist_child" T92 ON
 ("admin_changelist_parent"."id" = T92."parent_id") INNER JOIN
 "admin_changelist_child" T93 ON ("admin_changelist_parent"."id" =
 T93."parent_id") INNER JOIN "admin_changelist_child" T94 ON
 ("admin_changelist_parent"."id" = T94."parent_id") INNER JOIN
 "admin_changelist_child" T95 ON ("admin_changelist_parent"."id" =
 T95."parent_id") INNER JOIN "admin_changelist_child" T96 ON
 ("admin_changelist_parent"."id" = T96."parent_id") INNER JOIN
 "admin_changelist_child" T97 ON ("admin_changelist_parent"."id" =
 T97."parent_id") INNER JOIN "admin_changelist_child" T98 ON
 ("admin_changelist_parent"."id" = T98."parent_id") INNER JOIN
 "admin_changelist_child" T99 ON ("admin_changelist_parent"."id" =
 T99."parent_id") INNER JOIN "admin_changelist_child" T100 ON
 ("admin_changelist_parent"."id" = T100."parent_id") INNER JOIN
 "admin_changelist_child" T101 ON ("admin_changelist_parent"."id" =
 T101."parent_id") WHERE ("admin_changelist_child"."name" LIKE ? ESCAPE '\'
 AND T3."name" LIKE ? ESCAPE '\' AND T4."name" LIKE ? ESCAPE '\' AND
 T5."name" LIKE ? ESCAPE '\' AND T6."name" LIKE ? ESCAPE '\' AND T7."name"
 LIKE ? ESCAPE '\' AND T8."name" LIKE ? ESCAPE '\' AND T9."name" LIKE ?
 ESCAPE '\' AND T10."name" LIKE ? ESCAPE '\' AND T11."name" LIKE ? ESCAPE
 '\' AND T12."name" LIKE ? ESCAPE '\' AND T13."name" LIKE ? ESCAPE '\' AND
 T14."name" LIKE ? ESCAPE '\' AND T15."name" LIKE ? ESCAPE '\' AND
 T16."name" LIKE ? ESCAPE '\' AND T17."name" LIKE ? ESCAPE '\' AND
 T18."name" LIKE ? ESCAPE '\' AND T19."name" LIKE ? ESCAPE '\' AND
 T20."name" LIKE ? ESCAPE '\' AND T21."name" LIKE ? ESCAPE '\' AND
 T22."name" LIKE ? ESCAPE '\' AND T23."name" LIKE ? ESCAPE '\' AND
 T24."name" LIKE ? ESCAPE '\' AND T25."name" LIKE ? ESCAPE '\' AND
 T26."name" LIKE ? ESCAPE '\' AND T27."name" LIKE ? ESCAPE '\' AND
 T28."name" LIKE ? ESCAPE '\' AND T29."name" LIKE ? ESCAPE '\' AND
 T30."name" LIKE ? ESCAPE '\' AND T31."name" LIKE ? ESCAPE '\' AND
 T32."name" LIKE ? ESCAPE '\' AND T33."name" LIKE ? ESCAPE '\' AND
 T34."name" LIKE ? ESCAPE '\' AND T35."name" LIKE ? ESCAPE '\' AND
 T36."name" LIKE ? ESCAPE '\' AND T37."name" LIKE ? ESCAPE '\' AND
 T38."name" LIKE ? ESCAPE '\' AND T39."name" LIKE ? ESCAPE '\' AND
 T40."name" LIKE ? ESCAPE '\' AND T41."name" LIKE ? ESCAPE '\' AND
 T42."name" LIKE ? ESCAPE '\' AND T43."name" LIKE ? ESCAPE '\' AND
 T44."name" LIKE ? ESCAPE '\' AND T45."name" LIKE ? ESCAPE '\' AND
 T46."name" LIKE ? ESCAPE '\' AND T47."name" LIKE ? ESCAPE '\' AND
 T48."name" LIKE ? ESCAPE '\' AND T49."name" LIKE ? ESCAPE '\' AND
 T50."name" LIKE ? ESCAPE '\' AND T51."name" LIKE ? ESCAPE '\' AND
 T52."name" LIKE ? ESCAPE '\' AND T53."name" LIKE ? ESCAPE '\' AND
 T54."name" LIKE ? ESCAPE '\' AND T55."name" LIKE ? ESCAPE '\' AND
 T56."name" LIKE ? ESCAPE '\' AND T57."name" LIKE ? ESCAPE '\' AND
 T58."name" LIKE ? ESCAPE '\' AND T59."name" LIKE ? ESCAPE '\' AND
 T60."name" LIKE ? ESCAPE '\' AND T61."name" LIKE ? ESCAPE '\' AND
 T62."name" LIKE ? ESCAPE '\' AND T63."name" LIKE ? ESCAPE '\' AND
 T64."name" LIKE ? ESCAPE '\' AND T65."name" LIKE ? ESCAPE '\' AND
 T66."name" LIKE ? ESCAPE '\' AND T67."name" LIKE ? ESCAPE '\' AND
 T68."name" LIKE ? ESCAPE '\' AND T69."name" LIKE ? ESCAPE '\' AND
 T70."name" LIKE ? ESCAPE '\' AND T71."name" LIKE ? ESCAPE '\' AND
 T72."name" LIKE ? ESCAPE '\' AND T73."name" LIKE ? ESCAPE '\' AND
 T74."name" LIKE ? ESCAPE '\' AND T75."name" LIKE ? ESCAPE '\' AND
 T76."name" LIKE ? ESCAPE '\' AND T77."name" LIKE ? ESCAPE '\' AND
 T78."name" LIKE ? ESCAPE '\' AND T79."name" LIKE ? ESCAPE '\' AND
 T80."name" LIKE ? ESCAPE '\' AND T81."name" LIKE ? ESCAPE '\' AND
 T82."name" LIKE ? ESCAPE '\' AND T83."name" LIKE ? ESCAPE '\' AND
 T84."name" LIKE ? ESCAPE '\' AND T85."name" LIKE ? ESCAPE '\' AND
 T86."name" LIKE ? ESCAPE '\' AND T87."name" LIKE ? ESCAPE '\' AND
 T88."name" LIKE ? ESCAPE '\' AND T89."name" LIKE ? ESCAPE '\' AND
 T90."name" LIKE ? ESCAPE '\' AND T91."name" LIKE ? ESCAPE '\' AND
 T92."name" LIKE ? ESCAPE '\' AND T93."name" LIKE ? ESCAPE '\' AND
 T94."name" LIKE ? ESCAPE '\' AND T95."name" LIKE ? ESCAPE '\' AND
 T96."name" LIKE ? ESCAPE '\' AND T97."name" LIKE ? ESCAPE '\' AND
 T98."name" LIKE ? ESCAPE '\' AND T99."name" LIKE ? ESCAPE '\' AND
 T100."name" LIKE ? ESCAPE '\' AND T101."name" LIKE ? ESCAPE '\')) subquery
 ('%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%', '%daniel%',
 '%daniel%', '%daniel%', '%daniel%', '%daniel%')
 }}}

 Obviously, a bit more hilarious when it is the same word over and over
 again.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/27864#comment:8>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/071.3b4c0c040ac4e6b9e578be47474a76e9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to