Saltar al contenido principal

Cambios incompatibles con versiones anteriores

Cambios en JSON y en los formatos de datos

Almacenamiento y particionamiento

  • Se añadió compatibilidad con escrituras con estilo de particiones de Hive y se refactorizó la implementación de lectura (las columnas de partición de Hive ya no son virtuales). #76802 (Arthur Passos).
  • Se habilitó de forma predeterminada la configuración de MergeTree write_marks_for_substreams_in_compact_parts. Mejora significativamente el rendimiento de lectura de subcolumnas desde partes Compact recién creadas. Los servidores con una versión inferior a 25.5 no podrán leer las nuevas partes Compact. #84171 (Pavel Kruglov).
  • No se permite usar RENAME COLUMN ni DROP COLUMN con columnas listadas explícitamente para sumar en SummingMergeTree. Cierra #81836. #82821 (Alexey Milovidov).

Mejoras de funciones

  • Se introduce un nuevo argumento unexpected_quoting_character_strategy en la función extractKeyValuePairs, que controla qué ocurre cuando se encuentra un quoting_character de forma inesperada. Para más detalles, consulte la documentación de extractKeyValuePairs. #80657 (Arthur Passos).
  • Anteriormente, la función countMatches dejaba de contar al encontrar la primera coincidencia vacía, incluso si el patrón la aceptaba. Para solucionar este problema, countMatches ahora continúa ejecutándose y avanza un solo carácter cuando se produce una coincidencia vacía. Los usuarios que deseen conservar el comportamiento anterior pueden habilitar la opción count_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).

Mejoras en los tipos de datos

  • Mejora la precisión de la conversión de Decimal a Float32. Se implementa la conversión de Decimal a BFloat16. Cierra #82660. #82823 (Alexey Milovidov).

Rendimiento y gestión de recursos

  • Anteriormente, las consultas BACKUP, las fusiones y las mutaciones no utilizaban los limitadores globales del servidor para el tráfico local (max_local_read_bandwidth_for_server y max_local_write_bandwidth_for_server) y remoto (max_remote_read_network_bandwidth_for_server y max_remote_write_network_bandwidth_for_server); en su lugar, solo se limitaban mediante configuraciones específicas del servidor (max_backup_bandwidth_for_server, max_mutations_bandwidth_for_server y max_merges_bandwidth_for_server). Ahora utilizan ambos tipos de limitadores simultáneamente. #81753 (Sergei Trifonov).
  • Se añadió una nueva configuración cluster_function_process_archive_on_multiple_nodes que mejora el rendimiento del procesamiento de archivos en funciones de clúster cuando se establece en true (de forma predeterminada). Debe establecerse en false por compatibilidad y para evitar errores durante la actualización a 25.7+ si se utilizan funciones de clúster con archivos en versiones anteriores. #82355 (Kseniia Sumarokova).
  • El valor predeterminado anterior de concurrent_threads_scheduler era round_robin, que demostró ser injusto cuando había un gran número de consultas de un solo hilo (por ejemplo, INSERTs). Con este cambio, fair_round_robin, una alternativa más segura, pasa a ser el scheduler predeterminado. #84747 (Sergei Trifonov).
  • La materialización diferida solo está habilitada con el analizador para evitar mantenerla sin el analizador, ya que esto puede causar algunos problemas (por ejemplo, al usar indexHint() en condiciones). #83791 (Igor Nikonov).

Esquema y sintaxis SQL

  • Prohibir la creación de una tabla sin columnas insertables. #81835 (Pervakov Grigorii).
  • Exigir backticks alrededor de los identificadores con puntos en las expresiones predeterminadas para evitar que se interpreten como identificadores compuestos. #83162 (Pervakov Grigorii).
  • Admitir la sintaxis heredoc al estilo de PostgreSQL: $tag$ string contents... $tag$, también conocida como literales de cadena delimitados por signos de dólar. En versiones anteriores, había menos restricciones para las etiquetas: podían contener caracteres arbitrarios, incluidos signos de puntuación y espacios en blanco. Esto introduce ambigüedad al analizar identificadores que también pueden comenzar con el carácter dólar. Al mismo tiempo, PostgreSQL solo permite caracteres de palabra en las etiquetas. Para resolver este problema, ahora restringimos las etiquetas heredoc para que solo contengan caracteres de palabra. Cierra #84731. #84846 (Alexey Milovidov).

Seguridad y permisos

  • SYSTEM RESTART REPLICAS solo reiniciará las réplicas en las bases de datos donde tengas permiso para SHOW TABLES. Anteriormente, la consulta provocaba la reactivación de tablas en la base de datos Lazy, incluso sin acceso a esa base de datos, mientras esas tablas se eliminaban de forma concurrente. #83321 (Alexey Milovidov).
  • Las funciones azureBlobStorage, deltaLakeAzure e icebergAzure se han actualizado para validar correctamente los permisos AZURE. Todas las funciones en variante de clúster (funciones -Cluster) ahora verifican los permisos con respecto a sus equivalentes sin clúster. Para evitar errores de permisos, asegúrate de que los usuarios que invocan las funciones -Cluster tengan los privilegios adecuados (por ejemplo, GRANT S3 ON *.* TO user). Además, las funciones icebergLocal y deltaLakeLocal ahora exigen comprobaciones del permiso FILE. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov

Nuevas características

Tipos de datos

  • Se añaden nuevos tipos de datos: Time ([H]HH:MM:SS) y Time64 ([H]HH:MM:SS[.fractional]), así como algunas funciones básicas de conversión de tipos y funciones para interactuar con otros tipos de datos. Se añadieron opciones de configuración para la compatibilidad con la función heredada ToTime. #81217 (Yarik Briukhovetskyi).

Funciones

Tablas del sistema

Iceberg y DeltaLake

  • Soporte para tipos complejos en la evolución del esquema de Iceberg. #73714 (scanhex12).
  • Se introducen escrituras en Iceberg para consultas insert. #82692 (scanhex12).
  • Soporte para borrados posicionales en el motor de tabla Iceberg. #83094 (Daniil Ivanik).
  • Lectura de archivos de datos de Iceberg por ID de campo. Cierra #83065. #83653 (scanhex12).
  • Escrituras en Iceberg para CREATE. Cierra #83927. #83983 (scanhex12).
  • Escrituras para catálogos de Glue. #84136 (scanhex12).
  • Escrituras para catálogos REST de Iceberg. #84684 (scanhex12).
  • Fusiona todos los archivos de borrado por posición de Iceberg en archivos de datos. Esto reducirá la cantidad y el tamaño de los archivos Parquet en el almacenamiento de Iceberg. Sintaxis: OPTIMIZE TABLE table_name. #85250 (scanhex12).
  • Soporte para DROP TABLE en Iceberg (eliminación de catálogos REST/Glue + eliminación de los metadatos de la tabla). #85395 (scanhex12).
  • Soporte para mutaciones ALTER DELETE en Iceberg con formato merge-on-read. #85549 (scanhex12).
  • Soporte para escrituras en DeltaLake. Cierra #79603. #85564 (Kseniia Sumarokova).
  • Escribe más estadísticas de Iceberg (tamaños de columna, límites inferior y superior) en los metadatos (entradas del manifiesto) para la poda min-max. #85746 (scanhex12).
  • Soporte para añadir/eliminar/modificar columnas en Iceberg para tipos simples. #85769 (scanhex12).

MergeTree y almacenamiento

  • Todas las tablas ahora admiten la columna virtual _table, no solo las tablas de tipo Merge. #63665 (Xiaozhe Yu).
  • Se añade SZ3 como códec de compresión con pérdida, pero con error acotado, para columnas de tipo Float32 y Float64. #67161 (scanhex12).
  • Se añadió compatibilidad con actualizaciones ligeras para tablas de la familia MergeTree. Las actualizaciones ligeras pueden usarse con una nueva sintaxis: UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. También se añadió la implementación de eliminaciones ligeras mediante actualizaciones ligeras, que puede habilitarse estableciendo lightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov).
  • Se añadió compatibilidad con la columna virtual _part_granule_offset en tablas de la familia MergeTree. Esta columna indica el índice de base cero del gránulo/marca al que pertenece cada fila dentro de su parte de datos. Esto resuelve #79572. #82341 (Amos Bird).

Compatibilidad con protocolos y client

Funcionalidades de SQL y consultas

  • Se admite DESCRIBE SELECT, además de DESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi).
  • Se admite el uso de USE DATABASE {name}. #81307 (Yarik Briukhovetskyi).
  • Se ha implementado la lectura desde projections para parallel replicas. Se ha añadido una nueva opción de configuración parallel_replicas_support_projection para controlar si la compatibilidad con projections está habilitada. Para simplificar la implementación, la compatibilidad con projections solo se habilita cuando parallel_replicas_local_plan está activo. #82807 (zoomxi).

Formatos

  • Se agregó la configuración format_schema_source, que define la fuente de format_schema. #80874 (Tuan Pham Anh).
  • Se agregó Hash como nuevo formato de salida. Calcula un único valor hash para todas las columnas y filas del resultado. Esto resulta útil para calcular una “huella digital” del resultado, por ejemplo, en casos de uso donde la transferencia de datos es un cuello de botella. Ejemplo: SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash devuelve e5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze).

Configuración del servidor y gestión de cargas de trabajo

  • El ajuste del servidor cpu_slot_preemption habilita la planificación preventiva de CPU para las cargas de trabajo y garantiza una asignación max-min justa del tiempo de CPU entre ellas. Se añaden nuevos ajustes de carga de trabajo para la limitación de CPU: max_cpus, max_cpu_share y max_burst_cpu_seconds. #80879 (Sergei Trifonov).
  • Ahora se admite el ajuste de carga de trabajo max_waiting_queries. Puede usarse para limitar el tamaño de la cola de consultas. Si se alcanza el límite, todas las consultas posteriores finalizarán con el error SERVER_OVERLOADED. #81250 (Oleg Doronin).
  • Cierra la conexión TCP tras el número configurado de consultas o al alcanzar el umbral de tiempo configurado. Resuelve #68000. #81472 (Kenny Sun).

Almacenamiento en la Cloud

  • Añade extra_credentials a AzureBlobStorage para autenticarse mediante client_id y tenant_id. #84235 (Pablo Marcos).

Keeper

Funcionalidades experimentales

Motores de tabla y funciones de tabla

Mejoras en los índices de texto

  • Se agregan las funciones searchAny y searchAll, que son herramientas de propósito general para buscar en índices de texto. #80641 (Elmi Ahmadov).
  • El índice de texto ahora admite el tokenizador string. #81752 (Elmi Ahmadov).
  • Se cambió a 64 el valor predeterminado de la granularidad de los índices text. Esto mejora el rendimiento esperado de la consulta de prueba promedio en benchmarks internos. #82162 (Jimmy Aguilar Mena).
  • El bitmap de 256 bits almacena ordenadas las etiquetas salientes de un estado, pero los estados salientes se guardan en disco en el orden en que aparecen en la tabla hash. Por lo tanto, una etiqueta apuntaría a un estado siguiente incorrecto al leer desde disco. #82783 (Elmi Ahmadov).
  • Actualmente, el árbol FST se guarda en disco sin comprimir. Esto podría provocar un rendimiento deficiente o un mayor consumo de ancho de banda de E/S tanto al escribir como al leer en disco. #83093 (Elmi Ahmadov).

Actualizaciones de madurez de las funcionalidades

Mejoras de rendimiento

Ejecución de consultas y agregación

  • Optimización trivial para el combinador de funciones de agregación -If. #78454 (李扬).
  • Se añadió una nueva lógica (controlada por la configuración enable_producing_buckets_out_of_order_in_aggregation, habilitada de forma predeterminada) que permite enviar algunos buckets fuera de orden durante la agregación con uso eficiente de memoria. Cuando algunos buckets de agregación tardan bastante más en fusionarse que otros, esto mejora el rendimiento al permitir que el iniciador vaya fusionando mientras tanto buckets con ID más altos. La desventaja es un uso de memoria potencialmente mayor (aunque no debería ser significativo). #80179 (Nikita Taranov).
  • El pipeline posterior al paso TOTALS ahora es multihilo. #80331 (UnamedRus).
  • Cuando la consulta de agregación contiene solo una única función COUNT() sobre una columna NOT NULL, la lógica de agregación se integra por completo durante el sondeo de la tabla hash. Esto evita asignar y mantener cualquier estado de agregación, lo que reduce significativamente el uso de memoria y la sobrecarga de CPU. Esto aborda parcialmente #81982. #82104 (Amos Bird).
  • Calcular la clave serializada de forma columnar al agrupar por varias columnas de cadena o numéricas. #83884 (李扬).
  • Se implementó addManyDefaults para los combinadores -If. #83870 (Raúl Marín).

Optimizaciones de JOIN

  • Se añade el nuevo ajuste min_joined_block_size_rows (análogo a min_joined_block_size_bytes; valor predeterminado: 65409) para controlar el tamaño mínimo del bloque (en filas) de los bloques de entrada y salida de JOIN (si el algoritmo de join lo admite). Los bloques pequeños se compactarán. #81886 (Nikita Taranov).
  • Se optimizó el rendimiento de HashJoin al eliminar el bucle adicional sobre las tablas hash en el caso típico de una sola columna clave; además, se eliminan las comprobaciones de null_map y join_mask cuando siempre son true/false. #82308 (Nikita Taranov).
  • Las optimizaciones para null_map y JoinMask de #82308 se aplicaron al caso de JOIN con múltiples disyunciones. Además, se optimizó la estructura de datos KnownRowsHolder. #83041 (Nikita Taranov).
  • Se usa un std::vector<std::atomic_bool> simple para las banderas de join, a fin de evitar calcular un hash en cada acceso a ellas. #83043 (Nikita Taranov).
  • Se procesa max_joined_block_rows fuera del bucle principal de hash JOIN. Rendimiento ligeramente mejor en ALL JOIN. #83216 (Nikolai Kochetov).
  • No se preasigna memoria a las columnas de resultado cuando HashJoin usa el modo de salida lazy. Esto es subóptimo, especialmente cuando el número de coincidencias es bajo. Además, conocemos la cantidad exacta de coincidencias una vez completado el join, por lo que podemos preasignar con mayor precisión. #83304 (Nikita Taranov).
  • Todos los JOIN LEFT/INNER se convertirán automáticamente a RightAny si el lado derecho está determinado funcionalmente por las columnas clave del join (todas las filas tienen valores únicos de clave de join). #84010 (Nikita Taranov).
  • Se mejoró el rendimiento de la aplicación de patch parts en modo Join. #85040 (Anton Popov).

Mejoras en las consultas distribuidas

  • Se introdujo una opción para trasladar la (des)compresión y la (des)serialización de bloques a los hilos del pipeline, en lugar de usar un único hilo asociado a una conexión de red. Se controla mediante el ajuste enable_parallel_blocks_marshalling. Debería acelerar las consultas distribuidas que transfieren cantidades significativas de datos entre el iniciador y los nodos remotos. #78694 (Nikita Taranov).
  • INSERT SELECT distribuido en paralelo está habilitado de forma predeterminada en el modo en el que INSERT SELECT se ejecuta de forma independiente en cada segmento; consulte el ajuste parallel_distributed_insert_select. #80425 (Igor Nikonov).
  • Se comprimen los logs y los profile events en el protocolo nativo. En clústeres con más de 100 réplicas, los profile events sin comprimir ocupan entre 1 y 10 MB/s, y la barra de progreso responde con lentitud en conexiones lentas a Internet. Esto cierra #82533. #82535 (Alexey Milovidov).
  • INSERT SELECT distribuido en paralelo está habilitado de forma predeterminada en el modo en el que INSERT SELECT se ejecuta de forma independiente en cada segmento; consulte el ajuste parallel_distributed_insert_select. #83040 (Igor Nikonov).
  • Se corrigió el cálculo del tamaño mínimo de tarea para las réplicas paralelas. #84752 (Nikita Taranov).

Mejoras en los índices

  • Las consultas de búsqueda vectorial que usan un índice de similitud vectorial se completan con menor latencia gracias a la reducción de las lecturas de almacenamiento y del uso de CPU. #79103 (Shankar Iyer).
  • Se respeta merge_tree_min_{rows,bytes}_for_seek en filterPartsByQueryConditionCache para alinearlo con otros métodos que filtran por índices. #80312 (李扬).
  • Procesa primero los índices min-max de mayor granularidad. Cierra #75381. #83798 (Maruth Goyal).
  • El índice de filtro bloom ahora se usa para condiciones como has([c1, c2, ...], column), donde column no es de tipo Array. Esto mejora el rendimiento de estas consultas, haciéndolas tan eficientes como el operador IN. #83945 (Doron David).
  • Procesa los índices en orden ascendente de tamaño de archivo. El orden final de los índices prioriza los índices min-max y vectoriales (por simplicidad y selectividad, respectivamente), y después los índices pequeños. Dentro de los índices min-max/vectoriales también se prefieren los índices más pequeños. #84094 (Maruth Goyal).
  • Anteriormente, los datos del índice de texto se dividían en varios segmentos (de forma predeterminada, cada segmento tenía un tamaño de 256 MiB). Esto podía reducir el consumo de memoria al construir el índice de texto; sin embargo, aumenta el espacio necesario en disco y el tiempo de respuesta de las consultas. #84590 (Elmi Ahmadov).

Optimizaciones de subconsultas

  • Optimiza el plan generado para las subconsultas correlacionadas eliminando las operaciones JOIN redundantes mediante clases de equivalencia. Si existen expresiones equivalentes para todas las columnas correlacionadas, no se genera CROSS JOIN cuando está habilitada la configuración query_plan_correlated_subqueries_use_substitution. #82435 (Dmitry Novik).
  • Lee solo las columnas necesarias en una subconsulta correlacionada cuando actúa como argumento de la función EXISTS. #82443 (Dmitry Novik).

Mejoras en Azure Blob Storage

  • El motor de tabla azureBlobStorage ahora almacena en caché y reutiliza, cuando es posible, los tokens de autenticación de identidad administrada para evitar el throttling. #79860 (Nick Blakely).
  • Se reemplazó el client HTTP curl por el client HTTP poco para Azure Blob Storage. Se introdujeron varios ajustes para estos clients que reflejan los de S3. También se introdujeron tiempos de espera de conexión agresivos tanto para Azure como para S3. Se mejoró la introspección de los profile events y las métricas de Azure. El nuevo client está habilitado de forma predeterminada y ofrece latencias mucho mejores para consultas en frío sobre Azure Blob Storage. Se puede volver al client Curl anterior estableciendo azure_sdk_use_native_client=false. #83294 (alesapin).

Mejoras del motor de almacenamiento

  • Se corrige el filtrado por clave para los almacenamientos Redis y KeeperMap. #81833 (Pervakov Grigorii).
  • ATTACH PARTITION ya no provoca la invalidación de todas las cachés. #82377 (Alexey Milovidov).
  • Se evita mantener el bloqueo mientras se crean los datos de la instantánea de almacenamiento, para reducir la contención de bloqueos con una carga concurrente elevada. #83510 (Duc Canh Le).
  • Eliminar partes temporales puede llevar tiempo (especialmente con S3), y actualmente se hace mientras se mantiene un bloqueo global en MergeTreeBackgroundExecutor. Cuando necesitamos reiniciar todas las tablas debido a una pérdida de conexión y esperamos a que finalicen las tareas en segundo plano, las tablas pueden incluso quedarse atascadas en modo readonly durante una hora. Pero parece que no necesitamos este bloqueo para llamar a cancel. #84311 (Alexander Tokmakov).

Mejoras de formato

  • Nueva implementación del lector de Parquet. Suele ser más rápida y admite pushdown de filtros a nivel de página y PREWHERE. Actualmente es experimental. Use la configuración input_format_parquet_use_native_reader_v3 para habilitarla. #82789 (Michael Kolupaev).
  • Se mejoró el rendimiento del formato de entrada ProtobufSingle reutilizando el serializador cuando no se producen errores de análisis. #83613 (Eduard Karacharov).

Optimizaciones de tipos de datos y de serialización

  • Mejora significativamente el rendimiento de lectura de subcolumnas JSON desde datos compartidos en MergeTree al implementar nuevas serializaciones para los datos compartidos de JSON en MergeTree. #83777 (Pavel Kruglov).
  • Optimiza la deserialización de cadenas al simplificar el código. Cierra #38564. #84561 (Alexey Milovidov).

Mejoras en el pipeline y la ejecución

  • Minimiza las copias de memoria en los encabezados de los puertos durante la construcción del pipeline. PR original #70105 por heymind. #83381 (Raúl Marín).
  • Mejora el rendimiento de la construcción del pipeline. #83631 (Raúl Marín).
  • Optimiza MergeTreeReadersChain::getSampleBlock. #83875 (Raúl Marín).
  • Optimiza la materialización de constantes en los casos en los que esta solo se realiza para devolver una sola fila. #85071 (Alexey Milovidov).

Optimizaciones de memoria y recursos

  • Ajustar algunas configuraciones de jemalloc para mejorar el rendimiento. #81807 (Antonio Andelic).
  • Añadir alineación al Counter de ProfileEvents para reducir el false sharing. #82697 (Jiebin Sun).
  • Reducir las llamadas innecesarias a memcpy en CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).

Planificación y análisis de consultas

Mejoras de logging

Optimizaciones de funciones

  • Se optimizó largestTriangleThreeBuckets eliminando datos temporales. #84479 (Alexey Milovidov).
  • Se optimizó y simplificó la implementación de muchas funciones de procesamiento de cadenas. Se corrigió la documentación incorrecta de varias funciones. Nota: El resultado de byteSize para columnas String y tipos complejos que contienen columnas String ha cambiado de 9 bytes por cadena vacía a 8 bytes por cadena vacía, lo cual es el comportamiento esperado. #85063 (Alexey Milovidov).

Mejoras de Keeper

Mejoras en el lago de datos

  • Mejora del procesamiento paralelo de archivos con el backend de delta-kernel-rs. #85642 (Azat Khuzhin).

Mejoras

Control de acceso y seguridad

  • Se introducen dos nuevos tipos de acceso: READ y WRITE para las fuentes, y se deprecian todos los tipos de acceso anteriores relacionados con las fuentes. Antes, GRANT S3 ON *.* TO user; ahora: GRANT READ, WRITE ON S3 TO user. Esto también permite separar los permisos READ y WRITE para las fuentes; por ejemplo: GRANT READ ON * TO user, GRANT WRITE ON S3 TO user. Esta funcionalidad se controla mediante la configuración access_control_improvements.enable_read_write_grants y está deshabilitada de forma predeterminada. #73659 (pufit).
  • Se permiten parámetros en las consultas CREATE USER para nombres de usuario. #81387 (Diskein).
  • Se excluyen los datos sensibles de los volcados de memoria. Se añaden dos asignadores: AwsNodumpMemoryManager, compatible con la biblioteca de AWS, y JemallocNodumpSTLAllocator, compatible con STL. Ambos son envoltorios del asignador jemalloc. Usan los extent hooks de jemalloc y madvise para marcar las páginas de memoria como “don’t dump”. Se usan para credenciales de S3, credenciales de usuario y algunos datos de consultas. #82441 (Miсhael Stetsyuk).
  • Las vistas creadas por usuarios efímeros ahora almacenarán una copia del usuario real y ya no se invalidarán después de que se elimine el usuario efímero. #84763 (pufit).
  • forward_headers de la autenticación externa ahora se compara sin distinguir entre mayúsculas y minúsculas. #84737 (ingodwerust).
  • Se añade una columna parameter a system.grants para determinar el tipo de fuente para GRANT READ/WRITE y el motor de tabla para GRANT TABLE ENGINE. #85643 (MikhailBurdukov).

Copia de seguridad y restauración

Integridad y validación de datos

  • Verifique que la parte tenga un archivo checksum.txt coherente justo antes de hacer commit. #76625 (Sema Checherinda).
  • Se prohíbe iniciar una mutación ALTER RENAME COLUMN si va a renombrar alguna columna que en ese momento esté afectada por una mutación de datos incompleta. #81823 (Mikhail Artemenko).
  • Ahora la instantánea de mutaciones se construirá a partir de la instantánea de las partes visibles. Los contadores de mutación usados en la instantánea también se recalcularán a partir de las mutaciones incluidas. #82945 (Mikhail Artemenko).
  • Se añade la capacidad de analizar el prefijo y el sufijo de la parte, y también de comprobar la cobertura de las columnas no constantes. #83377 (Mikhail Artemenko).

Motor de tabla Iceberg

  • Admite eliminaciones posicionales para el motor de tabla Iceberg. #80237 (YanghongZhong).
  • Ahora ClickHouse admite archivos metadata.json comprimidos para Iceberg. Corrige #70874. #81451 (alesapin).
  • Corrige la lectura de Iceberg por identificadores de campo para tipos complejos. #84821 (scanhex12).
  • Admite escrituras en Iceberg que pueden leerse desde pyiceberg. #84466 (scanhex12).
  • Añade la versión de instantánea a los motores de tabla de lago de datos. #84659 (Pete Hampton).
  • Admite la escritura de un archivo version-hint con Iceberg. Esto cierra #85097. #85130 (scanhex12).
  • Admite el archivo .metadata.json comprimido mediante la configuración iceberg_metadata_compression_method. Admite todos los métodos de compresión de ClickHouse. Esto cierra #84895. #85196 (scanhex12).
  • Se optimizó el uso de memoria para los archivos de eliminación posicional de Iceberg. En lugar de cargar en memoria todos los datos del archivo de eliminación, solo se mantiene en RAM el grupo de filas actual de los archivos de eliminación Parquet. Esto reduce significativamente el consumo de memoria al trabajar con archivos de eliminación posicional grandes. #85329 (scanhex12).
  • Permite iterar de forma asíncrona los objetos de una tabla Iceberg sin almacenar explícitamente objetos para cada archivo de datos. #85369 (Daniil Ivanik).
  • Admite eliminaciones por igualdad de Iceberg. #85843 (Han Fei).

Motor de tabla DeltaLake

  • Mejora del motor de tabla DeltaLake: delta-kernel-rs tiene la API ExpressionVisitor, que se implementa en este PR y se aplica a la transformación de expresiones de columnas de partición (reemplazará el método obsoleto de delta-kernel-rs que se usaba antes en nuestro código). En el futuro, este ExpressionVisitor también permitirá implementar pruning basado en estadísticas y algunas funcionalidades propietarias de delta-lake. Además, este cambio tiene como objetivo dar soporte a la poda de particiones en el motor de tabla DeltaLakeCluster (el resultado de una expresión analizada, ActionsDAG, se serializará y se enviará desde el iniciador junto con la ruta de datos, porque este tipo de información, necesaria para el pruning, solo está disponible como metainformación en el listado de archivos de datos, que solo realiza el iniciador, pero debe aplicarse a los datos en cada servidor de lectura). #81136 (Kseniia Sumarokova).
  • Corrección de la poda de particiones con funciones de clúster de lago de datos. #82131 (Kseniia Sumarokova).
  • Corrección de la lectura de datos particionados en la función de tabla DeltaLakeCluster. En este PR se incrementa la versión del protocolo de las funciones de clúster, lo que permite enviar información adicional desde el iniciador a las réplicas. Esta información adicional contiene la expresión de transformación de delta-kernel, necesaria para analizar las columnas de partición (y, en el futuro, algunas otras cosas, como las columnas generadas, etc.). #82132 (Kseniia Sumarokova).
  • Ahora la base de datos Datalake lanza una excepción más clara. Corrige #81211. #82304 (alesapin).
  • Implementación del filtrado interno de delta-kernel-rs (estadísticas y poda de particiones) en el almacenamiento DeltaLake. #84006 (Kseniia Sumarokova).
  • Se añade la configuración delta_lake_enable_expression_visitor_logging para desactivar los logs de expression visitor, ya que pueden ser demasiado verbosos incluso para el nivel de logs de prueba al depurar algo. #84315 (Kseniia Sumarokova).
  • Se añade la configuración delta_lake_snapshot_version para permitir leer una versión específica de instantánea en el motor de tabla DeltaLake. #85295 (Kseniia Sumarokova).

Integración con lago de datos

  • Acelera el listado de tablas en los catálogos de datos mediante solicitudes asíncronas. #81084 (alesapin).
  • Se admite TimestampTZ en el catálogo de Glue. Cierra #81654. #83132 (scanhex12).
  • Divide FormatParserGroup en dos structs independientes: el primero se encarga de los recursos compartidos de cómputo e IO, y el segundo, de los recursos compartidos de filtrado (filter ActionDag, KeyCondition). Esto se hace para permitir un uso compartido más flexible de estas estructuras entre distintos hilos. #83997 (Daniil Ivanik).
  • Añade partition_columns_in_data_file, que faltaba, a la configuración de Azure. #85373 (Arthur Passos).
  • Añade el indicador show_data_lake_catalogs_in_system_tables para controlar la incorporación de tablas de lago de datos en system.tables; resuelve #85384. #85411 (Smita Kulkarni).

S3 y almacenamiento de objetos

  • Implementa los métodos moveFile y replaceFile en s3_plain_rewritable para que pueda usarse como disco de base de datos. #79424 (Tuan Pham Anh).
  • Las solicitudes de lectura y escritura de S3 se limitan a nivel del socket HTTP (en lugar de a nivel de solicitudes S3 completas) para evitar problemas con la limitación de max_remote_read_network_bandwidth_for_server y max_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov).
  • Este PR introduce jitter en el mecanismo de reintento de S3 cuando la configuración s3_slow_all_threads_after_network_error está habilitada. #81849 (zoomxi).
  • Implementa la autenticación de AWS S3 con un rol de IAM proporcionado explícitamente. Implementa OAuth para GCS. Estas funcionalidades hasta hace poco solo estaban disponibles en ClickHouse Cloud y ahora se han liberado como código abierto. Sincroniza algunas interfaces, como la serialización de los parámetros de conexión para almacenamientos de objetos. #84011 (Alexey Milovidov).
  • Permite usar cualquier política de almacenamiento (es decir, almacenamiento de objetos, como S3) para la agregación/ordenación externas. #84734 (Azat Khuzhin).
  • Agrupa todos los objetos eliminados para ejecutar una sola operación de eliminación en el almacenamiento de objetos. #85316 (Mikhail Artemenko).

Motor de tabla S3Queue

  • Ahora se pueden usar macros como {uuid} en la configuración keeper_path del motor de tabla S3Queue. #82463 (Nikolay Degterinsky).
  • Se añade una nueva configuración del servidor, s3queue_disable_streaming, que deshabilita el streaming en tablas con el motor de tabla S3Queue. Esta configuración se puede cambiar sin reiniciar el servidor. #82515 (Kseniia Sumarokova).
  • Se añaden las columnas commit_time, commit_id a system.s3queue_log. #83016 (Kseniia Sumarokova).
  • Se añaden registros para el proceso de apagado de S3Queue. #83163 (Kseniia Sumarokova).
  • Se detiene el streaming de S3(Azure/etc)Queue antes de detener cualquier tabla durante el apagado del servidor. #83530 (Kseniia Sumarokova).
  • Se admite cambiar la configuración de inserción de MV en el nivel de tabla S3Queue. Se añaden nuevas configuraciones de nivel S3Queue: min_insert_block_size_rows_for_materialized_views y min_insert_block_size_bytes_for_materialized_views. De forma predeterminada, se usarán las configuraciones de nivel de perfil, y las configuraciones de nivel S3Queue las sobrescribirán. #83971 (Kseniia Sumarokova).
  • Corrección del modo ordenado de S3Queue: salir antes si se solicitó el apagado. #84463 (Kseniia Sumarokova).

Integración de Kafka

Mejoras de ClickHouse Keeper

  • Mejora de Keeper: mover archivos changelog entre discos en un hilo en segundo plano. Anteriormente, mover el changelog a un disco distinto bloqueaba Keeper de forma global hasta que finalizara el traslado. Esto provocaba una degradación del rendimiento si el traslado era una operación larga (por ejemplo, a un disco S3). #82485 (Antonio Andelic).
  • Mejora de Keeper: añadir una nueva configuración keeper_server.cleanup_old_and_ignore_new_acl. Si está habilitada, se borrarán las ACL de todos los nodos, mientras que se ignorarán las ACL de las solicitudes nuevas. Si el objetivo es eliminar por completo las ACL de los nodos, es importante dejar esta configuración habilitada hasta que se cree un nuevo snapshot. #82496 (Antonio Andelic).
  • Mejora de Keeper: admitir permisos específicos para la ACL world:anyone. #82755 (Antonio Andelic).
  • Añade compatibilidad para especificar ACL adicionales de Keeper para paths en la configuración. Si desea añadir ACL adicionales para un path específico, defínalas en la configuración, en zookeeper.path_acls. #82898 (Antonio Andelic).
  • Añade un ProfileEvent cuando Keeper rechaza una escritura debido al límite flexible de memoria. #82963 (Xander Garbett).
  • Habilita de forma predeterminada los feature flags create_if_not_exists, check_not_exists y remove_recursive en Keeper, lo que permite nuevos tipos de solicitudes. #83488 (Antonio Andelic).
  • Añade compatibilidad para aplicar ACL adicionales en nodos específicos de Keeper mediante la configuración apply_to_children. #84137 (Antonio Andelic).
  • Añade el comando get_acl a KeeperClient. #84641 (Antonio Andelic).
  • Añade 4LW en Keeper, lgrq, para activar o desactivar el registro de solicitudes recibidas. #84719 (Antonio Andelic).
  • Reduce la contención del bloqueo de almacenamiento en Keeper. #84732 (Antonio Andelic).
  • La herramienta encrypt_decrypt ahora admite conexiones a ZooKeeper cifradas. #84764 (Roman Vasin).
  • Limita el tamaño de la caché de entradas de log de Keeper por número de entradas mediante keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold y keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic).

Tipos JSON y Dynamic

  • Se añade el archivo columns_substreams.txt a la parte Wide para hacer un seguimiento de todos los subflujos almacenados en ella. Esto facilita el seguimiento de los flujos dinámicos en los tipos JSON y Dynamic y evita tener que leer una muestra de estas columnas para obtener la lista de flujos dinámicos (por ejemplo, para calcular el tamaño de las columnas). Además, ahora todos los flujos dinámicos se reflejan en system.parts_columns. #81091 (Pavel Kruglov).
  • Se permite ALTER UPDATE en columnas JSON y Dynamic. #82419 (Pavel Kruglov).
  • Ahora se pueden usar los tipos Time y Time64 dentro del tipo JSON. #83784 (Yarik Briukhovetskyi).
  • Se añade la configuración json_type_escape_dots_in_keys para escapar los puntos en las claves JSON durante el análisis del tipo JSON. Esta configuración está deshabilitada de forma predeterminada. #84207 (Pavel Kruglov).

Formatos Parquet y ORC

  • Se introducen opciones de configuración para establecer el tamaño del bloque de compresión de ORC, y se actualiza su valor predeterminado de 64KB a 256KB para mantener la coherencia con Spark o Hive. #80602 (李扬).
  • Se admite escribir enum de Parquet como matriz de bytes, tal como lo dicta la especificación. Más adelante escribiré más información. #81090 (Arthur Passos).
  • Se admite escribir geoparquets como formato de salida. #81784 (scanhex12).

Consultas distribuidas y réplicas paralelas

  • Se ha introducido un nuevo ajuste, enable_add_distinct_to_in_subqueries. Cuando está habilitado, ClickHouse añadirá automáticamente DISTINCT a las subconsultas en cláusulas IN para consultas distribuidas. Esto puede reducir significativamente el tamaño de las tablas temporales transferidas entre segmentos y mejorar la eficiencia de la red. Nota: esto implica una compensación: aunque se reduce la transferencia por red, cada nodo requiere trabajo adicional de fusión (deduplicación). Habilita este SETTING cuando la transferencia por red sea un cuello de botella y el coste de fusión sea aceptable. #81908 (fhw12345).
  • Se añade compatibilidad con las funciones de tabla remote-() y las réplicas paralelas si se proporciona un clúster en el argumento address_expression. Además, corrige #73295. #82904 (Igor Nikonov).
  • Las consultas JOIN con réplicas paralelas ahora usan el paso lógico de join. Si surge algún problema con consultas JOIN que usen réplicas paralelas, prueba SET query_plan_use_new_logical_join_step=0 y notifícalo. #83801 (Vladimir Cherkasov).

Ajustes y configuración

  • Marcar como obsoleto el ajuste allow_experimental_join_condition. #80566 (Vladimir Cherkasov).
  • Los limitadores de red globales y por usuario nunca se restablecen, lo que garantiza que nunca se superen los límites max_network_bandwidth_for_all_users y max_network_bandwidth_for_all_users. #81729 (Sergei Trifonov).
  • Introducir el ajuste optimize_rewrite_regexp_functions (habilitado de forma predeterminada), que permite al optimizador reescribir determinadas llamadas a replaceRegexpAll, replaceRegexpOne y extract en formas más simples y eficientes cuando detecta patrones específicos de expresiones regulares. (issue #81981). #81992 (Amos Bird).
  • Ajustar la cola de los servidores TCP (64 de forma predeterminada) en función de listen_backlog (4096 de forma predeterminada). #82045 (Azat Khuzhin).
  • Añadir la capacidad de recargar max_local_read_bandwidth_for_server y max_local_write_bandwidth_for_server en caliente, sin reiniciar el servidor. #82083 (Kai Zhu).
  • Introducir el ajuste enable_vector_similarity_index, que debe estar habilitado para usar el índice de similitud vectorial. El ajuste existente allow_experimental_vector_similarity_index ahora es obsoleto. Sigue funcionando en caso de que alguien lo necesite. #83459 (Robert Schulze).
  • Añadir max_joined_block_size_bytes, además de max_joined_block_size_rows, para limitar el uso de memoria de los JOIN con columnas pesadas. #83869 (Nikolai Kochetov).
  • Corregir la compatibilidad de cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
  • Habilitar por defecto la compatibilidad con subconsultas correlacionadas. #85107 (Dmitry Novik).
  • Añadir ajustes database_replicated que definen los valores predeterminados de DatabaseReplicatedSettings. Si el ajuste no está presente en la consulta CREATE de la DB Replicated, se utiliza el valor de este SETTING. #85127 (Tuan Pham Anh).
  • Permitir argumentos clave-valor en el motor o función de tabla s3 o s3Cluster, por ejemplo s3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova).
  • Ejecutar EXISTS no correlacionado como una subconsulta escalar. Esto permite usar una caché de subconsultas escalares y aplicar plegado de constantes al resultado, lo que resulta útil para los índices. Por compatibilidad, se añade el nuevo ajuste execute_exists_as_scalar_subquery=1. #85481 (Nikolai Kochetov).
  • Admitir la resolución de más casos de identificadores compuestos. En particular, mejora la compatibilidad de ARRAY JOIN con el analizador antiguo. Introducir un nuevo ajuste analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested para mantener el comportamiento anterior. #85492 (Nikolai Kochetov).

Tablas del sistema y observabilidad

  • Se añaden métricas de presión a las métricas asíncronas de ClickHouse. #80779 (Xander Garbett).
  • Se añaden las métricas MarkCacheEvictedBytes, MarkCacheEvictedMarks y MarkCacheEvictedFiles para rastrear las expulsiones de la mark cache. (issue #60989). #80799 (Shivji Kumar Jha).
  • La tabla system.formats ahora contiene información ampliada sobre los formatos, como el tipo de contenido HTTP, las capacidades de inferencia de esquemas, etc. #81505 (Alexey Milovidov).
  • Se añade compatibilidad para borrar todas las advertencias de la tabla system.warnings mediante TRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov).
  • Se listan las licencias de los crates de Rust en system.licenses. #82440 (Raúl Marín).
  • Se estiman CNF/DNF complejas, por ejemplo, (a < 1 and a > 0) or b = 3, mediante estadísticas. #82663 (Han Fei).
  • En algunos casos, necesitamos varias dimensiones en nuestras métricas. Por ejemplo, contar merges o mutations fallidos por códigos de error en lugar de usar un único contador. #83030 (Miсhael Stetsyuk).
  • Se añaden métricas de recurso del proceso (como UserTimeMicroseconds, SystemTimeMicroseconds y RealTimeMicroseconds) a los profile events de part_log para las entradas MergeParts. #83460 (Vladimir Cherkasov).
  • Las métricas a nivel de Cgroup y las métricas de todo el sistema ahora se informan conjuntamente. Las métricas a nivel de Cgroup tienen nombres CGroup<Metric> y las métricas a nivel del SO (recopiladas desde procfs) tienen nombres OS<Metric>. #84317 (Nikita Taranov).
  • Se añaden métricas dimensionales para supervisar el tamaño de las colas acotadas concurrentes, etiquetadas por tipo de cola e ID de instancia para una mejor observabilidad. #84675 (Miсhael Stetsyuk).
  • La tabla system.columns ahora proporciona column como alias de la columna name existente. #84695 (Yunchi Pang).
  • Se añade una columna de format string a system.errors. Esta columna es necesaria para agrupar por el mismo tipo de error en las reglas de alert. #84776 (Miсhael Stetsyuk).
  • Los límites de Async Log ahora pueden ajustarse y se añade introspección. #85105 (Raúl Marín).
  • Se ignora UNKNOWN_DATABASE al obtener el tamaño de las columnas de tabla para system.columns. #85632 (Azat Khuzhin).

Motores de base de datos

Mejoras del sistema e internas

  • Corrige el adjuntado de bases de datos con discos remotos de solo lectura añadiendo manualmente los UUID de las tablas a DatabaseCatalog. #82670 (Tuan Pham Anh).
  • Mejora la gestión de tareas DDL cuando distributed_ddl_output_mode='*_only_active' al no esperar a réplicas nuevas o recuperadas cuyo retraso de replicación supere max_replication_lag_to_enqueue. Esto ayuda a evitar errores DDL task is not finished on some hosts cuando una nueva réplica pasa a estar activa tras la inicialización o la recuperación, pero ha acumulado un registro de replicación extenso. También se implementó la consulta SYSTEM SYNC DATABASE REPLICA STRICT, que espera a que el registro de replicación descienda por debajo de max_replication_lag_to_enqueue. #83302 (Alexander Tokmakov).
  • Cambia el orden de apagado de SystemLogs para que se produzca después de las tablas normales (y antes de las tablas del sistema, en lugar de antes de las tablas normales). #83134 (Kseniia Sumarokova).
  • Añade la configuración del servidor logs_to_keep a la configuración de bases de datos Replicated, lo que permite establecer el parámetro predeterminado logs_to_keep para las bases de datos Replicated. Los valores más bajos reducen el número de nodos de ZooKeeper (especialmente beneficioso cuando hay muchas bases de datos), mientras que los valores más altos permiten que las réplicas ausentes se pongan al día tras períodos más largos de inactividad. #84183 (Alexey Khatskevich).
  • Cambia el valor predeterminado de la configuración de la base de datos Replicated max_retries_before_automatic_recovery a 10, lo que permite una recuperación más rápida en algunos casos. #84369 (Alexander Tokmakov).
  • Optimiza las operaciones DDL de vistas materializadas actualizables no append en bases de datos Replicated al omitir la creación y el cambio de nombre de tablas temporales antiguas. #84858 (Tuan Pham Anh).

Replicación y sincronización

Mejoras del sistema e internas

  • Mejorar SYSTEM RESTART REPLICA para reintentar la creación de tablas cuando se produzcan problemas de conexión con ZooKeeper, evitando que las tablas se pierdan. #82616 (Nikolay Degterinsky).
  • Añadir validación de UUID en ReplicatedMergeTree::executeMetadataAlter para evitar definiciones de tablas incorrectas cuando se intercambian tablas entre la obtención del StorageID y la llamada a IDatabase::alterTable. #82666 (Nikolay Degterinsky).
  • Eliminar la lógica experimental send_metadata relacionada con la replicación experimental zero-copy. Este código nunca se usó, no era compatible y probablemente estaba roto, sin pruebas para verificar su funcionamiento. #82508 (alesapin).
  • Añadir compatibilidad con la expansión de macros en remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).

Funciones y expresiones

  • La función addressToSymbol y la tabla system.symbols usarán desplazamientos dentro del archivo en lugar de direcciones de memoria virtual. #81896 (Alexey Milovidov).
  • Intenta preservar los nombres de los elementos al derivar supertipos para tuplas con nombre. #81345 (lgbo).
  • Se permite mezclar diferentes reglas de ordenación para la misma columna en distintas ventanas. #82877 (Yakov Olkhovskiy).
  • Se añade una función para escribir tipos en formato wkb. #82935 (scanhex12).
  • Se añade la capacidad de interpretar Time y Time64 en formato MM:SS, M:SS, SS o S. #83299 (Yarik Briukhovetskyi).
  • La función reinterpret() ahora admite la conversión a Array(T), donde T es un tipo de datos de tamaño fijo (incidencia #82621). #83399 (Shankar Iyer).
  • Se corrigen las funciones structureToProtobufSchema y structureToCapnProtoSchema para que añadan correctamente un byte nulo de terminación en lugar de usar un salto de línea, lo que evita la falta de saltos de línea en la salida y posibles desbordamientos de búfer en las funciones que dependen del byte nulo (como logTrace, demangle, extractURLParameter, toStringCutToZero y encrypt/decrypt). Cierra #85062. #85063 (Alexey Milovidov).
  • Corrige la estructura del diccionario regexp_tree para admitir el procesamiento de cadenas con bytes nulos. #85063 (Alexey Milovidov).
  • Se corrigió la función formatRowNoNewline, que por error truncaba el último carácter de la salida cuando se llamaba con el formato Values o con cualquier formato sin un salto de línea al final de las filas. #85063 (Alexey Milovidov).
  • Se corrige un error de seguridad ante excepciones en la función stem que, en casos poco frecuentes, podía provocar fugas de memoria. #85063 (Alexey Milovidov).
  • Se corrigió la función initcap para argumentos FixedString para que reconozca correctamente el inicio de las palabras al comienzo de las cadenas cuando la cadena anterior de un bloque terminaba con un carácter de palabra. #85063 (Alexey Milovidov).
  • Se solucionó una vulnerabilidad de seguridad en el formato Apache ORC que podía provocar la exposición de memoria no inicializada. #85063 (Alexey Milovidov).
  • Se cambió el comportamiento de replaceRegexpAll y su alias REGEXP_REPLACE para permitir coincidencias vacías al final de las cadenas, incluso cuando la coincidencia anterior procesó toda la cadena (p. ej., ^a*|a*$ o ^|.*), en consonancia con la semántica de JavaScript, Perl, Python, PHP y Ruby, pero a diferencia de PostgreSQL. #85063 (Alexey Milovidov).
  • Se optimizó y simplificó la implementación de muchas funciones de manejo de cadenas. Se corrigió la documentación incorrecta de varias funciones. Nota: La salida de byteSize para columnas String y tipos complejos que contienen columnas String ha cambiado de 9 bytes por cadena vacía a 8 bytes por cadena vacía, que es el comportamiento esperado. #85063 (Alexey Milovidov).
  • Permitir un paso de cero en las funciones timeSeries*ToGrid(). Esta es la parte #3 de https://github.com/ClickHouse/ClickHouse/pull/75036. #85390 (Vitaly Baranov).
  • Se admiten arrays internos para la función nested. #85719 (Nikolai Kochetov).

Mejoras de MergeTree

  • Deshabilita de forma más precisa los índices de omisión que dependen de columnas actualizadas sobre la marcha o mediante partes de parche. Ahora, los índices de omisión solo dejan de usarse en las partes afectadas por mutaciones sobre la marcha o partes de parche; antes, se deshabilitaban para todas las partes. #84241 (Anton Popov).
  • Añade la configuración de MergeTree search_orphaned_parts_drives para limitar el alcance de la búsqueda de partes, por ejemplo, por discos con metadatos locales. #84710 (Ilya Golshtein).
  • Añade la compatibilidad que faltaba de read_in_order_use_virtual_row para WHERE. Esto permite omitir la lectura de más partes en consultas con filtros que no se habían transferido por completo a PREWHERE. #84835 (Nikolai Kochetov).
  • Corrige el uso de la serialización de discriminadores Variant “compact” en MergeTree. Antes no se usaba en algunos casos en los que sí podía utilizarse. #84141 (Pavel Kruglov).
  • Añade un límite (configuración de tabla max_uncompressed_bytes_in_patches) para el total de bytes sin comprimir en partes de parche. Esto evita ralentizaciones significativas de las consultas SELECT después de actualizaciones ligeras y previene un posible uso indebido de esta función. #85641 (Anton Popov).

Gestión de la caché y la memoria

  • Se corrige un error lógico en la caché del sistema de archivos: “Tiene cero bytes, pero el rango no ha terminado”. #81868 (Kseniia Sumarokova).
  • Se añade hash de rendezvous para mejorar la localidad de la caché. #82511 (Anton Ivashkin).
  • Se refactoriza la funcionalidad de cambio de tamaño dinámico de la caché del sistema de archivos. Se añaden más logs para la introspección. #82556 (Kseniia Sumarokova).
  • Se reduce la sobrecarga del seguimiento de memoria de las consultas para las funciones ejecutables definidas por el usuario. #83929 (Eduard Karacharov).
  • Todas las asignaciones de memoria realizadas por bibliotecas externas ahora son visibles para el memory tracker de ClickHouse y se contabilizan correctamente. Esto puede dar lugar a un “aumento” del uso de memoria notificado para determinadas consultas o a fallos con MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov).
  • Se asigna la cantidad mínima de memoria necesaria para encrypted_buffer en las colecciones con nombre cifradas. #84432 (Pablo Marcos).

Índice de similitud vectorial

  • Se impide que el usuario use nan e inf con NumericIndexedVector. Corrige #82239 y algo más. #82681 (Raufs Dunamalijevs).
  • El índice de similitud vectorial ahora admite cuantización binaria. La cuantización binaria reduce significativamente el consumo de memoria y acelera el proceso de creación de un índice vectorial (gracias a un cálculo de distancias más rápido). Además, la configuración existente vector_search_postfilter_multiplier quedó obsoleta y se sustituyó por una configuración más general: vector_search_index_fetch_multiplier. #85024 (Shankar Iyer).
  • La búsqueda vectorial aproximada con índices de similitud vectorial ya es GA. #85888 (Robert Schulze).

Manejo de errores y mensajes

  • La cabecera Connection se envía al final de las cabeceras, cuando se sabe que la conexión debe mantenerse. #81951 (Sema Checherinda).
  • En versiones anteriores, la multiplicación del estado de una función de agregación con IPv4 producía un error lógico en lugar de un código de error adecuado. Cierra #82817. #82818 (Alexey Milovidov).
  • Se mejoró el manejo de errores en AsynchronousMetrics. Si el directorio /sys/block existe pero no es accesible, el servidor se iniciará sin monitorizar los dispositivos de bloque. Cierra #79229. #83115 (Alexey Milovidov).
  • Había una comprobación incorrecta de dependencias para INSERT con vistas materializadas que tienen SELECT mal formados, y el usuario podía recibir una std::exception críptica en lugar de un error significativo con una explicación clara. Esto ya se ha corregido. Esto corrige: #82889. #83190 (Nikita Mikhaylov).
  • No mostrar descripciones demasiado largas de las acciones de expresiones en los mensajes de excepción. Cierra #83164. #83350 (Alexey Milovidov).
  • Cuando el almacenamiento se está cerrando, getStatus lanza una excepción ErrorCodes::ABORTED. Antes, esto hacía fallar la consulta SELECT. Ahora capturamos las excepciones ErrorCodes::ABORTED y las ignoramos intencionadamente. #83435 (Miсhael Stetsyuk).
  • Los mensajes de excepción para determinadas situaciones al cargar y añadir proyecciones ahora son más fáciles de leer. #83728 (Robert Schulze).
  • Comprobar si la conexión se ha cancelado antes de comprobar EOF para evitar leer de una conexión cerrada. Corrige #83893. #84227 (Raufs Dunamalijevs).
  • Se mejoró el manejo del apagado del servidor para las conexiones del client al simplificar las comprobaciones internas. #84312 (Raufs Dunamalijevs).
  • Los errores de bajo nivel durante la ejecución de UDF ahora fallan con el código de error UDF_EXECUTION_FAILED, mientras que antes podían devolverse distintos códigos de error. #84547 (Xu Jia).

Mejoras en el formato de SQL

  • Se corrige el formato inconsistente de CREATE DICTIONARY. Cierra #82105. #82829 (Alexey Milovidov).
  • Se corrige el formato inconsistente de TTL cuando contiene una función materialize. Cierra #82828. #82831 (Alexey Milovidov).
  • Se corrige el formato inconsistente de EXPLAIN AST en una subconsulta cuando contiene opciones de salida como INTO OUTFILE. Cierra #82826. #82840 (Alexey Milovidov).
  • Se corrige el formato inconsistente de expresiones entre paréntesis con alias en contextos donde no se permiten alias. Cierra #82836. Cierra #82837. #82867 (Alexey Milovidov).
  • Se corrige el formato de CREATE USER con parámetros de consulta (es decir, CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin).
  • Se corrige el análisis sintáctico de una coma final en las columnas de la consulta CREATE DICTIONARY después de una columna con parámetros, por ejemplo, Decimal(8). Cierra #85586. #85653 (Nikolay Degterinsky).

Integraciones externas

  • Unificar los nombres de los parámetros en ODBC y JDBC al usar colecciones con nombre. #83410 (Andrey Zvonov).
  • MongoDB: Conversión implícita de cadenas a tipos numéricos. Anteriormente, si se recibía un valor de cadena desde un origen de MongoDB para una columna numérica en una tabla de ClickHouse, se generaba una excepción. Ahora, el motor intenta analizar automáticamente el valor numérico de la cadena. Cierra #81167. #84069 (Kirill Nikiforov).
  • Permitir simdjson en arquitecturas no compatibles (anteriormente provocaba errores CANNOT_ALLOCATE_MEMORY). #84966 (Azat Khuzhin).

Mejoras varias

  • Se añade el motor de tabla Ytsaurus y la función de tabla. #77606 (MikhailBurdukov).
  • Se mejora HashJoin::needUsedFlagsForPerRightTableRow; devuelve false para cross join. #82379 (lgbo).
  • Se permite escribir/leer columnas Map como un Array de Tuples. #82408 (MikhailBurdukov).
  • Se revirtió este PR. #82884 (Mithun p).
  • Async logs: se limita el número máximo de entradas que se mantienen en la cola. #83214 (Raúl Marín).
  • Se habilita el uso de Date/Date32 como enteros en formatos de entrada JSON. #83597 (MikhailBurdukov).
  • Se mejora la compatibilidad con índices bloom filter (regular, ngram y token) para que se utilicen cuando el primer argumento es un Array constante (el conjunto) y el segundo es la columna indexada (el subconjunto), lo que permite una ejecución de consultas más eficiente. #84700 (Doron David).
  • Se permite la conversión de tipo de los valores Set al hacer pushdown de filtros IN / GLOBAL IN sobre las claves primarias del almacenamiento KeyValue (p. ej., EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov).
  • Se eliminan las exploraciones completas en los casos en que el análisis de índices da como resultado rangos vacíos para la lectura con réplicas paralelas. #84971 (Eduard Karacharov).
  • Se corrige una lista de problemas que pueden producirse al intentar ejecutar pruebas de integración en un host local. #82135 (Oleg Doronin).
  • Se habilita trace_log.symbolize de forma predeterminada para despliegues antiguos. #85456 (Azat Khuzhin).

Correcciones de errores (mal funcionamiento perceptible para el usuario en una versión estable oficial)

Optimizaciones de rendimiento

Correcciones en la ejecución de consultas

  • Para las consultas con la combinación ORDER BY ... LIMIT BY ... LIMIT N, cuando ORDER BY se ejecuta como un PartialSorting, el contador rows_before_limit_at_least ahora refleja el número de filas consumidas por la cláusula LIMIT en lugar del número de filas consumidas por la operación de ordenación. #78999 (Eduard Karacharov).
  • Se corrigió un error lógico con el operador <=> y el almacenamiento Join; ahora la consulta devuelve el código de error adecuado. #80165 (Vladimir Cherkasov).
  • Se corrige un cierre inesperado en la función loop cuando se usa con la familia de funciones remote. Se garantiza que se respete la cláusula LIMIT en loop(remote(...)). #80299 (Julia Kartseva).
  • Corrige el comportamiento incorrecto de las funciones to_utc_timestamp y from_utc_timestamp al manejar fechas anteriores a la época Unix (1970-01-01) y posteriores a la fecha máxima (2106-02-07 06:28:15). Ahora estas funciones acotan correctamente los valores al inicio de la época y a la fecha máxima, respectivamente. #80498 (Surya Kant Ranjan).
  • Corrige la ejecución de IN con transform_null_in=1 cuando hay NULL en el argumento izquierdo y el resultado de la subconsulta no es anulable. #81584 (Pavel Kruglov).
  • Se corrige el problema por el cual no se leen las columnas necesarias durante el procesamiento de subconsultas escalares correlacionadas. Corrige #81716. #81805 (Dmitry Novik).
  • Corrige el análisis de filtros cuando en la consulta solo se utiliza una columna de alias constante. Corrige #79448. #82037 (Dmitry Novik).
  • Corrige el error Not found column en consultas con arrayJoin en la condición WHERE e IndexSet. #82113 (Nikolai Kochetov).
  • Se corrige la excepción TOO_DEEP_SUBQUERIES cuando la definición de una CTE hace referencia a otra expresión de tabla con el mismo nombre. #83413 (Dmitry Novik).
  • Corrige los resultados incorrectos de las consultas con la cláusula WHERE ... IN (<subquery>) y la caché de condiciones de consulta activada (configuración use_query_condition_cache). #83445 (LB7666).
  • INSERT SELECT con UNION ALL podía provocar la desreferenciación de un puntero nulo en un caso excepcional. Con esto se cierra #83618. #83643 (Alexey Milovidov).
  • Se corrigió LOGICAL_ERROR durante el análisis de expresiones de la política de filas para columnas correlacionadas. #82618 (Dmitry Novik).
  • Se corrigieron resultados erróneos cuando la caché de condiciones de consulta se utiliza junto con CTE recursivos (problema #81506). #84026 (zhongyuankai).
  • Corrige el análisis recursivo infinito de definiciones no válidas de WINDOW. Corrige #83131. #84242 (Dmitry Novik).
  • Se corrigió Not-ready Set para IN (subquery) dentro de la configuración additional_table_filters expression. #85210 (Nikolai Kochetov).
  • Corrige un error lógico con subconsultas duplicadas cuando optimize_syntax_fuse_functions está habilitado; cierra #75511. #83300 (Vladimir Cherkasov).

Correcciones de Iceberg y DataLake

  • Se corrige la resolución de metadatos al consultar tablas Iceberg a través de REST catalog. … #80562 (Saurabh Kumar Ojha).
  • Se corrigen las condiciones de carrera en Iceberg. #82088 (Azat Khuzhin).
  • Se corrige “Context has expired” en Iceberg. #82146 (Azat Khuzhin).
  • Ahora ClickHouse puede leer tablas Iceberg desde Glue catalog después de la evolución del esquema. Corrige #81272. #82301 (alesapin).
  • Se corrigen las condiciones de carrera en Iceberg. #82841 (Azat Khuzhin).
  • Se desactiva la poda de archivos basada en límites para elementos de Array de Iceberg y valores de map de Iceberg, incluidos todos sus subcampos anidados. #83520 (Daniil Ivanik).
  • Se corrige la escritura en Iceberg para tipos complejos. #85330 (scanhex12).
  • La escritura de límites inferiores y superiores no es compatible con tipos complejos. #85332 (scanhex12).
  • Se corrige la nulabilidad de los campos en Iceberg. #85977 (scanhex12).
  • Ya no se crea un archivo de eliminación de Iceberg vacío. #86061 (scanhex12).
  • Se actualiza el timestamp de los metadatos en las escrituras de Iceberg. #85711 (scanhex12).
  • Spark no puede leer archivos de eliminación por posición. #85762 (scanhex12).
  • Deja de tomar el esquema de los manifest files, pero almacena de forma independiente los esquemas relevantes para cada snapshot. Infiere el esquema relevante para cada archivo de datos a partir de su snapshot correspondiente. El comportamiento anterior violaba la especificación de Iceberg para las entries de manifest files con estado existing. #84588 (Daniil Ivanik).
  • Ahora Iceberg ya no intenta almacenar en caché la snapshot version relevante entre consultas SELECT y siempre intenta resolver el snapshot correctamente. El intento anterior de almacenar en caché el snapshot de Iceberg provocaba problemas al usar una tabla Iceberg con time travel. #85038 (Daniil Ivanik).
  • Se corrige la resolución de metadatos al consultar tablas Iceberg a través de REST catalog. … #85531 (Saurabh Kumar Ojha).
  • Se corrige el enmascaramiento de secretos en las table functions icebergS3Cluster e icebergAzureCluster. #85658 (MikhailBurdukov).

Correcciones de DeltaLake

Correcciones de TTL y MergeTree

  • Recalcula el índice min-max cuando TTL reduce las filas para garantizar la corrección de los algoritmos que dependen de él, como minmax_count_projection. Esto resuelve #77091. #77166 (Amos Bird).
  • Corrige el recálculo incorrecto de TTL en TTL GROUP BY al actualizar TTL. #81222 (Evgeniy Ulasik).
  • Corrige el error “Context has expired” durante las fusiones cuando se usa un diccionario en la expresión TTL. #81690 (Azat Khuzhin).
  • Corrige LOGICAL_ERROR y el fallo posterior al usar la misma columna en TTL para GROUP BY y SET. #82054 (Pablo Marcos).
  • MergeTree ya no hace nada relacionado con TTL si se eliminan todos los TTL de la tabla. #84441 (alesapin).
  • Corrige que ALTER MODIFY ORDER BY no validara las columnas TTL en las claves de ordenación. Las columnas TTL ahora se rechazan correctamente cuando se usan en cláusulas ORDER BY durante operaciones ALTER, lo que evita una posible corrupción de la tabla. #84536 (xiaohuanlin).

Correcciones de proyecciones

  • Se corrige un error lógico al materializar una proyección cuando el tipo de la columna se cambiaba a Nullable. #80741 (Pavel Kruglov).
  • Se corrige el uso incorrecto de los metadatos del padre en la función de tabla mergeTreeProjection cuando enable_shared_storage_snapshot_in_query = 1. Esto corresponde a #82634. #82638 (Amos Bird).
  • Se corrige un bloqueo poco frecuente de ClickHouse cuando una tabla tiene una proyección, lightweight_mutation_projection_mode = 'rebuild' y el usuario ejecuta un lightweight delete que elimina TODAS las filas de cualquier bloque de la tabla. #84158 (alesapin).
  • Se corrige la copia de seguridad de partes con proyecciones dañadas. #85362 (Antonio Andelic).
  • Se prohíbe usar la columna _part_offset en proyecciones en las versiones hasta que se estabilice. #85372 (Sema Checherinda).

Correcciones de réplicas paralelas

  • En algunas consultas ejecutadas con réplicas paralelas, las optimizaciones de lectura en orden podían aplicarse en el iniciador, pero no en los nodos remotos. Esto hacía que el coordinador de réplicas paralelas (en el iniciador) y los nodos remotos usaran modos de lectura distintos, lo cual es un error lógico. #80652 (Igor Nikonov).
  • Se deshabilitan las réplicas paralelas cuando una subconsulta contiene FINAL #81401 por . #83455 (zoomxi).
  • Se corrige LOGICAL_ERROR en consultas con réplicas paralelas y múltiples JOIN INNER seguidos de un JOIN RIGHT. No se usan réplicas paralelas para esas consultas. #84299 (Vladimir Cherkasov).
  • Las consultas con réplicas paralelas que usan la optimización de lectura inversa en orden pueden producir resultados incorrectos. #85406 (Igor Nikonov).

Autenticación y seguridad

  • Se corrige la ocultación de los valores de las named collections en logs/query_log. Cierra #82405. #82510 (Kseniia Sumarokova).
  • Se establece la sal para los datos de autenticación al analizarlos desde el AST con el tipo SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
  • Se ocultan los detalles de autenticación del schema registry de Avro para que no sean visibles para el usuario ni en los logs. #83713 (János Benjamin Antal).
  • Se corrige el comportamiento incorrecto por el que, al ejecutar REVOKE S3 ON system.*, se revocan los permisos de S3 para *.*. Esto corrige #83417. #83420 (pufit).
  • Se corrige un fallo del servidor cuando un usuario creado con no_password intenta iniciar sesión después de que la configuración del servidor allow_no_password se cambiara a 0. #84426 (Shankar Iyer).
  • Se mejora el mensaje de error al intentar crear un usuario identificado con JWT. #85072 (Konstantin Bogdanov).
  • Se ocultan las credenciales de deltaLakeAzure, deltaLakeCluster, icebergS3Cluster e icebergAzureCluster. #85889 (Julian Maicher).
  • Se corrige un error introducido en #79963. Al insertar en una vista materializada con un definidor, la comprobación de permisos debe usar los privilegios del definidor. Corrige #79951. #83502 (pufit).

Correcciones en copias de seguridad y restauración

  • Se corrige la copia de seguridad de una tabla Memory vacía, que provocaba que fallara la restauración de la copia de seguridad con el error BACKUP_ENTRY_NOT_FOUND. #82791 (Julia Kartseva).
  • Se corrige un mensaje de error engañoso al restaurar una copia de seguridad en un disco de solo lectura. #83051 (Julia Kartseva).
  • Se corrige el inicio innecesario de copias de seguridad internas tras problemas de conexión. #84755 (Vitaly Baranov).

Funciones de ventana y funciones de agregación

  • Se corrige un posible fallo en Aggregator en caso de excepción durante la fusión. #81450 (Nikita Taranov).
  • Se corrige un posible fallo en Aggregator en caso de excepción durante la fusión. #82022 (Nikita Taranov).
  • Se corrige un error de copiar y pegar en arraySimilarity, impidiendo el uso de pesos UInt32 e Int32. Se actualizan las pruebas y la documentación. #82103 (Mikhail f. Shiryaev).
  • Se corrige el desbordamiento en las funciones numericIndexedVectorPointwiseAdd, numericIndexedVectorPointwiseSubtract, numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide, que se producía al aplicarlas a números grandes. #82165 (Raufs Dunamalijevs).

Correcciones de Parquet y del formato de archivo

  • Corrige el filtro bloom de Parquet, que aplicaba incorrectamente una condición como WHERE function(key) IN (...) como si fuera WHERE key IN (...). #81255 (Michael Kolupaev).
  • Corrige la escritura en Parquet, que generaba estadísticas incorrectas (mín./máx.) para tipos Decimal. #83754 (Michael Kolupaev).
  • Corrige la deserialización de groupArraySample/groupArrayLast en caso de elementos vacíos (la deserialización podía omitir parte del binario si la entrada estaba vacía; esto puede provocar corrupción durante la lectura de datos y UNKNOWN_PACKET_FROM_SERVER en el protocolo TCP). Esto no afecta a números ni a tipos de fecha y hora. #82763 (Pedro Ferreira).
  • Corrige la escritura de rutas JSON con valores NULL en formato RowBinary. #83923 (Pavel Kruglov).

Correcciones de JOIN

  • Corrige la modificación de filtros en consultas con una expresión JOIN sobre una tabla con motor Merge. Corrige #82092. #82950 (Dmitry Novik).
  • Corrige el fallo al hacer JOIN con un almacenamiento key-value usando una clave con conversión de tipo. #82497 (Pervakov Grigorii).
  • Corrige un error lógico al resolver el matcher en una consulta con múltiples JOINs; cierra #81969. #82421 (Vladimir Cherkasov).
  • Corrige la fusión del filtro en la condición de JOIN en los casos en que los operandos de igualdad tienen tipos distintos o hacen referencia a constantes. Corrige #83432. #84145 (Dmitry Novik).
  • Corrige el error lógico Expected single dictionary argument for function al hacer JOIN con una condición de desigualdad cuando una de las columnas es LowCardinality y la otra es una constante. Cierra #81779. #84019 (Alexey Milovidov).

Correcciones de la base de datos Replicated

  • Se corrigió markReplicasActive en DDLWorker y DatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh).
  • Se corrigió DatabaseReplicated::getClusterImpl. Si el primer elemento (o elementos) de hosts tiene id == DROPPED_MARK y no hay otros elementos para el mismo segmento, el primer elemento de shards será un vector vacío, lo que provoca std::out_of_range. #82093 (Miсhael Stetsyuk).
  • Ahora se realiza un seguimiento del número de jobs asíncronos de carga de tablas. Si hay jobs en ejecución, no se actualiza tail_ptr en TransactionLog::removeOldEntries. #82824 (Tuan Pham Anh).
  • Se corrigió el problema por el que, si una tabla MergeTree se crea con add_minmax_index_for_numeric_columns=1 o add_minmax_index_for_string_columns=1, el índice se materializa posteriormente durante una operación ALTER, lo que impide que la base de datos Replicated se inicialice correctamente en una nueva réplica. #83751 (Nikolay Degterinsky).
  • Se corrigió la creación de RMV en una nueva réplica de la base de datos Replicated si se elimina DEFINER. #85327 (Nikolay Degterinsky).
  • Se corrigió la recuperación de bases de datos replicadas cuando el movimiento del archivo de metadatos tarda mucho tiempo. #85177 (Tuan Pham Anh).
  • Se forzó la recuperación de la base de datos Replicated después de restaurar los metadatos de la base de datos en Keeper. #85960 (Tuan Pham Anh).
  • Se corrigió un error en la recuperación de la base de datos Replicated: si el nombre de una tabla contiene el símbolo %, durante la recuperación podía volver a crearse con un nombre distinto. #85987 (Alexander Tokmakov).
  • Ahora el worker de DDL limpia los hosts obsoletos del conjunto de réplicas. Esto reducirá la cantidad de metadatos almacenados en ZooKeeper. #88154 (alesapin).

Correcciones de las actualizaciones ligeras

  • Se corrigen las actualizaciones ligeras en tablas con motores ReplacingMergeTree y CollapsingMergeTree. #84851 (Anton Popov).
  • Se corrige un error lógico en las actualizaciones ligeras que actualizan todas las columnas de la tabla. #84380 (Anton Popov).
  • Se corrigen las actualizaciones ligeras en tablas con el motor ReplicatedMergeTree creadas en servidores con una versión inferior a la 25.7. #84933 (Anton Popov).
  • Se corrigen las actualizaciones ligeras en tablas con el motor MergeTree no replicado después de ejecutar una consulta ALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov).
  • Se corrige la limpieza de las partes de parche en ReplicatedMergeTree. Anteriormente, el resultado de una actualización ligera podía no ser visible temporalmente en la réplica hasta que la parte fusionada o mutada que materializa las partes de parche se descargara desde otra réplica. #85121 (Anton Popov).

Correcciones de S3 y almacenamiento de objetos

  • Se corrige la validación de argumentos de la función de tabla S3 en el enmascaramiento de secretos, lo que evita un posible LOGICAL_ERROR; cierra #80620. #82056 (Vladimir Cherkasov).
  • Se corrige un posible interbloqueo en consultas remotas cuando el servidor está bajo presión de memoria. #82160 (Kirill).
  • Se añade caducidad al token de AWS ECS para que pueda recargarse. #82422 (Konstantin Bogdanov).
  • Se corrige la desactivación de la alineación de límites para el búfer en caché en motores de tablas externas. Esto se había roto en https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
  • Se corrige no_sign_request para el client de S3. Puede usarse para evitar explícitamente la firma de solicitudes a S3. También puede definirse para endpoints específicos mediante configuración basada en endpoints. #83379 (Antonio Andelic).
  • Se omiten los nodos no disponibles durante INSERT SELECT desde s3Cluster() a MergeTree replicado. #83676 (Igor Nikonov).
  • Se corrige la condición de retorno anticipado para la ralentización de la tasa de solicitudes de S3: ahora basta con que s3_slow_all_threads_after_network_error o backup_slow_all_threads_after_retryable_s3_error sea true para habilitar este comportamiento cuando todos los hilos estén pausados debido a un error reintentable, en lugar de requerir ambos. #85505 (Julia Kartseva).
  • Se corrige un error lógico al leer desde funciones de almacenamiento de objetos a través de una tabla Distributed o la función de tabla remote. Corrige: #84658, Corrige #85173, Corrige #52022. #85359 (alesapin).
  • Se corrige el error lógico de S3Queue “Table is already registered”. Cierra #84433. Se rompió tras https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
  • Se corrige que valores de configuración grandes rompan las tablas S3Queue y el reinicio de réplicas. #86074 (Nikolay Degterinsky).

DynamicAndVariantTypeFixes

  • Se corrige la reversión de una columna Dynamic cuando falla el análisis sintáctico. #82169 (Pavel Kruglov).
  • Se corrige un posible fallo en el tipo Variant en UNION. #83295 (Pavel Kruglov).
  • Se corrige la lectura de una columna Variant con materialización diferida. #84400 (Pavel Kruglov).
  • No se validan tipos experimentales o sospechosos durante la ejecución de expresiones default/materialize al leer desde una tabla existente. #81618 (Pavel Kruglov).

Correcciones de Keeper

  • Corrección en Keeper: actualiza correctamente el recuento total de watches cuando se eliminan nodos efímeros al cerrar la sesión. #83583 (Antonio Andelic).
  • Se corrigen escrituras desordenadas en el registro de cambios de Keeper. Anteriormente, podíamos tener escrituras en curso en el registro de cambios, pero una reversión podía provocar un cambio concurrente del archivo de destino. Esto podía dar lugar a registros incoherentes y a una posible pérdida de datos. #84434 (Antonio Andelic).
  • Se corrigen fugas de memoria en Keeper con almacenamiento RocksDB (los iteradores no se destruían). #84523 (Azat Khuzhin).
  • Se corrige un problema por el que la configuración de Keeper rotate_log_storage_interval = 0 hacía que ClickHouse se cerrara inesperadamente. (problema #83975). #84637 (George Larionov).
  • Se corrige el recuento total de watches devuelto por Keeper. #84890 (Antonio Andelic).
  • Se bloquea ‘mutex’ al obtener ZooKeeper desde ‘view’ en RefreshTask. #84699 (Tuan Pham Anh).

Correcciones de indexación

  • Se corrige el descarte excesivo de gránulos al filtrar sobre índices de token/ngram con regexp que contiene alternancia y una primera alternativa no literal. #79373 (Eduard Karacharov).
  • La implementación de la configuración use_skip_indexes_if_final_exact_mode (introducida en 25.6) podía no seleccionar un rango candidato relevante en función de la configuración del motor MergeTree o de la distribución de los datos. Esto ya se ha resuelto. #82667 (Shankar Iyer).
  • La optimización de la configuración use_skip_indexes_if_final_exact_mode (introducida en 25.6) podía no seleccionar un rango candidato relevante en función de la configuración del motor MergeTree o de la distribución de los datos. Esto ya se ha resuelto. #82879 (Shankar Iyer).
  • Anteriormente, los índices set no tenían en cuenta las columnas Nullable al comprobar si los gránulos cumplían el filtro (incidencia #75485). #84305 (Elmi Ahmadov).
  • La comparación con el valor NaN no usaba los rangos correctos durante la evaluación del índice MinMax. #84386 (Elmi Ahmadov).
  • Los tokenizadores ngram y no_op ya no provocan fallos en el índice de texto (experimental) cuando los tokens de entrada están vacíos. #84849 (Robert Schulze).

Correcciones de vistas materializadas

Correcciones de Azure y del almacenamiento en la nube

  • En AzureBlobStorage, en la copia nativa se comparan los métodos de autenticación y, si durante ese proceso se produce una excepción, el código ahora recurre a la lectura y copia (es decir, a una copia no nativa). #82693 (Smita Kulkarni).
  • Se corrigió una doble liberación de memoria en AzureIteratorAsync. #85064 (Nikita Taranov).

Correcciones de fallos y estabilidad

  • Corrige un posible fallo en logging al terminar una sesión, ya que user_id a veces puede estar vacío. #82513 (Bharat Nallan).
  • Corrige un fallo en el client debido a que la conexión quedaba en estado desconectado después de un INSERT erróneo. #83253 (Azat Khuzhin).
  • Corrige un fallo al calcular el tamaño de un bloque con columnas vacías. #83271 (Raúl Marín).
  • Corrige un fallo que puede producirse en una consulta con la configuración ‘max_threads=1’ cuando se ejecuta bajo carga con la planificación de CPU habilitada. #83387 (Fan Ziqi).
  • Convierte zoutofmemory en un error de hardware; de lo contrario, lanzará un error lógico. Véase https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei).
  • Corrige un posible aborto (debido al join de threads de la task) y, con suerte, cuelgues (en pruebas unitarias) durante el apagado de BackgroundSchedulePool. #83769 (Azat Khuzhin).
  • Corrige un interbloqueo provocado por el thread de comprobación de cancelación en segundo plano. #84203 (Antonio Andelic).
  • Corrige un interbloqueo durante el apagado debido al bloqueo recursivo del contexto durante la limpieza del bridge de bibliotecas. #83824 (Azat Khuzhin).
  • Corrige un fallo en el client debido a que la conexión quedaba en estado desconectado después de un INSERT erróneo. #83842 (Azat Khuzhin).
  • Corrige un posible comportamiento indefinido (fallos) en caso de MEMORY_LIMIT_EXCEEDED durante la deserialización de String. #85440 (Azat Khuzhin).
  • Corrige un fallo poco frecuente en las inserciones asíncronas que modifican log_comment o insert_deduplication_token. #85540 (Anton Popov).

Correcciones de Glue y Catalog

  • Se corrigió un error en la integración con Glue Catalog. Ahora ClickHouse puede leer tablas con tipos de datos anidados en las que algunas subcolumnas contienen decimales, por ejemplo: map<string, decimal(9, 2)>. Corrige #81301. #82114 (alesapin).
  • ClickHouse ahora lee tablas de Glue Catalog cuando el tipo de tabla está especificado en minúsculas. #84316 (alesapin).
  • Unity Catalog ahora ignora esquemas con tipos de datos extraños en el caso de tablas no delta. Corrige #85699. #85950 (alesapin).

Correcciones de funciones

  • Las funciones trim{Left,Right,Both} ahora admiten cadenas de entrada del tipo “FixedString(N)”. Por ejemplo, SELECT trimBoth(toFixedString('abc', 3), 'ac') ahora funciona. #82691 (Robert Schulze).
  • La función trim, cuando se llama con entradas todas constantes, ahora produce una cadena de salida constante. (Error #78796). #82900 (Robert Schulze).
  • Se corrige la salida incorrecta de la función formatDateTime cuando el formateador %f se usa junto con formateadores de tamaño variable (p. ej., %M). #83020 (Robert Schulze).
  • Se corrige un error con argumentos NULL en la función CASE. #82436 (Yarik Briukhovetskyi).
  • Se evita usar partes no relacionadas de un diccionario compartido en la función lowCardinalityKeys. #83118 (Alexey Milovidov).
  • Se corrige colorSRGBToOKLCH/colorOKLCHToSRGB para una mezcla de argumentos constantes y no constantes. #83906 (Azat Khuzhin).
  • Se corrige la construcción incorrecta de tuplas vacías en la función array(). Esto corrige #84202. #84297 (Amos Bird).
  • Se corrige un error que provocaba una codificación y decodificación Bech32 incorrectas. El error no se detectó originalmente porque una implementación en línea del algoritmo usada para las pruebas tenía el mismo problema. #84257 (George Larionov).

Correcciones de consultas distribuidas

  • Se permitía INSERT SELECT distribuido en paralelo con LIMIT, lo cual no es correcto, ya que provoca duplicación de datos en la tabla de destino. #84477 (Igor Nikonov).
  • No intente sustituir las funciones de tabla por su alternativa de clúster en presencia de un JOIN o una subconsulta. #84335 (Konstantin Bogdanov).
  • Se añade una comprobación para detectar si se usa una subconsulta correlacionada en un contexto distribuido y así evitar un bloqueo. Corrige #82205. #85030 (Dmitry Novik).
  • El uso de distributed_depth como indicador de la función *Cluster era incorrecto y podía provocar duplicación de datos; utilice client_info.collaborate_with_initiator en su lugar. #85734 (Konstantin Bogdanov).
  • Se admiten constantes globales de la instrucción WITH para INSERT SELECT distribuido en paralelo con la tabla de destino Distributed. Antes, la consulta podía producir un error Unknown expression identifier. #85811 (Nikolai Kochetov).
  • Se corrige un error lógico al intentar CREATE ... AS (SELECT * FROM s3Cluster(...)) con DatabaseReplicated. #85904 (Konstantin Bogdanov).
  • Se añaden comprobaciones para sharding_key durante ALTER de la tabla Distributed. Anteriormente, un ALTER incorrecto rompía la definición de la tabla y el reinicio del servidor. #86015 (Nikolay Degterinsky).

Correcciones de métricas y monitorización

  • Se corrige la validación de los ajustes de métricas asíncronas asynchronous_metrics_update_period_s y asynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan).
  • Se corrigen las métricas IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles (antes se incluían en la métrica sin el prefijo Cache). #83730 (Azat Khuzhin).
  • Se corrige LOGICAL_ERROR en QueryMetricLog: Mutex no puede ser NULL. #82979 (Pablo Marcos).
  • Se corrigen las métricas incorrectas KafkaAssignedPartitions y KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
  • Se corrige que la estadística de bytes procesados quede subestimada cuando se usa PREWHERE (explícita o automática). #85495 (Michael Kolupaev).
  • Se corrige el desajuste en el seguimiento de memoria del pool de programación en segundo plano y del executor. #84946 (Azat Khuzhin).

Correcciones de tipos de datos y conversiones

  • Se corrigen casos en los que el parsing de Time podía causar problemas con msan. Esto corrige: #82477. #82514 (Yarik Briukhovetskyi).
  • Se corrige la ordenación de valores NaN en el tipo LowCardinality(Float32|Float64|BFloat16). #83786 (Pervakov Grigorii).
  • Se corrige el overflow de valores grandes (>2106-02-07) al convertir de Date a DateTime64. #83982 (Yarik Briukhovetskyi).
  • Se corrige un problema con la lectura implícita de valores Time negativos en la table y se aclara la documentación. #83091 (Yarik Briukhovetskyi).
  • El códec DoubleDelta ahora solo puede aplicarse a columnas de tipo numérico. En particular, las columnas FixedString ya no pueden comprimirse con DoubleDelta. (corrige #80220). #84383 (Jimmy Aguilar Mena).
  • Se corrige la pérdida de precision en JSONExtract al convertir números JSON a Decimal types. Ahora, los valores numéricos JSON conservan su representación decimal exacta, lo que evita errores de rounding de coma flotante. #85665 (ssive7b).

Gestión de memoria y recursos

  • Se corrige el uso incorrecto de memoria relacionado con max_untracked_memory. #83607 (Azat Khuzhin).
  • No compartir async_read_counters entre consultas. #83423 (Azat Khuzhin).
  • Se corrigen posibles errores de caché del sistema de archivos sin inicializar cuando se usa como almacenamiento temporal de datos. #83539 (Bharat Nallan).
  • Aplicar siempre filesystem_prefetches_limit (no solo desde MergeTreePrefetchedReadPool). #83999 (Azat Khuzhin).

Correcciones de configuración y ajustes

  • Al pasar ajustes a través de la URI, se tiene en cuenta el último valor. #82137 (Sema Checherinda).
  • Se corrigen las condiciones de carrera en client (al no usar un contexto global) y las sobrescrituras de session_timezone (antes, si session_timezone se establecía, por ejemplo, en users.xml/las opciones de client con un valor no vacío y en el contexto de la consulta con un valor vacío, se usaba el valor de users.xml, lo cual era incorrecto; ahora el contexto de la consulta siempre tendrá prioridad sobre el contexto global). #82444 (Azat Khuzhin).
  • Ya no se permite establecer threadpool_writer_pool_size en cero para garantizar que las operaciones del server no se queden bloqueadas. #82532 (Bharat Nallan).
  • Se resuelve un pequeño desbordamiento de enteros en la configuración del ajuste role_cache_expiration_time_seconds (problema #83374). #83461 (wushap).
  • Ya no se permite el valor cero para max_insert_block_size, ya que podría provocar un error lógico. #83688 (Bharat Nallan).
  • Se corrige un bucle infinito en estimateCompressionRatio() con block_size_bytes=0. #83704 (Azat Khuzhin).
  • Parámetros como date_time_input_format simplemente se ignoraban al usar HTTP con multipart. #85570 (Sema Checherinda).

Correcciones de MongoDB

  • Anteriormente, las definiciones del motor de tabla MongoDB podían incluir un componente de ruta en el argumento host:port, que se ignoraba silenciosamente. La integración de MongoDB se niega a cargar esas tablas. Con esta corrección, permitimos cargar esas tablas e ignorar el componente de ruta si el motor MongoDB tiene cinco argumentos, usando el nombre de la base de datos indicado en los argumentos. Nota: La corrección no se aplica a tablas recién creadas ni a consultas con la función de tabla mongo, ni tampoco a fuentes de diccionario ni a colecciones con nombre. #81942 (Vladimir Cherkasov).

Correcciones varias

  • En versiones anteriores, el servidor devolvía contenido excesivo en las solicitudes a /js. Esto resuelve #61890. #81895 (Alexey Milovidov).
  • Se corrige InterpreterInsertQuery::extendQueryLogElemImpl para volver a añadir comillas invertidas a los nombres de la base de datos y la tabla cuando sea necesario (p. ej., cuando los nombres contienen caracteres especiales como -). #81528 (Ilia Shvyrialkin).
  • Se corrigió una posible condición de carrera entre el hilo de sugerencias y el hilo principal del client. #82233 (Azat Khuzhin).
  • Se corrigió la seguridad frente a excepciones en la reescritura de union/intersect/except_default_mode. Cierra #82664. #82820 (Alexey Milovidov).
  • Al usar una implementación de Database sin caché, los metadatos de la tabla correspondiente se eliminan tras devolver las columnas y la referencia se invalida. #82939 (buyval01).
  • La llamada a Onprogress en JSONEachRowWithProgress está sincronizada con la finalización. #83879 (Sema Checherinda).
  • Se corrigió un error poco frecuente por el que la consulta MATERIALIZE COLUMN podía generar archivos inesperados en checksums.txt y, con el tiempo, partes de datos en estado detached. #84007 (alesapin).
  • Manejo correcto de excepciones en la actualización periódica de partes. #84083 (Azat Khuzhin).
  • Se corrigió la generación de nombres de columnas para literales booleanos para que use “true”/“false” en lugar de “1”/“0”, lo que evita conflictos de nombres de columnas entre literales booleanos y enteros en las consultas. #84945 (xiaohuanlin).
  • Se solucionan posibles problemas de ordenación incorrecta en el motor de tabla Merge. #85025 (Xiaozhe Yu).
  • Se implementaron las API faltantes para DiskEncrypted. #85028 (Azat Khuzhin).
  • Se introduce una configuración de compatibilidad con versiones anteriores para permitir que el nuevo analizador pueda hacer referencia a un alias externo en la cláusula WITH en caso de conflictos de nombres. Corrige #82700. #83797 (Dmitry Novik).
  • Permite hacer referencia a cualquier tabla en el argumento view(...) de la función de tabla remote cuando el analizador está habilitado. Corrige #78717. Corrige #79377. #83844 (Dmitry Novik).
  • Se corrige la escritura en modo append en MergeTree utilizado para transacciones experimentales con tipos de metadatos plain_rewritable/plain; antes simplemente se ignoraban. #83695 (Tuan Pham Anh).
  • Se corrigió el uso del logger en IAccessStorage. #84365 (Konstantin Bogdanov).
  • Se corrige la poda de archivos mediante una columna virtual en lagos de datos. #84520 (Kseniia Sumarokova).
  • Se corrige un problema por el que una consulta a una fuente remota con retraso podía provocar un acceso a un vector fuera de límites. #84820 (George Larionov).
  • Almacena correctamente toda la configuración en los metadatos de la tabla para el motor de cola de objetos. #84860 (Antonio Andelic).
  • Se corrige el error CORRUPTED_DATA cuando se usan columnas diferidas con ordenación externa. #84738 (János Benjamin Antal).
  • Elimina las llamadas innecesarias a getStatus() en las consultas SYSTEM DROP REPLICA. Corrige el caso en el que una tabla se elimina en segundo plano y se lanza la excepción Shutdown for storage is called. #85220 (Nikolay Degterinsky).
  • Se añaden las comprobaciones que faltaban de la longitud del nombre de la tabla en las consultas CREATE OR REPLACE y RENAME. #85326 (Michael Kolupaev).
  • Se corrigen los cierres inesperados y la corrupción de datos durante ALTER UPDATE en JSON. #85383 (Pavel Kruglov).
  • Corrige el segfault de CoalescingMergeTree con cadenas grandes. Esto cierra #84582. #85709 (scanhex12).
  • Se corrige send_logs_source_regexp (tras la refactorización del logging asíncrono en #85105). #85797 (Azat Khuzhin).
  • Corregida una posible inconsistencia en los diccionarios con update_field en errores MEMORY_LIMIT_EXCEEDED. #85807 (Azat Khuzhin).
  • Corrige las solicitudes HTTP realizadas por la función de tabla url() para que incluyan correctamente los números de puerto en el encabezado Host al acceder a puertos no estándar. Esto resuelve fallos de autenticación al usar URL prefirmadas con servicios compatibles con S3, como MinIO, que se ejecutan en puertos personalizados, algo habitual en entornos de desarrollo. (Corrige #85898). #85921 (Tom Quist).
Última modificación el 10 de junio de 2026