code: def eval_agg_call(self, exp):
      "helper for eval_callx; evaluator for CallX that consume multiple rows"
      if not isinstance(self.c_row,list): raise TypeError('aggregate function expected a list of rows')
      if len(exp.args.children)!=1: raise ValueError('aggregate function expected a single value',exp.args)
      arg,=exp.args.children # intentional: error if len!=1
      vals=[Evaluator(c_r,self.nix,self.tables).eval(arg) for c_r in self.c_row]
      if not vals: return None
      if exp.f=='min': return min(vals)
      elif exp.f=='max': return max(vals)
      elif exp.f=='count': return len(vals)
      else: raise NotImplementedError('unk_func',exp.ff eval_agg_call(self, exp):
      "helper for eval_callx; evaluator for CallX that consume multiple rows"
      if not isinstance(self.c_row,list): raise TypeError('aggregate function expected a list of rows')
      if len(exp.args.children)!=1: raise ValueError('aggregate function expected a single value',exp.args)
      arg,=exp.args.children # intentional: error if len!=1
      vals=[Evaluator(c_r,self.nix,self.tables).eval(arg) for c_r in self.c_row]
      if not vals: return None
      if exp.f=='min': return min(vals)
      elif exp.f=='max': return max(vals)
      elif exp.f=='count': return len(vals)
      else: raise NotImplementedError('unk_func',exp.f)
docs: helper for eval_callx; evaluator for CallX that consume multiple rows