MCPcopy Create free account
hub / github.com/sqlalchemy/sqlalchemy / _render_cte_clause

Method _render_cte_clause

lib/sqlalchemy/sql/compiler.py:5166–5217  ·  view source on GitHub ↗

include_following_stack Also render the nesting CTEs on the next stack. Useful for SQL structures like UNION or INSERT that can wrap SELECT statements containing nesting CTEs.

(
        self,
        nesting_level=None,
        include_following_stack=False,
    )

Source from the content-addressed store, hash-verified

5164 return clause
5165
5166 def _render_cte_clause(
5167 self,
5168 nesting_level=None,
5169 include_following_stack=False,
5170 ):
5171 """
5172 include_following_stack
5173 Also render the nesting CTEs on the next stack. Useful for
5174 SQL structures like UNION or INSERT that can wrap SELECT
5175 statements containing nesting CTEs.
5176 """
5177 if not self.ctes:
5178 return ""
5179
5180 ctes: MutableMapping[CTE, str]
5181
5182 if nesting_level and nesting_level > 1:
5183 ctes = util.OrderedDict()
5184 for cte in list(self.ctes.keys()):
5185 cte_level, cte_name, cte_opts = self.level_name_by_cte[
5186 cte._get_reference_cte()
5187 ]
5188 nesting = cte.nesting or cte_opts.nesting
5189 is_rendered_level = cte_level == nesting_level or (
5190 include_following_stack and cte_level == nesting_level + 1
5191 )
5192 if not (nesting and is_rendered_level):
5193 continue
5194
5195 ctes[cte] = self.ctes[cte]
5196
5197 else:
5198 ctes = self.ctes
5199
5200 if not ctes:
5201 return ""
5202 ctes_recursive = any([cte.recursive for cte in ctes])
5203
5204 cte_text = self.get_cte_preamble(ctes_recursive) + " "
5205 cte_text += ", \n".join([txt for txt in ctes.values()])
5206 cte_text += "\n "
5207
5208 if nesting_level and nesting_level > 1:
5209 for cte in list(ctes.keys()):
5210 cte_level, cte_name, cte_opts = self.level_name_by_cte[
5211 cte._get_reference_cte()
5212 ]
5213 del self.ctes[cte]
5214 del self.ctes_by_level_name[(cte_level, cte_name)]
5215 del self.level_name_by_cte[cte._get_reference_cte()]
5216
5217 return cte_text
5218
5219 def get_cte_preamble(self, recursive):
5220 if recursive:

Callers 6

visit_textual_selectMethod · 0.95
visit_compound_selectMethod · 0.95
visit_selectMethod · 0.95
visit_insertMethod · 0.95
visit_updateMethod · 0.95
visit_deleteMethod · 0.95

Calls 5

get_cte_preambleMethod · 0.95
_get_reference_cteMethod · 0.80
keysMethod · 0.45
joinMethod · 0.45
valuesMethod · 0.45

Tested by

no test coverage detected