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 -> table_name mapping
  Arguments:
      alias (str): name of alias
      table_name (str): name of the table
docstr_tok: ["Add","a","alias","-",">","table_name","mapping","Arguments",":","alias","(","str",")",":","name","of","alias","table_name","(","str",")",":","name","of","the","table"]
code: def add_table_alias(
      self, alias: str, database_name: str, table_name: str
  ):
      """
      Add a alias -> table_name mapping
      Arguments:
          alias (str): name of alias
          table_name (str): name of the table
      """
      self._check_duplicate_alias(alias)
  
      if database_name is not None:
          check_data_source_and_table_are_valid(
              self._catalog(), database_name, table_name
          )
  
          db_catalog_entry = self._catalog().get_database_catalog_entry(
              database_name
          )
          with get_database_handler(
              db_catalog_entry.engine, **db_catalog_entry.params
          ) as handler:
              # Assemble columns.
              response = handler.get_columns(table_name)
              if response.error is not None:
                  raise BinderError(response.error)
              column_df = response.data
              table_obj = create_table_catalog_entry_for_data_source(
                  table_name, database_name, column_df
              )
      else:
          table_obj = self._catalog().get_table_catalog_entry(
              table_name
          )
  
      self._table_alias_map[alias] = table_obj
  
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 3 for calling the StatementBinderContext obj's underlying member method code with example usage: obj.add_table_alias(alias, database_name, table_name) without return types