code: def _assert_columns_equal(actual_cols, expected_cols) -> None:
      """
      Assert equality of the given cols, bearing in mind sqlalchemy type
      instances can't be compared for equality, so will have to be converted to
      strings first.
      """
      actual = copy.deepcopy(actual_cols)
      expected = copy.deepcopy(expected_cols)
  
      for col in actual:
          col["type"] = str(col["type"])
  
      for col in expected:
          col["type"] = str(col["type"])
  
      assert actual == expected
  
imports: import copy
  import json
  from datetime import datetime
  from typing import Any, Optional
  from unittest.mock import Mock, patch
  import pandas
  import pytest
  from pytest_mock import MockerFixture
  from sqlalchemy import types
  from trino.sqlalchemy import datatype
  import superset.config
  from superset.constants import QUERY_CANCEL_KEY, QUERY_EARLY_CANCEL_KEY, USER_AGENT
  from superset.superset_typing import ResultSetColumnType, SQLAColumnType
  from superset.utils.core import GenericDataType
  from tests.unit_tests.db_engine_specs.utils import assert_column_spec, assert_convert_dttm
  from tests.unit_tests.fixtures.common import dttm
label_desc: Use image node_id 1 for calling a global function with example usage: _assert_columns_equal(actual_cols, expected_cols) without return types