Buscar/Altere um mecanismo de banco de dados analítico em C++ e passe nos testes

Altere um mecanismo de banco de dados analítico em C++ e passe nos testes

Use ao mudar o código de um mecanismo de banco de dados analítico em C++. A IA segue a mudança da análise do SQL até a execução, edita os arquivos gerados pelo código-fonte, segue as regras de C++ e de erros, e só termina após passar nos testes de lógica SQL e nas compilações necessárias.

Para usar estas regras de IA
## Escolha o tipo de compilação e os testes para cada etapa Escolha uma configuração de compilação que forneça asserções e diagnósticos relevantes sem tornar a iteração rotineira desnecessariamente lenta. ### Estratégia de compilação - Use uma compilação otimizada com símbolos de depuração como configuração normal de desenvolvimento quando ela preservar as verificações necessárias. - Use uma compilação de depuração totalmente instrumentada ao investigar segurança de memória, falhas de asserção ou comportamentos que a otimização possa afetar. - Execute o formatador do repositório antes de confirmar alterações. - Regenere os arquivos derivados do código-fonte por meio do alvo de geração aprovado, que também deve aplicar a formatação necessária. ### Estratégia de testes - Execute a suíte rápida de testes unitários durante a iteração normal. - Restrinja uma execução a um arquivo ou caso de teste ao diagnosticar uma alteração específica. - Execute a suíte completa, incluindo os testes lentos, antes de uma entrega ampla quando a alteração puder afetar o comportamento compartilhado. - Ao corrigir falhas de integração contínua, reproduza cada configuração necessária na ordem documentada. - Inclua compilações de matriz de configurações, execução vetorizada, sanitizadores e asserções quando o limite afetado as exigir. - Não substitua um controle autoritativo com falha por uma configuração local mais rápida sem evidências de que a diferença é irrelevante. ## Antes de corrigir, siga a consulta da análise do SQL até os resultados Rastreie o comportamento por todo o ciclo de vida da consulta, em vez de corrigir apenas o primeiro módulo que apresenta um sintoma. ### Etapas do fluxo 1. Analise o texto SQL em árvores sintáticas de instruções, expressões e referências de tabelas. 2. Vincule nomes e tipos ao catálogo enquanto cria um plano lógico. 3. Otimize o plano lógico com regras que preservem a semântica e escolhas baseadas em custo. 4. Converta operadores lógicos em operadores físicos. 5. Execute operadores físicos por meio de fluxos vetorizados e paralelos. 6. Retorne os resultados pela conexão e pelo contexto do cliente. ### Propriedade dos componentes - Mantenha sincronizadas a gramática e as transformações do analisador; toda regra gramatical precisa da transformação correspondente. - Faça o planejador controlar a vinculação, a resolução de tipos, as subconsultas e os operadores lógicos. - Faça o otimizador transformar os planos sem alterar a semântica observável. - Faça a camada de execução controlar o planejamento físico, os operadores e a avaliação de expressões. - Mantenha o armazenamento persistente, o uso de buffers, a compactação, os pontos de verificação e o registro antecipado de gravação na camada de armazenamento. - Trate o catálogo como a única fonte da verdade para esquemas, tabelas, funções e tipos. - Mantenha as transações, o estado de desfazer e o controle de concorrência multiversão separados do agendamento de tarefas e dos fluxos paralelos. ## Processe os dados em lotes de colunas e siga as regras de propriedade Um mecanismo analítico depende de distinções claras entre a sintaxe analisada, as expressões vinculadas, a identidade das colunas, os vetores físicos e a propriedade. ### Fluxo de dados - Processe os dados em lotes colunares, em vez de uma linha por vez. - Represente cada coluna do lote com a abstração vetorial do mecanismo. - Mantenha um par estável de índices de tabela e coluna durante o planejamento e a execução. - Mantenha as expressões analisadas sem vinculação e separadas das expressões tipadas e vinculadas. - Avalie as expressões vinculadas por meio do executor vetorizado de expressões. ### Propriedade e tipos - Use propriedade inteligente exclusiva por padrão. - Use propriedade compartilhada apenas quando vários tempos de vida realmente a exigirem. - Diferencie referências não proprietárias anuláveis de referências com valor não nulo garantido. - Nunca use ponteiros brutos que sejam proprietários. - Encaminhe a promoção de tipos e as conversões por um único conjunto autoritativo de regras. - Adicione tipos personalizados por meio do mecanismo de extensões, em vez de contornar o sistema de tipos. - Use visitantes para percorrer árvores, fábricas para desserialização e subclasses tipadas para hierarquias de operadores, entradas e expressões. ## Edite extensões e arquivos gerados a partir do código-fonte Trate extensões internas da árvore, extensões mantidas externamente, código gerado e artefatos de lançamento como classes de propriedade distintas. ### Limites das extensões - Edite diretamente as extensões internas da árvore no diretório de origem declarado. - Mantenha as extensões administradas externamente em repositórios separados e aplique alterações pertencentes ao repositório pelo mecanismo de patches designado. - Permita compilar tanto o conjunto completo de extensões quanto um subconjunto explícito. - Teste alterações de extensões com as mesmas interfaces centrais e regras de tipos usadas pela funcionalidade integrada. ### Artefatos gerados - Identifique os arquivos-fonte que geram vinculações de API, registros, configurações, código de serialização, metadados de armazenamento, métricas e utilitários de enumeração. - Edite a origem de um artefato gerado, nunca apenas sua saída gerada. - Execute o alvo de geração aprovado depois de alterar o código-fonte. - Examine as diferenças geradas em busca de alterações não relacionadas e formate-as com o formatador padrão. ## Siga o estilo de C++ e mantenha os comentários curtos A consistência no código de baixo nível reduz ambiguidades relacionadas à propriedade, aos índices, às interfaces públicas e ao fluxo de controle. ### Estilo de código - Use as regras de indentação e alinhamento do repositório e imponha seu limite de largura de linha com o formatador. - Prefira tipos inteiros de largura fixa a larguras inteiras dependentes da plataforma. - Use o tipo de índice designado pelo projeto para deslocamentos, índices e contagens. - Passe objetos não triviais somente de leitura por referência constante. - Prefira laços baseados em intervalos quando expressarem claramente o percurso. - Sempre use chaves em condicionais e laços. - Nunca use `const_cast`. - Siga as convenções estabelecidas de nomenclatura de arquivos, tipos, variáveis e funções. ### Comentários - Mantenha os comentários curtos e deixe o código claro fornecer a explicação comum. - Comente intenções duradouras, restrições ou invariantes não óbvios. - Não deixe no código o histórico de correções específico de um problema. - Coloque narrativas de alterações, como uma correção de diferença de uma posição, na descrição da alteração ou na mensagem de confirmação. - Use comentários mais longos somente quando o invariante não puder ficar claro pela estrutura e pelos nomes do código. ## Escolha exceções ou asserções pelo tipo de erro e escreva testes de lógica SQL Escolha os canais de erro de acordo com a necessidade de a consulta terminar, poder se recuperar ou ter encontrado um defeito interno de programação. ### Política de erros - Use exceções para falhas que encerram a consulta, como erros de análise, objetos ausentes ou memória esgotada. - Use valores de retorno para condições das quais seja possível se recuperar durante a mesma consulta. - Use asserções de depuração para erros de programação que a entrada do usuário nunca deva provocar. - Torne as asserções específicas o bastante para revelar o invariante violado. - Não transforme uma entrada inválida esperada em uma falha interna de asserção. ### Testes lógicos de SQL - Prefira testes lógicos declarativos de SQL a testes de C++ para o comportamento das consultas. - Marque separadamente as instruções que devem ser bem-sucedidas e as que devem falhar. - Declare os tipos esperados das colunas de resultados das consultas. - Separe o texto da consulta das linhas esperadas com o delimitador canônico da estrutura. - Use expectativas de expressões regulares para textos de erro somente quando a redação exata for intencionalmente instável. - Declare explicitamente as variáveis de ambiente necessárias. - Atribua aos testes lentos a designação de teste lento da estrutura para que as execuções padrão continuem práticas. - Cubra tipos numéricos, de cadeia e aninhados, além de usos inválidos e inesperados, em vez de apenas o caminho bem-sucedido. - Exija que a suíte autoritativa completa seja aprovada antes do envio. ## Encontre o que mudar pelos testes e conclua todas as verificações necessárias Use os testes e a propriedade arquitetural para localizar uma funcionalidade antes de editá-la e, depois, verifique cada superfície derivada afetada pela alteração. ### Sequência de investigação 1. Encontre testes existentes para conhecer a sintaxe compatível e o comportamento esperado. 2. Rastreie a funcionalidade desde o analisador, passando pelo vinculador, pelo otimizador e pelo planejamento físico, até a execução. 3. Localize os tipos correspondentes de instrução, operador, expressão, catálogo ou função. 4. Verifique onde a funcionalidade é registrada e onde fica sua declaração pública. 5. Pesquise arquivos de implementação e cabeçalhos públicos com a ferramenta padrão de busca de código do repositório. 6. Identifique os arquivos gerados e as superfícies de extensão que dependem do código-fonte alterado. ### Verificações de conclusão - Adicione ou atualize testes de regressão específicos antes de realizar testes amplos. - Execute a formatação e a geração a partir do código-fonte. - Execute o teste específico e, depois, as suítes necessárias de testes unitários, lentos, de sanitizadores, asserções, configurações e vetores. - Compile o executável e as extensões afetados. - Revise as diferenças geradas e a propriedade da documentação. - Não declare a conclusão até que todo controle necessário tenha um resultado real.