code: def _get_tables(self, query: ASTNode = None):
      columns = self.information_schema["TABLES"]
  
      target_table = None
      if (
          type(query) == Select
          and type(query.where) == BinaryOperation
          and query.where.op == "and"
      ):
          for arg in query.where.args:
              if (
                  type(arg) == BinaryOperation
                  and arg.op == "="
                  and type(arg.args[0]) == Identifier
                  and arg.args[0].parts[-1].upper() == "TABLE_SCHEMA"
                  and type(arg.args[1]) == Constant
              ):
                  target_table = arg.args[1].value
                  break
  
      data = []
      for name in self.information_schema.keys():
          if target_table is not None and target_table != name:
              continue
          row = TablesRow(
              TABLE_TYPE=TABLES_ROW_TYPE.SYSTEM_VIEW, TABLE_NAME=name
          )
          data.append(row.to_list())
  
      for ds_name, ds in self.persis_datanodes.items():
          if target_table is not None and target_table != ds_name:
              continue
          ds_tables = ds.get_tables()
          if len(ds_tables) == 0:
              continue
          elif isinstance(ds_tables[0], dict):
              ds_tables = [
                  TablesRow(
                      TABLE_TYPE=TABLES_ROW_TYPE.BASE_TABLE,
                      TABLE_NAME=x["name"],
                  )
                  for x in ds_tables
              ]
          elif (
              isinstance(ds_tables, list)
              and len(ds_tables) > 0
              and isinstance(ds_tables[0], str)
          ):
              ds_tables = [
                  TablesRow(
                      TABLE_TYPE=TABLES_ROW_TYPE.BASE_TABLE,
                      TABLE_NAME=x,
                  )
                  for x in ds_tables
              ]
          for row in ds_tables:
              row.TABLE_SCHEMA = ds_name
              data.append(row.to_list())
  
      for ds_name in self.get_integrations_names():
          if target_table is not None and target_table != ds_name:
              continue
          try:
              ds = self.get(ds_name)
              ds_tables = ds.get_tables()
              for row in ds_tables:
                  row.TABLE_SCHEMA = ds_name
                  data.append(row.to_list())
          except Exception:
              logger.error(f"Can't get tables from '{ds_name}'")
  
      for project_name in self.get_projects_names():
          if target_table is not None and target_table != project_name:
              continue
          project_dn = self.get(project_name)
          project_tables = project_dn.get_tables()
          for row in project_tables:
              row.TABLE_SCHEMA = project_name
              data.append(row.to_list())
  
      df = pd.DataFrame(data, columns=columns)
      return df
  
imports: from functools import partial
  import pandas
  from mindsdb_sql.parser.ast import BinaryOperation, Constant, Identifier, Select, Join, Union, Insert, Delete
  from mindsdb_sql.parser.ast.base import ASTNode
  from mindsdb.api.executor.datahub.classes.tables_row import TABLES_ROW_TYPE, TablesRow
  from mindsdb.api.executor.datahub.datanodes.datanode import DataNode
  from mindsdb.api.executor.datahub.datanodes.integration_datanode import IntegrationDataNode
  from mindsdb.api.executor.datahub.datanodes.project_datanode import ProjectDataNode
  from mindsdb.api.executor import exceptions
  from mindsdb.api.executor.utilities.sql import query_df
  from mindsdb.interfaces.agents.agents_controller import AgentsController
  from mindsdb.interfaces.database.projects import ProjectController
  from mindsdb.interfaces.jobs.jobs_controller import JobsController
  from mindsdb.interfaces.skills.skills_controller import SkillsController
  from mindsdb.utilities import log
label_desc: Use image node_id 10 for calling the InformationSchemaDataNode obj's underlying member method code with example usage: obj._get_tables(query) and returns: df