0Pricing
SQL Interview Prep · Aula

Evitando recursão infinita

Conheça a detecção de ciclos, os limites de profundidade e a proteção contra recursão que todo entrevistador verifica.

Evitando recursão infinita é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

A pergunta por trás da pergunta

Depois que você escreve uma CTE recursiva, um entrevistador perspicaz pergunta: "O que acontece se os dados tiverem um ciclo?" Isso verifica se você entende que a recursão pode continuar indefinidamente — e se sabe como se proteger contra isso.

Um ciclo ocorre quando a hierarquia retorna sobre si mesma: A se reporta a B, e B se reporta a A. O membro recursivo ingênuo alternará entre os dois indefinidamente.

Como um ciclo se forma

Supõe-se que as árvores não tenham ciclos, mas os dados reais são desorganizados. Uma atualização incorreta pode definir um funcionário como seu próprio gerente, ainda que indiretamente. Um grafo — como "usuários que seguem usuários" — é naturalmente cíclico.

Quando o membro recursivo encontra novamente um nó que já visitou, ele produz esse nó outra vez, o que reativa seus filhos, e o conjunto nunca fica vazio. A recursão só para quando uma etapa não retorna linhas; um ciclo garante que ela sempre retorne linhas.

Proteção 1: um limite de profundidade

A rede de segurança mais simples é um contador de profundidade com um limite no membro recursivo. Mesmo que exista um ciclo, a recursão para ao atingir esse limite.

É uma medida pouco precisa — ela também limita árvores legítimas e profundas —, mas é rápida e adequada para entrevistas.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.depth < 50
)
SELECT * FROM org;

Proteção 2: um caminho visitado

Uma proteção precisa acompanha o caminho dos nós visitados e se recusa a entrar novamente em um nó que já esteja nesse caminho. Acumule os identificadores em uma cadeia de texto ou em uma matriz e verifique a associação antes de continuar a recursão.

Isso interrompe os ciclos com precisão e ainda permite profundidade arbitrária em árvores legítimas.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id,
           CAST(',' || id || ',' AS VARCHAR(2000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id,
           o.path || e.id || ','
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.path NOT LIKE '%,' || e.id || ',%'
)
SELECT id, name, path FROM org;

Por que a verificação do caminho funciona

A condição path NOT LIKE '%,' || e.id || ',%' significa "siga esta aresta somente se o identificador do filho ainda não estiver no caminho". As vírgulas funcionam como delimitadores, para que o identificador 1 não corresponda incorretamente ao identificador 15.

Se um ciclo fizesse um nó ser visitado novamente, o WHERE filtraria essa linha, o membro recursivo acabaria não retornando nada e a recursão terminaria corretamente.

Proteção 3: cláusula CYCLE nativa

O Postgres moderno (14 ou posterior) e o padrão SQL oferecem uma cláusula CYCLE integrada que automatiza a verificação do caminho e sinaliza os ciclos para você. É a resposta mais limpa quando o mecanismo oferece suporte a ela.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e JOIN org o ON e.manager_id = o.id
)
CYCLE id SET is_cycle USING cycle_path
SELECT id, name, is_cycle FROM org;

MAXRECURSION do SQL Server

O SQL Server impõe por padrão um limite de 100 níveis de recursão. Se um ciclo ou uma árvore profunda o ultrapassar, a consulta gera um erro em vez de continuar indefinidamente — uma válvula de segurança implícita.

Você pode aumentá-lo ou removê-lo usando OPTION (MAXRECURSION n), em que 0 significa ilimitado. Porém, remover o limite sem uma proteção baseada no caminho reintroduz o risco de um ciclo infinito nos dados cíclicos.

-- Cap recursion at 200 levels in SQL Server
SELECT * FROM org
OPTION (MAXRECURSION 200);

Detectar versus impedir ciclos

Os entrevistadores podem distinguir dois objetivos:

  • Impedir — ignorar silenciosamente a aresta cíclica para que a consulta seja concluída (o WHERE da verificação do caminho).
  • Detectar e relatar — mostrar quais linhas fazem parte de um ciclo, para que a equipe de dados possa corrigir os dados incorretos (o sinalizador is_cycle da cláusula CYCLE).

Conhecer ambos os objetivos e saber quando cada um é apropriado é uma distinção de nível sênior.

Considerações de desempenho

A recursão pode ser dispendiosa mesmo sem ciclos. Estas são algumas dicas que os entrevistadores gostam de ouvir:

  • Crie um índice na coluna da junção, por exemplo manager_id, para que a junção de cada iteração seja rápida.
  • Filtre cedo na âncora para iniciar apenas a subárvore necessária, e não a tabela inteira.
  • Evite SELECT * — mantenha apenas as colunas exigidas pela recursão, além de depth e path.

Um modelo seguro

Combine as proteções em um modelo que você consiga reproduzir sob pressão: a coluna de profundidade como proteção de reserva e a verificação do caminho como proteção precisa. Mesmo que uma delas seja excessiva para dados limpos, mostrar ambas demonstra rigor.

WITH RECURSIVE walk AS (
    SELECT id, parent_id, 1 AS depth,
           CAST(',' || id || ',' AS VARCHAR(4000)) AS path
    FROM nodes WHERE parent_id IS NULL
    UNION ALL
    SELECT n.id, n.parent_id, w.depth + 1,
           w.path || n.id || ','
    FROM nodes n JOIN walk w ON n.parent_id = w.id
    WHERE w.depth < 100
      AND w.path NOT LIKE '%,' || n.id || ',%'
)
SELECT id, depth FROM walk;

Armadilhas comuns em entrevistas

Últimas armadilhas a evitar:

  • Remover MAXRECURSION no SQL Server sem outra proteção — isso reabre o risco de um ciclo infinito.
  • Declarar uma coluna de texto do caminho curta demais, causando truncamento e deixando a proteção quebrada sem aviso.
  • Comparar identificadores sem delimitadores de vírgula, fazendo o identificador 1 corresponder incorretamente dentro do identificador 21.
  • Presumir que os dados não têm ciclos apenas porque "deveriam" ser assim — sempre verifique.

Verificação rápida

Escolha a proteção que interrompe os ciclos com precisão sem limitar a profundidade legítima.

Recapitulação

Toda resposta envolvendo uma CTE recursiva deve abordar a segurança:

  • Os ciclos fazem o membro recursivo nunca retornar vazio, portanto a recursão nunca para.
  • Limite de profundidade = proteção rápida; verificação do caminho visitado = prevenção precisa de ciclos; cláusula CYCLE = detecção nativa em mecanismos modernos.
  • MAXRECURSION 100 do SQL Server é uma válvula implícita — não o remova sem outra proteção.
  • Crie um índice na coluna da junção e inicie a recursão de forma restrita para obter melhor desempenho.

Agora você consegue escrever, percorrer, gerar e proteger CTEs recursivas de ponta a ponta.

Perguntas Frequentes

A aula “Evitando recursão infinita” é grátis?

Sim — o texto completo de “Evitando recursão infinita” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “Evitando recursão infinita”?

Conheça a detecção de ciclos, os limites de profundidade e a proteção contra recursão que todo entrevistador verifica. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Evitando recursão infinita”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Interview Prep?

Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Membros âncora e recursivos
  2. Percorrendo um organograma
  3. Gerando séries de números e datas
  4. Evitando recursão infinita
← Voltar para SQL Interview Prep