class_docstr: Executes functional expression which yields a table of rows
  Arguments:
      node (AbstractPlan): FunctionScanPlan
code: def exec(self, *args, **kwargs) -> Iterator[Batch]:
      assert (
          "lateral_input" in kwargs
      ), "Key lateral_input not passed to the FunctionScan"
      lateral_input = kwargs.get("lateral_input")
      if not lateral_input.empty():
          res = self.func_expr.evaluate(lateral_input)
  
          if not res.empty():
              if self.do_unnest:
                  res.unnest(res.columns)
  
              yield res
  
          # persist stats of function expression
          instrument_function_expression_cost(
              self.func_expr, self.catalog()
          )
  
file_path: evadb/evadb/executor/function_scan_executor.py
imports: from typing import Iterator
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import instrument_function_expression_cost
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.function_scan_plan import FunctionScanPlan
label_desc: Use image node_id 2 for calling the FunctionScanExecutor obj's underlying member method code with example usage: obj.exec() without return types