docstr: Execute a expr on all the rows of the relation
  
  Args:
      expr (str): sql expression
      alias (str): alias of the output of the expr
  
  Returns:
      `EvaDBQuery`: relation
  
  Examples:
  
      Runs Yolo on all the frames of the input table
  
      >>> relation = cursor.table("videos")
      >>> relation.cross_apply("Yolo(data)", "objs(labels, bboxes, scores)")
  
      Runs Yolo on all the frames of the input table and unnest each object as separate row.
  
      >>> relation.cross_apply("unnest(Yolo(data))", "obj(label, bbox, score)")
docstr_tok: ["Execute","a","expr","on","all","the","rows","of","the","relation","Args",":","expr","(","str",")",":","sql","expression","alias","(","str",")",":","alias","of","the","output","of","the","expr","Returns",":","`","EvaDBQuery","`",":","relation","Examples",":","Runs","Yolo","on","all","the","frames","of","the","input","table",">",">",">","relation","=","cursor.table","(","``","videos","''",")",">",">",">","relation.cross_apply","(","``","Yolo","(","data",")","''",",","``","objs","(","labels",",","bboxes",",","scores",")","''",")","Runs","Yolo","on","all","the","frames","of","the","input","table","and","unnest","each","object","as","separate","row",".",">",">",">","relation.cross_apply","(","``","unnest","(","Yolo","(","data",")",")","''",",","``","obj","(","label",",","bbox",",","score",")","''",")"]
code: def cross_apply(self, expr: str, alias: str) -> "EvaDBQuery":
      """Execute a expr on all the rows of the relation
  
      Args:
          expr (str): sql expression
          alias (str): alias of the output of the expr
  
      Returns:
          `EvaDBQuery`: relation
  
      Examples:
  
          Runs Yolo on all the frames of the input table
  
          >>> relation = cursor.table("videos")
          >>> relation.cross_apply("Yolo(data)", "objs(labels, bboxes, scores)")
  
          Runs Yolo on all the frames of the input table and unnest each object as separate row.
  
          >>> relation.cross_apply("unnest(Yolo(data))", "obj(label, bbox, score)")
      """
      assert self._query_node.from_table is not None
  
      table_ref = string_to_lateral_join(expr, alias=alias)
      join_table = TableRef(
          JoinNode(
              TableRef(self._query_node, alias=self._alias),
              table_ref,
              join_type=JoinType.LATERAL_JOIN,
          )
      )
      self._query_node = SelectStatement(
          target_list=create_star_expression(), from_table=join_table
      )
      # reset the alias as after join there isn't a single alias
      self._alias = Alias("Relation")
      try_binding(self._evadb.catalog, self._query_node)
      return self
  
imports: from typing import Union
  import pandas
  from evadb.database import EvaDBDatabase
  from evadb.interfaces.relational.utils import create_limit_expression, create_star_expression, handle_select_clause, sql_predicate_to_expresssion_tree, sql_string_to_expresssion_list, string_to_lateral_join, try_binding
  from evadb.models.storage.batch import Batch
  from evadb.parser.alias import Alias
  from evadb.parser.select_statement import SelectStatement
  from evadb.parser.statement import AbstractStatement
  from evadb.parser.table_ref import JoinNode, TableRef
  from evadb.parser.types import JoinType
  from evadb.parser.utils import parse_sql_orderby_expr
  from evadb.server.command_handler import execute_statement
label_desc: Use image node_id 3 for calling the EvaDBQuery obj's underlying member method code with example usage: obj.cross_apply(expr, alias) and returns: self