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 |