class_docstr: Interface for openlineage-sql.
  
  :param dialect: dialect specific to the database
  :param default_schema: schema applied to each table with no schema parsed
class_docstr_tok: ["Interface","for","openlineage-sql",".",":","param","dialect",":","dialect","specific","to","the","database",":","param","default_schema",":","schema","applied","to","each","table","with","no","schema","parsed"]
docstr: Makes sure to return a semicolon-separated SQL statements.
docstr_tok: ["Makes","sure","to","return","a","semicolon-separated","SQL","statements","."]
code: def normalize_sql(cls, sql: list[str] | str) -> str:
      """Makes sure to return a semicolon-separated SQL statements."""
      return ";\n".join(
          stmt.rstrip(" ;\r\n") for stmt in cls.split_sql_string(sql)
      )
  
imports: from __future__ import annotations
  from typing import TYPE_CHECKING, Callable
  import sqlparse
  from attrs import define
  from openlineage.client.facet import BaseFacet, ColumnLineageDatasetFacet, ColumnLineageDatasetFacetFieldsAdditional, ColumnLineageDatasetFacetFieldsAdditionalInputFields, ExtractionError, ExtractionErrorRunFacet, SqlJobFacet
  from openlineage.common.sql import DbTableMeta, SqlMeta, parse
  from airflow.providers.openlineage.extractors.base import OperatorLineage
  from airflow.providers.openlineage.utils.sql import TablesHierarchy, create_information_schema_query, get_table_schemas
  from airflow.typing_compat import TypedDict
label_desc: Use image node_id 7 for calling the SQLParser obj's underlying member method code with example usage: obj.normalize_sql(cls, sql) and returns: str