


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.
