sqlite - django.db.utils.OperationalError: parser stack overflow -


i have re-usable django application should support python2.7, python 3.x , pypy. developed in python 2.7 @ beginning , of tests worked well. made them worked in python3.3 too. have problem python3.4, pypy, pypy3;

django.db.utils.operationalerror: parser stack overflow 

my tests run on sqlite3. check trace, guess query size. couldn't find solution solve problem.

i overrided builtin sqlite3 code in python3.4 environment pring sql, raise error for. big sql. it doesn't matter, don't need check sql, post in here show how big. can bigger that. because queryset building on runtime in loop.

by way, told before, there no problem python2.7 , python3.3. problem raises others.

are there configuration handle this?

here sql:

select "river_approvement". "id", "river_approvement". "content_type_id", "river_approvement". "object_id", "river_approvement". "field", "river_approvement". "meta_id", "river_approvement". "transactioner_id", "river_approvement". "transaction_date", "river_approvement". "status", "river_approvement". "skip", "river_approvement". "order", "river_approvement". "enabled" "river_approvement" inner join "river_approvementmeta" on("river_approvement".     "meta_id" = "river_approvementmeta".     "id") inner join "river_transition" on("river_approvementmeta".     "transition_id" = "river_transition".     "id") where("river_approvement".     "field" = ? , "river_transition".     "source_state_id"     in(select ab0.         "id"         "river_state"         ab0 ab0.         "id"         in(select aa2.             "destination_state_id"             "river_approvement"             aa0 inner join "river_approvementmeta"             aa1 on(aa0.                 "meta_id" = aa1.                 "id") inner join "river_transition"             aa2 on(aa1.                 "transition_id" = aa2.                 "id") where(aa0.                 "field" = ? , aa2.                 "source_state_id"                 in(select z0.                     "id"                     "river_state"                     z0 z0.                     "id"                     in(select y2.                         "destination_state_id"                         "river_approvement"                         y0 inner join "river_approvementmeta"                         y1 on(y0.                             "meta_id" = y1.                             "id") inner join "river_transition"                         y2 on(y1.                             "transition_id" = y2.                             "id") where(y0.                             "field" = ? , y2.                             "source_state_id"                             in(select x0.                                 "id"                                 "river_state"                                 x0 x0.                                 "id"                                 in(select w2.                                     "destination_state_id"                                     "river_approvement"                                     w0 inner join "river_approvementmeta"                                     w1 on(w0.                                         "meta_id" = w1.                                         "id") inner join "river_transition"                                     w2 on(w1.                                         "transition_id" = w2.                                         "id") where(w0.                                         "field" = ? , w2.                                         "source_state_id"                                         in(select v0.                                             "id"                                             "river_state"                                             v0 v0.                                             "id"                                             in(select u2.                                                 "destination_state_id"                                                 "river_approvement"                                                 u0 inner join "river_approvementmeta"                                                 u1 on(u0.                                                     "meta_id" = u1.                                                     "id") inner join "river_transition"                                                 u2 on(u1.                                                     "transition_id" = u2.                                                     "id") where(u0.                                                     "field" = ? , u2.                                                     "source_state_id"                                                     in( ? ) , u0.                                                     "object_id" = ? , u0.                                                     "content_type_id" = ? ))) , w0.                                         "object_id" = ? , w0.                                         "content_type_id" = ? ))) , y0.                             "object_id" = ? , y0.                             "content_type_id" = ? ))) , aa0.                 "object_id" = ? , aa0.                 "content_type_id" = ? ))) , "river_approvement".     "object_id" = ? , "river_approvement".     "content_type_id" = ? ) 

the default sqlite3 parser stack size 100 lexical items. think "it beyond ability of human comprehend". see many nested levels in example: 15 parenheses, 9 "select", 9 "where", 9 "in", 5 "and". minimum of necessary terms can imagine on stack possible parser gramatics. maybe joins or invisible counted into, size 100 makes sense. sqlite3 can recompiled option yystackdepth=-1 or big positive number (-1 dynamic depth stack starting 100 , doubled everytimes), not solution reusable public application.

it can improved little moving complicated terms (sub-select) before and first term of boolean expression. can done by:

mymodel.objects. \     filter(meta__transition__destination_state_id__in=          mymodel.objects.filter(...)     ).filter(field=...) 

it can improve stack size little 5 "and" in 100 items.

you probaby use filter expression more conditions in 1 filter: filter(field_1=value_1, field_2=value_2) same filter(**{'field_1': value_1, 'field_2': value_2}). order of items in dictionary depends on implementation of hash function in respective cpython version or on implemetation details of dictionary on pypy. why exception may raised python versions. if add complicated additional subselect, every python must raise exception.

the result sql used django queryset can examined without running it:

print(my_complicated_queryset.query.get_compiler('default').as_sql()) 

'default' connection alias name in settings.databases.


Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -