code: def test_hash_join_with_multiple_tables(self):
      select_query = """SELECT * FROM table1 JOIN table2
                            ON table2.a0 = table1.a0 JOIN table3
                            ON table3.a1 = table1.a1 WHERE table1.a2 > 50;"""
      actual_batch = execute_query_fetch_all(self.evadb, select_query)
      tmp = pd.merge(
          self.table1,
          self.table2,
          left_on=["table1.a0"],
          right_on=["table2.a0"],
          how="inner",
      )
      expected = pd.merge(
          tmp,
          self.table3,
          left_on=["table1.a1"],
          right_on=["table3.a1"],
          how="inner",
      )
      expected = expected.where(expected["table1.a2"] > 50)
      if len(expected):
          expected_batch = Batch(expected)
          self.assertEqual(
              expected_batch.sort_orderby(["table1.a0"]),
              actual_batch.sort_orderby(["table1.a0"]),
          )
  
imports: import unittest
  from test.util import create_dummy_batches, create_sample_video, create_table, file_remove, get_evadb_for_testing, load_functions_for_testing, shutdown_ray
  import numpy
  import pandas
  import pytest
  from evadb.configuration.constants import EvaDB_ROOT_DIR
  from evadb.models.storage.batch import Batch
  from evadb.readers.decord_reader import DecordReader
  from evadb.server.command_handler import execute_query_fetch_all
label_desc: Use image node_id 13 for calling the SelectExecutorTest obj's underlying member method code with example usage: obj.test_hash_join_with_multiple_tables() without return types