server/sources/rql2sql.py
changeset 10475 a1e8dbb7215b
parent 9543 39f981482e34
child 10522 1660a0fa4f43
equal deleted inserted replaced
10474:1dcc52f5e340 10475:a1e8dbb7215b
   395     def iter_exists_sols(self, exists):
   395     def iter_exists_sols(self, exists):
   396         if not exists in self.existssols:
   396         if not exists in self.existssols:
   397             yield 1
   397             yield 1
   398             return
   398             return
   399         thisexistssols, thisexistsvars = self.existssols[exists]
   399         thisexistssols, thisexistsvars = self.existssols[exists]
       
   400         notdone_outside_vars = set()
   400         # when iterating other solutions inner to an EXISTS subquery, we should
   401         # when iterating other solutions inner to an EXISTS subquery, we should
   401         # reset variables which have this exists node as scope at each iteration
   402         # reset variables which have this exists node as scope at each iteration
   402         for var in exists.stmt.defined_vars.itervalues():
   403         for var in exists.stmt.defined_vars.itervalues():
   403             if var.scope is exists:
   404             if var.scope is exists:
   404                 thisexistsvars.add(var.name)
   405                 thisexistsvars.add(var.name)
       
   406             elif var.name not in self.done:
       
   407                 notdone_outside_vars.add(var)
   405         origsol = self.solution
   408         origsol = self.solution
   406         origtables = self.tables
   409         origtables = self.tables
   407         done = self.done
   410         done = self.done
   408         for thisexistssol in thisexistssols:
   411         for thisexistssol in thisexistssols:
   409             for vname in self.unstablevars:
   412             for vname in self.unstablevars:
   415                 yield 1
   418                 yield 1
   416                 # cleanup self.done from stuff specific to exists
   419                 # cleanup self.done from stuff specific to exists
   417                 for var in thisexistsvars:
   420                 for var in thisexistsvars:
   418                     if var in done:
   421                     if var in done:
   419                         done.remove(var)
   422                         done.remove(var)
       
   423                 for var in list(notdone_outside_vars):
       
   424                     if var.name in done and var._q_sqltable in self.tables:
       
   425                         origtables[var._q_sqltable] = self.tables[var._q_sqltable]
       
   426                         notdone_outside_vars.remove(var)
   420                 for rel in exists.iget_nodes(Relation):
   427                 for rel in exists.iget_nodes(Relation):
   421                     if rel in done:
   428                     if rel in done:
   422                         done.remove(rel)
   429                         done.remove(rel)
   423         self.solution = origsol
   430         self.solution = origsol
   424         self.tables = origtables
   431         self.tables = origtables