class_docstr: This context is used to store information that is useful during the process of binding a statement (such as a SELECT statement) to the catalog. It stores the following information:
  
  Args:
      `_table_alias_map`: Maintains a mapping from table_alias to corresponding
      catalog table entry
      `_derived_table_alias_map`: Maintains a mapping from derived table aliases,
      such as subqueries or function expressions, to column alias maps for all the
      corresponding projected columns. For example, in the following queries, the
      `_derived_table_alias_map` attribute would contain:
  
      `Select * FROM (SELECT id1, id2 FROM table) AS A` :
          `{A: {id1: table.col1, id2: table.col2}}`
      `Select * FROM video LATERAL JOIN func AS T(a, b)` :
          `{T: {a: func.obj1, b:func.obj2}}`
docstr: Add a alias -> derived table column mapping
  Arguments:
      alias (str): name of alias
      target_list: list of TupleValueExpression or FunctionExpression or FunctionIOCatalogEntry
docstr_tok: ["Add","a","alias","-",">","derived","table","column","mapping","Arguments",":","alias","(","str",")",":","name","of","alias","target_list",":","list","of","TupleValueExpression","or","FunctionExpression","or","FunctionIOCatalogEntry"]
code: def add_derived_table_alias(
      self,
      alias: str,
      target_list: List[
          Union[
              TupleValueExpression,
              FunctionExpression,
              FunctionIOCatalogEntry,
          ]
      ],
  ):
      """
      Add a alias -> derived table column mapping
      Arguments:
          alias (str): name of alias
          target_list: list of TupleValueExpression or FunctionExpression or FunctionIOCatalogEntry
      """
      self._check_duplicate_alias(alias)
      col_alias_map = {}
      for expr in target_list:
          if isinstance(expr, FunctionExpression):
              for obj in expr.output_objs:
                  col_alias_map[obj.name] = obj
          elif isinstance(expr, TupleValueExpression):
              col_alias_map[expr.name] = expr.col_object
          else:
              continue
  
      self._derived_table_alias_map[alias] = col_alias_map
  
imports: from typing import Callable, Dict, List, Tuple, Union
  from thefuzz import process
  from evadb.binder.binder_utils import BinderError, check_data_source_and_table_are_valid, create_table_catalog_entry_for_data_source
  from evadb.catalog.catalog_type import TableType
  from evadb.catalog.models.column_catalog import ColumnCatalogEntry
  from evadb.catalog.models.function_io_catalog import FunctionIOCatalogEntry
  from evadb.catalog.models.table_catalog import TableCatalogEntry
  from evadb.expression.function_expression import FunctionExpression
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.third_party.databases.interface import get_database_handler
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 4 for calling the StatementBinderContext obj's underlying member method code with example usage: obj.add_derived_table_alias(alias, target_list) without return types