Buscar/Modifica un motor de bases de datos analíticas en C++ y pasa sus pruebas

Modifica un motor de bases de datos analíticas en C++ y pasa sus pruebas

Úsalo al cambiar un motor de bases de datos analíticas en C++. La IA sigue el cambio del análisis de SQL a la ejecución, edita los archivos generados desde su fuente, respeta las reglas de C++ y de errores, y pasa las pruebas de lógica SQL y las compilaciones necesarias antes de terminar.

Para usar estas reglas de IA
## Elige el tipo de compilación y las pruebas para cada etapa Elige una configuración de compilación que proporcione aserciones y diagnósticos relevantes sin ralentizar innecesariamente la iteración habitual. ### Estrategia de compilación - Usa como configuración normal de desarrollo una compilación optimizada con símbolos de depuración cuando conserve las comprobaciones requeridas. - Usa una compilación de depuración con instrumentación completa cuando investigues la seguridad de memoria, fallos de aserción o comportamientos que la optimización pueda afectar. - Ejecuta el formateador del repositorio antes de confirmar cambios. - Regenera los archivos derivados del código fuente mediante el objetivo de generación aprobado, que también debe aplicar el formato requerido. ### Estrategia de pruebas - Ejecuta la suite rápida de pruebas unitarias durante la iteración normal. - Limita una ejecución a un archivo o caso de prueba cuando diagnostiques un cambio específico. - Ejecuta la suite completa, incluidas las pruebas lentas, antes de una entrega amplia cuando el cambio pueda afectar al comportamiento compartido. - Al corregir fallos de integración continua, reproduce cada configuración requerida en el orden documentado. - Incluye compilaciones de matriz de configuraciones, ejecución vectorizada, sanitizadores y aserciones cuando el límite afectado las requiera. - No sustituyas una puerta autoritativa que falla por una configuración local más rápida sin pruebas de que la diferencia es irrelevante. ## Antes de corregir, sigue la consulta del análisis de SQL a los resultados Rastrea el comportamiento a lo largo de todo el ciclo de vida de la consulta en lugar de parchear el primer módulo que manifieste un síntoma. ### Etapas del flujo 1. Analiza el texto SQL y conviértelo en árboles sintácticos de sentencias, expresiones y referencias de tablas. 2. Vincula nombres y tipos con el catálogo mientras creas un plan lógico. 3. Optimiza el plan lógico con reglas que preserven la semántica y decisiones basadas en costes. 4. Convierte los operadores lógicos en operadores físicos. 5. Ejecuta los operadores físicos mediante flujos vectorizados y paralelos. 6. Devuelve los resultados mediante la conexión y el contexto del cliente. ### Propiedad de los componentes - Mantén sincronizadas la gramática y las transformaciones del analizador; cada regla gramatical necesita la transformación correspondiente. - Haz que el planificador sea responsable de la vinculación, la resolución de tipos, las subconsultas y los operadores lógicos. - Haz que el optimizador transforme los planes sin alterar la semántica observable. - Haz que la capa de ejecución sea responsable de la planificación física, los operadores y la evaluación de expresiones. - Mantén el almacenamiento persistente, el uso de búferes, la compresión, los puntos de control y el registro de escritura anticipada en la capa de almacenamiento. - Trata el catálogo como la única fuente de verdad para esquemas, tablas, funciones y tipos. - Mantén las transacciones, el estado de deshacer y el control de concurrencia multiversión separados de la programación de tareas y los flujos paralelos. ## Procesa los datos por lotes de columnas y sigue las reglas de propiedad Un motor analítico depende de distinciones claras entre la sintaxis analizada, las expresiones vinculadas, la identidad de las columnas, los vectores físicos y la propiedad. ### Flujo de datos - Procesa los datos en lotes columnares en vez de hacerlo fila por fila. - Representa cada columna del lote con la abstracción vectorial del motor. - Conserva un par estable de índices de tabla y columna durante la planificación y la ejecución. - Mantén las expresiones analizadas sin vincular y separadas de las expresiones tipadas y vinculadas. - Evalúa las expresiones vinculadas mediante el ejecutor vectorizado de expresiones. ### Propiedad y tipos - Usa de forma predeterminada propiedad inteligente exclusiva. - Usa propiedad compartida solo cuando varias duraciones de vida la requieran realmente. - Distingue las referencias no propietarias anulables de las referencias con valor no nulo garantizado. - Nunca uses punteros sin abstracción que sean propietarios. - Encauza la promoción de tipos y las conversiones por un único conjunto autoritativo de reglas. - Añade tipos personalizados mediante el mecanismo de extensiones en lugar de eludir el sistema de tipos. - Usa visitantes para recorrer árboles, fábricas para la deserialización y subclases tipadas para las jerarquías de operadores, entradas y expresiones. ## Edita las extensiones y los archivos generados desde su código fuente Trata las extensiones internas del árbol, las extensiones mantenidas externamente, el código generado y los artefactos de publicación como clases de propiedad distintas. ### Límites de las extensiones - Edita directamente las extensiones internas del árbol en su directorio fuente declarado. - Mantén las extensiones administradas externamente en repositorios separados y aplica los cambios propiedad del repositorio mediante el mecanismo de parches designado. - Permite compilar tanto el conjunto completo de extensiones como un subconjunto explícito. - Prueba los cambios de extensiones con las mismas interfaces principales y reglas de tipos que usa la funcionalidad integrada. ### Artefactos generados - Identifica los archivos fuente que generan vinculaciones de API, registros, ajustes, código de serialización, metadatos de almacenamiento, métricas y utilidades para enumeraciones. - Edita el origen de un artefacto generado, nunca únicamente su salida generada. - Ejecuta el objetivo de generación aprobado después de cambiar el código fuente. - Examina las diferencias generadas para detectar cambios ajenos y aplícales el formateador estándar. ## Sigue el estilo de C++ y mantén los comentarios breves La coherencia del código de bajo nivel reduce la ambigüedad sobre la propiedad, los índices, las interfaces públicas y el flujo de control. ### Estilo del código - Usa las reglas de sangría y alineación del repositorio y aplica su límite de anchura de línea mediante el formateador. - Prefiere tipos enteros de anchura fija a anchuras de enteros dependientes de la plataforma. - Usa el tipo de índice designado por el proyecto para desplazamientos, índices y recuentos. - Pasa por referencia constante los objetos no triviales de solo lectura. - Prefiere bucles basados en rangos cuando expresen claramente el recorrido. - Usa siempre llaves en las condiciones y los bucles. - Nunca uses `const_cast`. - Sigue las convenciones establecidas para nombrar archivos, tipos, variables y funciones. ### Comentarios - Mantén breves los comentarios y deja que un código claro proporcione la explicación habitual. - Comenta la intención duradera, las restricciones o los invariantes que no resulten evidentes. - No dejes en el código el historial de reparaciones específico de una incidencia. - Incluye las explicaciones de los cambios, como una corrección por una diferencia de uno, en la descripción del cambio o en el mensaje de confirmación. - Usa comentarios más largos solo cuando el invariante no pueda quedar claro mediante la estructura y los nombres del código. ## Elige excepciones o aserciones según el error y escribe pruebas de lógica SQL Elige los canales de error según si una consulta debe terminar, puede recuperarse o ha encontrado un defecto interno de programación. ### Política de errores - Usa excepciones para fallos que terminan la consulta, como errores de análisis, objetos ausentes o memoria agotada. - Usa valores de retorno para condiciones que puedan recuperarse durante la misma consulta. - Usa aserciones de depuración para errores de programación que la entrada del usuario nunca deba provocar. - Haz que las aserciones sean lo bastante específicas para revelar el invariante vulnerado. - No conviertas una entrada no válida prevista en un fallo interno de aserción. ### Pruebas lógicas de SQL - Prefiere pruebas lógicas declarativas de SQL a pruebas de C++ para el comportamiento de las consultas. - Marca por separado las sentencias que deben completarse correctamente y las que deben fallar. - Declara los tipos esperados de las columnas de resultados para las consultas. - Separa el texto de la consulta de las filas esperadas con el delimitador canónico del entorno. - Usa expectativas con expresiones regulares para el texto de errores solo cuando la redacción exacta sea inestable de forma intencionada. - Declara explícitamente las variables de entorno requeridas. - Asigna a las pruebas lentas la designación correspondiente del entorno para que las ejecuciones predeterminadas sigan siendo prácticas. - Abarca tipos numéricos, de cadenas y anidados, además de usos no válidos e inesperados, en vez de limitarte al caso correcto. - Exige que la suite autoritativa completa se supere antes del envío. ## Encuentra qué cambiar con las pruebas y termina todas las comprobaciones Usa las pruebas y la propiedad arquitectónica para localizar una funcionalidad antes de editarla y, a continuación, verifica cada superficie derivada que resulte afectada por el cambio. ### Secuencia de investigación 1. Busca pruebas existentes para conocer la sintaxis admitida y el comportamiento esperado. 2. Rastrea la funcionalidad desde el analizador, pasando por el vinculador, el optimizador y la planificación física, hasta la ejecución. 3. Localiza los tipos correspondientes de sentencia, operador, expresión, catálogo o función. 4. Comprueba dónde se registra la funcionalidad y dónde reside su declaración pública. 5. Busca archivos de implementación y cabeceras públicas con la herramienta estándar de búsqueda de código del repositorio. 6. Identifica los archivos generados y las superficies de extensión que dependen del código fuente modificado. ### Comprobaciones de finalización - Añade o actualiza pruebas de regresión específicas antes de realizar pruebas amplias. - Ejecuta el formateo y la generación desde el código fuente. - Ejecuta la prueba específica y después las suites requeridas de pruebas unitarias, lentas, de sanitizadores, aserciones, configuraciones y vectores. - Compila el ejecutable y las extensiones afectados. - Revisa las diferencias generadas y la propiedad de la documentación. - No declares la finalización hasta que cada puerta requerida tenga un resultado real.