docstr: Check if a oxide parsed CTE contains only SELECT statements
  
  :param oxide_parse: parsed CTE
  :return: True if CTE is a SELECT statement
code: def _check_cte_is_select(
      self, oxide_parse: list[dict[str, Any]]
  ) -> bool:
      """
      Check if a oxide parsed CTE contains only SELECT statements
  
      :param oxide_parse: parsed CTE
      :return: True if CTE is a SELECT statement
      """
  
      def is_body_select(body: dict[str, Any]) -> bool:
          if op := body.get("SetOperation"):
              return is_body_select(op["left"]) and is_body_select(
                  op["right"]
              )
          return all(key == "Select" for key in body.keys())
  
      for query in oxide_parse:
          parsed_query = query["Query"]
          cte_tables = self._get_cte_tables(parsed_query)
          for cte_table in cte_tables:
              is_select = is_body_select(cte_table["query"]["body"])
              if not is_select:
                  return False
      return True
  
imports: import logging
  import re
  from collections.abc import Iterator
  from dataclasses import dataclass
  from typing import Any, cast, Optional
  from urllib import parse
  import sqlparse
  from sqlalchemy import and_
  from sqlparse import keywords
  from sqlparse.lexer import Lexer
  from sqlparse.sql import Identifier, IdentifierList, Parenthesis, remove_quotes, Token, TokenList, Where
  from sqlparse.tokens import Comment, CTE, DDL, DML, Keyword, Name, Punctuation, String, Whitespace, Wildcard
  from sqlparse.utils import imt
  from superset.exceptions import QueryClauseValidationException
  from superset.utils.backports import StrEnum
label_desc: Use image node_id 5 for calling the ParsedQuery obj's underlying member method code with example usage: obj._check_cte_is_select(oxide_parse) and returns: True, all, unknown, False