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

Method visit_cte

lib/sqlalchemy/sql/compiler.py:4055–4269  ·  view source on GitHub ↗
(
        self,
        cte: CTE,
        asfrom: bool = False,
        ashint: bool = False,
        fromhints: Optional[_FromHintsType] = None,
        visiting_cte: Optional[CTE] = None,
        from_linter: Optional[FromLinter] = None,
        cte_opts: selectable._CTEOpts = selectable._CTEOpts(False),
        **kwargs: Any,
    )

Source from the content-addressed store, hash-verified

4053 cte._compiler_dispatch(self, cte_opts=opt, **local_kw)
4054
4055 def visit_cte(
4056 self,
4057 cte: CTE,
4058 asfrom: bool = False,
4059 ashint: bool = False,
4060 fromhints: Optional[_FromHintsType] = None,
4061 visiting_cte: Optional[CTE] = None,
4062 from_linter: Optional[FromLinter] = None,
4063 cte_opts: selectable._CTEOpts = selectable._CTEOpts(False),
4064 **kwargs: Any,
4065 ) -> Optional[str]:
4066 self_ctes = self._init_cte_state()
4067 assert self_ctes is self.ctes
4068
4069 kwargs["visiting_cte"] = cte
4070
4071 cte_name = cte.name
4072
4073 if isinstance(cte_name, elements._truncated_label):
4074 cte_name = self._truncated_identifier("alias", cte_name)
4075
4076 is_new_cte = True
4077 embedded_in_current_named_cte = False
4078
4079 _reference_cte = cte._get_reference_cte()
4080
4081 nesting = cte.nesting or cte_opts.nesting
4082
4083 # check for CTE already encountered
4084 if _reference_cte in self.level_name_by_cte:
4085 cte_level, _, existing_cte_opts = self.level_name_by_cte[
4086 _reference_cte
4087 ]
4088 assert _ == cte_name
4089
4090 cte_level_name = (cte_level, cte_name)
4091 existing_cte = self.ctes_by_level_name[cte_level_name]
4092
4093 # check if we are receiving it here with a specific
4094 # "nest_here" location; if so, move it to this location
4095
4096 if cte_opts.nesting:
4097 if existing_cte_opts.nesting:
4098 raise exc.CompileError(
4099 "CTE is stated as 'nest_here' in "
4100 "more than one location"
4101 )
4102
4103 old_level_name = (cte_level, cte_name)
4104 cte_level = len(self.stack) if nesting else 1
4105 cte_level_name = new_level_name = (cte_level, cte_name)
4106
4107 del self.ctes_by_level_name[old_level_name]
4108 self.ctes_by_level_name[new_level_name] = existing_cte
4109 self.level_name_by_cte[_reference_cte] = new_level_name + (
4110 cte_opts,
4111 )
4112

Callers

nothing calls this directly

Calls 15

_init_cte_stateMethod · 0.95
_truncated_identifierMethod · 0.95
_generate_prefixesMethod · 0.95
_get_reference_cteMethod · 0.80
format_aliasMethod · 0.80
format_label_nameMethod · 0.80
_de_cloneMethod · 0.80
_requires_quotesMethod · 0.80
compareMethod · 0.45
joinMethod · 0.45

Tested by

no test coverage detected