code: def exec(self, *args, **kwargs):
      # Check if database already exists.
      db_catalog_entry = self.catalog().get_database_catalog_entry(
          self.node.database_name
      )
  
      if db_catalog_entry is not None:
          if self.node.if_not_exists:
              msg = f"{self.node.database_name} already exists, nothing added."
              yield Batch(pd.DataFrame([msg]))
              return
          else:
              raise ExecutorError(
                  f"{self.node.database_name} already exists."
              )
  
      logger.debug(
          f"Trying to connect to the provided engine {self.node.engine} with params {self.node.param_dict}"
      )
  
      # Check the validity of database entry.
      with get_database_handler(
          self.node.engine, **self.node.param_dict
      ):
          pass
  
      logger.debug(f"Creating database {self.node}")
      self.catalog().insert_database_catalog_entry(
          self.node.database_name,
          self.node.engine,
          self.node.param_dict,
      )
  
      yield Batch(
          pd.DataFrame(
              [
                  f"The database {self.node.database_name} has been successfully created."
              ]
          )
      )
  
file_path: evadb/evadb/executor/create_database_executor.py
imports: import pandas
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import ExecutorError
  from evadb.models.storage.batch import Batch
  from evadb.parser.create_statement import CreateDatabaseStatement
  from evadb.third_party.databases.interface import get_database_handler
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 2 for calling the CreateDatabaseExecutor obj's underlying member method code with example usage: obj.exec() without return types