Skip to main content

Cambios incompatibles con versiones anteriores

Cambios en consultas y sintaxis

  • El operador IN ahora usa una semántica de valores exactos para el tipo Bool: solo 0 y 1 del conjunto coinciden con valores Bool. Antes, los valores numéricos mayores que 255 en el conjunto de IN se convertían incorrectamente a true, por lo que SELECT CAST(1, 'Bool') IN (256) devolvía 1. Ahora devuelve correctamente 0. #93115 (Ashrith Bandla).
  • Se corrigió la precedencia del operador NOT para ajustarla al estándar SQL: NOT ahora tiene menor precedencia que IS NULL, BETWEEN, LIKE y los operadores aritméticos. Por ejemplo, NOT (x) IS NULL ahora se interpreta como NOT (x IS NULL) en lugar de (NOT x) IS NULL. Esto puede cambiar el resultado de las consultas que dependían del comportamiento anterior (no estándar). #97680 (Alexey Milovidov).
  • SELECT ya no se permite como identificador sin comillas en un elemento de la lista de expresiones WITH. #101059 (Aruj Bansal).
  • El operador IN ahora rechaza conversiones de Decimal con pérdida dentro de tipos compuestos (Tuple, Array, Map), lo que hace que su comportamiento sea coherente con las comparaciones escalares de nivel superior. Antes, las comprobaciones de precisión solo se aplicaban a valores escalares de nivel superior: por ejemplo, CAST('33.3', 'Decimal64(1)') IN (33.33) devolvía correctamente 0, pero CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) devolvía incorrectamente 1. Ahora ambos casos devuelven correctamente 0. #101812 (Nihal Z. Miaji).

Cambios en los tipos de datos

  • Las versiones de serialización de los tipos de datos ahora también se propagan a los tipos de datos anidados. Por ejemplo, la versión de serialización with_size_stream de String antes solo se aplicaba a las columnas String de nivel superior y a los elementos de Tuple; ahora se aplica a cualquier tipo String dentro de cualquier tipo anidado, como Array, Map, Variant o JSON. Esto se controla mediante el setting de MergeTree propagate_types_serialization_versions_to_nested_types, que ahora está habilitado de forma predeterminada. Después de este cambio, las partes de datos recién creadas no pueden leerse con versiones anteriores, pero las partes antiguas sí pueden leerse en la versión nueva. Las actualizaciones son seguras, pero no las reversiones a versiones anteriores. #94859 (Pavel Kruglov).
  • Se corrigió el orden de bytes de la serialización binaria de QBit para usar el formato little-endian. #101378 (Raufs Dunamalijevs).

Cambios en el almacenamiento y los índices

  • Se corrigieron los metadatos de las proyecciones normales para que las proyecciones con claves de ordenación de varias columnas se reconozcan correctamente. #91352 (Amos Bird).
  • Se corrigió un problema por el que los archivos de los índices de omisión no respetaban la configuración replace_long_file_name_to_hash, lo que provocaba errores de “File name too long” y fallos al leer índices con nombres largos. Ahora, cuando los nombres de archivo de los índices de omisión superan max_file_name_length, se reemplazan por un hash, igual que ocurre con los archivos de columna. Esto es retrocompatible (los servidores nuevos leen las partes antiguas), pero una reversión (o el uso de servidores antiguos durante una actualización gradual) puede hacer que se ignoren los índices con nombres largos. #97128 (Raúl Marín).

Características eliminadas

  • Se eliminó el tipo de índice de omisión hypothesis. Era una característica experimental poco conocida y de utilidad práctica limitada. Crear tablas con INDEX ... TYPE hypothesis ahora genera un error. #96874 (Alexey Milovidov).
  • Se eliminó la función experimental detectProgrammingLanguage. #99567 (Alexey Milovidov).

Cambios en los ajustes y la configuración

  • Se cambió el valor predeterminado de mysql_datatypes_support_level de vacío a decimal,datetime64,date2Date32, lo que permite, de forma predeterminada, la correspondencia correcta de MySQL DATE con Date32, DECIMAL/NUMERIC con Decimal y DATETIME/TIMESTAMP con precisión con DateTime64. Anteriormente, las columnas MySQL DATE se correspondían con Date, que no puede representar fechas anteriores a 1970-01-01, lo que provocaba corrupción de datos. #97716 (Alexey Milovidov).

Cambios en las inserciones y la deduplicación

  • La inserción asíncrona ahora está habilitada de forma predeterminada: ClickHouse agrupa por defecto todas las inserciones pequeñas en lotes. Esto se rige por la configuración compatibility: establecer compatibility en una versión inferior a 26.2 restablece el valor predeterminado anterior de false. Las inserciones asíncronas pueden activarse o desactivarse en varios niveles: en los perfiles de usuario de la configuración, para la sesión, para la consulta o para la tabla MergeTree. #97590 (Sema Checherinda).

Cambios en las tablas del sistema

Otros cambios incompatibles

  • mergeTreeAnalyzeIndexes{,UUID} ahora acepta un Array de nombres de partes en lugar de una expresión regular, ya que las expresiones regulares son lentas (funcionalidad experimental). #98474 (Azat Khuzhin).
  • La biblioteca H3 se ha actualizado a la versión 4, lo que mejora la precisión de los cálculos de longitud, área y otras métricas. Este cambio no es retrocompatible porque los nuevos resultados difieren de los anteriores. #100348 (Alexey Milovidov).
  • Se ha cambiado la forma en que la tabla Merge maneja las columnas virtuales. Si la tabla subyacente contiene _table o _database, estas columnas se leen desde el almacenamiento; de lo contrario, se rellenan después del paso de lectura mediante el paso de expresión. #101742 (Mikhail Artemenko).

Nuevas características

Funciones

  • Se añadió la función naturalSortKey(s) para claves de ordenación natural. #90322 (Nazarii Piontko).
  • Se añadió la función arrayAutocorrelation(arr [, max_lag]), que calcula la autocorrelación normalizada de un array numérico para cada desfase. Admite arrays de enteros, coma flotante y decimales. #94776 (Wenyu Chen).
  • La función has() ahora es compatible con el tipo JSON para comprobar la existencia de rutas, de forma similar a Map. #96927 (DQ).
  • Se añadió la función de tabla mergeTreeTextIndex(database, table, index), que lee datos directamente desde un índice de texto. Puede usarse para introspección o para realizar agregaciones sobre datos del índice de texto. #97003 (Anton Popov).
  • Se añadió la función SQL obfuscateQuery. #98305 (Xuewei Wang).
  • Se añadieron las funciones caseFoldUTF8 y removeDiacriticsUTF8 para el plegado de mayúsculas y minúsculas en Unicode y la eliminación de marcas diacríticas. #98973 (George Larionov).
  • La función printf ahora admite cadenas de formato no constantes, lo que permite usar un patrón de formato distinto por fila según los valores de las columnas. #98991 (Yash).
  • Se añadió la función highlight(), que envuelve las apariciones de términos de búsqueda en una cadena de texto con etiquetas HTML (por defecto <em>/</em>). Admite coincidencias ASCII sin distinción entre mayúsculas y minúsculas, la combinación automática de coincidencias superpuestas y etiquetas de apertura/cierre personalizadas. #99131 (Peng).
  • Se añadió la función de cadena normalizeUTF8NFKCCasefold para la normalización Unicode NFKC_Casefold, que combina la normalización NFKC con el plegado de mayúsculas y minúsculas. #99276 (George Larionov).
  • Se añadió el tokenizador unicode_word para índices de texto completo y la función tokens. Divide el texto usando reglas de límite de palabra de Unicode: las palabras ASCII se forman con caracteres conectores (guion bajo, dos puntos, punto y comilla simple), mientras que los caracteres Unicode no ASCII se convierten en tokens de un solo carácter. Las stop words configurables usan por defecto signos de puntuación CJK comunes. #99357 (Amos Bird).
  • Se añadió la función arrayTranspose, que toma una matriz bidimensional (matriz) y la transpone. #101214 (Vitaly Baranov).
  • Se añadió la función hasPhrase (alias matchPhrase) para la búsqueda de frases (secuencias continuas de tokens). La búsqueda es de fuerza bruta y aún no es compatible con el índice de texto. #101997 (Elmi Ahmadov).
  • Se añadió dotProduct como función de distancia compatible para índices de similitud vectorial. La dirección de ordenación ahora se valida para todas las funciones de distancia a fin de evitar resultados incorrectos sin avisar. #102254 (Renzo).
  • La función stem ahora puede aplicar stemming a todas las palabras/tokens de columnas String, FixedString, Array([Fixed]String), Nullable, LowCardinality y Const. #99137 (Jimmy Aguilar Mena).
  • La función stem ya no es experimental (anteriormente, era necesario habilitar allow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena).
  • Se añadió la función JSONAllValues, que devuelve todos los valores de una columna JSON como Array(String), con los valores serializados en representación textual y ordenados por sus nombres de path. También se añadió compatibilidad con índices de texto para la expresión JSONAllValues en columnas JSON: cuando se crea un índice de texto en JSONAllValues(json_column), se usa automáticamente para filtrar consultas sobre subcolumnas de JSON (p. ej., json_column.key1 = 'value'). #100730 (Anton Popov).
  • Se añadieron unidades compatibles con PostgreSQL al operador EXTRACT: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE y MILLENNIUM. También se corrigió EXTRACT(WEEK FROM date), que anteriormente generaba un error. #100274 (Alexey Milovidov).
  • Se añadió compatibilidad con la función toDaysInMonth() mediante azúcar sintáctico del parser para la sintaxis de la función estándar SQL OVERLAY. La función overlay ya existe; esto añade compatibilidad con la forma basada en palabras clave que usa PLACING, FROM y FOR como separadores. #101681 (Desel72).
  • Los valores de Date y Date32 ahora pueden sumarse a los valores de Time y Time64 mediante el operador +, lo que produce un resultado DateTime o DateTime64. Por ejemplo, SELECT toDate('2024-01-15') + toTime('14:30:25') devuelve 2024-01-15 14:30:25. El resultado se calcula en la zona horaria de la sesión, y los resultados fuera de rango se gestionan de acuerdo con la configuración date_time_overflow_behavior. #102421 (Nihal Z. Miaji).

Características de SQL y de las consultas

  • Cuando un parámetro tiene tipo Nullable y no se especifica, ahora se asume que su valor es NULL. #93869 (Vikash Kumar).
  • ClickHouse ahora puede omitir partes de datos completas en consultas SELECT basándose en estadísticas mín./máx. #94140 (zoomxi).
  • Se añadió compatibilidad con las CTE materializadas, que evalúan las CTE una sola vez durante la ejecución de la consulta y almacenan sus resultados en tablas temporales. #94849 (Dmitry Novik).
  • Ahora se pueden usar ciertas funciones sin paréntesis en SQL. #95949 (Aly Kafoury).
  • Se añadió la sintaxis de subcolumna combinada json.@path para el tipo JSON. Devuelve el valor literal como Dynamic si la ruta contiene un escalar, el subobjeto como Dynamic si la ruta contiene un objeto anidado, o NULL si la ruta no existe. #98788 (Pavel Kruglov).
  • Se añadió la palabra clave SOME para expresiones de subconsulta. Se comporta de forma idéntica a ANY. #99842 (Artem Kytkin).
  • Se añadió compatibilidad con SET TIME ZONE 'tz' como alias de SET session_timezone. #99883 (phulv94).
  • Se añadió compatibilidad con la cláusula VALUES estándar de SQL como expresión de tabla en FROM, por ejemplo, SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72).
  • Se añadió compatibilidad con literales compuestos de intervalos del estándar SQL con calificadores de rango TO, por ejemplo, INTERVAL '1:30' HOUR TO MINUTE, que se descomponen internamente en sumas de intervalos. #100453 (Desel72).
  • Se añadió el comando SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x' para los modos ordered y unordered. #100709 (Bharat Nallan).

Motores de tabla y almacenamiento

  • Se añadió compatibilidad con la lectura incremental para el motor de tabla Paimon, con seguimiento del progreso de instantáneas respaldado por Keeper, incluidas lecturas delta de instantáneas concretos mediante paimon_target_snapshot_id. #93655 (XiaoBinMu).
  • Se añadió compatibilidad con ZooKeeper auxiliar en DatabaseReplicated. #95590 (RinChanNOW).
  • Se añadió compatibilidad para leer tipos timestamp de nanosegundos de Iceberg v3 (timestamp_ns y timestamptz_ns), asignados a DateTime64(9) y DateTime64(9, 'UTC'). Esto permite que ClickHouse lea datos de Iceberg con estos tipos en el esquema; no constituye compatibilidad completa con Iceberg v3 ni permite escribir Iceberg v3 con estos tipos. #97132 (Dmitry Kovalev).
  • Se añadió ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') para tablas Iceberg. #97904 (murphy-4o).
  • Se añadió una nueva caché SLRU para metadatos de Parquet para mejorar el rendimiento de lectura al eliminar la necesidad de volver a descargar archivos solo para leer sus metadatos. #98140 (Grant Holly).
  • Se añadió compatibilidad con índices de omisión de MergeTree para columnas JSON usando JSONAllPaths con los tipos de índice bloom_filter, tokenbf_v1, ngrambf_v1 y text (invertido), lo que permite omitir gránulos según el conjunto de rutas JSON presentes en cada gránulo. #98886 (Pavel Kruglov).
  • Se añadió el índice de proyección commit_order, que reorganiza los datos en orden de inserción. #99004 (Mikhail Artemenko).
  • Se añadió serialización en buckets para columnas Map en MergeTree (map_serialization_version = 'with_buckets'). Las claves se dividen en buckets basados en hash, de modo que al leer una sola clave (m['key']) solo se lee un bucket en lugar de toda la columna, lo que proporciona una aceleración de entre 2 y 49 veces en búsquedas de una sola clave, según el tamaño del mapa. El número de buckets y la estrategia de bucketización pueden controlarse mediante los nuevos ajustes de MergeTree map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient y map_buckets_min_avg_size. El ajuste map_serialization_version_for_zero_level_parts mantiene la serialización básica para las inserciones a fin de evitar la sobrecarga de escritura, mientras que las partes fusionadas usan buckets. Los índices de omisión sobre mapKeys/mapValues son compatibles con la serialización en buckets, y optimize_functions_to_subcolumns reescribe m['key'] como una lectura de subcolumna por clave cuando hay buckets disponibles. #99200 (Pavel Kruglov).

Inserción y deduplicación

  • Se implementó un nuevo comportamiento de max_insert_block_size_rows, max_insert_block_size_bytes, min_insert_block_size_rows y min_insert_block_size_bytes en el proceso de compactación, controlado por la configuración de compatibilidad use_strict_insert_block_limits. #94207 (Kirill Kopnev).

Ajustes y configuración

  • Se añadió el ajuste de MergeTree table_readonly para marcar tablas como de solo lectura y evitar inserciones y modificaciones. #97652 (Alexey Milovidov).
  • Se añadió el ajuste use_partition_pruning (alias use_partition_key). Establécelo en false para desactivar la poda de particiones basada en la clave de partición. #97888 (Nihal Z. Miaji).
  • Cada entrada type=http en <protocols> ahora puede especificar una clave <handlers> personalizada que apunte a una sección de configuración <http_handlers_*> independiente, lo que permite aplicar distintas reglas de enrutamiento HTTP por puerto. #98414 (Amos Bird).
  • Se añadieron dos ajustes de MergeTree — replicated_fetches_min_part_level y replicated_fetches_min_part_level_timeout_seconds — que permiten a las réplicas omitir la recuperación de partes recién insertadas (sin fusionar) desde otras réplicas, reduciendo la sobrecarga de replicación durante periodos de ingestión intensa. #98625 (tanner-bruce).
  • Se añadió el ajuste de servidor restore_access_entities_with_current_grants. Cuando está habilitado, los usuarios/roles restaurados ven sus privilegios limitados a lo que el usuario que realiza la restauración puede conceder (con la misma semántica que GRANT CURRENT GRANTS), en lugar de fallar con ACCESS_DENIED. #98795 (pufit).
  • Se añadieron los ajustes max_skip_unavailable_shards_num y max_skip_unavailable_shards_ratio para limitar cuántos segmentos pueden omitirse sin aviso cuando skip_unavailable_shards está habilitado. Si el número o la proporción de segmentos no disponibles supera el umbral configurado, se lanza una excepción en lugar de devolver resultados incompletos sin aviso. #99369 (Alexey Milovidov).
  • Se implementaron cuotas por hash de consulta normalizada para proteger los servicios públicos de ClickHouse frente a abusos. NORMALIZED_QUERY_HASH se admite como tipo de clave de cuota — una cuota independiente por cada consulta normalizada única, de modo que CREATE QUOTA q KEYED BY normalized_query_hash controla cada consulta distinta por separado. QUERIES_PER_NORMALIZED_HASH se admite como tipo de recurso de cuota — limita el número máximo de ejecuciones de una misma consulta normalizada dentro de un intervalo, por lo que MAX queries_per_normalized_hash = 100 evita que un mismo patrón de consulta se ejecute más de 100 veces. #99586 (Alexey Milovidov).
  • El ajuste de MergeTree auto_statistics_types ahora usa minmax, uniq de forma predeterminada, por lo que las estadísticas minmax y uniq se crean automáticamente para todas las columnas adecuadas de las tablas nuevas. materialize_statistics_on_insert ahora usa false de forma predeterminada, por lo que las estadísticas se generan durante las fusiones en lugar de en el momento de la inserción, reduciendo la sobrecarga de inserción. Establece materialize_statistics_on_insert = 1 para restaurar el comportamiento anterior. #101275 (Han Fei).
  • Se añadió el ajuste de actualización prefer_dependency_replica para las cadenas de dependencias de vistas materializadas, con el fin de reducir la pérdida de datos causada por el retraso de replicación entre réplicas. #101591 (Seva Potapov).

Autenticación

  • Se añadió la opción de configuración LDAP por servidor <follow_referrals> (valor predeterminado: false) para controlar si el client de LDAP sigue referencias. Desactivar el seguimiento de referencias evita timeouts y bloqueos al buscar desde un base DN raíz de dominio de Active Directory, y genera menos ruido en el log. #96765 (paf91).

Tablas del sistema

  • Se añadió system.histogram_metric_log, una nueva tabla del sistema que realiza instantáneas periódicas de todas las métricas de histograma (p. ej., latencias de S3/Azure y duraciones de las etapas de procesamiento de solicitudes de Keeper). La columna value de system.histogram_metrics ahora es Float64 para ofrecer mayor flexibilidad y compatibilidad con el modelo de datos de Prometheus. #103046 (Miсhael Stetsyuk).

Características experimentales

  • Se añadió el códec de compresión de punto flotante ALP (sin fallback de ALP_rd para valores double no comprimibles). #91362 (Nazarii Piontko).
  • Se añadieron indicaciones de tipo diferidas experimentales para columnas JSON. Cuando se habilitan mediante allow_experimental_json_lazy_type_hints, ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName) que solo agrega o modifica indicaciones de tipo se completa al instante como una operación de solo metadatos, sin reescribir los datos históricos. Las indicaciones de tipo se aplican en tiempo de consulta a las partes antiguas y se materializan durante los INSERT y las fusiones en segundo plano. #97412 (tanner-bruce).
  • Se añadió compatibilidad con dialectos SQL externos mediante la biblioteca polyglot. #99496 (Alexey Milovidov).
  • Se añadió la configuración query_plan_optimize_join_order_randomize, que aleatoriza las estadísticas utilizadas para reordenar el join, lo que resulta útil para realizar pruebas. #100643 (Vladimir Cherkasov).
  • Se añadió compatibilidad con funciones de IA en ClickHouse, lo que permite a los usuarios llamar a endpoints de OpenAI y Anthropic mediante SQL. aiGenerate se incluye como la primera función de este tipo. #100831 (George Larionov).
  • Se añadieron las funciones de IA aiClassify, aiExtract y aiTranslate para utilizar APIs de LLM en ClickHouse. #100832 (George Larionov).
  • Se añadió compatibilidad con lagos de datos en Azure con Delta Kernel. #102202 (Smita Kulkarni).

Mejoras del rendimiento

Rendimiento de JOIN

  • Pequeñas mejoras en HashJoin y ConcurrentHashJoin. #96663 (Yarik Briukhovetskyi).
  • Se añadió compatibilidad para invertir los lados de los joins ANTI, SEMI y FULL en función de las estadísticas del optimizador. #97498 (Hechem Selmi).
  • Se redujo la contención en la caché en los joins RIGHT y FULL comprobando si JoinUsedFlags está activado antes de escribir. #99274 (Hechem Selmi).
  • Se aceleraron los joins hash sobre claves Int32 e Int64 con un rango pequeño mediante una tabla hash de índice directo. #99275 (Hechem Selmi).

Optimización de consultas

  • Se optimizó el skipping de gránulos para pointInPolygon en polígonos grandes y se corrigió un error por el que el análisis de índice de pointInPolygon arrojaba errores durante el pruning de la primary key. #91633 (Nihal Z. Miaji).
  • optimize_read_in_order ahora se respeta al leer projections. #95885 (Andrey Zvonov).
  • Se optimizó ligeramente la lectura desde el Diccionario del text index, lo que mejora el rendimiento general del análisis del text index. #97519 (Anton Popov).
  • Se mejoró el rendimiento del análisis del text index para consultas con conditions combinadas que involucran tanto columnas indexadas como no indexadas. Anteriormente, la optimización de salida anticipada durante el análisis de índice se deshabilitaba incorrectamente en esos casos. #98096 (Anton Popov).
  • Se mejoró el rendimiento de las consultas con expressions constantes que generan arrays o maps muy largos. #98287 (Alexey Milovidov).
  • Se corrigió el análisis de condiciones de clave para primary keys DateTime64 comparadas con constantes enteras, lo que antes impedía el Granule pruning. #98410 (Amos Bird).
  • La setting optimize_syntax_fuse_functions ahora está habilitada de forma predeterminada. #98424 (Alexey Milovidov).
  • El partition pruning ahora está permitido cuando el predicado contiene cualquier operador de comparación (=, <, >, !=) y la partition key está envuelta en una chain de funciones determinista (por ejemplo, con PARTITION BY x, predicados como cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026 o toYYYYMM(x) != 2026 usarán la partition key para el pruning). #98432 (Nihal Z. Miaji).
  • La optimización read-in-order y el pruning de la primary key ahora están permitidos cuando el tipo de destino de CAST es Nullable y la conversión es monotónica; por ejemplo, con PRIMARY KEY x, ClickHouse puede usar la optimización read-in-order para ORDER BY x::Nullable(UInt64) y el pruning de la primary key para predicados como WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • El pruning de índice y el filter pushdown ahora están permitidos cuando una columna integral se compara con un literal float; por ejemplo, predicados como WHERE x < 10.5 ahora pueden usar la primary key para el pruning, y filtros como prime < 1e9 o number < 1e5 ahora hacen pushdown para las table functions primes() y numbers() en lugar de provocar una ejecución no acotada. #98516 (Nihal Z. Miaji).
  • Las consultas que filtran por columnas de primary key de MergeTree con alternancias regex sobre strings literales, como ^(abc-1|abc-2), ahora pueden usar el pruning de la primary key cuando las alternativas comparten un prefix común. #98988 (Yash).
  • Se optimizaron INTERSECT ALL y EXCEPT ALL. #99097 (Raufs Dunamalijevs).
  • Se agregó soporte para la optimización read_in_order_use_virtual_row en lecturas en orden inverso. #99198 (Vladimir Cherkasov).
  • Consultas discontinuas más rápidas para columnas LowCardinality con un único diccionario. #99285 (Ivan Babrou).
  • Se corrigió el escalado negativo en consultas cortas con aggregation en máquinas con muchos núcleos. Cuando una consulta lee pocas marcas, la pipeline ya no se expande a max_threads después de la aggregation, lo que evita la sobrecarga de flujos casi vacíos. #99493 (Alexey Milovidov).
  • Se mejoró el rendimiento de las consultas con réplicas paralelas al seleccionar correctamente el tamaño de la tarea de lectura. #99801 (Nikita Taranov).
  • Se eliminaron los elementos redundantes al final de ORDER BY una vez que todas las claves de GROUP BY quedan cubiertas por el prefijo de ORDER BY. #100157 (Alexey Milovidov).
  • Se optimizaron las consultas aplicando la cláusula LIMIT dentro de UNION ALL. #100364 (Alexey Milovidov).
  • Se añadió soporte de compilación JIT para comparaciones de columnas String y FixedString en ORDER BY, lo que mejora entre un 6 y un 17 % el rendimiento de ordenación en la fase de combinación para claves de ordenación dominadas por cadenas. #100577 (Raúl Marín).
  • Cuando read_in_order_use_virtual_row está habilitado junto con la nueva configuración read_in_order_use_virtual_row_per_block, la información de límites de filas virtuales ahora se emite después de cada block leído de MergeTree, lo que permite que la combinación vuelva a priorizar las fuentes a mitad del flujo para las partes cuyos datos quedan completamente filtrados por WHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov).
  • Mejor paralelización de consultas con vistas simples (sobre una tabla MergeTree subyacente) ejecutadas con réplicas paralelas. #100815 (Igor Nikonov).
  • Se añadió soporte para réplicas paralelas sobre vistas simples (incluidas las vistas UNION ALL compatibles sobre tablas MergeTree) cuando parallel_replicas_allow_view_over_mergetree=1. Esto paraleliza la consulta externa de la vista en lugar de la interna, aumentando la paralelización de consultas entre nodos. #100958 (Igor Nikonov).
  • Se optimizó la lectura en orden de la clave primaria para full_sorting_merge cuando hay filtros con IN en el plan de consulta. #101261 (Nikita Taranov).
  • Se mejoró el rendimiento de INSERT VALUES para columnas Map, Array y Tuple cuando los valores se pasan como cadenas escapadas (por ejemplo, '{\'key\':1}'), evitando recurrir innecesariamente al analizador de expresiones SQL. #102119 (Joanna Hulboj).

Rendimiento de funciones y agregación

  • Se mejoró el rendimiento de la función levenshteinDistance. #94543 (Joanna Hulboj).
  • Se optimizaron las conversiones en lote del tipo Decimal al evitar llamadas a funciones por elemento. #95923 (Konstantin Bogdanov).
  • Se mejoró el rendimiento de las consultas LIKE. #98149 (Elmi Ahmadov).
  • Se optimizó la aggregate function avgWeighted mediante el uso de acumuladores locales en lugar de almacenamiento y reenvío por fila a través del estado de agregación, con mejoras de rendimiento de hasta un 27 % para entradas Nullable. #98793 (Antonio Andelic).
  • Se aceleraron las funciones var*Stable y stddev*Stable para columnas Float64 mediante la desvirtualización del bucle interno. Esto permite optimizaciones del compilador (FMA/registros) que alteran los resultados de coma flotante a nivel de ULP. #99460 (Riyane El Qoqui).
  • Se utiliza la codificación base58 optimizada de Firedancer para entradas de 32/64 bytes (automática para base58Encode) y se permite usar la decodificación base58 optimizada si el resultado decodificado tiene 32/64 bytes (de forma explícita con base58Decode('...', 32)). #99461 (Joanna Hulboj).
  • Se optimizó la función cutURLParameter eliminando desplazamientos de memoria innecesarios. #100218 (Nikita Semenov).
  • Conversión más rápida de float a string para valores enteros grandes al ampliar la ruta rápida de itoa con redondeo compatible con dragonbox. #100649 (Raúl Marín).
  • Se reemplazó dragonbox por zmij para lograr una conversión de float a string entre 1,5 y 3 veces más rápida. #100650 (Raúl Marín).
  • Conversión más rápida de Int128/UInt128 a string al sustituir la división por software por reducción de Barrett y desenrollar el bucle de conversión. #100671 (Raúl Marín).
  • Se evitó crear threads redundantes en la fusión paralela de UniqExactSet. #100686 (Jiebin Sun).
  • Se añadió fusión paralela por lotes para UniqExactSet. #100687 (Jiebin Sun).

Rendimiento de almacenamiento y E/S

  • Se redujo la contención de bloqueos durante operaciones de solo lectura en tablas ReplicatedMergeTree con mutaciones finalizadas. #95771 (Eduard Karacharov).
  • Iceberg ahora puede precargar metadatos en la caché de forma asíncrona, habilitado al establecer iceberg_metadata_async_prefetch_period_ms al crear la tabla. Las consultas SELECT sobre tablas Iceberg ahora pueden especificar el parámetro iceberg_metadata_staleness_ms, lo que permite a ClickHouse basarse en la versión en caché de los metadatos si es más reciente que la antigüedad especificada; de lo contrario, se consulta el catálogo Iceberg remoto para obtener los metadatos más recientes. Esto puede eliminar llamadas al catálogo Iceberg durante el procesamiento de solicitudes, con una mejora visible del rendimiento. #96191 (Arsen Muk).
  • El modo ordered de S3Queue ahora usa S3 ListObjectsV2 StartAfter para evitar volver a listar todo el historial del prefijo, lo que reduce las llamadas a ListObjects. #96370 (Venkata Vineel).
  • Se habilitaron lecturas paralelas en el motor de tabla YTsaurus. #97343 (MikhailBurdukov).
  • Se mejoró el rendimiento de los lagos de datos. En versiones anteriores, la lectura desde el almacenamiento de objetos no ajustaba el pipeline al número de hilos de procesamiento. #99548 (Alexey Milovidov).
  • Se permitió la precarga al leer un archivo remoto mediante la caché de páginas en espacio de usuario. #99919 (Alexey Milovidov).
  • Se corrigió una regresión significativa del rendimiento de INSERT cuando deduplicate_insert=enable (valor predeterminado desde la versión 26.2) al diferir el cálculo del hash de los datos, moviéndolo del squashing al sink, y usar hash por lotes de columnas mediante updateHashWithValueRange, lo que reduce la sobrecarga de ~2.5s a ~0.5s para 5M de filas con 22 columnas. #101494 (Sema Checherinda).

Optimización de memoria

  • En las inserciones síncronas, ahora se puede omitir el bloque original (necesario para la deduplicación) para ahorrar memoria. #96661 (Sema Checherinda).
  • Se mejoró el rendimiento y se redujo el uso de memoria de las funciones de ventana paralelas en ciertos escenarios, así como de las cargas de trabajo de arrayFold con arrays grandes. Esto también puede reducir la presión por fallos de página y mejorar la estabilidad de las consultas afectadas cuando los límites de memoria son estrictos. #98892 (filimonov).

Mejoras

Consultas y SQL

  • Las proyecciones de agregación ahora son compatibles correctamente en vistas. #88798 (Amos Bird).
  • optimize_aggregators_of_group_by_keys ahora optimiza correctamente las funciones de agregación en consultas GROUPING SETS. #93935 (Xiaozhe Yu).
  • Se añadió compatibilidad con la optimización que convierte joins OUTER en INNER con join_use_nulls. #95968 (Vladimir Cherkasov).
  • Se amplió cast_keep_nullable para que funcione con tipos Dynamic/JSON. Cuando está habilitado, convertir NULL desde tipos que pueden ser Nullable devuelve NULL; de lo contrario, NULL lanza el error CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov).
  • Se añadió la cláusula ROLE a CREATE USER. #97074 (Vitaly Baranov).
  • Se añadió información sobre filtros diferidos como un elemento independiente en la salida de la consulta EXPLAIN (al usar políticas de fila/PREWHERE con FINAL). #97374 (Yarik Briukhovetskyi).
  • Se añadió compatibilidad con expresiones de join de tablas entre paréntesis en la cláusula FROM, p. ej. SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
  • Se aplican índices de omisión de datos durante el análisis distribuido de índices. #97767 (Azat Khuzhin).
  • La clave de ordenación de una tabla ahora puede ser una expresión como toDate(time), y las decisiones sobre no diferir esas expresiones se toman cuando forman parte de filtros. #98237 (Yarik Briukhovetskyi).
  • El optimizador del orden de join ahora infiere predicados transitivos de equi-join a partir de condiciones de join existentes. Por ejemplo, dado A.x = B.x AND B.x = C.x, se reconoce la equivalencia A.x = C.x, lo que permite al optimizador considerar joins directos entre tablas conectadas transitivamente. Esto puede mejorar la calidad del plan para esquemas en estrella y en copo de nieve. La funcionalidad se controla mediante la nueva configuración enable_join_transitive_predicates (desactivada de forma predeterminada). #98479 (Alexander Gololobov).
  • Cuando apply_row_policy_after_final o apply_prewhere_after_final está habilitado, las condiciones compuestas con AND en las políticas de fila y en PREWHERE ahora se descomponen para extraer átomos de la clave de ordenación para el análisis de índices de clave primaria. Antes, si un filtro diferido contenía una mezcla de predicados sobre la clave de ordenación y otros que no lo eran (p. ej. x > 1 AND y != 'foo'), toda la expresión se excluía del análisis de índices. #98513 (Yarik Briukhovetskyi).
  • Ahora, solo las réplicas “vivas” (a las que se puede conectar) participan en el análisis distribuido de índices. #98521 (Azat Khuzhin).
  • Se limitó el número de nodos usados en la heurística automática de réplicas paralelas al número real de nodos del clúster (en lugar de solo la configuración max_parallel_replicas). #98668 (Nikita Taranov).
  • Se implementaron hedged requests y lectura asíncrona para el análisis distribuido de índices. #98724 (Azat Khuzhin).
  • Se añadió compatibilidad con la cláusula SAMPLE en el análisis distribuido de índices. #98931 (Azat Khuzhin).
  • Se añadió compatibilidad con la monotonicidad en la multiplicación, lo que permite la poda de la clave primaria para expresiones key * constant. #98983 (Amos Bird).
  • Los mensajes de error del analizador ya no muestran todas las columnas de una tabla (lo que podía producir excepciones de más de 150 KB). Las listas de columnas ahora están limitadas a 10 elementos. #99002 (Yash).
  • Las estadísticas de columnas de subconsultas con JOIN ahora se devuelven correctamente para que la consulta padre pueda usarlas para reordenar los JOIN. #99096 (Alexander Gololobov).
  • Ahora se permite ALTER TABLE MODIFY COLUMN x TTL ... sin especificar el tipo de la columna. #99208 (Nikolay Degterinsky).
  • Se mejoró la salida de EXPLAIN PLAN pretty=1: ahora imprime las columnas de salida de la consulta de nivel superior, muestra etiquetas/símbolos de relaciones JOIN con la estimación de filas del resultado y la localidad, e incluye las columnas de salida por paso para los pasos de JOIN/source. #99462 (Kirill Kopnev).
  • Se corrigió el fallo de la función de tabla merge() con un error UNKNOWN_IDENTIFIER al consultar columnas que no están presentes en todas las tablas distribuidas/remotas subyacentes. #99833 (Alexey Milovidov).
  • ConditionSelectivityEstimator ya no se usa en el optimizador cuando la condición no está en CNF (por ejemplo, where a = 0, que es una única condición en la que las estadísticas no pueden ayudar). #100110 (Han Fei).
  • Se aplicó distributed_index_analysis_min_indexes_bytes_to_activate después de la poda de particiones. #100477 (Azat Khuzhin).
  • EXPLAIN PIPELINE ahora admite la configuración distributed=1 para incluir fragmentos remotos del pipeline. #100513 (Nikita Taranov).
  • use_partition_pruning = 0 ahora también desactiva la poda del índice MinMax y la optimización del conteo en las columnas de la clave de partición, además de desactivar la poda basada en claves de partición. #100904 (Nihal Z. Miaji).
  • EXPLAIN [PLAN] pretty=1 ahora imprime expresiones en un formato legible para humanos. #100927 (Kirill Kopnev).
  • accurateCastOrNull y accurateCastOrDefault ahora admiten tipos de destino Tuple, incluidos Tuples anidados con elementos Nullable. Antes, estas funciones rechazaban destinos Tuple porque Tuple no podía estar dentro de Nullable. #100942 (Nihal Z. Miaji).
  • Ahora puede usar una coma final en la cláusula WITH antes de una consulta SELECT. #101093 (Aruj Bansal).
  • Se implementó la materialización diferida de columnas para ReplacingMergeTree con FINAL cuando el predicado es lo suficientemente selectivo. #101647 (Nikolai Kochetov).
  • Se mejoraron las estimaciones predeterminadas de selectividad para condiciones sin estadísticas, ajustándolas a heurísticas estándar del sector: 0.1 para la selectividad de la condición LIKE y 0.33 para la selectividad de una condición desconocida. #101653 (Alexander Gololobov).
  • Se incorporó en línea la subconsulta VIEW en el árbol de consulta para permitir aplicar más optimizaciones a la VIEW. #100830 (Dmitry Novik).

Funciones

  • Ahora se puede usar entrada nativa de JSON/Object para las funciones JSONExtract. #96711 (Fisnik Kastrati).
  • Se introdujo la función SQL tokensForLikePattern, que tokeniza patrones LIKE respetando la semántica de los comodines: % y _ se tratan como comodines, los comodines escapados (\%, \_) se tratan como literales y se descartan los tokens adyacentes a comodines no escapados. #97872 (Amos Bird).
  • Se implementó la función toDaysInMonth(), que devuelve el número de días del mes correspondiente a la fecha especificada. #99227 (Vitaly Baranov).
  • Se cambió el nombre del tokenizador unicodeWord a asciiCJK. #100956 (George Larionov).
  • Se añadió azúcar sintáctico a nivel de parser para la sintaxis de la función estándar SQL OVERLAY. La función overlay ya existe; esto añade soporte para la forma basada en palabras clave que utiliza PLACING, FROM y FOR como separadores. #101681 (Desel72).
  • La función ngrams ahora rechaza longitudes de ngram no válidas. Por ejemplo, SELECT ngrams('abc', 0) ahora devuelve un error. #101922 (Robert Schulze).
  • Se añadió soporte para el tokenizador array en la optimización de LIKE. #102880 (Elmi Ahmadov).

Motores de tabla y almacenamiento

  • Se añadió un hilo de limpieza dedicado para MergeTree para evitar retrasos en la limpieza bajo una carga intensa de merges. #91574 (Amos Bird).
  • Las tablas con reglas DELETE TTL ahora pueden usar el algoritmo de vertical merge. #97332 (murphy-4o).
  • Las marcas de los índices secundarios ahora se precalientan cuando está habilitada la configuración prewarm_mark_cache (se cargan en la caché de marcas de índice durante la obtención de partes de datos y el arranque de la tabla). #97772 (Anton Popov).
  • Ahora se pueden crear índices de texto sobre columnas Nullable([Fixed]String) y Array(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena).
  • Cancelación anticipada de merges en segundo plano en DROP DATABASE para ordinary shared merge tree. #98161 (Shaohua Wang).
  • Se añadió la configuración finalize_projection_parts_synchronously para permitir la finalización síncrona de las partes de proyección durante INSERT, reduciendo el uso máximo de memoria en tablas con muchas proyecciones, mientras se conserva por defecto el comportamiento asíncrono existente. #98228 (Amos Bird).
  • Se añadió la configuración de MergeTree share_nested_offsets (valor predeterminado true). Cuando se establece en false, las columnas Array con nombres con puntos (por ejemplo, n.a, n.b) se tratan como columnas independientes en lugar de compartir archivos de desplazamiento y validar que los tamaños de los arrays sean iguales como parte de la semántica heredada de Nested. #98416 (Amos Bird).
  • Se optimizó TRUNCATE DATABASE TABLES LIKE precancelando merges en paralelo. #98597 (Shaohua Wang).
  • Se redujo la contención de bloqueos en MergeTreeBackgroundExecutor liberando los recursos de las tareas sin adquirir el bloqueo. #98604 (Dmitry Novik).
  • TRUNCATE DATABASE ahora responde a la cancelación de consultas. #98828 (Shaohua Wang).
  • Se reinicia la caché de estadísticas después de cambiar una configuración de MergeTree. #98520 (Han Fei).
  • Se añadió la configuración de MergeTree compress_per_column_in_compact_parts para controlar cómo se organizan los bloques comprimidos dentro de las partes compactas. Cuando es true (valor predeterminado, que conserva el comportamiento actual), cada columna inicia un nuevo bloque comprimido, lo que permite la descompresión selectiva. Cuando es false, todas las columnas dentro de un gránulo se empaquetan en el mismo bloque comprimido, lo que mejora la tasa de compresión y el rendimiento de lectura para cargas de trabajo que siempre leen todas las columnas. #101114 (Amos Bird).
  • El índice de texto ahora es GA y permanece habilitado independientemente de la configuración compatibility, lo que evita su desactivación inesperada durante la restauración de copias de seguridad o al ejecutarse en modo de compatibilidad. #101518 (Nikita Fomichev).
  • Se añadió soporte para el índice de texto creado sobre mapValues(map) con el operador IN. #99286 (Anton Popov).
  • Se mejoró el análisis de varios índices de texto usados simultáneamente en la misma consulta. La configuración use_skip_indexes_on_data_read ya no es necesaria para la optimización de direct read de los índices de texto. #102255 (Anton Popov).
  • Se añadió compatibilidad con el análisis de índices de texto para la función hasPhrase mediante el modo HINT. #102438 (Elmi Ahmadov).
  • Las estadísticas de columna MinMax ahora almacenan los valores mínimo y máximo como Field (con tipo) en lugar de Float64. El formato serializado incluye el nombre de tipo de la columna junto con los valores. La versión del archivo de estadísticas pasa a V2; los archivos escritos por versiones anteriores requieren volver a materializarse (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).

Lagos de datos

  • Se añadió una nueva consulta para comprobar el estado de DataLakeCatalog. #94690 (Smita Kulkarni).
  • Se mejoraron las operaciones de escritura de Iceberg para Unity Catalog. #98162 (Konstantin Vedernikov).
  • Se reconstruyeron las entidades de IcebergManifestFile para que el mantenimiento del código sea menos propenso a errores (y también se corrigieron algunos problemas de caché de archivos manifest). #98231 (Daniil Ivanik).
  • Se mejoró ALTER TABLE ... EXECUTE expire_snapshots(...) de Iceberg con un soporte más amplio para argumentos. #99130 (murphy-4o).
  • Se cambió la interfaz de las inserciones de Iceberg con el catálogo. Se marcaron como obsoletas las opciones storage_catalog_type, storage_aws_access_key_id y otras similares. #100334 (Konstantin Vedernikov).
  • Se corrigió el manejo inconsistente de rutas en Iceberg causado por el uso combinado de rutas de almacenamiento y rutas de metadatos; se exigió que las tablas Iceberg escriban una ubicación de tabla que sea una URL o una ruta absoluta; se añadió un mecanismo alternativo para contar tamaños de archivo en Azure; se manejó version-hint.txt de forma compatible con Spark; se introdujeron abstracciones a nivel de tipo para reducir la confusión entre tipos de rutas; y se corrigió el uso de eliminaciones por posición. #100420 (Daniil Ivanik).
  • Se evitó escanear todo el catálogo remoto del lago de datos en busca de sugerencias de tablas del tipo “Maybe you meant …” cuando show_data_lake_catalogs_in_system_tables está deshabilitado. #100452 (Alsu Giliazova).
  • La información del objeto utilizada para analizar archivos de datos de Iceberg ahora contiene el número de filas del archivo y su tamaño en bytes, extraídos del archivo manifest. #100645 (Daniil Ivanik).
  • Se añadió un mecanismo de poda para Delta Lake con columnas virtuales. #101634 (Konstantin Vedernikov).

S3 y almacenamiento de objetos

  • Se añadió un marcador de posición {_schema_hash} para el motor de tabla S3 que inserta un hash de las definiciones de las columnas de la tabla en la ruta de S3. #98265 (Miсhael Stetsyuk).
  • Se añadió una nueva opción para forzar el uso del estilo virtual/path en los endpoints de S3. #102378 (Konstantin Vedernikov).

Configuración y ajustes

  • Los usuarios ahora pueden especificar varios métodos de autenticación en la configuración users_xml. #91998 (Flip-Liquid).
  • Ahora se puede establecer la configuración internal_replication para un clúster creado por la base de datos Replicated. #97228 (Pervakov Grigorii).
  • Se añadió la configuración allow_nullable_tuple_in_extracted_subcolumns, que controla si las subcolumnas extraídas Tuple(...) de Tuple, Variant, Dynamic y JSON se devuelven como Nullable(Tuple(...)) (NULL para las filas faltantes) o como Tuple(...) (valores de tupla predeterminados para las filas faltantes). Está deshabilitada de forma predeterminada; solo puede cambiarse reiniciando el servidor. #97299 (Nihal Z. Miaji).
  • type_json_allow_duplicated_key_with_literal_and_nested_object ahora está habilitada de forma predeterminada, lo que evita errores por claves duplicadas al analizar JSON como {"a" : 42, "a" : {"b" : 42}}, que ClickHouse puede producir a partir de los datos originales {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
  • Las estadísticas de columnas ahora son GA. La configuración allow_experimental_statistics (valor predeterminado: false) queda obsoleta en favor de allow_statistics (valor predeterminado: true); allow_statistics_optimize pasa de beta a GA; ClickHouse crea estadísticas minmax y uniq para las columnas nuevas (configuración de MergeTree auto_statistics_types); y, para evitar INSERTs más lentos, materialize_statistics_on_insert ahora está deshabilitada de forma predeterminada. #97487 (Han Fei).
  • Se aclaró la relación entre enable_parallel_replicas y automatic_parallel_replicas_mode: una consulta puede usar réplicas paralelas solo si enable_parallel_replicas > 0. Con automatic_parallel_replicas_mode=1, la decisión se toma durante la planificación en función de las estadísticas recopiladas; con automatic_parallel_replicas_mode=0, las réplicas paralelas se usan para todas las consultas compatibles, independientemente de las estadísticas. INSERT SELECT en Distributed con réplicas paralelas siempre se comporta como si automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
  • Se habilitó de forma predeterminada la funcionalidad de suplantación (EXECUTE AS target_user). #97870 (Vitaly Baranov).
  • Se añadió la configuración access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (permitida de forma predeterminada), que impide usar perfiles de configuración definidos en la configuración (excepto el perfil default) para usuarios definidos mediante SQL. #98662 (Alexander Tokmakov).
  • Se añadió una configuración para controlar el comportamiento ante incompatibilidades de tipos en Variant y Dynamic (lanzar una excepción o devolver null). #99085 (Bharat Nallan).
  • Se cambió el valor predeterminado de stderr_reaction de throw a log_last para los UDFs ejecutables. Los UDFs que escriben advertencias en stderr ya no fallan cuando el código de salida es 0, y las excepciones por código de salida ahora incluyen el contenido de stderr. #99232 (Xu Jia).
  • Se añadió la configuración input_format_column_name_matching_mode, que permite distintas sensibilidades entre mayúsculas y minúsculas para los formatos de entrada. #99346 (manerone).
  • Las estadísticas automáticas ya no están habilitadas para las tablas del sistema, ya que rara vez se benefician de ellas. #102862 (Han Fei).

Tablas del sistema y monitorización

  • Los índices de descarte de datos utilizados durante la ejecución de la consulta ahora se registran en system.query_log en una nueva columna skip_indices. #99793 (Grant Holly).
  • Se añadió la columna projections_duration_ms a system.part_log, que registra la duración, en milisegundos, de la fusión o reconstrucción de cada proyección. #98292 (Amos Bird).
  • Se añadió el alias de columna INDEX_LENGTH a information_schema.tables. #101705 (Robert Schulze).
  • information_schema.tables ahora ignora las partes inactivas de la tabla, lo que hace que los valores mostrados del tamaño de la tabla sean más realistas. #101706 (Robert Schulze).

ClickHouse Keeper

  • find_super_nodes ya no se queda bloqueado al recorrer los hijos del primer supernodo, lo que permite encontrar más de uno. #97819 (pufit).
  • Se marca una sesión de ZooKeeper como expirada en cuanto comienza la finalización, en lugar de esperar a que termine el thread de envío. Esto permite que otros threads establezcan una nueva sesión sin demora. #99102 (Raúl Marín).
  • Se omiten las solicitudes obsoletas de Keeper para sesiones que ya se han desconectado, lo que evita recorridos de ida y vuelta innecesarios en Raft. El número de sesiones finalizadas rastreadas está limitado por la configuración de coordination max_finished_sessions_cache_size. #99246 (Antonio Andelic).
  • Se evita que el comando mntr de Keeper se quede bloqueado por contención de bloqueos. #99472 (Antonio Andelic).
  • Se redujo la contención de bloqueos en el despachador de Keeper al invocar callbacks y despachar read requests fuera del ámbito del mutex, y se añadieron guardas de bloqueo perfiladas para la observabilidad. #99751 (Antonio Andelic).

Gestión de la memoria

  • Se añadió el parámetro de configuración use_separate_cache_arena para controlar la separación de la arena de caché. #100664 (Seva Potapov).

Formatos de datos

  • Se añadió la configuración output_format_trim_fixed_string para eliminar los bytes nulos finales de los valores FixedString en los formatos de salida de texto. #97558 (NeedmeFordev).
  • Ahora es posible procesar archivos GeoParquet que contienen distintos tipos Geo en la misma columna. #97851 (Mark Needham).
  • La deserialización de estados binarios de AggregateFunction ahora requiere consumir toda la entrada. Si hay bytes redundantes adicionales al final, ClickHouse lanza una excepción en lugar de aceptar datos de estado malformados. #98786 (Nihal Z. Miaji).
  • Los usuarios ahora pueden escribir tipos de datos Interval de ClickHouse en el formato Arrow. #99519 (Peter Nguyen).
  • Se añadió soporte nativo para importar y exportar tipos de datos UUID en los formatos Arrow y Parquet, con inferencia lógica automática para UUIDs de nivel superior y soporte para indicaciones de esquema explícitas para UUIDs anidados. #99521 (Ivan).
  • Se tolera la ausencia de relleno al final del último bloque de los archivos Parquet. #99857 (Seva Potapov).
  • La exportación de UUIDs a Parquet mediante el codificador Arrow ahora incluye la anotación correcta del tipo UUID, lo que elimina la necesidad de aplicar manualmente CAST a los datos FixedString(16) al volver a leer los archivos. #100150 (Ivan).
  • Se añadió soporte nativo para importar tipos de datos Apache Arrow StringView y BinaryView en columnas String de ClickHouse, lo que mejora la compatibilidad con la ingestión basada en Arrow. #100762 (Ivan).
  • Se añadió soporte para Nullable(Tuple) en los formatos Arrow, ArrowStream, ORC y Parquet heredado. #101272 (Nihal Z. Miaji).

Colecciones con nombre y diccionarios

  • Se añadió sslmode a las claves permitidas para las fuentes de diccionario de PostgreSQL, lo que permite configurar el modo SSL para las conexiones de diccionarios de PostgreSQL (por ejemplo, para AWS RDS, que exige SSL de forma predeterminada). #98014 (mcalfin).
  • Se evita eliminar colecciones con nombre que son dependencias de fuentes de diccionario. #98127 (Pablo Marcos).
  • Se añadió soporte para los tipos Map y JSON/Object como atributos de diccionario. Ahora los diccionarios pueden almacenar y recuperar tipos complejos, incluidos Map(String, String), Map(String, Array(String)), JSON y Nullable(JSON), tanto en los layouts FLAT como HASHED. #98627 (yanglongwei).
  • SYSTEM RELOAD DICTIONARIES ahora recarga los diccionarios en orden topológico para que los diccionarios que toman datos de otros diccionarios dispongan de datos actualizados después de la recarga. #98356 (Alexey Milovidov).
  • Los diccionarios de caché ya no adquieren un bloqueo exclusivo en hasKeys, lo que reduce la contención al usar un bloqueo compartido para las lecturas de caché. #100796 (liuguangliang).

Otras mejoras

  • Las pistas de ACCESS_DENIED ya no revelan nombres de columnas, a menos que el usuario pueda mostrar todas las columnas requeridas; los nombres de la base de datos y de la tabla siguen siendo visibles en la pista. #91067 (filimonov).
  • Se recarga la configuración del clúster si cambian las direcciones IP del hostname del servidor local, en lugar de las direcciones IP de cualquier host. #93726 (Zhigao Hong).
  • Se vacían los búferes de logging asíncrono en caso de cierre inesperado. #97836 (Azat Khuzhin).
  • Se redujo el bloqueo durante el control de acceso. #97894 (Nikita Taranov).
  • Se actualizó ClickStack a la versión 2.20.0. #98252 (Aaron Knudtson).
  • Se desactiva la generación de SQL con IA (comando ??) en el client embebido (protocolos SSH y WebSocket) para evitar el acceso a las variables de entorno del servidor. #100290 (Alexey Milovidov).
  • Se envía NACK para los mensajes dañados al usar almacenamiento RabbitMQ. #102157 (Seva Potapov).

Correcciones de errores

Correcciones de JOIN

  • Se corrigió la ausencia de una columna cuando se usaba un alias de identificador no estándar en un JOIN con el analyzer antiguo. #95679 (Zhigao Hong).
  • Se corrigió un resultado incorrecto cuando se usaba el algoritmo grace_hash con joins no equi y el bloque izquierdo no podía procesarse por completo debido a restricciones de tamaño en el resultado del join. #97866 (János Benjamin Antal).
  • Se corrigió un error lógico con analyzer_compatibility_join_using_top_level_identifier y ARRAY JOIN. #98179 (Vladimir Cherkasov).
  • Se corrigió una excepción LOGICAL_ERROR cuando un RIGHT JOIN dentro de un CROSS JOIN era intercambiado por la optimización query_plan_join_swap_table en la ruta de código heredada del paso join. #98279 (Alexey Milovidov).
  • Se corrigió una excepción “Pipeline stuck” en joins full_sorting_merge causada por un interbloqueo en PingPongProcessor cuando la optimización FilterBySetOnTheFly creaba una dependencia circular con MergeJoinTransform. #98454 (Alexey Milovidov).
  • Se corrigió una excepción de error lógico cuando CROSS JOIN se usaba junto con INNER JOIN USING. #98459 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR cuando arrayJoin se usaba en una expresión de filtro con OUTER JOIN y join_use_nulls habilitado. #98464 (Alexey Milovidov).
  • Se corrigió una excepción BAD_GET y resultados de consulta incorrectos cuando se usaba una expresión no booleana (p. ej., sin(col)) tanto en WHERE como en SELECT con un JOIN, debido a que la optimización de pushdown de filtros corrompía nodos DAG compartidos. #98681 (Alexey Milovidov).
  • Se corrigió un LOGICAL_ERROR “Replica decided to read in Default mode, not in WithOrder” al usar read_in_order_through_join con réplicas paralelas. #98685 (Alexey Milovidov).
  • LEFT ANTI JOIN con múltiples columnas de clave de join devolvía resultados incorrectos cuando enable_join_runtime_filters=1 (el valor predeterminado). #98871 (Alexander Gololobov).
  • Se corrigió un error en la optimización query_plan_convert_any_join_to_semi_or_anti_join que devolvía un resultado incorrecto para las filas sin coincidencia. #99112 (Yarik Briukhovetskyi).
  • Se corrigió una excepción en funciones que operan sobre ColumnReplicated con filas no referenciadas producidas por JOIN. #99564 (Hechem Selmi).
  • Se corrigió un caso poco frecuente en el que un join con reordenación podía producir un resultado incorrecto. #100790 (Yarik Briukhovetskyi).
  • Se corrigieron resultados incorrectos cuando un JOIN con la optimización shard-by-PK usaba la caché de condiciones de consulta y algunas partes se filtraban mediante condiciones en caché. #100926 (Groene AI).
  • Se corrigió una excepción NOT_FOUND_COLUMN_IN_BLOCK al usar ARRAY JOIN con JOIN USING y analyzer_compatibility_join_using_top_level_identifier habilitado. #101507 (Vladimir Cherkasov).
  • Se corrigió el orden incorrecto de las filas en consultas que usan ORDER BY con el algoritmo de join grace_hash, lo que podía generar resultados incorrectos sin advertencia. #102036 (János Benjamin Antal).
  • Se corrigió un LOGICAL_ERROR (tamaño inesperado del tipo de índice) que podía producirse en consultas RIGHT JOIN y FULL JOIN cuando se configuraba max_bytes_in_join. #102042 (Jimmy Aguilar Mena).

Correcciones de consultas y del analizador

  • Se corrigió cómo se guarda el destino de una tabla alias como dependencia DDL cuando no está completamente calificado: ahora se guarda con la base de datos de la tabla alias en lugar de con la base de datos de la sesión. #95175 (Enric Calabuig).
  • Se corrigió un error Block structure mismatch in stream causado por columnas innecesarias devueltas por la materialización diferida. #96682 (Nikolai Kochetov).
  • Se corrigió una excepción en la comparación de tuplas que involucraba elementos del tipo Nothing (p. ej., al comparar con elementos de tupla NULL) cuando se usaba con GROUPING SETS y ORDER BY. #97509 (Alexey Milovidov).
  • Se corrigió la excepción “Context has expired” en subconsultas correlacionadas que contenían funciones de tabla como url(). #97544 (Alexey Milovidov).
  • Se corrigieron excepciones y comportamiento incorrecto en optimize_syntax_fuse_functions con proyecciones de agregación, tipos Date y preservación de nombres de columnas. #97545 (Alexey Milovidov).
  • Se eliminó una query rewrite incorrecta de replaceRegexpOne a extract que producía resultados erróneos cuando la regexp no coincidía; también se corrigió una excepción cuando replaceRegexpOne se usaba con GROUP BY ... WITH CUBE y group_by_use_nulls=1. #97546 (Alexey Milovidov).
  • Se corrigieron excepciones LOGICAL_ERROR causadas por LowCardinality dentro de tipos compuestos (Variant, Dynamic, Tuple) en concatWithSeparator, format, subconsultas IN, GLOBAL IN y joins con filtros en tiempo de ejecución. #97831 (Raúl Marín).
  • Se corrigió una excepción LOGICAL_ERROR “Chunk info was not set for chunk in MergingAggregatedTransform” al usar ARRAY JOIN con la función de tabla merge() sobre varias tablas Distributed combinadas con GROUP BY. #97838 (Raúl Marín).
  • Se corrigió un error que impedía usar CTE con operaciones insert-select distribuidas. #97889 (Yarik Briukhovetskyi).
  • Se corrigió una discrepancia entre columnas. #97921 (Kai Zhu).
  • Se corrigió un segfault en la optimización del plan de consulta al convertir un outer join en un inner join con arrayJoin en una expresión de filtro. #98147 (Alexey Milovidov).
  • Se corrigió un LOGICAL_ERROR “Trying to execute PLACEHOLDER action” cuando se referenciaban columnas correlacionadas de consultas externas dentro de funciones lambda como arrayMap. #98285 (Alexey Milovidov).
  • Se corrigió una excepción de error lógico en caseWithExpression cuando la expresión CASE involucraba argumentos materialize(NULL) u otros argumentos Nullable(Nothing). #98290 (Alexey Milovidov).
  • Se corrigió una excepción de conversión inválida al filtrar la columna virtual _table en la función de tabla merge. #98291 (Alexey Milovidov).
  • Se corrigió una excepción cuando ORDER BY ... WITH FILL se usaba junto con LIMIT BY. #98361 (Alexey Milovidov).
  • Se corrigió una excepción “Column … query tree node does not have valid source node” al hacer join entre una tabla Merge (que envuelve una tabla Distributed) y otra tabla. #98376 (Alexey Milovidov).
  • Se corrigió una excepción “Column identifier is already registered” cuando count_distinct_optimization se usaba con una cláusula QUALIFY. #98433 (Alexey Milovidov).
  • Se corrigió una excepción “cannot be inside Nullable type” al usar IN/NOT IN con argumentos de columna LowCardinality (por ejemplo, a NOT IN (b), donde a es LowCardinality(String)). #98443 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR “Projection cannot increase the number of rows in a block” al fusionar partes con un TTL que elimina todas las filas y una proyección de agregación con una clave GROUP BY constante. #98458 (Alexey Milovidov).
  • Se corrigió una excepción en consultas DISTINCT cuando el uso de proyecciones de agregación y materialize causaba diferencias en el tipo LowCardinality entre la consulta y la proyección. #98462 (Alexey Milovidov).
  • Se corrigió una excepción de error lógico “Replica decided to read in WithOrder mode, not in ReverseOrder” al usar réplicas paralelas con optimize_aggregation_in_order. #98467 (Alexey Milovidov).
  • Se corrigió un resultado inesperado con read_in_order_use_virtual_row y funciones monotónicas. #98514 (Vladimir Cherkasov).
  • Se corrigió un LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' al usar PREWHERE con una subconsulta IN en tablas MergeTree. #98522 (Alexey Milovidov).
  • Se corrigió una excepción “Sorting column wasn’t found in the ActionsDAG’s outputs” cuando query_plan_convert_join_to_in estaba habilitado con query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
  • Se corrigió un LOGICAL_ERROR cuando un Identifier quedaba vacío después de la sustitución de parámetros. #98530 (Pervakov Grigorii).
  • Se corrigió el análisis de índice distribuido con expresiones (no solo columnas) en la clave primaria, lo que provocaba que no se filtraran los gránulos redundantes en réplicas remotas. #98561 (Azat Khuzhin).
  • Se corrigió un error lógico “TABLE_FUNCTION is not allowed in expression context” cuando una table function con un alias aparecía varias veces dentro del mismo ámbito de consulta (por ejemplo, en las cláusulas PREWHERE y QUALIFY). #98557 (Alexey Milovidov).
  • Se corrigió una excepción “Bad cast from type DB::TableFunctionNode to DB::QueryNode” al usar la table function input como argumento de remote. #98694 (Alexey Milovidov).
  • Se corrigió una excepción en LogicalExpressionOptimizerPass cuando una función booleana en una comparación equals devolvía un tipo Variant. #98712 (Alexey Milovidov).
  • Se corrigió una excepción UNKNOWN_IDENTIFIER al consultar la table function merge() o el motor Merge sobre tablas con columnas JSON con parámetros distintos y columnas ALIAS que hacen referencia a subrutas JSON, con el nuevo analizador habilitado. #98753 (Pavel Kruglov).
  • Se corrigió la optimización optimize_skip_unused_shards con el analizador cuando se usaba un almacenamiento Distributed en una View. #98754 (Nikolai Kochetov).
  • Se corrigió una excepción LOGICAL_ERROR (desajuste en la estructura del bloque en removeUnusedColumns) que podía producirse con FINAL + PREWHERE + una expresión WHERE constante + agregaciones que no dependen de columnas, como count(). #98778 (Alexey Milovidov).
  • Se corrigió una excepción “Inconsistent table names” al usar la table function view() que contiene JOINs dentro de otro JOIN (solo con el analizador antiguo). #98809 (Alexey Milovidov).
  • Se corrigió una excepción al combinar loop con cluster table functions. #98860 (Konstantin Bogdanov).
  • Se corrigió un LOGICAL_ERROR “RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin).
  • Se corrigió una excepción “Scalar doesn’t exist” al consultar un segmento remoto con optimize_const_name_size configurado y enable_scalar_subquery_optimization = 0. #98979 (andriibeee).
  • Se corrigió NOT_FOUND_COLUMN_IN_BLOCK en algunas consultas con GROUP BY y expresiones que incluyen búsquedas inversas en Diccionario, comparaciones de conversión Date/DateTime y comparaciones de tuplas. #98980 (Nihal Z. Miaji).
  • Se corrigió un error por el que EXISTS ignoraba las cláusulas LIMIT y OFFSET en las subconsultas, lo que provocaba resultados incorrectos cuando la subconsulta no devolvía filas debido a un desplazamiento o a un límite de cero. #99005 (andriibeee).
  • Se corrigió una excepción “Block structure mismatch” cuando la optimización de propagación de filtros encontraba una expresión AND que se cortocircuitaba a una constante con GROUPING SETS. #99010 (Alexey Milovidov).
  • Se corrigió un LOGICAL_ERROR al consultar una tabla que tiene tanto una ROW POLICY como una columna ALIAS que usa dictGet, provocado por un acceso prematuro a la expresión de tabla durante la resolución de la columna ALIAS en el nuevo analizador. #99065 (Peng).
  • Se corrigió un fallo de segmentación en un CTE recursivo con remote() + view(). #99081 (Konstantin Bogdanov).
  • Se omite el análisis adicional de índices innecesario cuando se aplica la optimización de lectura en orden. #99084 (Vladimir Cherkasov).
  • Se corrigieron las verificaciones de acceso durante InverseDictionaryLookupPass, comprobando el acceso solo una vez antes de ejecutar el paso de optimización. #99210 (Mikhail Artemenko).
  • Se corrigió optimize_skip_unused_shards con el nuevo analizador cuando se usaba una tabla Distributed dentro de una subconsulta IN. #99436 (Nikolai Kochetov).
  • Se corrigió un error de uso de memoria después de liberarla (heap-use-after-free) en INTERSECT/EXCEPT cuando la consulta producía nombres de columna duplicados. #99471 (Alexey Milovidov).
  • Se corrigió un error lógico en ALTER TABLE ... DROP PART cuando se usaba un parámetro de consulta tipado para el nombre de la parte. #99489 (Alexey Milovidov).
  • Se corrigió una excepción std::length_error al consultar tablas del sistema vacías con el formato Pretty a través de la interfaz HTTP. #99541 (Alexey Milovidov).
  • Se corrigió una degradación del rendimiento en el analizador al eliminar columnas no utilizadas de ARRAY JOIN. #99587 (Dmitry Novik).
  • Se corrigió una excepción (Bad get: has Tuple, actual type String) en ConditionSelectivityEstimator cuando una consulta usaba IN con un único parámetro de consulta escalar (por ejemplo, WHERE col IN ({p:String})) en una tabla que tiene estadísticas de columnas y use_statistics habilitado. #99614 (Ilya Yatsishin).
  • Se corrigió una excepción “Block structure mismatch” en consultas con una cláusula HAVING en las que la expresión de filtro contenía tanto una agregación envuelta en una función que devuelve NULL como materialize(0). #99915 (Alexey Milovidov).
  • Se corrigió un error lógico con una subconsulta correlacionada dentro de un argumento untuple. #99917 (Vladimir Cherkasov).
  • Se corrigió una excepción “Inconsistent AST formatting” en ALTER TABLE ... MODIFY QUERY con subconsultas anidadas que contenían SETTINGS cuando el propio ALTER también tenía SETTINGS. #99938 (Nikita Mikhaylov).
  • Se corrigió una excepción LOGICAL_ERROR “Not-ready Set” en la función IN durante la optimización del plan de consulta con convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR “Unexpected node type for table expression … Actual IDENTIFIER” cuando se usaba una subconsulta escalar dentro de un argumento de función de tabla no resuelto. #100014 (Alexey Milovidov).
  • Se corrigió el número cuadrático de consultas ejecutadas cuando se usaba distributed_index_analysis con predicados que contenían subconsultas IN. #100287 (Anton Popov).
  • Se corrigió una excepción de “Block structure mismatch” al usar GROUP BY ... WITH TOTALS HAVING combinado con UNION DISTINCT y expresiones Nullable. #100293 (Alexey Milovidov).
  • Se corrigió una excepción de “Inconsistent AST formatting” en compilaciones de depuración al usar GROUP BY CUBE(...) WITH ROLLUP o combinaciones similares. #100376 (Alexey Milovidov).
  • Se corrigió una excepción al crear una vista con alias de columnas y consultas SELECT * o EXCEPT/INTERSECT. #100386 (Alexey Milovidov).
  • Se corrigió una excepción TOO_MANY_ROWS en consultas SELECT count() con max_rows_to_read / force_primary_key cuando los datos estaban divididos en múltiples partes con límites de gránulos no alineados. #100408 (Alexey Milovidov).
  • Se corrigieron casos de NOT_FOUND_COLUMN_IN_BLOCK en los que la parte SELECT de la proyección tenía columnas que no existían en la parte SELECT original de la consulta. #100623 (Yarik Briukhovetskyi).
  • Ahora se permite pasar una clave de segmentación a las funciones de tabla cluster() y clusterAllReplicas() al usar una función de tabla como origen (por ejemplo, cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy).
  • Se corrigieron tipos de argumento incorrectos de AggregateFunction en el conteo trivial optimizado, lo que provocaba una excepción NUMBER_OF_ARGUMENTS_DOESNT_MATCH al consultar expresiones como count(v0 + v1) en tablas distribuidas. #100794 (YjyJeff).
  • Se corrigió un error lógico, “Invalid action query tree node”, al usar INTERSECT ALL / UNION ALL con expresiones reducidas a constantes. #100977 (Alexey Milovidov).
  • Se corrigió un error UNKNOWN_IDENTIFIER incorrecto cuando se usaba el mismo alias para varias expresiones en SELECT; ahora se informa correctamente el error MULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov).
  • Se corrigió una excepción en DirectJoinMergeTreeEntity cuando los bloques del pipeline contenían columnas ColumnConst combinadas con columnas normales. #101046 (Alexey Milovidov).
  • Se corrigió un espacio sobrante en el formato de los alias de columnas de CTE (WITH t (a, b)WITH t(a, b)). #101049 (Alexey Milovidov).
  • Se corrigió un fallo en las funciones de tabla remote/cluster con funciones de tabla anidadas como merge cuando el analizador estaba habilitado. #101055 (Alexey Milovidov).
  • Se corrigió la aplicación doble de OFFSET en consultas distribuidas cuando prefer_localhost_replica=1, lo que producía menos filas de las esperadas. #101071 (Nihal Z. Miaji).
  • Se corrigió un error “Illegal type Decimal64 of start parameter” en las funciones de agregación de series temporales al usar serialize_query_plan=1 con réplicas paralelas. #101083 (Groene AI).
  • Se corrigieron resultados de consulta incorrectos cuando se usaba una constante entera grande (p. ej., 256, 2147483648) como predicado booleano en una cláusula WHERE con AND en tablas MergeTree. #101287 (Groene AI).
  • Se corrigió un cierre inesperado con “Logical error: Reading from materialized CTE before materialization” cuando una subconsulta escalar hacía referencia a una cadena de materialized CTE dependientes. #101305 (Groene AI).
  • Se corrigió una excepción al convertir una cadena con datos adicionales al final al tipo vacío Tuple(). #102011 (Alexey Milovidov).
  • Se corrigió un error lógico al analizar una cadena incorrecta de tupla vacía. #102289 (Nihal Z. Miaji).
  • Se corrigieron resultados de agregación incorrectos (filas duplicadas) al usar optimize_aggregation_in_order=1 con columnas de GROUP BY ordenadas de forma distinta a la clave de ordenación de la tabla. #102299 (Groene AI).
  • Se corrigió una excepción en getStructureOfRemoteTable cuando el segmento local devolvía columnas vacías debido a DDL concurrente. #102604 (Alexey Milovidov).
  • Se optimizaron las cadenas de OR de ROW POLICY a IN en el nuevo analizador. #102915 (Azat Khuzhin).
  • Se corrigieron resultados incorrectos devueltos por WHERE x AND toNullable(N) en tablas MergeTree cuando N es un entero mayor que UInt8 (p. ej., 256, 65535, 2147483648 o cualquier entero negativo). #103077 (Groene AI).

Correcciones de MergeTree y almacenamiento

  • Se corrigió un error lógico al adjuntar una parte en MergeTree si había varios cambios de nombre encadenados entre su separación y su nueva adjunción. #96351 (Alexey Milovidov).
  • Se corrigió el cálculo no determinista de uncompressed_hash para partes Compact de MergeTree cuando se usan varios códecs de compresión, lo que podía provocar un comportamiento incorrecto de deduplicación. #97522 (Alexey Milovidov).
  • Se corrigió que las excepciones MEMORY_LIMIT_EXCEEDED se reportaran incorrectamente como CORRUPTED_DATA durante las merges de SummingMergeTree y CoalescingMergeTree. #97537 (János Benjamin Antal).
  • hasPartitionId ahora devuelve false si existe otra partición con un ID de partición más alto en el conjunto de partes de datos. #97748 (Mikhail Artemenko).
  • Se corrigió una mutación después de una actualización ligera con índices secundarios. #98044 (Raúl Marín).
  • Se corrigieron resultados incorrectos en consultas FINAL al mezclar índices de omisión de clave primaria y de no clave primaria. #98097 (Raúl Marín).
  • Si las columnas de la clave de partición no están cubiertas por la clave de ordenación, la poda de particiones podía omitir incorrectamente particiones que contenían filas que debían “prevalecer” durante la deduplicación FINAL. #98242 (Yarik Briukhovetskyi).
  • Se corrigió un posible interbloqueo cuando dos operaciones concurrentes de MOVE PARTITION trabajan con el mismo par de tablas en direcciones opuestas. #98264 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR “Invalid binary search result in MergeTreeSetIndex” provocada por la conversión toDate en columnas de clave con datos a ambos lados del límite de 65535. #98276 (Alexey Milovidov).
  • Se corrigió un fallo esporádico de deduplicación por el que las reinserciones se deduplicaban incorrectamente debido a un orden de limpieza inconsistente entre los directorios ZooKeeper blocks/ y deduplication_hashes/. #98293 (Alexey Milovidov).
  • Se corrigió que las mutaciones MATERIALIZE INDEX y MATERIALIZE PROJECTION se quedaran bloqueadas cuando el índice o la proyección se eliminaban antes de que finalizara la mutación. #98369 (Alexey Milovidov).
  • Se corrigieron resultados incorrectos de poda de particiones después de fusionar partes con columnas de clave de partición Nullable, causados por límites incorrectos del índice min-max. #98405 (Amos Bird).
  • Se corrigió una excepción LOGICAL_ERROR en renameAndCommitEmptyParts que podía producirse cuando TRUNCATE TABLE se ejecutaba de forma concurrente con OPTIMIZE TABLE usando transacciones de MergeTree. #98508 (Alexey Milovidov).
  • Se corrigió un desbordamiento decimal al realizar poda de particiones con DateTime64. #98628 (Yarik Briukhovetskyi).
  • Se corrigió la reaparición de partes de datos obsoletas causada por una limpieza incorrecta de partes de cobertura vacías. #98698 (Shaohua Wang).
  • Se corrigió la detección de la utilidad del índice de omisión set en un predicado OR con false (es decir, or(x, 0)). #98776 (Azat Khuzhin).
  • Se corrigió que los índices de omisión (y las condiciones de clave primaria) no se aplicaran a columnas ALIAS cuando la fusión de expresiones del plan de consulta está deshabilitada (query_plan_merge_expressions = 0 o query_plan_enable_optimizations = 0). #98960 (Peng).
  • Se corrigió la poda incorrecta o insuficiente cuando se usaban startsWith, LIKE o NOT LIKE con una columna FixedString. Además, la función de conversión de FixedString a String ahora puede podar gránulos cuando se aplica a una columna clave. #99001 (Nihal Z. Miaji).
  • Se corrigió una excepción al leer partes de parche (actualizaciones ligeras) sin la columna _part_offset en el plan de consulta. #99023 (Alexey Milovidov).
  • Una consulta como SELECT * FROM table WHERE pk_id = '', donde pk_id es una clave primaria String, ahora usa correctamente el índice de clave primaria para filtrar gránulos. #99027 (Shankar Iyer).
  • Se corrigió una excepción al crear una tabla con una columna EPHEMERAL que tiene el mismo nombre que una columna virtual (por ejemplo, _part_offset). #99031 (Alexey Milovidov).
  • Se corrigió LOGICAL_ERROR debido a una discrepancia en el orden de las columnas de las partes de parche. #99164 (Pablo Marcos).
  • Se corrigió que ALTER TABLE UPDATE/DELETE fallara con un error Missing columns cuando una tabla tiene una columna MATERIALIZED cuya expresión depende de una columna EPHEMERAL. #99281 (Yash).
  • Se corrigió la compatibilidad al actualizar tablas replicadas con índices minmax implícitos de la versión 25.10 a versiones más recientes. #99392 (Raúl Marín).
  • Se corrigió el marcado incorrecto, en casos raros, de una parte de datos como dañada y su separación tras una consulta DETACH/ATTACH TABLE. #99529 (Anton Popov).
  • Se corrigió un fallo de aserción de rows_sources en una fusión vertical cuando SYSTEM STOP/START MERGES se alterna rápidamente durante la fusión de una tabla con columnas Dynamic. #99532 (Alexey Milovidov).
  • Se corrigió la poda incorrecta de particiones para toWeek() que provocaba que las consultas con WHERE toWeek(date, mode) = N devolvieran resultados vacíos para las semanas 49–52 en tablas particionadas por toYYYYMM(date). #99542 (Takumi Hara).
  • Se corrigió un LOGICAL_ERROR al usar ALTER TABLE ADD COLUMN para crear una columna EPHEMERAL con el mismo nombre que una columna virtual (por ejemplo, _part_offset). #99549 (Alexey Milovidov).
  • Se corrigió que CLEAR COLUMN no reconstruyera las proyecciones ni volviera a evaluar las columnas materializadas que dependen de la columna limpiada, lo que podía causar excepciones o corrupción de datos durante fusiones posteriores. #99565 (Desel72).
  • Una parte con proyecciones desconocidas ya no se marca como perdida para siempre. #99623 (Sema Checherinda).
  • Se corrigió una referencia colgante en injectRequiredColumns que provocaba un fallo durante la fusión. #99679 (Tuan Pham Anh).
  • Se corrigió un error lógico durante la fusión de partes de proyección después de CLEAR COLUMN en una tabla con proyecciones y partes compactas. #100068 (Pavel Kruglov).
  • Se corrigió un LOGICAL_ERROR “Stream … not found” al insertar en una tabla con columnas Array(JSON) anidadas en partes wide con optimize_on_insert=0. #100475 (Pavel Kruglov).
  • Evalúe los argumentos del engine para StorageAlias antes de almacenar la definición, de modo que expresiones como currentDatabase() se resuelvan como literales antes de guardarse en la base de datos. #100902 (Nikolay Degterinsky).
  • Se corrigió que divide e intDiv devolvieran ILLEGAL_DIVISION cuando se usaban en expresiones de filtro durante el análisis de índices en algunos casos. #100928 (Nihal Z. Miaji).
  • Se corrigió que una optimización de minmax_count_projection y de COUNT(*) trivial quedara deshabilitada de forma permanente tras una eliminación ligera, incluso después de que se fusionaran todas las partes con una máscara de eliminación ligera. #101212 (Anton Popov).
  • Se corrigió una carrera de dato en storage_id en IStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky).
  • Se corrigió que materialize_skip_indexes_on_merge=false no suprimiera los índices de texto (full-text) durante la fusión. Anteriormente, solo se suprimían los skip indexes no textuales (minmax, set, bloom_filter). #101932 (Groene AI).
  • Las entradas de caché del índice de similitud vectorial ahora se eliminan después de eliminar una parte (por ejemplo, durante una fusión), lo que corrige que las entradas nunca se expulsaran debido a claves de caché que no coincidían. #99575 (Seva Potapov).
  • Se corrigió una excepción LOGICAL_ERROR falsa durante el redimensionamiento dinámico de la caché del filesystem debido a una race condition en la promoción de la subcola SLRU. #99850 (Alexey Milovidov).
  • Se corrigió un posible error lógico durante la lectura de subcolumnas de Map. #101641 (Pavel Kruglov).
  • Se corrigió la prioridad de la coincidencia exacta de subcolumnas sobre la coincidencia por prefijo en getSubcolumnData para evitar un posible fallo. #101645 (Pavel Kruglov).
  • Se corrigió el uso de extremos incorrectos en un índice min-max creado sobre una columna JSON, lo que provocaba resultados de consulta incorrectos. #101918 (Pavel Kruglov).
  • Se corrigió un bug de race en SLRU en la caché del filesystem (26.1+) que podía provocar un error lógico de reserva de espacio. #101991 (Kseniia Sumarokova).
  • Se corrigió un error lógico Having zero bytes en la caché, provocado por la sobrescritura de un objeto remoto entre list y read, lo que antes daba lugar a metadatos de objeto obsoletos. #101219 (Kseniia Sumarokova).
  • Se corrigió un fallo de aserción file_offset_of_buffer_end <= getFileSize() al leer tablas Log o StripeLog en almacenamiento de objetos S3 con escrituras concurrentes. #100763 (Alexey Milovidov).
  • Se corrigió la aplicación del límite de tamaño de la caché al recargar la configuración. #100659 (Aleksei Filatov).
  • Se corrigió una terminación con LOGICAL_ERROR durante el cambio dinámico de tamaño de la caché del sistema de archivos SLRU, causada por estadísticas de expulsión compartidas entre subcolas y una ruta de recuperación incorrecta para candidatos fallidos. #102396 (Antonio Andelic).
  • Se corrigió que las optimizaciones minmax_count_projection y la trivial de COUNT(*) quedaran deshabilitadas permanentemente después de una eliminación ligera. #102900 (Anton Popov).

Correcciones de tipos de datos y serialización

  • Se corrigió un resultado incorrecto o una excepción durante la lectura de subcolumnas de columnas ALIAS. #95408 (Pavel Kruglov).
  • Se corrigió que la función de agregación sumCount no pudiera leer estados serializados antiguos tras la introducción de Nullable(Tuple). #97502 (Nihal Z. Miaji).
  • Se corrigió un error lógico relacionado con la ausencia de un stream durante INSERT SELECT con JSON y buckets en datos compartidos. #97523 (Pavel Kruglov).
  • Se corrigieron posibles fallos durante la lectura de gránulos vacíos en datos compartidos avanzados en JSON. #97778 (Pavel Kruglov).
  • Se corrigió una compilación JIT incorrecta de la función sign para tipos enteros más amplios que Int8: los valores fuera del rango -128..127 podían producir un signo incorrecto. #98012 (Alexey Milovidov).
  • Se corrigió que el formato ProtobufList no funcionara con el motor Kafka porque el estado de lectura no se restablecía entre mensajes. #98151 (Alexey Milovidov).
  • Se corrigió la corrupción silenciosa de datos al insertar una columna Date de Parquet/Arrow en una columna Enum: ahora la conversión de tipos incompatible se rechaza correctamente en lugar de almacenar valores de enum no válidos. #98364 (Alexey Milovidov).
  • Se corrigió una excepción al leer un archivo Arrow con una columna Array en una tabla con una columna Nested. #98365 (Alexey Milovidov).
  • Se corrigió una excepción al leer desde Nullable(Tuple(...)) cuando el nombre de un elemento de Tuple colisiona con la subcolumna null de Nullable. #98372 (Alexey Milovidov).
  • Se corrigió la conversión incorrecta de Parquet Bool a FixedString en el lector nativo V3, que producía bytes sin procesar en lugar de una representación en cadena. #98378 (Alexey Milovidov).
  • Se corrigió tryGetColumnDescription para filtrar subcolumnas por el tipo de la columna padre, de forma coherente con otros métodos de búsqueda de columnas. #98391 (Alexey Milovidov).
  • Se corrigió la reversión de columnas en el motor Buffer al gestionar una excepción durante la anexión de un nuevo bloque. La lógica anterior podía provocar un estado corrupto de las columnas en memoria. #98551 (Pavel Kruglov).
  • Se corrigió una excepción Bad cast from type ColumnConst to ColumnDynamic en la comparación null-safe (<=> / IS NOT DISTINCT FROM) con columnas const Dynamic o Variant y NULL. También se corrigió que IS DISTINCT FROM con Dynamic/Variant frente a NULL devolviera siempre 0 de forma incorrecta. #98553 (Alexey Milovidov).
  • Se corrigió que parseDateTimeBestEffort analizara incorrectamente palabras que empiezan por prefijos de mes o de día de la semana. #98742 (Pavel Kruglov).
  • Se corrigió una excepción de reverseUTF8 con entrada UTF-8 no válida (truncada). #98770 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR en las funciones financieras (financialNetPresentValue, financialInternalRateOfReturn, etc.) al pasar argumentos de tipo BFloat16. #98958 (Alexey Milovidov).
  • SummingMergeTree ya no suma columnas Bool (ni otras columnas de tipo domain); los valores Bool ahora se conservan tal cual en lugar de sumarse aritméticamente. #98976 (Yash).
  • Se corrigió un comportamiento indefinido (desreferenciación de puntero nulo) al alterar una columna version/sign/is_deleted a EPHEMERAL o ALIAS en motores MergeTree. Ahora esas alteraciones se rechazan correctamente. #98985 (Alexey Milovidov).
  • Se corrigió que parseDateTimeBestEffort interpretara incorrectamente palabras que comienzan con prefijos de mes en formato DD-month-YYYY. #99350 (Pavel Kruglov).
  • Se corrigió CHECK TABLE con serialización dispersa dentro de un Tuple con Dynamic. #99351 (Pavel Kruglov).
  • Se corrigió un logical error unordered_map::at: key not found en el formato de salida Avro al serializar columnas Enum8/Enum16 con valores no presentes en la definición del enum. #99332 (Desel72).
  • Se corrigió un error por el que la comparación entre los tipos Time[64] y DateTime[64] resultaba confusa; los valores Time[64] ahora se promocionan a DateTime[64] añadiendo 1970-01-01 como parte de la fecha. #99267 (Yarik Briukhovetskyi).
  • Se corrigió la deserialización de \N (NULL) para el tipo Variant en los formatos de texto Escaped/Raw. #99648 (Pavel Kruglov).
  • Se corrigió un comportamiento indefinido en el lector del formato Avro al leer valores numéricos que desbordan el tipo de columna de destino. Las consultas ahora fallan en caso de desbordamiento en lugar de producir silenciosamente valores incorrectos. #99697 (asyablue22).
  • Se corrigió una terminación por falso positivo en NativeReader al deserializar un flujo en formato Native con un desajuste en el recuento de filas: se cambió de LOGICAL_ERROR a INCORRECT_DATA. #99822 (Rahul Nair).
  • Se corrigió una terminación del proceso durante la deserialización de columnas Tuple cuando el tipo de serialización en el flujo binario es DETACHED. #99823 (Rahul Nair).
  • Se corrigió la configuración aggregate_functions_null_for_empty para que funcione con funciones de agregación que devuelven tipos no Nullable, como Array o Map (por ejemplo, groupArray, sumMap). #99839 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR en la función midpoint cuando se invoca con tipos enteros con signo y sin signo combinados. #99867 (Alexey Milovidov).
  • Se corrigió una excepción LOGICAL_ERROR en consultas que involucran columnas Dynamic con joins cruzados y filtros en tiempo de ejecución, causada porque ColumnVariant::filter compartía punteros a columnas Variant en lugar de clonarlos en la ruta de optimización hasOnlyNulls. #100234 (Pavel Kruglov).
  • Se corrigió un error en arrays de Variant que podía reinterpretar el tipo de datos al llamar a arrayFirst/arrayLast. Por ejemplo, Array(Variant(Date, Bool)) se convertía en Bool cuando el tipo variante subyacente real era Date. #100255 (timothygk).
  • Se corrigió un problema que impedía que los formatos CSV y MsgPack analizaran Nullable(Tuple) correctamente. #100038 (Nihal Z. Miaji).
  • Se corrigió un problema por el que las funciones accurateCastOrDefault y to*OrDefault no preservaban el tipo de columna Const para entradas constantes. #100132 (Alexey Milovidov).
  • Los parámetros de consulta omitidos con tipo LowCardinality(Nullable(T)) ahora toman correctamente NULL como valor predeterminado, igual que Nullable(T). #100144 (Denys Melnyk).
  • Se corrigió el desbordamiento de enteros con signo (comportamiento indefinido) en toStartOfInterval cuando se llamaba con valores de intervalos de milisegundos o microsegundos muy grandes en DateTime64 de alta precisión. #100156 (Alexey Milovidov).
  • Se corrigieron los filtros de runtime de join sobre el tipo de datos Variant. #100182 (Dmitry Novik).
  • Se corrigió una conversión de Time64 a UInt64 que podía limitar los valores a 24 horas. #100025 (Yarik Briukhovetskyi).
  • Se corrigió una excepción al calcular el supertipo común para tuples vacías y no vacías con use_variant_as_common_type habilitado. #100699 (Antonio Andelic).
  • Se corrigió el comportamiento indefinido en positiveModulo cuando el divisor sin signo no cabe en el tipo de resultado con signo. #100705 (Raúl Marín).
  • Se corrigió el comportamiento indefinido (desbordamiento de enteros con signo) en toStartOfInterval al usar intervalos de Week, Quarter o Year con un argumento origin y valores de intervalo extremos. #100817 (Raúl Marín).
  • Se corrigió un problema que impedía que los combinadores de funciones de agregación If, Distinct, DistinctIf e IfState, con un tipo de retorno Tuple y uno o más argumentos Nullable, pudieran leer estados serializados antiguos tras la introducción de Nullable(Tuple). #100826 (Nihal Z. Miaji).
  • cast_keep_nullable, cuando está habilitado, ya no genera una excepción al convertir un null Dynamic en un Variant. #100864 (Seva Potapov).
  • Se corrigió una excepción en intDiv/intDivOrZero sobre arrays de tuples anulables. #100895 (Raúl Marín).
  • Se corrigió el comportamiento indefinido (desbordamiento de enteros con signo) en parseDateTimeBestEffort al analizar cadenas de fecha y hora con más de 18 dígitos de fracción de segundo. #100948 (Vasily Chekalkin).
  • Se corrigió que la función de agregación sumCountOrDefault, con uno o más argumentos Nullable, no pudiera leer estados serializados antiguos tras la introducción de Nullable(Tuple). #101021 (Nihal Z. Miaji).
  • Se corrigió que las columnas ALIAS con tipos DateTime/DateTime64 no aplicaran la conversión de zona horaria cuando la zona horaria declarada difería de la zona horaria de la expresión. #101043 (Alexey Milovidov).
  • Se eliminó Nullable de la columna de resultado en arrayIntersect y funciones relacionadas para evitar un desajuste entre serialización y deserialización. #101569 (George Larionov).
  • Se corrigió que positiveModulo(tuple, number) se redirigiera incorrectamente a división en lugar de a módulo. #101709 (ClickGap AI Bot).
  • Se corrigió una salida incorrecta en formatDateTime con el especificador %W bajo determinadas configuraciones de formato no predeterminadas. #101847 (Robert Schulze).
  • Se corrigió una excepción por incompatibilidad de tipos en transform cuando la columna predeterminada es const en algunos bloques. #100616 (Pavel Kruglov).
  • Se permiten row groups vacíos en Parquet. #100653 (Vitaly Baranov).
  • min/max/argMin/argMax ahora tratan NaN de forma coherente con ORDER BY: NaN siempre se omite (solo se devuelve cuando todos los valores son NaN). Antes, los resultados dependían de la posición de NaN en los datos debido a la semántica de comparación no ordenada de IEEE 754. #100448 (Raúl Marín).
  • Se corrigió una inferencia incorrecta del tipo de dato de fecha en caso de overflow tras el ajuste de la zona horaria. #102674 (Pavel Kruglov).
  • Se corrigió que CASE con una expresión Dynamic devolviera ELSE para todas las filas. #102684 (Pavel Kruglov).
  • Se corrigió la serialización del tipo Dynamic aplanado con tipos de datos codificados en binario. #102692 (Pavel Kruglov).
  • Se corrigió que cast_string_to_date_time_mode se ignorara para CAST a Nullable(DateTime). #103035 (Pavel Kruglov).
  • Se hizo que la representación de null en la serialización de columnas replicadas y dispersas respetara la configuración (por ejemplo, format_tsv_null_representation). #102888 (Hechem Selmi).

Correcciones de text index y skip index

  • Se corrigió el uso del índice de texto junto con otros índices de omisión. Anteriormente, podían producirse errores lógicos como “Trying to get non-existing mark” cuando un filtro de consulta usaba simultáneamente un índice de texto y otros índices de omisión normales. #98555 (Anton Popov).
  • Se corrigió la reconstrucción de los índices de texto durante las fusiones con TTL. #99107 (Anton Popov).
  • Se corrigió una validación excesivamente estricta del preprocesador del índice de texto. #99359 (Anton Popov).
  • Se eliminó la compatibilidad con funciones negadas (notEquals, notLike, notIn) en el análisis del índice de texto. Estas funciones nunca podían omitir ningún gránulo, por lo que analizar el índice para ellas solo añadía sobrecarga. #99393 (Anton Popov).
  • Se corrigió una excepción NOT_FOUND_COLUMN_IN_BLOCK cuando se hacía referencia a un predicado del índice de texto (p. ej., hasAllTokens) tanto en las cláusulas SELECT como WHERE mediante un alias. #99504 (Anton Popov).
  • Se corrigieron resultados incorrectos al usar hasAllTokens con OR entre columnas que tienen índices de texto independientes. #99505 (Anton Popov).
  • Se corrigió la lectura del índice de texto en una tabla con eliminaciones ligeras y políticas de fila existentes. #99661 (Anton Popov).
  • Se corrigió el análisis, por parte del índice de texto con preprocesador, de predicados con la función IN, y también una colisión de tokens buscados que podía provocar resultados incorrectos. #99755 (Anton Popov).
  • Se corrigió el uso incorrecto del índice de texto con las funciones startsWith y endsWith en tokenizadores que no admiten coincidencias de subcadenas (array, splitByString). Anteriormente, estos tokenizadores podían producir resultados incorrectos de forma silenciosa. #100151 (Anton Popov).
  • Se corrigió un fallo poco frecuente cuando se lanzaba una excepción “Memory Limit” al crear el índice de texto. #100213 (Anton Popov).
  • Se corrigieron los errores “Not-ready Set is passed as the second argument” durante el análisis de un índice de texto construido sobre mapValues para predicados que contenían una cláusula IN. #100224 (Anton Popov).
  • Se corrigió un fallo al usar un índice de búsqueda de texto con una cláusula IN que contenía una subconsulta de Tuple, por ejemplo, WHERE (id, str) IN (SELECT (id, str) FROM ...), o cuando el número de columnas de la subconsulta no coincidía con la Tuple del lado izquierdo de IN. #100959 (Anton Popov).
  • El tokenizador splitByString ahora rechaza cadenas separadoras vacías. #101928 (Robert Schulze).
  • El tokenizador sparseGrams generaba tokens más largos que la longitud máxima proporcionada (debido a un +2 codificado de forma fija en la implementación). #101934 (Elmi Ahmadov).
  • Se corrigió una excepción al consultar tablas Merge o Distributed con un índice de texto completo y condiciones de filtro combinadas que mezclan has*Tokens con LIKE, con query_plan_direct_read_from_text_index habilitado. #101939 (Jimmy Aguilar Mena).
  • Se corrigió hasToken/hasTokenOrNull con patrones compuestos solo por separadores (p. ej., '()', '!!!') en columnas con un índice de texto: antes, el índice omitía silenciosamente todos los gránulos en lugar de generar BAD_ARGUMENTS (para hasToken) o devolver NULL (para hasTokenOrNull). #102544 (Jimmy Aguilar Mena).
  • Los ajustes del índice de texto completo (enable_full_text_index, allow_experimental_full_text_index, use_skip_indexes_on_data_read) ya no se desactivan cuando el ajuste compatibility apunta a una versión anterior a la 26.1. #102422 (Nikita Fomichev).
  • Se añadió compatibilidad con columnas ALIAS en la optimización de lectura directa desde el índice de texto. #103037 (Anton Popov).

Correcciones en el lago de datos

  • Se corrigió una condición de carrera lógica al cambiar la versión del snapshot en el motor de tablas DeltaLake, y se eliminaron las recargas redundantes y costosas de snapshots. #96226 (Kseniia Sumarokova).
  • Se corrigieron una excepción DUPLICATE_COLUMN y valores NULL silenciosos al leer tablas Delta Lake que usan el modo de correspondencia de columnas “name” con campos struct cuyos nombres contienen puntos. #98013 (Caio Ishizaka Costa).
  • Se corrigió un error al usar Unity catalog sobre GCS. #98456 (Melvyn Peignon).
  • DataLakeCatalog ahora respeta la configuración http_forbid_headers del servidor al validar la opción auth_header. #98827 (Michael Anastasakis).
  • Ahora se prohíbe crear, adjuntar y actualizar tablas locales de lago de datos fuera de las rutas de usuario; esto se comprueba al crear y actualizar IDataLakeMetadata. #98936 (Daniil Ivanik).
  • Se corrigieron las lecturas de Iceberg BigLake: las credenciales de ADC ahora se reenvían al client S3 de GCS (corrigiendo errores 403), las credenciales de OAuth2 se codifican como URL antes de enviarse y el recorrido del espacio de nombres ya no se aborta ante respuestas HTTP 400 de BigLake. #98998 (Nikita Fomichev).
  • Se corrigió un error de acceso fuera de límites al consultar solo columnas virtuales de una tabla Iceberg con datos Avro. #99080 (alesapin).
  • Se corrigió un crash en ALTER TABLE ... REMOVE SETTINGS para el motor de tablas Iceberg. #99108 (alesapin).
  • Se corrigió un crash muy poco frecuente cuando una tabla Iceberg contiene archivos en formatos mixtos (ORC y Parquet). #99168 (alesapin).
  • Se corrigió un crash (desreferenciación de puntero nulo) al ejecutar ALTER TABLE ... MODIFY COLUMN ... COMMENT en tablas Iceberg. #99838 (Desel72).
  • ClickHouse ahora maneja correctamente las tablas de estilo Spark (con una ruta absoluta completa para cada archivo o una ruta relativa a la ruta común de la tabla). #99935 (alesapin).
  • Se corrigió una excepción cuando una opción de ruta de archivo de metadata de Iceberg contiene un null byte. #100283 (Alexey Milovidov).
  • Se corrigió un error de copiar y pegar por el que delta_lake_snapshot_end_version, configurado sin delta_lake_snapshot_start_version, se ignoraba silenciosamente en lugar de producir un error BAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar).
  • Se corrigió un error lógico en tablas Iceberg ordenadas durante mutations. #100499 (alesapin).
  • Se corrigió el Polaris catalog con Azure, donde desde la versión 25.12 el catálogo añadía el bucket al principio de la ruta. #100583 (Konstantin Vedernikov).
  • Se corrigió una excepción Logical error: 'partitions_count > 0' al realizar operaciones consecutivas de ALTER TABLE UPDATE en una tabla Iceberg particionada. #101278 (Desel72).
  • Se corrigió insert-select desde un clúster de Delta Lake con ReplicatedMergeTree. #101299 (Konstantin Vedernikov).
  • Ahora se genera un error cuando se usan delta_lake_snapshot_version o las configuraciones de versión de CDF sin DeltaKernel habilitado, en lugar de devolver silenciosamente datos incorrectos. #101489 (Desel72).
  • Se corrigió un bucle de reintentos de INSERT de Iceberg que fallaba cuando la tabla se había creado con iceberg_metadata_file_path y la versión de metadatos de destino ya existía. #101548 (Groene AI).
  • Se corrigió un fallo del servidor (LOGICAL_ERROR) al seleccionar desde una vista materializada respaldada por una tabla con el table engine IcebergLocal. #101577 (Groene AI).
  • Se corrigió un fallo en ALTER TABLE ... UPDATE de IcebergLocal al usar formato Avro, causado porque los tipos envoltorio LowCardinality/Nullable no se desempaquetaban antes de la serialización. #102337 (Desel72).
  • Se añadió la columna hostname que faltaba a system.delta_lake_metadata_log y system.iceberg_metadata_log. #102162 (Michael Russell).
  • Se corrigió CoalescingMergeTree para el tipo Array. #102384 (Konstantin Vedernikov).

Correcciones de S3/Azure/almacenamiento de objetos

  • Se corrigió una excepción en CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova).
  • Se corrigió un fallo por el que, al consultar archivos con un patrón glob (p. ej., file('dir/**', 'LineAsString')), se producía una excepción no controlada del sistema de archivos si el directorio contenía un enlace simbólico colgante. Ahora esos enlaces simbólicos colgantes se omiten silenciosamente. #98143 (Mark Andreev).
  • Se corrigió el uso excesivo de memoria (~514 MiB) durante la autodetección de formato al leer datos que no eran Arrow (p. ej., JSON desde url() o file() sin un formato explícito), causado porque el lector ArrowStream interpretaba erróneamente los primeros bytes como una longitud de metadatos enorme. #98893 (Konstantin Bogdanov).
  • Se corrigió una race condition que podía provocar la excepción “ReadBuffer is canceled” en consultas que usan urlCluster o funciones de tabla de clúster similares. #98955 (Alexey Milovidov).
  • Se corrigió el mensaje engañoso “inflate failed: buffer error” al leer archivos comprimidos inexistentes mediante la función de tabla url() con patrones glob. #99034 (Alexey Milovidov).
  • Se corrigieron las llamadas N+1 a HeadObject para globs con expansión de llaves en S3. #99219 (Konstantin Bogdanov).
  • Se corrigieron casos en los que números con ceros a la izquierda en una ruta de partición de Hive provocaban errores. #99458 (Yarik Briukhovetskyi).
  • Se corrigió un posicionamiento incorrecto en AsynchronousReadBufferFromFileDescriptor con O_DIRECT. #99678 (Pavel Kruglov).
  • Se corrigió un error por el que ClickHouse podía omitir archivos si faltaba la cabecera Content-Length en la respuesta a la solicitud HEAD (por ejemplo, debido a transcodificación descompresiva en GCS). #99971 (Yarik Briukhovetskyi).
  • El servidor ya no deja de arrancar cuando se configura un disco de Azure blob storage pero el endpoint no está accesible temporalmente (p. ej., por un fallo de DNS). #100701 (Raúl Marín).
  • Se corrigió un segfault en s3Cluster y en consultas distribuidas debido a un use-after-free en el grupo de conexiones. #100837 (Konstantin Bogdanov).
  • Se corrigió una excepción que se escapaba del destructor Client::~Client de S3 y provocaba la terminación del servidor. #101798 (Gagan Dhakrey).
  • Se corrigió que el host y el puerto no se registraran correctamente durante la reconexión. #102280 (Grant Holly).
  • Se corrigió una excepción del servidor en ClusterDiscovery cuando un clúster estático (definido en la configuración) se quedaba temporalmente sin nodos activos. #102661 (Kseniia Sumarokova).

Correcciones de S3Queue

  • S3Queue: se corrigió un error de aserción tras una pérdida de conexión con ZooKeeper, aunque el commit se había realizado correctamente. #100210 (Kseniia Sumarokova).
  • Se corrigió la descripción invertida de la columna alterable en system.s3_queue_settings y system.azure_queue_settings: se intercambiaron los significados de 0 y 1 para que coincidan con el comportamiento real del código. #101703 (ClickGap AI Bot).

Correcciones de seguridad y control de acceso

  • La función de tabla loop llamaba a inner_storage->read() directamente, omitiendo la capa del intérprete donde se aplican las políticas de fila, los privilegios a nivel de columna y otras comprobaciones de seguridad. Esto permitía que un usuario restringido por políticas de fila leyera todas las filas mediante loop(table). #97682 (pufit).
  • Aplicar comprobaciones READ ON FILE a file() escalar y a DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
  • Aceptar credenciales base64 sin relleno en HTTP Basic Auth. Algunos clientes HTTP omiten el relleno final = en la cabecera Authorization: Basic, lo que antes provocaba fallos de autenticación. #98392 (Amos Bird).
  • Se corrigió una elusión de RBAC que permitía a los usuarios ejecutar DESCRIBE sobre cualquier tabla mediante remote(), remoteSecure(), cluster() o clusterAllReplicas() apuntando a localhost, sin requerir el privilegio SHOW_COLUMNS. #98669 (pufit).
  • Se corrigió un issue por el que system.grants omitía los parámetros de expresión regular de los grants URL y S3 en la columna access_object. #98987 (DQ).
  • Se corrigió una elusión de RBAC que permitía a los usuarios obtener la estructura de la tabla mediante DESCRIBE TABLE o CREATE TABLE AS en funciones de tabla (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc(), etc.) sin los privilegios de acceso al origen requeridos. En el caso de las funciones que infieren el esquema a partir de servidores remotos, esto también permitía desencadenar conexiones salientes (SSRF) sin autorización. #99122 (pufit).
  • Limitar las constraints de settings en el worker de DDL para consultas DDL distribuidas. #99317 (Pablo Marcos).
  • Se corrigieron problemas menores con la autenticación TOTP: la opción de CLI --one-time-password con una contraseña vacía y la validación de los valores de configuración <digits> y <period>. #99322 (Vladimir Cherkasov).
  • Las credenciales en las cadenas de conexión JDBC, ODBC y NATS ahora se enmascaran en los registros de consultas y en la salida de SHOW CREATE. En el caso de las cadenas de conexión con formato URI, solo se enmascara la parte correspondiente a la contraseña. El setting nats_token ahora también se enmascara. #99344 (János Benjamin Antal).
  • Prohibir la lectura de credenciales de Google desde un archivo local, lo cual era inseguro porque permitía leer otras credenciales si se conocía la ruta del archivo. #99584 (Konstantin Vedernikov).
  • Se corrigió que el origen del diccionario de MySQL omitiera RemoteHostFilter para parámetros DDL inline. #99720 (Shaohua Wang).
  • Se corrigió system.completions para filtrar correctamente bases de datos, tablas y columnas según los permisos de acceso en todas las combinaciones de grants: por tabla, por base de datos y revoke por columna. #100432 (Shaohua Wang).
  • Sanitizar query_id en el handler HTTP para evitar la inyección de CRLF en las cabeceras de respuesta mediante la cabecera X-ClickHouse-Query-Id. #100500 (Pablo Marcos).
  • Algunos catálogos podían mostrar secretos en la sección SETTINGS de SELECT * FROM system.databases. Ahora esto se impide. #100800 (Konstantin Vedernikov).
  • Las políticas de fila no se propagaban desde los subplanificadores al planificador principal para el logging, por lo que no aparecían en query_log para vistas, subconsultas e instrucciones INSERT SELECT. Ahora se conservan en QueryAccessInfo para el logging. #101044 (Narasimha Pakeer).

Correcciones de copia de seguridad y restauración

  • Se corrigió que max_execution_time no se aplicara a la copia de seguridad/restauración. #99205 (Kseniia Sumarokova).
  • Se corrigió una excepción ReadBuffer is canceled. Can't read from it. en operaciones de copia de seguridad/restauración con archivos zip. #100400 (Alexey Milovidov).
  • Se validan las rutas de las entradas de archivo en los metadatos de la copia de seguridad para rechazar recorridos de ruta, rutas absolutas y nombres vacíos durante RESTORE. #100483 (Pablo Marcos).
  • Se corrigieron el formateo y la clonación del AST de BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).

Correcciones de ClickHouse Keeper

  • Se corrigió una carrera de dato en el client de ZooKeeper entre el hilo de envío y el hilo de recepción. #97887 (Pablo Marcos).
  • Se corrigió la pérdida de datos en Keeper tras un reinicio al usar Azure Blob Storage con metadatos s3_plain para el almacenamiento de logs. #97987 (Antonio Andelic).
  • Se estableció el componente Watch para las respuestas de watch en aggregated_zookeeper_log en lugar de dejarlo vacío. #98202 (Antonio Andelic).
  • Se corrigió un problema por el que ClickHouse Keeper desconectaba a clients Java de ZooKeeper después de una solicitud addWatch. El Java client espera un cuerpo ErrorResponse de 4 bytes, pero Keeper enviaba un cuerpo vacío, lo que provocaba EOFException y la desconexión de la sesión. #98499 (Antonio Andelic).
  • Se corrigió que las métricas de Keeper zk_followers y zk_synced_followers no disminuyeran cuando un follower dejaba de estar disponible. Se añadieron las nuevas métricas zk_learners y zk_synced_non_voting_followers al comando mntr. #98504 (Antonio Andelic).
  • Se corrigió que el puerto Raft seguro de Keeper ignorara cipherList y dhParamsFile de la configuración openSSL. #98509 (Antonio Andelic).
  • Se corrigieron mensajes de log engañosos de Keeper como “Receiving request for session X took 9963 ms”, donde el tiempo informado en realidad se pasaba esperando inactivo en poll() entre heartbeats. #98510 (Antonio Andelic).
  • Se corrigió que las conexiones TCP de Keeper impidieran un apagado ordenado del servidor al no responder a la señal de apagado. #98525 (Alexey Milovidov).
  • Se corrigió una aserción de depuración en DDLWorker causada por un first_failed_task_name obsoleto después de que se eliminara una entrada de ZooKeeper durante la recuperación de reinicialización. #99099 (Antonio Andelic).
  • Se corrigió un caso de crash en Keeper. #99133 (JIaQi Tang).
  • Se corrigió un error en Keeper por el que una read request podía quedarse bloqueada (provocando un timeout de sesión) si otra sesión distinta y no relacionada en el mismo servidor se cerraba justo en el momento equivocado. #99484 (Michael Kolupaev).
  • Se corrigió un SEGFAULT en NuRaft debido a una race condition. #100444 (Pablo Marcos).
  • Se corrigió que KeeperMap CREATE TABLE fallara con “Cannot create metadata for table” cuando nodos residuales de ZooKeeper de un drop parcial anterior a 25.1 no tenían el nodo drop_lock_version. #101623 (Antonio Andelic).
  • Se corrigió la pérdida del registry de UDF cuando una sesión de ZooKeeper expiraba durante una actualización periódica: todas las user-defined functions podían dejar de estar disponibles hasta que una actualización completa se completara correctamente. #101891 (Nikita Fomichev).
  • Se corrigió un crash durante la actualización de UDF causado por que ZooKeeperRetriesControl reintentaba sobre una sesión de ZooKeeper obsoleta (expirada) sin renovarla. #102059 (Nikita Fomichev).

Correcciones de bloqueos y estabilidad

  • Se corrigió un fallo en las funciones del dialecto Kusto bin(), bin_at(), extract() e indexof() cuando se proporcionan argumentos vacíos. #95736 (NeedmeFordev).
  • Se corrigió un fallo/assert del servidor en mapContainsKey/mapContainsKeyLike con un skip index tokenbf_v1. #97826 (Shankar Iyer).
  • Se corrigió un fallo del servidor (std::terminate) causado por una excepción no capturada en el destructor del pool de conexiones HTTP cuando se alcanza el límite estricto del grupo de conexiones con alta concurrencia. #97850 (Antonio Andelic).
  • Se corrigió un acceso fuera de límites en ColumnConst::getExtremes que podía causar un fallo cuando extremes = 1 está habilitado. #98263 (Alexey Milovidov).
  • Se añadieron validaciones de datos corruptos durante la deserialización de DDSketch para evitar segfaults, excepciones, bucles infinitos y OOM al leer aggregate function states corruptos de quantilesDD. #98284 (Alexey Milovidov).
  • Se corrigió una excepción poco frecuente en el ejecutor del pipeline, que podía manifestarse como Received signal 6 (en builds de depuración), cuando la expansión del pipeline compite con la cancelación de la consulta. #98428 (Alexey Milovidov).
  • Se corrigió una desreferenciación de puntero nulo en dictGetOrDefault cuando el argumento de clave es Nullable. #98460 (Alexey Milovidov).
  • Se corrigió un interbloqueo del pipeline al usar sort_overflow_mode = 'break' junto con funciones de ventana. #98543 (Alexey Milovidov).
  • Se corrigió un fallo por desreferenciación de puntero nulo en tablas del sistema creadas entre la captura instantánea de las tablas en IDatabaseTablesIterator::table() y su modificación en otro hilo durante una iteración posterior. #98792 (Grant Holly).
  • Se corrigió la desviación en el seguimiento de memoria causada por asignaciones fallidas que no se revertían, el comportamiento no definido de nallocx(0) y un error de desfase de uno en el seguimiento del pico global. Se amplió el seguimiento para cubrir los búferes circulares de io_uring. #98915 (Antonio Andelic).
  • Se corrigió un fallo del servidor (std::terminate) al ejecutar ALTER TABLE ... DROP PART en una patch part después de un cambio de esquema (por ejemplo, ADD COLUMN). #99036 (Peng).
  • Se corrigió un fallo del servidor que podía ocurrir si se lanzaba una excepción por exceder el límite de memoria durante una lectura desde disco en caché. #99042 (Shankar Iyer).
  • Se corrigió un fallo provocado por una excepción de límite de memoria lanzada durante la aplicación de una patch part. #99086 (Anton Popov).
  • Se corrigió un fallo al usar una tabla Buffer con SAMPLE cuando el destino no lo admite. #99141 (Kseniia Sumarokova).
  • Se corrigió un error de heap-use-after-free cuando una tabla se elimina de forma concurrente mientras hay una consulta de lectura en ejecución. #99483 (Alexey Milovidov).
  • Se corrigió un heap-buffer-overflow en CompressionCodecT64 y un aborto del proceso en CompressionCodecMultiple al descomprimir datos comprimidos malformados. Ahora los códecs lanzan una excepción en lugar de bloquearse. #99680 (Rahul Nair).
  • Se corrigió un bucle infinito al leer archivos en formato Npy con dimensiones de shape negativas. #99812 (Desel72).
  • Se corrigió un global-buffer-overflow en la función CRC32 con argumentos FixedString cuando se evaluaba con cero filas durante el cálculo del header del query plan. #99835 (Alexey Milovidov).
  • Se corrigió un fallo de aserción en sipHash128Keyed (y funciones hash con clave similares) cuando el argumento de datos es un Map con claves de array u otros tipos de array anidados. #99921 (Alexey Milovidov).
  • Se corrigió un fallo de aserción al multiplicar estados de agregación NumericIndexedVector por una constante entera par, causado por self-XOR en bitmaps Roaring con alias en pointwiseAddInplace. #99976 (Desel72).
  • Se corrigió una desreferenciación de nullptr en el Parquet reader cuando la ruta filter-in-decoder encuentra páginas filtradas. #99677 (Alexey Milovidov).
  • Se corrigió un fallo del servidor local cuando CREATE DICTIONARY tiene una definición con un valor de lista que contiene una función inexistente. #100036 (Yakov Olkhovskiy).
  • Se corrigió un SIGSEGV al leer patch parts después de ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky).
  • Se corrigió un use-of-uninitialized-value en StringSearcher.h. #100225 (Konstantin Bogdanov).
  • Se corrigió un fallo del servidor (fallo de aserción) al usar funciones de agregación paramétricas con el combinador Array y argumentos NULL, como quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot).
  • Se corrigió un heap-buffer-overflow en sorted_buffer_gt::insert() de usearch que podía provocar un fallo o corromper la memoria silenciosamente durante la vector similarity search. #100537 (Dustin Healy).
  • Se corrigió un fallo del servidor (error lógico “Unexpected return type from __topKFilter”) cuando use_top_k_dynamic_filtering está habilitado y la columna ORDER BY es de tipo Dynamic o Variant. #100742 (Groene AI).
  • Se corrigió un fallo del servidor al usar la función has() con PREWHERE/WHERE sobre una clave Tuple que contiene elementos LowCardinality. #100760 (Groene AI).
  • Se corrigió un segfault por desreferenciación de puntero nulo al cargar diccionarios durante el apagado del servidor. #100839 (Miсhael Stetsyuk).
  • Se corrigió un desbordamiento de búfer en ULIDStringToDateTime cuando la entrada contiene bytes no ASCII. #100843 (Konstantin Bogdanov).
  • Se corrigió un fallo (LOGICAL_ERROR) al consultar una tabla Merge (o la table function merge()) que abarca varias tablas, incluida una tabla Distributed, con distributed_group_by_no_merge=1 habilitado. #100859 (Groene AI).
  • Se corrigió un fallo al construir un diccionario Polygon a partir de una tabla MergeTree que usa serialización de columnas dispersas. #100964 (Anton Popov).
  • Se corrigió un fallo (Logical error: isConst/isSparse/isReplicated assertTypeEquality) en los algoritmos de merge cuando la replicación diferida de columnas (enable_lazy_columns_replication) produce columnas ColumnReplicated que pasan a canalizaciones de merge-sort con entradas que llegan tarde. #101036 (Groene AI).
  • Se corrigió un fallo del servidor (SIGABRT) al usar funciones de agregación con el combinador interno Null (por ejemplo, sumNull, avgNull) y aggregate_functions_null_for_empty = 1. #101147 (Groene AI).
  • Se corrigió un use-after-free en la ruta de escritura de la caché del sistema de archivos que podía provocar lecturas de memoria ya liberada al registrar segmentos de archivo completados. #101161 (Groene AI).
  • Se corrigió un fallo del servidor con “Trying to attach external table to a ready set without explicit elements” cuando el análisis distribuido de índices encuentra un predicado GLOBAL IN cuyo Set se construyó sin elementos explícitos. #101178 (Groene AI).
  • Se corrigieron resultados incorrectos en las funciones de agregación MAX/MIN sobre columnas Decimal cuando la compilación JIT está habilitada. #101203 (Raúl Marín).
  • Se corrigió un fallo del servidor (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) al consultar una tabla MergeTree con ORDER BY CAST(lc_column, 'Type'), donde lc_column tiene un tipo LowCardinality. #101220 (Groene AI).
  • Se corrigió UB en mergeTreeAnalyzeIndexes() en caso de que el argumento de optimizaciones no sea válido. #101253 (Azat Khuzhin).
  • Se corrigió un fallo del servidor (Logical error: “Variant … is empty”) cuando una consulta lee simultáneamente una columna Tuple que contiene un tipo Map Dynamic y su subcolumna. #101448 (Groene AI).
  • Se corrigió un fallo LOGICAL_ERROR con el mensaje “Current component is empty” al consultar system.part_moves_between_shards con enforce_keeper_component_tracking habilitado. #101462 (Groene AI).
  • Se corrigió un fallo de segmentación en DataTypeDynamic::create() cuando el fuzzer genera un AST mal formado del tipo Dynamic. #101464 (Groene AI).
  • Se corrigió un fallo (LOGICAL_ERROR: “ColumnUnique can’t contain null values”) al comparar una columna LowCardinality con una constante NULL de Variant mientras use_variant_default_implementation_for_comparisons está deshabilitado. #101690 (Groene AI).
  • Se añadió una comprobación para streams vacíos en Bzip2ReadBuffer para que devuelva EOF en lugar de lanzar UNEXPECTED_END_OF_FILE cuando el stream interno está vacío. #101691 (ClickGap AI Bot).
  • Se corrigió un fallo por uso de memoria después de liberarla en el scheduler de arrendamiento de CPU cuando el temporizador de espera sobrevive al worker thread cuyos ProfileEvents::Counters referencia. #101761 (Antonio Andelic).
  • Se corrigió un uso fuera de ámbito en la deserialización en paralelo de rutas dinámicas del tipo Object, que podía provocar fallos al leer tablas con muchas rutas dinámicas. #101823 (Antonio Andelic).
  • Se corrigió un SIGSEGV en MergeTreeDataPartWriterWide::cancel cuando un constructor de stream lanza una excepción durante addStreams, lo que dejaba una entrada nula en column_streams. #101936 (Antonio Andelic).
  • Se corrigió un fallo de segmentación en mutations sobre materialized columns sin expresión. #102342 (zoomxi).
  • Se corrigió un segfault (o LOGICAL_ERROR en builds de depuración) al leer archivos Parquet con bloom filter push-down habilitado y condiciones de igualdad/desigualdad en la cláusula WHERE, causado por un acceso a memoria fuera de límites en el precargador de Parquet. #102385 (Groene AI).
  • Se corrigió una lectura fuera de límites en funciones de búsqueda de cadenas (countSubstrings, position, etc.) al buscar una subcadena compuesta íntegramente por bytes nulos. #102401 (Raúl Marín).
  • Se corrigió una lectura fuera de límites en printf con un % al final. #102472 (Raúl Marín).
  • Se corrigió un fallo por LOGICAL_ERROR “Unexpected number of rows in column subchunk” en el lector nativo de Parquet V3 al leer nullable columns con un filtro WHERE. #102628 (Groene AI).
  • Se corrigió un fallo del server (SIGSEGV) al leer archivos Avro con schemas recursivos que contenían referencias cíclicas a tipos simbólicos. Ahora estos schemas se detectan y rechazan con un mensaje de error claro. #102853 (Groene AI).
  • Se corrigió un fallo del server (aserción LOGICAL_ERROR) cuando una función sobre una columna Variant alcanza un memory limit u otra excepción no relacionada con la conversión de tipos durante el cast del resultado en FunctionVariantAdaptor. #102855 (Groene AI).
  • Se corrigió un fallo del server en builds de depuración/sanitizador cuando se lanza std::length_error durante schema inference. #102859 (Groene AI).
  • Se corrigió un fallo al usar una vista con una cláusula WHERE en la que la consulta interna produce columnas con tipos distintos de los metadatos de la vista (por ejemplo, Nullable a partir de un LEFT JOIN con join_use_nulls). #102085 (Miсhael Stetsyuk).

Otras correcciones de errores

  • Se corrigió un error por el que las configuraciones explícitas enviadas junto con compatibility en la misma solicitud podían ignorarse silenciosamente cuando su valor coincidía con el valor predeterminado del servidor. #97078 (Raufs Dunamalijevs).
  • Se corrigió un problema por el que el client informaba NETWORK_ERROR en lugar del parsing error real (con el número de fila correcto) cuando un INSERT con parsing en paralelo encontraba datos no válidos. #97339 (Alexey Milovidov).
  • Se corrigió un problema por el que DROP DATABASE con database_atomic_wait_for_drop_and_detach_synchronously podía quedar bloqueado indefinidamente cuando se terminaba la consulta. #97586 (Alexey Milovidov).
  • Se corrigió un problema por el que KILL QUERY no podía terminar consultas bloqueadas durante la generación de WITH FILL, la carga de Diccionarios mediante dictGet o ALTER DELETE con mutations_sync=1 en ReplicatedMergeTree. #97589 (Alexey Milovidov).
  • Se corrigió un error lógico en una consulta de política de enmascaramiento de datos con ON CLUSTER. #97594 (Bharat Nallan).
  • Se corrigió una poda de particiones incorrecta al usar DateTime64 anterior al epoch con la función toDate(). #97746 (Yarik Briukhovetskyi).
  • Se corrigió un LOGICAL_ERROR de Cannot schedule a file en INSERT sobre Distributed debido a una condición de carrera entre DROP e INSERT. #97822 (Azat Khuzhin).
  • Se corrigió un error lógico “Bad cast from type DB::ColumnConst to DB::ColumnArray” en kql_array_sort_asc/kql_array_sort_desc cuando se invocaban con argumentos de Array constantes. #98251 (Alexey Milovidov).
  • El servidor HTTP ahora devuelve un mensaje de error en el body de la respuesta para las respuestas 400 Bad Request causadas por headers malformados, en lugar de un body vacío. #98268 (Alexey Milovidov).
  • Se corrigieron resultados incorrectos con distributed index analysis (Experimental Feature) y la caché de condiciones de consulta. #98269 (Azat Khuzhin).
  • Se corrigió un problema por el que un dictionary source de MongoDB fallaba con named collections. #98528 (Pablo Marcos).
  • Ahora se impide eliminar una columna cuando sus subcolumns se usan en expresiones predeterminadas o alias de otras columnas, y se utiliza el analizador para las expresiones predeterminadas en ALTER DROP COLUMN. #98569 (Nikita Mikhaylov).
  • Todas las DB::Exception de PocoHTTPClient::makeRequestInternalImpl ahora se consideran no reintentables, incluida HTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda).
  • Se corrigieron dos errores en la compilación JIT de expresiones: un error de copiar y pegar en la verificación de tipos de nativeCast que hacía inalcanzables las ramas de conversión de entero a entero y de float a float, y un nullptr incorrecto de TargetMachine pasado a PassBuilder de LLVM. #98660 (Alexey Milovidov).
  • Se corrigió una excepción “Inconsistent KeyCondition behavior” en compilaciones de depuración cuando la clave primaria contiene valores NaN de punto flotante, haciendo que accurateLess y accurateEquals manejen NaN de forma coherente con el orden de clasificación de ClickHouse. #98964 (Alexey Milovidov).
  • Se corrigió windowFunnel con strict_deduplication, que devolvía un nivel incorrecto al encontrar un evento duplicado. #99003 (Yash).
  • Se hizo que las entradas de system.trace_log para las recargas automáticas de los diccionarios de ClickHouse tengan IDs de consulta no vacíos. #98784 (Miсhael Stetsyuk).
  • Se corrigió que SYSTEM START REPLICATED VIEW no activara la tarea de actualización. #98797 (Pablo Marcos).
  • Se corrigió que WITH FILL STALENESS produjera filas rellenadas adicionales cuando los datos se leen en varios fragmentos (por ejemplo, con un index_granularity pequeño). #98895 (Alexey Milovidov).
  • Se corrigió un fallo en la ofuscación de consultas para identificadores que comienzan con una letra mayúscula, como Ab. #101450 (Xuewei Wang).
  • Se corrigió que se ignorara TABLE_UUID_MISMATCH en la ruta de código sin analizador. #99380 (Azat Khuzhin).
  • Se corrigió que clickhouse format --obfuscate produjera SQL no válido al ofuscar tipos de skip index, nombres de códecs de compresión, nombres de motores de base de datos y definiciones de layout/source de diccionarios. #99260 (Raúl Marín).
  • Validar los cambios de configuración en las consultas CREATE cuando el propio engine también admite settings. #99279 (János Benjamin Antal).
  • Se corrigió que insert_deduplication_token se ignorara silenciosamente en consultas INSERT SELECT sin ORDER BY ALL. Ahora, proporcionar insert_deduplication_token es suficiente para habilitar la desduplicación independientemente de ORDER BY ALL. #99206 (Desel72).
  • Retrasar el procesamiento hasta que el servidor haya terminado de cargar todas las tablas. #99700 (Seva Potapov).
  • Se corrigió el análisis de comillas de estilo shell en los argumentos de la table function executable. #99794 (Nikita Semenov).
  • Se corrigió que las consultas de async insert reportaran written_rows, read_rows y result_rows en cero en query_log y en la salida del client. #99879 (Sema Checherinda).
  • Se corrigió que un INSERT con VALUES fallara cuando los datos iban seguidos de un comentario SQL final (-- o /* */) en la línea siguiente. Ahora el comentario se omite en lugar de interpretarse como otra fila. #100016 (Pratima Patel).
  • Se corrigió una excepción en arrayRemove al comparar Tuples con componentes NULL. #100017 (Alexey Milovidov).
  • Procesar correctamente los valores negativos dentro de NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik).
  • Se corrigió un problema por el que la table function primes no respetaba correctamente max_rows_to_read en algunos casos, especialmente cuando están presentes offset y step. #100199 (Nihal Z. Miaji).
  • Los usuarios ya no ven NATURAL CROSS JOIN al consultar el AST de una consulta con natural join que se reescribe como CROSS JOIN. #100223 (Peter Nguyen).
  • Se introdujeron algunos cambios menores en funciones: las funciones h3 ahora validan mejor los límites; readWKB comprueba los límites de tamaño (un nuevo ajuste, max_wkb_geometry_elements); y las funciones del generador aleatorio limitan el número máximo de iteraciones. #100270 (Alexey Milovidov).
  • Se corrigió un issue por el que cutURLParameter podía omitir parámetros incorrectamente cuando aparecían como subcadenas de otros parámetros. #100280 (Nikita Semenov).
  • Se corrigió una excepción LOGICAL_ERROR en estimateCompressionRatio cuando el parámetro block_size_bytes es extremadamente grande. #100298 (Alexey Milovidov).
  • Se corrigió un problema por el que DROP TABLE quedaba bloqueado indefinidamente en tablas con motor Kafka cuando los consumers se quedaban atascados en un rebalance tras un error de heartbeat. #100388 (Alexey Milovidov).
  • Se validan las dimensiones de la forma del formato Npy frente al tamaño del archivo y los límites de desbordamiento para evitar denegaciones de servicio mediante archivos .npy manipulados. También se rechazan las formas vacías y se limita la memoria por fila a 2 GiB. #100625 (Raúl Marín).
  • Se corrigió que session_timezone se ignorara al analizar valores DateTime durante async inserts (TCP) y en todas las inserciones por HTTP. #100647 (Sema Checherinda).
  • Se hizo StorageRabbitMQ::shutdown idempotente y se añadieron comprobaciones defensivas de null, ya que ahora se llama dos veces (en StreamingStorageRegistry y DatabaseCatalog). #100455 (Miсhael Stetsyuk).
  • Se corrigió una excepción LOGICAL_ERROR al usar accurateCastOrNull con el tipo de destino QBit. #100470 (Raufs Dunamalijevs).
  • Se corrigió que la sintaxis LIMIT m OFFSET n WITH TIES no funcionara (equivalente a LIMIT n, m WITH TIES, que ya funcionaba). #100491 (Nihal Z. Miaji).
  • Se corrigió un segfault en el que SerializationInfoTuple::add hacía un assert_cast sobre una referencia simple de SerializationInfo al fusionar partes después de que ALTER MODIFY COLUMN cambiara una columna de un tipo no Tuple a Tuple. #100509 (Miсhael Stetsyuk).
  • Se corrigió una excepción “No set is registered for key” al usar IN con columnas Nullable(Tuple) que tienen campos con nombre y elementos LowCardinality. #100523 (Alexey Milovidov).
  • Se corrigió que EXECUTE AS ignorara las cláusulas FORMAT e INTO OUTFILE especificadas en la consulta. #100538 (pufit).
  • Se corrigió el formato inconsistente del AST para SAMPLE con un OFFSET a nivel de consulta. #100579 (Pavel Kruglov).
  • Se corrigieron los errores “La tabla de destino no existe” en las vistas materializadas con tablas internas durante el inicio asíncrono, causados por un orden incorrecto en las dependencias de inicio. #100946 (Nikolay Degterinsky).
  • Se corrigió una excepción en optimizeLazyMaterialization cuando se usa una proyección con PREWHERE junto con ORDER BY ... LIMIT. #101115 (Anton Popov).
  • Se corrigió un mensaje de error incorrecto al llamar a intExp10 con un argumento NaN: decía intExp2 en lugar de intExp10. #101582 (Krishna Chaitanya).
  • Se corrigió que allow_statistics=0 no bloqueara ALTER TABLE ADD STATISTICS ni ALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya).
  • Se corrigió que CREATE TABLE ... AS merge() ignorara la lista explícita de columnas y, en su lugar, infiriera automáticamente las columnas a partir de las tablas de origen, lo que provocaba errores NOT_FOUND_COLUMN_IN_BLOCK cuando merge_table_max_tables_to_look_for_schema_inference era lo bastante bajo y las tablas de origen tenían esquemas distintos. #101663 (Miсhael Stetsyuk).
  • Se corrigió que la creación de un diccionario RANGE_HASHED aceptara silenciosamente un atributo de rango MAX inexistente y usara una configuración de tipos incorrecta cuando los atributos de rango mínimo y máximo tenían tipos diferentes. #101732 (Yakov Olkhovskiy).
  • Se corrigieron errores en las funciones arrayLevenshteinDistanceWeighted y arraySimilarity. #101767 (Mikhail f. Shiryaev).
  • Se corrigió que la API de consultas de Prometheus ignorara los cuerpos de formulario de las solicitudes POST. #101794 (James Cunningham).
  • Se corrigió un falso negativo de shouldPatchFunction en SYSTEM INSTRUMENT ADD cuando la cadena de búsqueda aparece por primera vez dentro de un argumento de plantilla del nombre de símbolo desmangleado. #101885 (Pablo Marcos).
  • Se corrigió la descripción de system.codecs para AES_256_GCM_SIV para que mostrara AES-256 en lugar de AES-128. #101917 (Jimmy Aguilar Mena).
  • Se corrigió un comportamiento indefinido al analizar paquetes de consulta del protocolo nativo con valores QueryProcessingStage no válidos. #101972 (Raúl Marín).
  • Se cerró la conexión TCP cuando se produce una excepción durante el análisis inicial de la consulta, para evitar leer datos basura de un flujo desincronizado. #101989 (Raúl Marín).
  • Se corrigieron los casos en los que Time con valores negativos devolvía un resultado incorrecto al compararse con DateTime. #102056 (Yarik Briukhovetskyi).
  • Se corrigieron los espacios que faltaban al dar formato a unlock snapshot. #102063 (Han Fei).
  • No se podían inicializar, en una réplica nueva, las tablas Alias sin una tabla de destino en Database Replicated. #102397 (Nikolay Degterinsky).
  • Los INSERT simples sin vistas materializadas ya no solicitan un número excesivo de slots y threads de ConcurrencyControl (max_threads en lugar de max_insert_threads), lo que evita el agotamiento de slots de CC y el aumento descontrolado del número de threads en clusters con alto throughput de INSERT. #102961 (Sema Checherinda).
  • Se reintrodujo ArrowMemoryPool para poder lanzar MEMORY_LIMIT_EXCEEDED y evitar el OOM del kernel. #102999 (Azat Khuzhin).
  • Se corrigió un tipo de argumento incorrecto que se mostraba en los mensajes de error de las funciones de búsqueda de cadenas (p. ej., locate, position) cuando los argumentos se pasan en orden invertido (locate(needle, haystack) con function_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov).
  • Se corrigió el bloqueo indefinido de waitForPause cuando se llama a disableFailPoint sin que haya ningún thread pausado en el failpoint. #103119 (Shaohua Wang).
Last modified on June 29, 2026