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