MCPcopy
hub / github.com/sqlalchemy/sqlalchemy / _render_cte_clause

Method _render_cte_clause

lib/sqlalchemy/sql/compiler.py:5370–5421  ·  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

5368 return clause
5369
5370 def _render_cte_clause(
5371 self,
5372 nesting_level=None,
5373 include_following_stack=False,
5374 ):
5375 """
5376 include_following_stack
5377 Also render the nesting CTEs on the next stack. Useful for
5378 SQL structures like UNION or INSERT that can wrap SELECT
5379 statements containing nesting CTEs.
5380 """
5381 if not self.ctes:
5382 return ""
5383
5384 ctes: MutableMapping[CTE, str]
5385
5386 if nesting_level and nesting_level > 1:
5387 ctes = util.OrderedDict()
5388 for cte in list(self.ctes.keys()):
5389 cte_level, cte_name, cte_opts = self.level_name_by_cte[
5390 cte._get_reference_cte()
5391 ]
5392 nesting = cte.nesting or cte_opts.nesting
5393 is_rendered_level = cte_level == nesting_level or (
5394 include_following_stack and cte_level == nesting_level + 1
5395 )
5396 if not (nesting and is_rendered_level):
5397 continue
5398
5399 ctes[cte] = self.ctes[cte]
5400
5401 else:
5402 ctes = self.ctes
5403
5404 if not ctes:
5405 return ""
5406 ctes_recursive = any([cte.recursive for cte in ctes])
5407
5408 cte_text = self.get_cte_preamble(ctes_recursive) + " "
5409 cte_text += ", \n".join([txt for txt in ctes.values()])
5410 cte_text += "\n "
5411
5412 if nesting_level and nesting_level > 1:
5413 for cte in list(ctes.keys()):
5414 cte_level, cte_name, cte_opts = self.level_name_by_cte[
5415 cte._get_reference_cte()
5416 ]
5417 del self.ctes[cte]
5418 del self.ctes_by_level_name[(cte_level, cte_name)]
5419 del self.level_name_by_cte[cte._get_reference_cte()]
5420
5421 return cte_text
5422
5423 def get_cte_preamble(self, recursive):
5424 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