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,
)
| 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: |
no test coverage detected