Skip to main content

Cambios incompatibles con versiones anteriores

Cambios en las consultas y la sintaxis

  • Las funciones de ventana RANK y DENSE_RANK ahora rechazan argumentos y lanzan NUMBER_OF_ARGUMENTS_DOESNT_MATCH, conforme al SQL standard. Anteriormente, consultas como RANK(x) OVER (ORDER BY id) se aceptaban sin más, ignorando el argumento, lo que solía generar confusión entre los usuarios. Para restaurar el comportamiento permisivo anterior, establezca allow_rank_dense_rank_arguments = 1. #104324 (groeneai).

Cambios en los tipos de datos

  • icebergHash y icebergBucket ahora rechazan los argumentos Int128, UInt128, Int256, UInt256 y Decimal256 con un error explícito. Anteriormente, truncaban silenciosamente los valores de mayor tamaño y generaban hash con colisiones. La especificación de Iceberg solo define el cálculo de hash para enteros de 32/64 bits y decimales con una precisión de hasta 38; convierta a Int64 o Decimal128 para mantener el comportamiento anterior en los valores que quepan. #105866 (Algunenano).
  • toUUID, toUUIDOrNull, toUUIDOrZero, toUUIDOrDefault, CAST a UUID y Nullable(UUID), accurateCastOrNull a UUID y los formatos de entrada que parsean un UUID a partir de texto (Avro, MsgPack, JSONExtract, …) ahora rechazan las cadenas que tienen la longitud correcta pero contienen caracteres no hexadecimales. Anteriormente, esas entradas se convertían silenciosamente en un UUID inventado al leer más allá del final de la tabla de lookup de dígitos hexadecimales. Ahora toUUID lanza CANNOT_PARSE_UUID y las variantes Or* devuelven NULL, el UUID con valor cero o el valor predeterminado suministrado. #104370 (groeneai).
  • Los tipos Dynamic y Variant ahora se validan en la clause PARTITION BY de la ventana; antes esto no se comprobaba cuando allow_suspicious_types_in_group_by está disabled. Las consultas que particionan una ventana sobre una columna Dynamic o Variant ahora lanzan un error a menos que allow_suspicious_types_in_group_by = 1. #105450 (Avogar).

Cambios en el almacenamiento y los índices

  • Se rechazan valores Dynamic/Variant anidados en agregaciones min/max e índices minmax. Anteriormente, solo se comprobaban valores Dynamic/Variant de nivel superior. #105468 (Avogar).
  • El valor predeterminado del SETTING del servidor insert_deduplication_version cambia de compatible_double_hashes a new_unified_hash. La deduplicación de inserciones ahora funciona sobre todo el bloque insertado (por inserción), en lugar de por parte/partición: un reintento de la misma inserción se sigue deduplicando, pero dos inserciones distintas que generan una parte idéntica ya no se deduplican entre sí, y las inserciones reordenadas de las mismas filas ya no se deduplican. Establezca insert_deduplication_version = compatible_double_hashes para restaurar el comportamiento anterior. La deduplicación de inserciones asíncronas también se rige por la ventana síncrona con new_unified_hash: tanto su habilitación (replicated_deduplication_window) como su retención (replicated_deduplication_window_seconds, 1 hora de forma predeterminada) siguen los SETTINGs síncronos, por lo que *_for_async_inserts es una configuración heredada y solo se aplica a old_separate_hashes / compatible_double_hashes. Las instancias que actualicen directamente desde una versión cuyo valor predeterminado era old_separate_hashes deben ejecutarse primero con compatible_double_hashes hasta que haya transcurrido la ventana de deduplicación relevante más larga (incluida replicated_deduplication_window_for_async_inserts, cuyo valor predeterminado es una semana, si se usan inserciones asíncronas) antes de usar new_unified_hash. Las cargas de trabajo asíncronas que cambien desde compatible_double_hashes deben primero aumentar replicated_deduplication_window[_seconds] hasta la ventana asíncrona (y ejecutarse durante una ventana asíncrona completa), detener las inserciones asíncronas o mantenerse en compatible_double_hashes, porque new_unified_hash ya no comprueba los ID de async_blocks de mayor duración. #107886 (CheSema).
  • Se corrige el problema por el que hasToken con un needle que contiene un separador devolvía resultados silenciosamente mediante un índice de texto, en lugar de generar BAD_ARGUMENTS. #108189 (Ergus).

Funciones eliminadas

  • Ya no es posible usar el Parquet reader ni el writer basados en Arrow, ahora obsoletos. En su lugar siempre se utiliza la implementación native. Los SETTINGS que seleccionaban o ajustaban las implementaciones antiguas ahora son obsoletos y se ignoran: input_format_parquet_use_native_reader_v3, output_format_parquet_use_custom_encoder, output_format_parquet_version, output_format_parquet_compliant_nested_types y output_format_parquet_unsupported_types_as_binary. El Native writer siempre escribe Parquet V2.6+ con tipos anidados compatibles, y genera UNKNOWN_TYPE para los tipos no compatibles en lugar de escribirlos como raw binary. #100949 (alexey-milovidov).
  • Se eliminó el SETTING obsoleto allow_experimental_query_deduplication y el comportamiento experimental no compatible de deduplicación de consultas asociado. #99398 (devcrafter).
  • ALTER TABLE ... REPLACE PARTITION ... FROM ... ya no elimina silenciosamente los datos de la partición de destino cuando la tabla de origen no tiene partes en la partición solicitada. Anteriormente, dicha solicitud eliminaba la partición de destino sin escribir nada en su lugar. Ahora se rechaza con BAD_ARGUMENTS de forma predeterminada. Este es un cambio incompatible con versiones anteriores: un REPLACE PARTITION desde un origen vacío que antes se ejecutaba correctamente (borrando el destino) ahora generará un error tras la actualización. Para restaurar el comportamiento anterior de borrado silencioso, establezca el nuevo SETTING allow_replace_partition_from_empty_source = 1 (por consulta o en el perfil), o establezca compatibility en 26.5 o una versión anterior. Para eliminar explícitamente los datos de destino, use ALTER TABLE ... DROP PARTITION .... #104939 (groeneai).
  • Se eliminaron las funciones experimentales de KQL (Kusto) array_sort_asc y array_sort_desc, así como sus implementaciones SQL, kql_array_sort_asc y kql_array_sort_desc. Estas funciones eran experimentales, tenían una implementación de baja calidad y provocaban errores de corrección y del analizador sintáctico. Las consultas que usan estos nombres ahora devuelven UNKNOWN_FUNCTION. #108101 (groeneai).

Nuevas características

Funciones

  • Se añadió compatibilidad con la función de PromQL histogram_quantile en las funciones de tabla prometheusQuery y prometheusQueryRange. Esto permite calcular cuantiles a partir de los buckets de histogramas clásicos de Prometheus identificados por la etiqueta le. #103477 (Yasumoto).
  • Se añadió la función h3PolygonToCellsWithContainment, que admite modos de contención centrada, de contención completa y de solapamiento. #104455 (yousefQadry).
  • Ahora se puede especificar un argumento de precisión opcional para las funciones formatReadableSize, formatReadableDecimalSize y formatReadableQuantity, que controla el número de dígitos después del punto decimal. El valor predeterminado es 2, lo que mantiene el comportamiento previo. #104648 (antoniofilipovic).
  • Se añadieron los alias de agregación min_by y max_by para argMin y argMax. #105712 (itsjoeoui).

Funcionalidades de SQL y consultas

  • formatReadableTimeDelta ahora acepta como entrada expresiones INTERVAL de tipos distintos de Month y Year. #64315 (Beetelbrox).
  • Se añadió compatibilidad con el formato de salida PNG, lo que permite renderizar directamente los resultados de las consultas como imágenes PNG. #74691 (m7kss1).
  • Se introdujo una función de reserva de memoria para cargas de trabajo. Consulte la documentación sobre planificación de cargas de trabajo. #82414 (serxa).
  • Se añadieron las opciones IPV4_PREFIX_BITS e IPV6_PREFIX_BITS para cuotas identificadas mediante IP_ADDRESS o FORWARDED_IP_ADDRESS, lo que permite compartir los límites de cuota por subred IP en lugar de aplicarlos por separado a cada dirección IP completa. #89270 (adityachopra29).
  • Se implementó ADD ENUM VALUES en consultas ALTER TABLE para simplificar la adición de nuevos valores a un tipo Enum existente sin necesidad de volver a especificar todos los valores Enum actuales. #93830 (ilejn).
  • Se añadió el formato de entrada GeoJSON para lectura. #98124 (mneedham).
  • Se añadió un posprocesador al índice de texto que transforma los tokens tras la tokenización. #98939 (Ergus).
  • Se añadió compatibilidad opcional con nodos TTL en ClickHouse Keeper. Los nodos TTL caducan automáticamente al finalizar su tiempo de vida configurado y no pueden tener nodos secundarios. #100397 (scanhex12).
  • Se añadió almacenamiento de posiciones de tokens para índices de texto, con el fin de admitir búsquedas exactas con hasPhrase. Habilite el argumento de índice support_phrase_search y la configuración de MergeTree allow_experimental_text_index_phrase_search. #103172 (ahmadov).
  • Se añadieron las funciones arrayTopK y arrayBottomK: - arrayTopK(k, array) devuelve los K elementos más grandes en orden descendente - arrayBottomK(k, array) devuelve los K elementos más pequeños en orden ascendente. #104563 (vitlibar).
  • Se añadió compatibilidad para seleccionar columnas mediante patrones de nombre con * LIKE '<pattern>' y * ILIKE '<pattern>', incluidas formas calificadas como table.* LIKE '<pattern>' y table.* ILIKE '<pattern>'. LIKE busca coincidencias en los nombres de columna distinguiendo entre mayúsculas y minúsculas; ILIKE, sin distinguirlas. #104569 (niyue).
  • Se añadieron consultas continuas para tablas MergeTree mediante una secuencia de lecturas de instantáneas. #105114 (Michicosun).
  • Se añadió el formato RowBinaryWithNamesAndTypesAndDefaults para mejorar la compatibilidad con la evolución del esquema. #105736 (mzitnik).
  • Se añadieron funciones para servir Mapbox Vector Tiles directamente desde SQL: MVTEncodeGeom proyecta una geometría en el espacio de píxeles de una tesela de mapa Slippy y la recorta; MVTEncode agrega las geometrías proyectadas de un grupo en los bytes binarios de una tesela de una sola capa; y MVTBoundingBox / MVTBoundingBoxMercator devuelven el cuadro delimitador de una tesela para limitar las filas a esta. Se admiten geometrías de puntos, líneas y polígonos. También están disponibles con los alias de PostGIS ST_AsMVTGeom y ST_AsMVT. #106107 (saarthak2002).
  • Se añadieron LOCALTIME y LOCALTIMESTAMP (sintaxis estándar de SQL/PostgreSQL). LOCALTIMESTAMP es un alias de now() (devuelve DateTime); LOCALTIME devuelve la hora actual como un valor Time. #106139 (thomas-cabral).
  • Se añadieron dos nuevas estrategias de load_balancing, hostname_longest_common_prefix y hostname_longest_common_suffix, que prefieren la réplica cuyo hostname comparte con el hostname del iniciador el prefijo común más largo (o, respectivamente, el sufijo). Son útiles cuando el centro de datos se codifica como prefijo o sufijo de hostnames cuyos segmentos numéricos tienen longitud variable, situaciones en las que las estrategias existentes nearest_hostname y hostname_levenshtein_distance seleccionan la réplica equivocada. #107360 (den-crane).
  • Nuevas funciones quantizeBFloat16ToInt8 y dequantizeInt8ToBFloat16: un códec escalar que comprime los componentes de embedding a 8 bits mediante un cuantificador gaussiano Lloyd-Max de 256 niveles, del que se pueden extraer códigos Int4/Int2/binarios mediante truncamiento de bits. #108102 (alexey-milovidov).

Motores de tabla y almacenamiento

  • Se añadió compatibilidad con la escritura en Azure Data Lake Storage Gen2. #105406 (scanhex12).

Configuración y ajustes

  • Se añadió el SETTING output_format_always_write_decimal_point_in_float_and_decimal para imprimir siempre el punto decimal en los números de coma flotante y Decimal en formatos de texto, incluso cuando el valor es un número entero. Por ejemplo, muestra 1. en lugar de 1. Está deshabilitado de forma predeterminada. #62614 (qoega).
  • Se añadió un nuevo SETTING inmutable de MergeTree, allow_tuple_element_aggregation, deshabilitado de forma predeterminada. Cuando está habilitado, SummingMergeTree, AggregatingMergeTree y CoalescingMergeTree aplanan recursivamente las columnas Tuple y agregan cada elemento hoja de forma independiente durante las fusiones, como si fuera una columna de nivel superior: SummingMergeTree lo suma, AggregatingMergeTree fusiona su estado de función de agregación y CoalescingMergeTree conserva su último valor no NULL. El SETTING debe especificarse al crear la tabla y los motores que no lo admiten lo ignoran silenciosamente. #98039 (JingYanchao).
  • Se añadió el SETTING output_format_float_precision para controlar el número de dígitos decimales en la salida de texto de números de coma flotante. #99721 (phulv94).
  • Se añadieron los SETTINGs de tabla de MergeTree materialize_projections_on_insert y materialize_projections_on_merge. Cuando materialize_projections_on_insert = 0, los INSERT omiten la creación de partes de proyección, lo que mejora el rendimiento de inserción en tablas con muchas proyecciones. Cuando materialize_projections_on_merge = 1, una fusión reconstruye una proyección que falta en todas sus partes de origen, por lo que las proyecciones pueden crearse durante las fusiones en lugar de durante la inserción. Las fusiones siguen combinando únicamente partes que comparten el mismo conjunto de proyecciones. #100993 (cwurm).
  • Se añadió un nuevo SETTING de S3Queue, after_processing_move_preserve_path. Cuando se habilita junto con after_processing='move' y after_processing_move_prefix, los objetos procesados se mueven conservando toda su ruta de origen bajo el prefijo de destino, en lugar de aplanarse para conservar solo el nombre de archivo. #105354 (asya-ch).
  • Se añadieron los elementos de configuración del controlador HTTP url_prefix y full_url_prefix para hacer coincidir todas las rutas con un prefijo determinado, así como los elementos explícitos url_regexp, full_url_regexp y headers_regexp. La sintaxis heredada <url>regex:...</url> sigue siendo compatible. #107492 (vitlibar).

Autenticación

  • Se añadió una credencial external_id opcional para el acceso a S3 basado en roles. #106941 (eliangidoni).
  • Se añadió a la tabla system.session_log información sobre el certificado TLS del cliente (subjects, número de serie, issuer y período de validez) para mejorar la observabilidad de la autenticación basada en certificados. #107679 (alexey-milovidov).

Tablas del sistema

  • Se añadió la tabla system.iceberg_files, que expone metadatos por archivo de las tablas Iceberg, con una fila por cada archivo de datos o de borrado en el snapshot actual de cada tabla. #104415 (asya-ch).
  • Se añadieron índices de omisión hipotéticos (de tipo «qué pasaría si»). Use CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ... para definir un índice de omisión virtual con ámbito de sesión y, a continuación, EXPLAIN WHATIF SELECT ... para estimar su ratio de omisión y coste sin materializarlo. Los índices definidos son visibles en la nueva tabla system.hypothetical_indexes. #104608 (yariks5s).
  • Se añadió la tabla del sistema system.constraints, que proporciona información sobre todas las restricciones CHECK y ASSUME de todas las tablas, incluidos el nombre, el tipo y la expresión de cada restricción. #105337 (PedroTadim).
  • Se añadió una nueva tabla del sistema, system.documentation, que recopila en una sola tabla la documentación de referencia integrada de los componentes uniformes del sistema (funciones, motores de tabla, tipos de datos, configuraciones, formatos y otros), con la documentación renderizada en Markdown. #107463 (alexey-milovidov).

Funcionalidades experimentales

  • Se añadió el algoritmo experimental de reordenación de JOIN dphyp para INNER JOIN como opción del SETTING query_plan_optimize_join_order_algorithm, así como el SETTING query_plan_optimize_join_order_max_searched_plans, que limita la búsqueda del orden de los JOIN y recurre al siguiente algoritmo de la cadena cuando se supera dicho límite; establézcala en 0 para mantener el comportamiento anterior de búsqueda ilimitada. #98798 (davenger).
  • Se añadió el modo de aplicación diferida de listas de postings para el índice de texto. Cuando se habilita mediante SET allow_experimental_text_index_lazy_apply = 1 y SET text_index_posting_list_apply_mode = 'lazy', las listas de postings se decodifican bajo demanda con granularidad de bloques empaquetados mediante un enfoque basado en cursores, en lugar de materializarse por completo en mapas de bits Roaring, lo que reduce el uso de memoria y el tiempo de CPU en consultas selectivas sobre índices de texto. #100035 (fastio).
  • Se permite adjuntar controladores prometheus al puerto HTTP principal con un prefijo opcional. #104975 (JTCunning).
  • Se añadió un SETTING experimental de MergeTree, packed_skip_index_max_bytes, que agrupa substreams pequeños de índices de omisión en un único archivo skp_idx.packed por parte, lo que reduce la presión sobre los inodos cuando se definen muchos índices de omisión en una tabla. La decisión se toma por substream en el momento de la escritura: los substreams cuyo tamaño serializado se mantiene por debajo del umbral se incluyen en el archivo; los de mayor tamaño conservan la disposición independiente skp_idx_<name>.idx2 / .mrk2. Una misma parte puede combinar ambas disposiciones. Los índices de texto completo no son compatibles y siempre se almacenan en archivos individuales. El valor predeterminado es 0 (empaquetado deshabilitado). #105321 (Algunenano).
  • Se admite la serialización Buffers para UDF de WebAssembly mediante ABI BUFFERED_V1, y se añade webassembly_udf_enable_fuel como SETTING persistente de funciones UDF de WASM. #105574 (antonio2368).
  • Ejecución de consultas distribuidas en varias etapas: el planificador divide el plan de consulta en etapas conectadas mediante intercambios de dispersión / difusión / recopilación / reorganización, y envía los fragmentos del plan a los nodos worker. Los datos entre etapas se transmiten mediante TCP o se transfieren mediante archivos temporales en almacenamiento de objetos compartido; la ruta admite reorganización distribuida, hash joins de difusión, agregación mediante reorganización y ordenación distribuida. La funcionalidad es experimental y está deshabilitada de forma predeterminada. #106020 (davenger).
  • El motor experimental de planes de consultas distribuidas (make_distributed_plan) ahora puede usar un puerto distinto para el envío de tareas y el intercambio de streaming por worker, configurado por réplica en <remote_servers> mediante stateless_worker_port y streaming_exchange_port. Si no se configuran, se utilizan los puertos anteriores a nivel de servidor (stateless_worker_client.port y distributed_query.streaming_exchange_port). Esto permite ejecutar varios workers en un mismo host. #107885 (davenger).

Mejoras del rendimiento

Rendimiento de JOIN

  • Implementa la aplicación diferida de índices de selector y de replicación cuando un JOIN va seguido de un LIMIT selectivo, TopN u otro JOIN. Para controlar el número de columnas de payload necesario para habilitar los índices de selector diferidos, utiliza el SETTING query_plan_min_columns_for_join_lazy_indexing (0 significa que la optimización está deshabilitada). Para controlar el LIMIT al que se aplica la optimización, utiliza el SETTING query_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi).
  • Permite que ASOF JOIN use el algoritmo de join parallel_hash, paralelizando la compilación entre valores distintos de las claves de igualdad. Anteriormente, ASOF se excluía incondicionalmente de parallel_hash. #105375 (gregakinman).
  • Comparte el FixedHashMap del hash join como filtro en tiempo de ejecución de JOIN en el lado de sondeo. Cuando la tabla hash del lado de compilación es (o puede convertirse en) un FixedHashMap, se publica como filtro en tiempo de ejecución y sustituye el Set/BloomFilter que, de otro modo, instalaría BuildRuntimeFilterStep. Esta función se controla mediante el nuevo SETTING enable_join_runtime_filter_shared_fixed_hash_table (valor predeterminado: true). #105640 (wudidapaopao).
  • La reordenación de JOIN mediante DP ahora se permite con réplicas paralelas. #105889 (nickitat).
  • Se mejora el plan de consulta cuando JOIN usa filtros en tiempo de ejecución (enable_join_runtime_filters habilitado de forma predeterminada): el modelo de costes de reordenación de joins ahora puede atravesar WindowTransform (y otros pasos del plan que preservan las filas) en el subárbol derecho y utiliza el recuento de filas subyacente y el NDV por columna en lugar de asumir que no hay estadísticas. #107229 (UnamedRus).

Optimización de consultas

  • Se mejoró el rendimiento del análisis de índices de texto en búsquedas con varios tokens al optimizar el manejo de tokens poco frecuentes. #98226 (CurtizJ).
  • Se mejoró el rendimiento de las funciones encrypt, decrypt y halfMD5 al evitar búsquedas implícitas del proveedor de OpenSSL por cada fila en OpenSSL 3.x. #99105 (thevar1able).
  • Se compactan los bloques de origen antes de projection.calculate() durante MATERIALIZE PROJECTION para reducir el número de partes temporales de proyección y la sobrecarga de fusión. Aceleración de ~3,4 veces en una tabla de 50 millones de filas. #100047 (amosbird).
  • Los usuarios ahora se benefician de un mayor rendimiento de los filtros de tiempo de ejecución aproximados y los índices de filtro Bloom. #100201 (cv4g).
  • Se aceleran las consultas ORDER BY ... LIMIT BY ejecutando LIMIT BY dentro de cada flujo ordenado en paralelo durante Sort cuando las columnas de LIMIT BY son un prefijo de las de ORDER BY. Esto reduce el número de filas que pasan por la fusión de ordenación final y por cualquier paso posterior de la canalización. Esta optimización se controla mediante la nueva configuración query_plan_push_limit_by_into_sort (habilitada de forma predeterminada). #104000 (nihalzp).
  • Se reduce la sobrecarga por consulta en consultas SELECT sencillas (análisis sintáctico, análisis y planificación). Por ejemplo, SELECT count() FROM hits desde una única conexión es aproximadamente un 50 % más rápido. #104513 (Algunenano).
  • Se mejoró el rendimiento de bitmapContains para estados groupBitmap distintos de UInt64 al evitar llamadas repetidas a rb_max durante las comprobaciones de rango. #105960 (niyue).
  • Se mejoró el rendimiento de inserción para columnas LowCardinality con índices bloom_filter. #106410 (EmeraldShift).
  • Se mejoró el rendimiento de las funciones L2DistanceTransposed y cosineDistanceTransposed para el tipo de datos QBit. #106701 (rienath).
  • Se mejoró el rendimiento del análisis de consultas sobre tablas con muchas columnas al evitar calcular hashes de nodos de columna —que incluyen toda la expresión de la tabla de origen— cuando no es necesario. El análisis de subconsultas SELECT * anidadas sobre una tabla con ~1200 columnas ahora es unas 50 veces más rápido. #106957 (novikd).
  • Se mejoró el rendimiento de las funciones encrypt, decrypt, tryDecrypt, aes_encrypt_mysql y aes_decrypt_mysql hasta en un orden de magnitud, recuperando el rendimiento perdido durante la migración de BoringSSL a OpenSSL 3.x (24.4). #107339 (thevar1able).
  • Se mejoró la ejecución de arrayElement en Array(LowCardinality(String)) y de las funciones LIKE para mapas con claves o valores LowCardinality(String) al evitar la materialización innecesaria de cadenas. #107450 (EmeraldShift).
  • Se redujo el uso de CPU y se mejoró el rendimiento de evaluación de índices de omisión en consultas que filtran columnas DateTime64. #107707 (shankar-iyer).
  • Se mejoró el rendimiento de las búsquedas de subcadenas que no distinguen entre mayúsculas y minúsculas, incluidas positionCaseInsensitiveUTF8, ILIKE y multiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano).
  • Se corrigió una regresión de rendimiento de aproximadamente un 16 % en el rendimiento del códec de coma flotante FPC en ARM, introducida cuando sus tablas de predictores empezaron a usar VectorWithMemoryTracking. #108182 (groeneai).
  • Se corrigió una regresión de rendimiento por la que una sola eliminación ligera DELETE deshabilitaba la caché de condiciones de consulta de toda la tabla. Las consultas selectivas repetidas sobre una tabla que hubiera sido modificada mediante una eliminación ligera dejaban de descartar gránulos y pasaban a leer todas las marcas. #112947 (fm4v).
  • Se limitó el coste de estimar la selectividad de col IN (...) a partir de las estadísticas de columnas, que podía añadir cientos de milisegundos a la planificación de una sola consulta. El estimador ya no ejecuta la subconsulta de col IN (subquery) para rellenar un conjunto del que solo necesita un valor de selectividad; en su lugar, omite los conjuntos no construidos. Para conjuntos con un tamaño superior al del nuevo ajuste statistics_max_set_size_for_exact_selectivity_estimation (10000 de forma predeterminada), la selectividad se deriva ahora del tamaño del conjunto y de los límites de su rango. #114389 (nickitat).

Rendimiento de funciones y agregaciones

  • Optimiza el análisis del índice de clave primaria para claves primarias largas y de alta cardinalidad. En el caso de una clave primaria larga, el tiempo de ejecución del análisis de índices depende ahora principalmente de la complejidad del filtro de la consulta —las columnas de clave que utiliza realmente—, y no de la longitud de la clave primaria. Por tanto, ampliar la clave de ordenación supone una sobrecarga adicional insignificante para el análisis de índices de consultas que filtran solo unas pocas de sus columnas. Para una clave primaria de alta cardinalidad, en la que ClickHouse conserva en memoria únicamente un prefijo selectivo de las columnas de clave y no carga las columnas finales, el análisis de índices ahora trabaja solo con ese prefijo en memoria en lugar de con toda la clave. La optimización está habilitada de forma predeterminada y se puede desactivar con el nuevo SETTING use_lightweight_primary_key_index_analysis. #91836 (nihalzp).
  • Reduce el uso máximo de memoria al fusionar resultados parciales de agregación de dos niveles con estados de agregación grandes (p. ej., groupArray), liberando de forma incremental los estados de origen de cada bucket durante la fusión, en lugar de mantenerlos todos activos hasta que finalice. #102330 (yurifedoseev).
  • Nueva optimización de GROUP BY para claves de alta cardinalidad distribuidas uniformemente, que distribuye las filas entre los hilos mediante el hash de la clave de agrupación, de modo que cada hilo agrega un subconjunto disjunto de claves sin necesidad de una fase de fusión. Establezca enable_sharding_aggregator = 1 para habilitarla. #104233 (nihalzp).
  • Acelera las consultas LIMIT BY en tablas MergeTree particionadas ejecutando LIMIT BY en paralelo dentro del flujo de cada partición, en lugar de fusionar todos los flujos en uno antes de aplicar el límite. Esto se aplica cuando la expresión de partición es una función determinista de las columnas de LIMIT BY, de modo que ningún grupo de LIMIT BY puede abarcar dos particiones. Se controla mediante el nuevo SETTING allow_limit_by_partitions_independently (habilitado de forma predeterminada). #105126 (nihalzp).
  • Acelera las consultas SELECT ... LIMIT N BY <cols> cuando <cols> son un prefijo de la clave de ordenación de la tabla, o pasan a serlo después de que WHERE col = const fije las columnas iniciales. Con esta opción habilitada, MergeTree lee los datos en orden de clave primaria y LIMIT BY primero filtra en modo de flujo, con memoria O(1) por flujo ordenado, descartando la mayor parte de los datos; a continuación, ejecuta el LIMIT BY normal sobre los datos reducidos para obtener el resultado final. Se controla mediante el nuevo SETTING optimize_limit_by_in_order (habilitado de forma predeterminada). #105135 (nihalzp).
  • Acelera las consultas LIMIT BY eliminando expresiones de clave redundantes: se descarta una clave que es una función determinista de las demás claves (p. ej., LIMIT 5 BY x, f(x) pasa a ser LIMIT 5 BY x) y una función inyectiva de una clave se sustituye por su argumento (p. ej., LIMIT 5 BY toString(x) pasa a ser LIMIT 5 BY x). Esto permite evaluar menos expresiones y de menor coste por fila. Se controla mediante los nuevos SETTINGs optimize_limit_by_function_keys y optimize_injective_functions_in_limit_by, ambas habilitadas de forma predeterminada. #106818 (nihalzp).
  • Acelera el análisis de consultas con muchas llamadas a funciones o llamadas profundamente anidadas eliminando un hash redundante del árbol de consultas de la caché de resolución de funciones. #107516 (novikd).
  • Paraleliza el procesamiento del resultado de una CTE recursiva: una operación GROUP BY u otra operación sobre un resultado grande de WITH RECURSIVE ya no está limitada a un único hilo. #107694 (alexey-milovidov).

Rendimiento de almacenamiento y E/S

  • Los clientes de S3 con el mismo endpoint y bucket comparten una caché, lo que evita detectar regiones duplicadamente. #96802 (zvonand).
  • Se mejoró el rendimiento de copia en el almacenamiento de objetos al copiar blobs en paralelo. #105089 (asya-ch).
  • Se evita leer el contenido de los archivos al usar el formato de entrada One con funciones de tabla de tipo archivo, como file y s3. #105157 (niyue).
  • La clave primaria de MergeTree y los índices de omisión ahora pueden descartar gránulos en filtros donde ifNull o coalesce envuelven una condición, como ifNull(key = 0, 0) o coalesce(key = 0, 0). Estos predicados —que los generadores de consultas suelen emitir para convertir una comparación que podría devolver NULL en un valor booleano definido— antes eran opacos para el análisis de índices y no permitían omitir gránulos. Esto amplía el SETTING existente allow_key_condition_coalesce_rewrite (habilitado de forma predeterminada). #106272 (andyzzhao).
  • Se mejoró el rendimiento de decodificación de las columnas Parquet FLOAT y DOUBLE codificadas con BYTE_STREAM_SPLIT. #106376 (Algunenano).
  • Se corrigieron bloqueos prolongados al iniciar sesión y al iniciar consultas con el almacenamiento de acceso replicado cuando se modifican a la vez muchas entidades de acceso (políticas de fila, roles, cuotas y perfiles de configuración). Cada caché por entidad ahora se recalcula una vez por lote de notificaciones, en lugar de una vez por cada entidad modificada, lo que elimina trabajo cuadrático que podía mantener bloqueado el acceso durante minutos. #107672 (azat).
  • Se corrigió una regresión de rendimiento por la que la lectura de muchos archivos pequeños desde el almacenamiento de objetos mediante s3 y otras funciones de tabla dejó de realizar prefetch y pasó a usar lecturas síncronas, ralentizando considerablemente las lecturas de muchos archivos pequeños en un solo hilo o con baja concurrencia. #108872 (fm4v).
  • Se habilitó el prefetch inicial de objetos pequeños cuando las lecturas del almacenamiento de objetos pasan por la caché del sistema de archivos (filesystem_cache_name). Antes, las lecturas de muchos archivos pequeños, como la ingesta con S3Queue, seguían siendo síncronas y estaban limitadas por la latencia cuando la caché del sistema de archivos estaba habilitada. #109478 (fm4v).
  • Se mejoró la optimización de PREWHERE para subcolumnas Map al tener en cuenta su tamaño en disco. #110623 (Avogar).
  • La materialización diferida ahora se aplica a consultas con FINAL, un filtro y un LIMIT pequeño, incluso sin ORDER BY (para ReplacingMergeTree). #110722 (KochetovNicolai).
  • Se redujo el tiempo de CPU dedicado a la deduplicación durante los vaciados de inserciones asíncronas que abarcan muchas particiones. #111150 (valerypetrov).
  • Se corrigió una regresión de CPU en consultas que realizan muchas lecturas pequeñas e independientes de la misma parte de MergeTree cuando la tabla tiene columnas LowCardinality. La comprobación que determina si una parte tiene un único diccionario compartido examinaba cada marca de toda la parte en cada tarea de lectura; ahora localiza mediante búsqueda binaria cada secuencia de marcas iguales. Las consultas de este tipo en tablas con una index_granularity pequeña eran hasta varias veces más lentas desde la versión 26.6. #116134 (groeneai).

Optimización de memoria

  • Se redujo hasta diez veces la memoria utilizada por los metadatos del tipo Enum en tablas con columnas Enum. Las búsquedas de valor a nombre se mantienen igual de rápidas o son más rápidas, mientras que las búsquedas de nombre a valor durante el análisis y la deserialización pueden ser más lentas. #95668 (qoega).
  • Se redujo el uso máximo de memoria de BACKUP al dejar de copiar la lista interna de información de archivos al escribir entradas de copia de seguridad (algo significativo para copias de seguridad que contienen millones de archivos). #111162 (jkartseva).

Mejoras

Consultas y SQL

  • Identifica las columnas por posición (en lugar de por nombre) al eliminar columnas no utilizadas del plan de consulta. Esto permite eliminar columnas no utilizadas cuando existen nombres de columna duplicados. #100586 (antaljanosbenjamin).
  • Se añadió SESSION_USER como alias de currentUser() que no distingue entre mayúsculas y minúsculas, para lograr compatibilidad con PostgreSQL y el estándar SQL. #106081 (takumihara).
  • Se redujo la latencia de cancelación de las consultas ejecutadas mediante el protocolo de red de PostgreSQL: KILL QUERY ahora interrumpe la serialización de salida dentro de un único fragmento, en lugar de esperar a que se envíe el fragmento completo al cliente. #106535 (rvasin).
  • Corrige un error ILLEGAL_TYPE_OF_ARGUMENT en consultas distribuidas con serialize_query_plan = 1 que contienen una lambda con un argumento constante (p. ej., arrayMap(t -> t.2, ...)). Las columnas constantes de los nodos INPUT de ActionsDAG ahora se conservan durante la serialización del plan de consulta. #107124 (alexey-milovidov).
  • Se redujo la latencia de cancelación de las consultas ejecutadas mediante el protocolo de red de MySQL: KILL QUERY ahora interrumpe la serialización de salida dentro de un único fragmento, en lugar de esperar a que se envíe el fragmento completo al cliente. #107228 (rvasin).

Funciones

  • EXPLAIN SYNTAX ahora representa de forma coherente los operadores como llamadas a funciones en la salida de explicación (por ejemplo, plus(1, 2) en lugar de 1 + 2). #94681 (1abdelhalim).
  • Ahora se admite la sintaxis de estilo PostgreSQL expr OP SOME(array) / expr OP ALL(array) (con un lado derecho que no es una subconsulta) y se reescribe como has / NOT has para =/<>, o como lambdas arrayExists / arrayAll para otros operadores de comparación. No se acepta ANY en la forma de array porque any también es una función de agregación; use SOME en su lugar. La forma de subconsulta de ANY/SOME/ALL sigue convirtiéndose en IN / NOT IN. #105129 (alexey-milovidov).
  • Se añadió compatibilidad con las funciones multiSearchAny, multiSearchAnyUTF8 y multiMatchAny en los índices de texto. También se mejoró el análisis de índices de texto para la función match: ahora los patrones con grupos alternativos pueden omitir más gránulos. #106279 (CurtizJ).
  • La función h3PolygonToCells ahora aplica el límite máximo de tamaño de array al conjunto de polígonos de un MultiPolygon, valida los códigos de retorno de la biblioteca H3 subyacente y rechaza argumentos MultiLineString en lugar de devolver silenciosamente un resultado vacío. #106399 (Algunenano).
  • La deserialización de los estados de las funciones de agregación contingency, cramersV, cramersVBiasCorrected y theilsU ahora valida que los recuentos almacenados formen una tabla de contingencia coherente y, de lo contrario, genera una excepción CORRUPTED_DATA. #107185 (nihalzp).
  • Se mejora la estimación de cardinalidad en el optimizador del plan de consulta: una columna generada por una función determinista de un único argumento (por ejemplo, toYear(date)) ahora hereda como límite superior el número de valores distintos de su argumento, en lugar de quedar sin estadísticas, lo que permite una reordenación de joins más precisa. #107757 (davenger).

Motores de tabla y almacenamiento

  • Corrige los consumidores del motor de tabla Kafka que seguían usando un intervalo de sondeo corto tras la asignación de particiones, para que vuelvan a usar el valor configurado de kafka_poll_timeout_ms y eviten sondeos vacíos excesivos, partes insertadas más pequeñas y sobrecarga adicional de fusión tras los reequilibrios. #100431 (sugaf1204).
  • Los motores de tabla para lagos de datos, incluidos Iceberg y DeltaLake, ahora pueden usar discos S3 y Azure con caché, lo que permite que las lecturas repetidas utilicen la caché del sistema de archivos. #102017 (RinChanNOWWW).
  • Permite fusionar con el PREWHERE existente, en una segunda pasada del optimizador, los filtros introducidos después de la selección PREWHERE inicial (pushdown de predicados, filtros de tiempo de ejecución o un PREWHERE explícito junto con un WHERE establecido por el planificador), en lugar de mantenerlos como un paso Filter independiente sobre la lectura de MergeTree. #105445 (yariks5s).
  • Se añadió el SETTING wait_for_part_commit_in_dependent_materialized_views. Cuando está habilitada, una vista materializada en cascada que se vuelve a unir a su origen puede ver la fila que se está insertando. #105943 (ahmadov).
  • Compatibilidad con PostgreSQL para EXTRACT(TIMEZONE_HOUR FROM dt) y EXTRACT(TIMEZONE_MINUTE FROM dt), que extraen las partes de hora y minuto de un desplazamiento de zona horaria, y para EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>), que extraen el valor de un intervalo. #106227 (vinayakj592).
  • Se implementó SYSTEM RESTART DISK <name>: ahora recarga los metadatos de un disco en memoria y vuelve a examinar las partes de datos de las tablas de réplicas de solo lectura ubicadas en él. Esto permite que una réplica de solo lectura de una tabla en almacenamiento compartido plain_rewritable detecte, bajo demanda, los datos escritos por otro servidor, sin esperar a refresh_parts_interval ni reiniciar el servidor. #106645 (jrdi).
  • Omite cargas innecesarias de archivos de marcas para datos compartidos avanzados de JSON. #107051 (Avogar).
  • Se añadió el SETTING, aplicable al momento de creación, materialized_postgresql_use_extended_date_and_time_types para el motor de base de datos MaterializedPostgreSQL. De forma predeterminada (habilitada), las columnas date/timestamp de PostgreSQL se infieren como Date32/DateTime64; establecerla en 0 al ejecutar CREATE DATABASE infiere los tipos más restringidos Date/DateTime. El SETTING no es aplicable al motor de tabla MaterializedPostgreSQL. #107428 (alexey-milovidov).
  • MergeTree ahora puede leer un flujo comprimido cuyos bloques usan códecs diferentes. Este es el requisito previo en el lado de lectura para la selección adaptativa de códecs. #108592 (rienath).
  • Usa el índice de omisión bloom_filter para predicados IN en una columna indexada directamente cuando transform_null_in = 1 y el conjunto IN no contiene ningún valor NULL. Antes, el índice se omitía en estas consultas, lo que obligaba a realizar un escaneo completo. #111329 (groeneai).

S3 y almacenamiento de objetos

  • Registra los privilegios en system.query_log.used_privileges para todas las comprobaciones de acceso concedidas, incluidas las que siguen la ruta isGranted que no genera excepciones (checkAccessWithFilter). Anteriormente, solo se registraban los privilegios comprobados mediante puntos de entrada que generan excepciones (checkAccess / checkGrantOption), por lo que READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL no aparecían en el registro de auditoría de consultas DESCRIBE, CREATE TABLE AS y similares que usan las funciones de tabla file / s3 / azure / url. La aplicación del control de acceso no cambia. #104693 (alexbakharew).
  • Completa de forma asíncrona la solicitud final de carga multiparte de S3 mediante el rastreador de tareas, de modo que pueda solaparse con la carga de la última parte en lugar de ejecutarse secuencialmente durante la finalización. #105487 (asya-ch).
  • Se aumentó de una a seis horas la configuración predeterminada de persistent_processing_node_ttl_seconds para S3Queue y AzureQueue, lo que evita que los procesos de larga duración o reiniciados pierdan el bloqueo del bucket demasiado pronto. #106838 (kssenii).
  • Admite los valores REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, GLACIER_IR y EXPRESS_ONEZONE (además de STANDARD e INTELLIGENT_TIERING) para la configuración s3_storage_class_name. #107251 (adityaksolves).
  • La ruta de ejemplo de particionamiento Hive para tablas de almacenamiento de objetos (p. ej., S3) se resuelve al usar la tabla por primera vez, en lugar de durante CREATE/ATTACH, por lo que un endpoint inaccesible ya no bloquea la creación de tablas ni el inicio del servidor. #111842 (evillique).

Ajustes y configuración

  • Hacer que la estrategia de partición Hive sea la predeterminada en la configuración de compatibilidad file_like_engine_default_partition_strategy. #86746 (kssenii).
  • Se añadieron cuatro nuevas configuraciones de tabla MergeTree para controlar los parámetros predeterminados de los índices de texto: text_index_dictionary_block_size, text_index_dictionary_block_frontcoding_compression, text_index_posting_list_block_size y text_index_posting_list_codec. Estas configuraciones permiten ajustar el comportamiento de los índices de texto a nivel de tabla sin especificar parámetros en cada definición de índice. Los argumentos explícitos de cada índice siguen teniendo prioridad. #100626 (CurtizJ).
  • Añadir la configuración output_format_pretty_use_nbsp_for_padding para representar el relleno del diseño de tabla en los formatos Pretty de estilo tabular mediante el ESPACIO DE NO SEPARACIÓN U+00A0 cuando output_format_pretty_grid_charset sea UTF-8. Esto ayuda a que la salida Pretty copiada conserve la alineación de las tablas en herramientas que contraen los espacios normales. La configuración está deshabilitada de forma predeterminada y la salida con el juego de caracteres ASCII conserva los espacios normales. #103559 (ashrithb).
  • Admitir la compatibilidad con el analizador anterior mediante la configuración analyzer_compatibility_allow_non_aggregate_in_having. Si está habilitada, las condiciones sin agregación se moverán de HAVING a WHERE. #104232 (novikd).
  • OPTIMIZE TABLE ... ON CLUSTER y otras instrucciones DDL ya no se bloquean cuando la tabla de destino tiene table_readonly = 1. La configuración ahora genera un nuevo código de error específico, TABLE_IS_PERMANENTLY_READ_ONLY, que DDLWorker trata como no reintentable (a diferencia de TABLE_IS_READ_ONLY, un error transitorio que se produce durante desconexiones temporales de ZooKeeper en ReplicatedMergeTree). La configuración table_readonly también se rechaza ahora explícitamente para ReplicatedMergeTree, tanto durante la creación como mediante ALTER MODIFY SETTING. #105109 (alexey-milovidov).
  • El orden descendente en las claves de ordenación de MergeTree (p. ej., ORDER BY (time DESC, key)) ahora siempre es compatible y ya no requiere la configuración experimental allow_experimental_reverse_key, que ha quedado obsoleta. #106440 (nikitamikhaylov).
  • Admitir keyed_by_normalized_query_hash para las cuotas definidas en la configuración estática del servidor (users.xml), en consonancia con la sintaxis DDL existente CREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov).
  • La configuración de compatibilidad ya no aplica configuraciones obsoletas, por lo que no las marca como modificadas ni genera advertencias sobre ellas. #107737 (UberDever).
  • Se añadió la configuración analyzer_compatibility_multiple_joins_qualify_column_names (valor predeterminado: false). Cuando está habilitada y la cláusula FROM de una consulta contiene dos o más JOIN, los nombres de las columnas de resultado generados por el analizador imitan la reescritura de múltiples JOIN del analizador anterior: las columnas expandidas desde * se denominan <alias-or-table>.<column>, y una referencia a una columna sin alias en la lista SELECT conserva el nombre exactamente como se escribió. Esto permite que las consultas externas que hacen referencia a esos nombres cualificados, como SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), funcionen como lo hacían con el analizador anterior. También se corrigió un problema por el que el analizador perdía los nombres cualificados de las columnas de resultado expandidas desde * cuando group_by_use_nulls se combinaba con ROLLUP, CUBE o GROUPING SETS, lo que producía nombres de columnas de resultado duplicados e impedía las referencias externas a esas columnas. #110746 (novikd).
  • Se añadió la configuración analyzer_compatibility_apply_final_to_all_joined_tables, que restaura el comportamiento anterior: el modificador FINAL de la tabla situada más a la izquierda de un JOIN también se aplicaba a las demás tablas combinadas. La configuración se registra en el historial de cambios de configuración, por lo que compatibility con versiones anteriores a la 26.6 restaura automáticamente la semántica anterior. #111589 (fm4v).
  • Se añadió una nueva configuración de MergeTree, text_index_version, que controla la versión del formato en disco de los índices de texto: v0_initial, v1_with_codec o v2_with_positions. Durante una actualización progresiva o antes de una reversión de versión, establézcala en una versión anterior para que los servidores más recientes sigan escribiendo partes de índices de texto en un formato que los servidores más antiguos aún puedan leer; la configuración de compatibilidad la ajusta automáticamente. #111803 (CurtizJ).

Tablas del sistema y monitorización

  • Rellena used_storages en system.query_log con el nombre del motor de almacenamiento al consultar tablas a través de DataLakeCatalog. #100706 (melvynator).
  • Añade las columnas current_projection, current_projection_progress, projections_completed y projections_remaining a system.merges para mostrar el progreso de fusión de las proyecciones. #102611 (amosbird).
  • Los motores de tabla ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas description, syntax, examples, introduced_in y related de la tabla system.table_engines. #106177 (alexey-milovidov).
  • Los motores de base de datos ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas description, syntax, examples, introduced_in y related de la tabla system.database_engines. #106178 (alexey-milovidov).
  • Los tipos de datos ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas description, syntax, examples, introduced_in y related de la tabla system.data_type_families. #106180 (alexey-milovidov).
  • Los formatos de entrada/salida ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas description, examples, introduced_in y related de la tabla system.formats. #106181 (alexey-milovidov).
  • Los combinadores de funciones de agregación ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas description, syntax, examples, introduced_in y related de la tabla system.aggregate_function_combinators. #106185 (alexey-milovidov).
  • Se añadió una nueva tabla system.data_skipping_index_types que enumera los tipos de índices de omisión de datos disponibles, junto con su documentación integrada (description, syntax, examples, introduced_in, related). #106186 (alexey-milovidov).
  • Se añadió una nueva tabla system.disk_types que enumera los tipos de disco disponibles, junto con su documentación integrada (description, syntax, examples, introduced_in, related). #106187 (alexey-milovidov).
  • Se añadieron las métricas asíncronas TotalUncompressedBytesOfMergeTreeTables y TotalUncompressedBytesOfMergeTreeTablesSystem, que informan del tamaño total sin comprimir de los datos almacenados en tablas de la familia MergeTree. #106364 (alexey-milovidov).
  • Añade el evento de perfil GlobalMemoryLimitExceeded para que los operadores puedan supervisar cuándo se alcanza el límite de memoria de todo el servidor. #106466 (sacheendra).
  • Se añadieron las métricas asíncronas ExecutableUserDefinedFunctionMemoryResidentBytes y ExecutableUserDefinedFunctionProcesses, que informan sobre la memoria residente (VmRSS) y el número de procesos en ejecución de las funciones definidas por el usuario executable y executable_pool, incluidos los procesos descendientes y los trabajadores inactivos del grupo. #107300 (HanziJiang).
  • Se añadió show_remote_databases_in_system_tables, habilitado de forma predeterminada, para que los usuarios puedan ocultar las bases de datos MySQL y PostgreSQL de system.tables, system.columns y system.completions. show_data_lake_catalogs_in_system_tables sigue controlando únicamente la visibilidad de DataLakeCatalog. #104416 (pamarcos). #109082 (pamarcos).

ClickHouse Keeper

  • Diversos cambios en Keeper que lo hacen aproximadamente el doble de rápido en general (mejor procesamiento por lotes, canalización de mensajes al líder y de adiciones al log). #101757 (al13n321).
  • Añade más eventos del perfil de Keeper, tanto del lado del servidor como del client, para watches. #105336 (scanhex12).
  • Añade una nueva tabla system.keeper_snapshots, exclusiva de Keeper, con información sobre snapshots locales de ClickHouse Keeper. #105571 (mstetsyuk).
  • Añade una nueva tabla system.keeper_changelogs, exclusiva de Keeper, con información sobre archivos de changelog locales de ClickHouse Keeper (log de Raft). #105617 (mstetsyuk).
  • Añade una tabla system.keeper_cluster exclusiva de Keeper. Contiene una fila por cada miembro del clúster de Raft según lo ve el Keeper actual. #105646 (mstetsyuk).
  • Reduce el uso máximo de memoria al aplicar snapshots recibidos en ClickHouse Keeper con KeeperMemoryStorage. #105851 (antonio2368).
  • Añade coordination_settings de Keeper para limitar la admisión de entradas de log no confirmadas de NuRaft y aplicar throttling a los sondeos inversos de append-entries. #106108 (antonio2368).

Gestión de memoria

  • Se corrigieron mensajes de error de sintaxis que podían incluir bytes de memoria adyacente después de que el analizador retrocediera más allá del final de una instrucción. #105086 (groeneai).
  • Se redujo el uso de memoria al abrir una copia de seguridad (para RESTORE o como base de un BACKUP incremental). Los metadatos de .backup ahora se analizan como un flujo en lugar de cargarse en un árbol de documentos XML en memoria, lo que evita asignar un árbol DOM de varios gigabytes en el caso de copias de seguridad grandes, especialmente incrementales. #109107 (jkartseva).
  • Se redujo el uso máximo de memoria al finalizar un BACKUP. Al escribir los metadatos de la copia de seguridad, ya no se copia la información de todos los archivos a un vector temporal (lo que, en copias de seguridad con millones de archivos, consumía transitoriamente varios gigabytes); ahora se recorre directamente. #109861 (jkartseva).

Formatos de datos

  • Ahora se pueden insertar campos Fixed de Avro para variantes de enteros de 8, 16, 32 y 64 bits. #98139 (patrickpichler).
  • El formato AvroConfluent ahora reintenta el cliente HTTP de Confluent Schema Registry ante fallos transitorios (timeouts de transporte, conexión rechazada, errores de DNS y HTTP 5xx/408/429) con backoff exponencial, en lugar de cancelar el INSERT ante el primer fallo de red. Los nuevos settings format_avro_schema_registry_max_retries (valor predeterminado: 5) y format_avro_schema_registry_retry_initial_backoff_ms (valor predeterminado: 100) controlan la política. Los errores de validación del esquema (HTTP 409 y JSON de Avro malformado) siguen siendo irrecuperables. #106661 (groeneai).
  • Se conservaron los códigos de error originales de ClickHouse para los errores devueltos mediante Apache Arrow. #107267 (azat).

Colecciones con nombre y diccionarios

  • Se añadió la configuración enable_compression para la función de tabla mysql, el motor de tabla MySQL, el motor de base de datos MySQL, el diccionario SOURCE(MYSQL) y las colecciones con nombre. Al habilitarla, ClickHouse negocia la compresión a nivel de protocolo MySQL para todos los datos transferidos a través de la conexión. #103229 (bernardlim).
  • Se añadió una nueva tabla system.dictionary_layouts que enumera las estructuras de diccionario disponibles junto con documentación integrada (description, syntax, examples, introduced_in, related). #106182 (alexey-milovidov).
  • Se añadió una nueva tabla system.dictionary_sources que enumera las fuentes de diccionario disponibles junto con documentación integrada (description, syntax, examples, introduced_in, related). #106184 (alexey-milovidov).
  • El tipo de almacenamiento efectivo de las colecciones con nombre ya está disponible como named_collections_storage.type en system.server_settings y mediante getServerSetting('named_collections_storage_type'). #111806 (pamarcos).

Otras mejoras

  • Se mejoraron las sugerencias de nombres de tablas en los mensajes de error: ya no sugieren exactamente el mismo nombre e incluyen el nombre de la base de datos (p. ej., “¿Quizás quiso decir other_db.my_table?”). #95116 (matt-metivier).
  • Se mejoró el mensaje de error para identificadores no resueltos en consultas sin cláusula FROM, sugiriendo añadir una. #101769 (Onyx2406).
  • Se corrigió un problema por el que PREWHERE con una subconsulta IN en columnas de clave primaria no usaba el índice de clave primaria para la poda de gránulos, lo que provocaba escaneos completos de tabla en lugar de leer solo los gránulos relevantes. #102570 (nikitamikhaylov).
  • Las vistas materializadas actualizables ahora continúan actualizándose después de reemplazar su tabla de destino mediante EXCHANGE TABLES y eliminar la tabla antigua. Anteriormente, las actualizaciones podían fallar con una excepción UNKNOWN_TABLE porque conservaban el UUID de la tabla antigua. #102724 (seva-potapov).
  • Se activa enable_join_transitive_predicates de forma predeterminada. #103724 (davenger).
  • La vista materializada actualizable ahora admite REFRESH DEPENDS ON para desencadenar actualizaciones al actualizarse otra RMV, en lugar de según una programación basada en tiempo. (REFRESH EVERY ... DEPENDS ON ya existía, pero no se podía usar de forma fiable para este caso de uso). Consulte la documentación de CREATE MATERIALIZED VIEW. #104440 (al13n321).
  • Se añade la opción EXPLAIN PIPELINE para compactar cadenas repetidas de procesadores. #104662 (niyue).
  • Se añadió REGEXP_SUBSTR como alias de regexpExtract que no distingue entre mayúsculas y minúsculas, para compatibilidad con Oracle/MySQL/Snowflake. #105122 (alexey-milovidov).
  • Se añadió date_part('unit', expr) como azúcar sintáctico para EXTRACT(unit FROM expr). Se admiten todos los tipos de intervalos estándar y los adicionales de PostgreSQL (epoch, dow, doy, isodow, isoyear, century, decade, millennium). #105127 (alexey-milovidov).
  • QueryConditionCache ahora registra individualmente los gránulos descartados por el filtro, incluso dentro de lotes de lectura que superan parcialmente PREWHERE, lo que reduce el número de marcas que las consultas posteriores con la misma condición deben volver a leer. #105335 (hanfei1991).
  • Se añade compatibilidad con BFloat16 para funciones de predicados numéricos. #105391 (mohhddhassan).
  • Se admiten estadísticas básicas, una estadística compacta por columna que almacena mínimos y máximos numéricos, la longitud media de las cadenas y recuentos de NULL cuando corresponde. #106048 (hanfei1991).
  • Se admite un modificador NULL / NOT NULL al final de ALTER TABLE ... ADD/MODIFY COLUMN, al igual que en CREATE TABLE. #106150 (takumihara).
  • El optimizador PREWHERE ahora agrupa los conjunciones que hacen referencia al mismo conjunto de columnas antes de estimar la selectividad, de modo que condiciones como a > 2500 AND a < 2502 se evalúan conjuntamente como un rango combinado (~0,02 % de selectividad), en lugar de como dos predicados independientes (~50 % cada uno). Esto permite ordenar con mayor precisión las condiciones PREWHERE cuando hay estadísticas de columnas disponibles. #106337 (hanfei1991).
  • No se muestra el preámbulo “Stack trace (when copying this message, always include the lines below):” en los mensajes de excepción cuando el stack trace está vacío. #106524 (alexey-milovidov).
  • Corregido CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) en discos cifrados para que copie datos en lugar de crear enlaces físicos. #106731 (nikitamikhaylov).
  • Corregida la lectura de datos de tablas en bases de datos DataLakeCatalog con catalog_type = 'onelake' mediante el uso predeterminado del endpoint Blob de OneLake (.blob.fabric.microsoft.com). Establezca onelake_use_blob_endpoint = false para conservar el comportamiento anterior del endpoint DFS (.dfs.fabric.microsoft.com). #106843 (scanhex12).
  • Reducida la sobrecarga de CPU del registro asíncrono con tasas elevadas de registros al notificar al consumidor de registros solo cuando la cola pasa de estar vacía a no estarlo, en lugar de hacerlo con cada mensaje. #107352 (nikitamikhaylov).
  • Corregida la lectura de la longitud de auth_response en el handshake de MySQL, donde un byte de longitud >= 128 se interpretaba como un valor de varios gigabytes porque se leía como un char con signo. #107384 (uwezkhan).
  • MaterializedPostgreSQL ahora asigna las columnas de PostgreSQL numeric(p, 0) con una precisión superior a 76 (por ejemplo, numeric(78, 0), utilizado para enteros de 256 bits) a Int256 de ClickHouse, en lugar de generar el error “Precision too big”. Los valores que no caben en Int256 se rechazan con un error claro. #107431 (alexey-milovidov).
  • Nullable(Tuple(...)) ahora está en fase Beta. Está deshabilitado de forma predeterminada; establezca enable_nullable_tuple_type = 1 para usarlo. #107754 (nihalzp).
  • Las inserciones asíncronas ya no registran la lista completa de query_id en el nivel trace/debug, lo que, desde la versión 26.2, podía saturar text_log en servicios con mucho tráfico de inserciones asíncronas. Las líneas detalladas ahora se registran en el nivel test. #107852 (CheSema).
  • Reducido el uso de metadatos de la caché del sistema de archivos mediante la liberación rápida de las entradas de prioridad invalidadas. #107903 (kssenii).
  • Un índice de omisión bloom_filter en una columna Array ahora se utiliza para arrayJoin(column) IN (set), arrayJoin(column) GLOBAL IN (set) y arrayJoin(column) = const, igual que ya se utilizaba para hasAny(column, set) y has(column, const). Anteriormente, estas formas de arrayJoin ... recurrían a un análisis completo. #109536 (groeneai).
  • IS NOT DISTINCT FROM e IS TRUE ahora usan índices de clave primaria y minmax para descartar gránulos, igual que =. Anteriormente, k IS NOT DISTINCT FROM 42 y (k = 42) IS TRUE escaneaban todos los gránulos. #110006 (groeneai).

Correcciones de errores

Correcciones de JOIN

  • Se corrigió la función nested (utilizada internamente por ARRAY JOIN), que eliminaba LowCardinality de los tipos de columna y provocaba que Array(LowCardinality(String)) se convirtiera en Array(String) en la salida. #98974 (Onyx2406).
  • Se corrigió la reordenación de joins que descartaba silenciosamente las filas sin coincidencia de un RIGHT/LEFT JOIN cuando se combinaba mediante comas (cross join) con otra tabla; por ejemplo, t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Anteriormente, la consulta devolvía el resultado de un inner join en lugar del de un outer join. #101684 (groeneai).
  • Se corrigió un LOGICAL_ERROR (“Port is not connected”, código 49) que podía producirse al ejecutar consultas que incluían una VIEW con agregación dentro de un JOIN. #102574 (Ergus).
  • Se corrigió el problema por el que max_rows_to_transfer y max_bytes_to_transfer se ignoraban silenciosamente en consultas GLOBAL IN y GLOBAL JOIN con el nuevo analizador. Ahora, los ajustes generan SET_SIZE_LIMIT_EXCEEDED (o interrumpen la ejecución, según transfer_overflow_mode) cuando la tabla externa materializada supera el límite configurado, de acuerdo con el comportamiento del analizador antiguo. #104119 (groeneai).
  • Se corrigieron resultados incorrectos o fallos de consulta en consultas JOIN que usan join_algorithm = 'direct' con una tabla MergeTree en el lado derecho cuando la optimización reordenaba las columnas de búsqueda. #104174 (groeneai).
  • Se corrigió un error por el que las consultas que combinaban arrayJoin con ORDER BY ... LIMIT después de un JOIN podían devolver silenciosamente cero filas. La optimización del plan de consulta que eleva la evaluación de funciones por encima de SortingStep ya no se aplica cuando la expresión elevada contiene arrayJoin, ya que arrayJoin puede cambiar el número de filas. #104558 (groeneai).
  • Se corrigió un error lógico en algunos casos de uso de LIMIT BY negativo con ARRAY JOIN. #105403 (nihalzp).
  • Se añadió un nuevo ajuste de compatibilidad, analyzer_compatibility_prefer_alias_over_subcolumn (deshabilitado de forma predeterminada). Cuando está habilitado, el nuevo analizador prefiere interpretar los identificadores de varias partes como prefijos de alias en lugar de como coincidencias con subcolumnas Tuple o columnas con puntos, restaurando el comportamiento del intérprete anterior. Esto evita errores AMBIGUOUS_IDENTIFIER (y relacionados) cuando una consulta une una tabla cuyo nombre coincide con el de una tabla interna de una CTE/subconsulta que usa SELECT * sobre un join, caso en el que las columnas renombradas mediante asterisco (por ejemplo, b.id) podrían filtrar los identificadores de la tabla interna al ámbito externo. #105491 (vdimir).
  • Se corrigieron posibles resultados incorrectos en consultas que combinan un outer join con un inner join posterior que hace referencia al lado que aporta valores nulos del outer join. La reordenación de joins podía elegir un plan que incorporaba las condiciones del inner join en la cláusula ON del outer join. #105992 (vdimir).
  • Se mejoró la compatibilidad con el analizador antiguo. Si la tabla tiene columnas como x.a Array, x.b Array, x String, se prefieren los arrays para ARRAY JOIN x. #106069 (KochetovNicolai).
  • Se corrigió una excepción en consultas INNER JOIN con una tabla MergeTree vacía en el lado izquierdo cuando están habilitados enable_parallel_replicas, query_plan_use_new_logical_join_step y query_plan_optimize_join_order_algorithm = 'greedy'. #106338 (KochetovNicolai).
  • Corrige un error lógico (Left and right columns have same names) en el optimizador del orden de JOIN que podía producirse en JOIN ejecutados con réplicas paralelas cuando dos relaciones del grafo de JOIN comparten nombres de columnas. #106418 (alexey-milovidov).
  • Corrige una excepción LOGICAL_ERROR (Invalid number of rows in Chunk) en JoiningTransform para un LEFT JOIN con claves únicas en el lado derecho, una condición ON mixta y un valor pequeño de max_joined_block_size_rows. #106928 (groeneai).
  • Corrige una excepción (LOGICAL_ERROR) en el filtro en tiempo de ejecución de JOIN cuando la clave de JOIN contiene un tipo Variant o Dynamic anidado dentro de una Tuple, Array o Map, y el lado derecho del JOIN tiene un único valor distinto. #106931 (groeneai).
  • Corrige un LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y) al ejecutar una función sobre una columna Dynamic creada mediante un JOIN sobre Dynamic (por ejemplo, las filas no unidas de un RIGHT/FULL JOIN o una subconsulta EXISTS correlacionada que se descorrelaciona en un JOIN). #107095 (groeneai).
  • Corrige una excepción de error lógico Bad cast from type DB::IColumn const* to DB::ColumnNullable const* cuando se pasa un asterisco calificado (t.*) sobre una clave JOIN ... USING a una función de agregación y el otro lado de un OUTER JOIN tiene una clave Nullable (con join_use_nulls = 0). #107129 (groeneai).
  • Corrige un error lógico (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) cuando la optimización de inserción de disyunciones (predicados parciales) inserta una condición sobre una clave USING cuyo tipo se amplía mediante el JOIN. También corrige un bloqueo del servidor (fallo de segmentación) en el analizador al resolver identificadores en consultas JOIN ... USING que contienen ramas if/multiIf evaluables como constantes que hacen referencia a identificadores desconocidos. #107407 (groeneai).
  • Corrige el filtro en tiempo de ejecución de JOIN que producía resultados incorrectos para columnas JSON. #107663 (Avogar).
  • Corrige una excepción de error lógico Bad cast from type DB::ColumnNullable to DB::ColumnVector<...> cuando un asterisco calificado (t.*) selecciona una clave JOIN USING y ese JOIN está anidado bajo un JOIN PASTE/CROSS/por coma o un JOIN ON externo, con join_use_nulls = 0. #108043 (groeneai).
  • Corrige un error en el nuevo analizador por el que FINAL en una tabla de un JOIN (por ejemplo, FROM t1 FINAL JOIN t2) se aplicaba incorrectamente también a las demás tablas unidas, lo que podía ralentizar esas consultas. #108979 (vdimir).
  • Con analyzer_compatibility_join_using_top_level_identifier = 1, ahora un identificador en JOIN ... USING puede resolverse a partir de un alias definido en una subexpresión dentro de la lista SELECT (por ejemplo, SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), igualando el comportamiento del analizador antiguo. Anteriormente, solo se consideraban los alias de proyección de nivel superior, y estas consultas fallaban con una excepción UNKNOWN_IDENTIFIER incluso con la configuración habilitada. La sugerencia de error que recomienda habilitar esta configuración ahora también se genera cuando el alias coincidente está anidado. #110739 (novikd).
  • Se corrigió el error INCOMPATIBLE_TYPE_OF_JOIN en un join ANY sobre una tabla con engine Join cuando un filtro WHERE en una columna del lado derecho permitía al planificador de consultas reescribir el join como SEMI o ANTI. Las tablas con engine Join tienen una strictness declarada fija que no se puede cambiar, por lo que ahora se rechaza la conversión para estas tablas. #111362 (groeneai).
  • Se corrigió TYPE_MISMATCH (“Key type for complex key … does not match”) cuando un JOIN con un diccionario utiliza una clave de join Nullable, LowCardinality o LowCardinality(Nullable) y la clave del diccionario no está envuelta. La búsqueda en diccionario de joins directos ahora normaliza la clave al tipo de clave declarado del diccionario (como ya hacen dictGet/dictHas), y una clave NULL nunca coincide. #111857 (groeneai).
  • Se corrigió AMBIGUOUS_COLUMN_NAME (Block structure mismatch in (columns with identical name must have identical structure)) en una consulta que repite una condición JOIN ON en WHERE con join_use_nulls = 1. Ahora esta consulta devuelve su resultado en lugar de fallar. #112007 (groeneai).
  • Se corrigieron resultados incorrectos o la finalización del servidor en JOIN directos con diccionarios cuya clave utiliza serialización dispersa. #112327 (groeneai).
  • Se corrigieron resultados incorrectos cuando un hash join tiene una única clave LowCardinality de un tipo de más de 8 bytes (UInt128, Int128, UInt256, Int256 y sus variantes Nullable). Este join devolvía silenciosamente filas cuyos valores de clave no eran iguales. #113230 (groeneai).
  • Se corrigió la poda de partes y gránulos para una condición JOIN ON que implica columnas constantes del otro lado. #113484 (vdimir).
  • Se corrigió un valor incorrecto devuelto para una columna virtual como _table o _database, seleccionada del lado derecho de un JOIN gestionado por DirectKeyValueJoin (un almacenamiento key-value como EmbeddedRocksDB, KeeperMap, Redis o un diccionario). En su lugar, la consulta devolvía el contenido de una columna de datos o fallaba con LOGICAL_ERROR. #113698 (groeneai).

Correcciones en consultas y en el analizador

  • Corrige un error por el que splitMultipartQuery generaba el error “Consulta vacía” en consultas que terminaban con un comentario después de un punto y coma. #85491 (yariks5s).
  • Corrige el caso en el que el analizador sintáctico no aceptaba un alias después de una subconsulta en DESCRIBE TABLE y generaba un error de sintaxis. #100205 (yariks5s).
  • Corrige que la cláusula FORMAT fuera consumida por INSERT en lugar de aplicarse a la salida de EXPLAIN en EXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406).
  • Corrige que las consultas SELECT fueran significativamente más lentas cuando se ejecutaban INSERT simultáneos. Anteriormente, una canalización INSERT reservaba slots de CPU hasta max_threads al inicio de la consulta, incluso cuando la mayoría nunca se utilizaba, lo que privaba de recursos a los SELECT simultáneos. La asignación de slots de CPU ahora se realiza según la demanda: la canalización solo solicita slots a medida que envía trabajo paralelizable. Se aplica tanto al control de concurrencia como al planificador de CPU preventivo para cargas de trabajo. La nueva configuración del servidor concurrent_threads_lazy_allocation (valor predeterminado: true) sirve como mecanismo de reversión. #102928 (seva-potapov).
  • Corrige un error por el que ALTER TABLE ... MODIFY SETTING en una tabla EmbeddedRocksDB podía persistir un valor de configuración no válido en el archivo de metadatos de la tabla, incluso cuando el servidor rechazaba la consulta. En el siguiente reinicio del servidor, la tabla no podía adjuntarse debido a CANNOT_PARSE_BOOL (o un error de análisis similar) y, en bases de datos donde los errores de carga son fatales, el servidor se negaba a iniciarse. Los valores de configuración no válidos ahora se rechazan antes de escribir metadatos. #103417 (groeneai).
  • Corrige INSERT de streaming con input_format_max_block_wait_ms para la interfaz HTTP y para INSERT SELECT FROM input, de modo que los bloques de entrada parciales se vacíen antes de que finalice la solicitud. #104534 (alexey-milovidov).
  • Corrige que la expresión CASE devolviera la rama ELSE en lugar de la rama THEN correspondiente cuando tanto la expresión como un valor WHEN eran NULL. #105556 (Algunenano).
  • Corrige la compatibilidad con el uso de UDF de SQL de WASM en definiciones de MATERIALIZED VIEW. #106161 (niyue).
  • Corrige que INTERPOLATE () generara INVALID_WITH_FILL_EXPRESSION cuando las columnas de ORDER BY tenían alias en la lista SELECT con el analizador anterior. #106252 (yakov-olkhovskiy).
  • Las funciones base58Encode, base58Decode y tryBase58Decode ahora respetan max_execution_time y la cancelación de consultas con entradas grandes, y rechazan entradas de más de 10 KB en lugar de ejecutarse durante mucho tiempo. El límite se puede configurar mediante la nueva configuración function_base58_max_input_size (0 lo desactiva). #106428 (alexey-milovidov).
  • Corrige un error que producía resultados incorrectos, por el que WHERE c0 = const no devolvía filas en tablas con ORDER BY f(c0) cuando f(const) se evalúa como NaN; por ejemplo, ORDER BY sqrt(c0) con una constante negativa. El análisis de la clave primaria descartaba incorrectamente todos los gránulos y contaminaba la caché de condiciones de consulta para consultas posteriores. #106507 (groeneai).
  • Se corrigieron resultados incorrectos para SELECT c, count() FROM t WHERE c GROUP BY c en tablas con la _minmax_count_projection implícita, una proyección de agregación explícita o una proyección normal: todos los grupos se reducían a una sola fila con una clave constante y el número total de filas. #106590 (groeneai).
  • Se hizo que FORMAT también se aplique a la salida de EXPLAIN de EXPLAIN ... INSERT ... SELECT ... FORMAT ... cuando SETTINGS precede a FORMAT o el formato de salida es Values. #106686 (alexey-milovidov).
  • Se corrigió un error espurio poco frecuente RESOURCE_ACCESS_DENIED (“Scheduler queue with resource request is about to be destructed”) en una consulta a la que se había concedido acceso a un recurso de carga de trabajo, causado por la reutilización de un objeto de solicitud local al hilo que conservaba el fallo de una solicitud anterior. #106690 (alexey-milovidov).
  • Se corrigieron match, extract, extractAll y countMatches, que devolvían resultados incorrectos para expresiones regulares con secuencias de escape hexadecimales u octales. #106709 (ofeliacode).
  • Se corrigió un desbordamiento por defecto de enteros en el analizador del protocolo de conexión PostgreSQL, donde un mensaje con un campo de longitud inferior a 4 provocaba que size - 4 se desbordara y un resize/ignore de tamaño excesivo. #107485 (uwezkhan).
  • Con enable_analyzer = 1 (el valor predeterminado), al consultar una tabla por su nombre sin calificar cuando solo existe en otra base de datos, ahora se sugiere la tabla correcta; por ejemplo, SELECT * FROM functions muestra Maybe you meant system.functions?. Anteriormente, el nuevo analizador mostraba un error Unknown table expression identifier sin sugerencias, mientras que el analizador anterior ya ofrecía una sugerencia útil. #107550 (groeneai).
  • Se corrigió un aborto del servidor (std::terminate, señal 6) durante el desmontaje de una consulta con plan distribuido (make_distributed_plan = 1) cuando una comprobación de estado de un trabajador no lograba reprogramar la siguiente comprobación (por ejemplo, CANNOT_SCHEDULE_TASK durante el apagado o MEMORY_LIMIT_EXCEEDED). La consulta ahora falla correctamente y el servidor sigue en ejecución. #107575 (groeneai).
  • Se corrigieron resultados incorrectos en consultas distribuidas que seleccionaban columnas ALIAS con una subexpresión común: las columnas podían desalinearse y los valores devolverse en la columna equivocada. #107675 (vdimir).
  • Se corrigió un error lógico Inconsistent AST formatting para una función de ventana sin argumentos dentro de una declaración CODEC o de motor (p. ej., CODEC(cume_dist() OVER (...))); dicha función ahora conserva sus paréntesis para que la consulta supere un ciclo de formato/análisis. #107806 (alexey-milovidov).
  • getClientHTTPHeader ahora se trata correctamente como no determinista, por lo que su resultado ya no se reutiliza incorrectamente en la caché de resultados de consultas. #108029 (alexey-milovidov).
  • Se corrigieron resultados incorrectos al usar SELECT [...] SAMPLE [...] junto con la caché de condiciones de consulta (la configuración use_query_condition_cache = 1, que también es el valor predeterminado). #108488 (groeneai).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK cuando se asigna un alias a un predicado compuesto en GROUP BY y se vuelve a hacer referencia a él, con enable_identifier_resolve_cache habilitado (de forma predeterminada). La optimización optimize_and_compare_chain no era idempotente y un nodo resuelto compartido acumulaba un conjuncional transitivo duplicado. #108553 (groeneai).
  • Corrige el error NUMBER_OF_COLUMNS_DOESNT_MATCH cuando una subconsulta sobre una tabla Distributed lee dos o más columnas ALIAS que se expanden a la misma expresión (por ejemplo, a1 String ALIAS toString(x), a2 String ALIAS toString(x)) y alimenta una consulta externa, p. ej., SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai).
  • Corrige el error UNKNOWN_IDENTIFIER en ALTER TABLE ... DROP COLUMN cuando otra columna tiene una expresión DEFAULT o MATERIALIZED que define y hace referencia a un alias insertado en línea. #109374 (alexey-milovidov).
  • Corrige que system.tables omitiera silenciosamente bases de datos para usuarios con permisos por base de datos cuando la consulta solo lee las columnas name/database. Introducido en 26.2. #109723 (samay-sharma).
  • Corrige el error UNKNOWN_IDENTIFIER en columnas calificadas con el nombre de una CTE (cte_name.column) en consultas almacenadas en vistas cuando el analizador está habilitado. #111386 (novikd).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK cuando una consulta FINAL filtra por una columna de la clave de ordenación que no figura en la lista SELECT y el filtro se mueve a PREWHERE (por ejemplo, SELECT s FROM t FINAL WHERE k GROUP BY s con optimize_move_to_prewhere_if_final = 1). #111721 (groeneai).
  • Corrige el inicio del servidor y el fallo de ATTACH con WITH RECURSIVE is not supported with the old analyzer en una vista con una CTE recursiva cuando enable_analyzer = 0 es el valor predeterminado del servidor. #112784 (evillique).
  • Corrige la propagación de los ajustes de consulta y el manejo de NULL en accurateCastOrDefault. #114912 (alexey-milovidov).
  • Corrige que read_rows, read_bytes, written_rows y written_bytes en system.query_thread_log informaran un total acumulado durante la vida útil del hilo en lugar de los valores de la consulta registrada. Se veían afectadas las filas de los hilos de larga duración agrupados, en particular el hilo HTTPHandler que inicia la consulta. #115596 (groeneai).

Correcciones de MergeTree y de almacenamiento

  • Ahora se pueden eliminar las partes separadas con el sufijo tryN. #58957 (antaljanosbenjamin).
  • Se corrige una excepción MULTIPLE_EXPRESSIONS_FOR_ALIAS en consultas con alias de proyección duplicados (por ejemplo, SELECT *, day + 365 AS day) dentro de subconsultas anidadas al ejecutarse con réplicas paralelas. #80310 (alexey-milovidov).
  • Se corrigió la selección incorrecta del códec de compresión para partes de MergeTree cuando se configuraba explícitamente el ajuste a nivel de tabla default_compression_codec. Las partes escritas durante las inserciones, las fusiones y para las proyecciones usaban el códec predeterminado global del servidor en lugar del ajuste a nivel de tabla. Ahora también se cubre la parte vacía generada por una mutación que elimina todos los datos. #101784 (Onyx2406).
  • Se corrigen errores MULTIPLE_EXPRESSIONS_FOR_ALIAS generados por réplicas remotas al ejecutar consultas que hacen referencia a alias de proyección en PREWHERE / WHERE / HAVING / QUALIFY (p. ej., SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) o SELECT * sobre autojoins con nombres de columna coincidentes, con réplicas paralelas y parallel_replicas_local_plan = 0. #103806 (groeneai).
  • Se corrige una parte de parche dañada tras ejecutar ALTER TABLE ... DROP PARTITION ID 'patch-...' seguido de DETACH/ATTACH TABLE. Anteriormente, la parte de cobertura vacía se escribía sin partition.dat ni source_parts.dat, lo que provocaba una entrada broken-on-start_patch-... en system.detached_parts después del siguiente attach o reinicio del servidor. #104353 (groeneai).
  • Se corrigió el reemplazo silencioso de datos por valores predeterminados cuando ALTER TABLE ... RENAME COLUMN se ejecutaba simultáneamente con OPTIMIZE TABLE ... FINAL u otra fusión en segundo plano. #104822 (groeneai).
  • Se corrigieron dos casos de LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized generados por consultas con enable_materialized_cte: (1) una CTE materializada reutilizada y filtrada mediante IN (subquery) sobre otra CTE materializada, y (2) una CTE materializada a la que se hace referencia tanto directamente como dentro de un filtro WHERE ... IN (...) que accede a una clave primaria de MergeTree mediante una subconsulta IN anidada. EXPLAIN sobre las mismas consultas también se veía afectado, ya que los errores se producían durante la optimización del plan. #105041 (novikd).
  • Con skip_cache_on_disk_failure = 1, las consultas ahora continúan cuando FileCache no puede crear un directorio de caché en disco. El fallo se registra en lugar de hacer que falle la consulta. #105250 (Diskein).
  • Se corrigió la excepción de error lógico Mutation of Memory table produced incomplete output generada por ALTER TABLE <memory_table> APPLY PATCHES y ALTER TABLE <memory_table> APPLY DELETED MASK. Las tablas Memory no poseen partes de parche ni máscaras de eliminación, por lo que ambos comandos ahora se tratan correctamente como operaciones sin efecto. #105286 (groeneai).
  • Se corrige CANNOT_CONVERT_TYPE para Merge sobre Merge sobre Distributed con distributed_group_by_no_merge=1. #105330 (azat).
  • Se corrigió que singleValueOrNullMerge devolviera un valor concreto en lugar de NULL al fusionar un estado que ya había observado varios valores distintos. #105734 (fallintoplace).
  • Corrige un fallo en la función de tabla mongodb, el almacenamiento MongoDB y la fuente de diccionarios MongoDB cuando el nombre de la colección está vacío o contiene bytes NUL. #105776 (Algunenano).
  • Corrige el rechazo de ALTER TABLE ... CLEAR COLUMN para las columnas explícitas columns_to_sum de SummingMergeTree y CoalescingMergeTree. #105785 (antonio2368).
  • Corrige errores UNKNOWN_DATABASE al crear una vista parametrizada cuyo nombre de base de datos se proporciona mediante un parámetro de consulta. #105799 (groeneai).
  • Restaura la optimización de lectura en orden para las tablas Merge al usar el analizador. #105867 (KochetovNicolai).
  • Corrige las mutaciones UPDATE y DELETE en tablas Iceberg a las que se accede mediante un catálogo, incluidas las actualizaciones y eliminaciones repetidas que no afectan a ninguna fila. #106111 (scanhex12).
  • Corrige que optimize_skip_unused_shards no se aplicara (y que force_optimize_skip_unused_shards fallara erróneamente) al consultar una tabla Distributed a través de una tabla Merge o de la función de tabla merge, con el predicado aplicado sobre ellas. #106250 (KochetovNicolai).
  • Corrige un error lógico Column identifier ... is already registered cuando un predicado de mutación (DELETE/UPDATE) contiene una subconsulta IN/EXISTS que lee de una expresión de tabla predeterminada anidada en otra subconsulta. #106414 (alexey-milovidov).
  • Corrige resultados incorrectos esporádicos en consultas ORDER BY ... DESC al leer partes anchas en orden inverso con read_in_order_use_virtual_row_per_block = 1 y un valor pequeño de max_block_size. #106429 (vdimir).
  • Corrige una excepción Bad cast exception en diccionarios Redis que usan STORAGE_TYPE 'simple' con una disposición cache/direct y una única clave de cadena (compleja); estos diccionarios ahora funcionan y las claves compuestas con almacenamiento simple informan de un error claro. #106501 (vdimir).
  • Corrige la excepción Mutation of Memory table produced incomplete output generada por comandos ALTER TABLE <memory_table> que no tienen efectos sobre los datos por fila en un motor Memory, incluidos APPLY PATCHES, APPLY DELETED MASK, MATERIALIZE STATISTICS, MATERIALIZE INDEX, MATERIALIZE PROJECTION y REWRITE PARTS. Las tablas Memory no poseen estas estructuras, por lo que estos comandos ahora se tratan como operaciones sin efecto. #106621 (groeneai).
  • Corrige el fallo que impedía iniciar el servidor con Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0) cuando una tabla MergeTree tiene una parte de índice de omisión con cero gránulos y un archivo de marcas no vacío en disco. #106675 (groeneai).
  • Corrige el caso en el que las réplicas paralelas no se aplicaban a una vista con UNION debido a una tabla vacía en la UNION. #106900 (devcrafter).
  • Corrige una excepción de error lógico conflicted_part_name.has_value() que podía producirse durante una inserción síncrona en una tabla ReplicatedMergeTree cuando el bloque insertado se había deduplicado por completo y ya se había eliminado el nodo de deduplicación de la parte en conflicto (por ejemplo, mediante un DROP PARTITION simultáneo). #107026 (groeneai).
  • Corrige el poco frecuente LOGICAL_ERROR “Attempt to release query context that does not exist” y el fallo del servidor asociado al leer tablas MergeTree mediante un disco de caché del sistema de archivos creado con enable_filesystem_query_cache_limit = 1. #107028 (groeneai).
  • Corrige un fallo del servidor al mover una parte vacía a un disco plain_rewritable (por ejemplo, con ALTER TABLE ... MOVE PARTITION ... TO DISK para una parte vacía conservada debido a remove_empty_parts = 0). #107040 (groeneai).
  • Corrige una excepción Logical error: Too large size passed to allocator al ejecutar INSERT en una tabla MergeTree cuando adaptive_write_buffer_initial_size se establece en un valor extremadamente grande. El tamaño inicial del búfer de escritura adaptativo ahora se limita al tamaño máximo del búfer. #107104 (groeneai).
  • Corrige lotes de ALTER TABLE ... ON CLUSTER que combinan MODIFY SETTING/RESET SETTING con un cambio de comentario (por ejemplo, MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) y que se aplicaban solo en la réplica líder, dejando las demás réplicas desincronizadas. También corrige que un MODIFY COLUMN ... COMMENT posicional o SETTINGS por columna se clasificara erróneamente como un cambio local de metadatos que solo afecta a comentarios, lo que omitía la reordenación de columnas de los metadatos replicados y podía provocar INCOMPATIBLE_COLUMNS al reiniciar la réplica. #107142 (groeneai).
  • Corrige el error Argument ... of GROUPING function is not a part of GROUP BY clause en consultas que usan la función grouping con la configuración group_by_use_nulls habilitada. #107206 (KochetovNicolai).
  • Corrige consultas de actualización ligera UPDATE con réplicas paralelas heredadas habilitadas en tablas MergeTree no replicadas. #107246 (groeneai).
  • Corrige una posible excepción de error lógico en SYSTEM SYNC DATABASE REPLICA … STRICT y hace que el modificador STRICT surta efecto para las réplicas de bases de datos. #107344 (PedroTadim).
  • Corrige Logical error: 'Duplicate announcement received for replica number N', que podía producirse con réplicas paralelas cuando una subconsulta escalar contenía subconsultas anidadas que leían la misma tabla. #107381 (groeneai).
  • Corrige la pérdida silenciosa de datos en MergeTree simple (no replicado) al ejecutar REPLACE PARTITION, MOVE PARTITION, DETACH PARTITION o DETACH PART en una partición que aún tiene parches de actualización ligera UPDATE sin aplicar. Estas operaciones ahora rechazan el comando (como ya hace ReplicatedMergeTree) e indican que se use ALTER TABLE ... APPLY PATCHES, en lugar de revertir silenciosamente la actualización confirmada. #107386 (groeneai).
  • Corrige que MaterializedPostgreSQL dejara de replicar silenciosamente los cambios cuando el nombre de la base de datos o de la tabla de PostgreSQL contiene letras mayúsculas (el consumidor de pgoutput solicitaba un nombre de publicación sin comillas y en minúsculas que no coincidía con la publicación que conservaba las mayúsculas). #107423 (alexey-milovidov).
  • Corrige el error THERE_IS_NO_COLUMN cuando optimize_if_transform_strings_to_enum = 1 y la expresión if/transform optimizada sobre literales de cadena es una clave de GROUP BY u ORDER BY en una tabla Distributed o con réplicas paralelas. #107455 (groeneai).
  • Se corrigió un problema por el que SELECT ... FINAL y OPTIMIZE TABLE ... FINAL devolvían filas duplicadas después de que CREATE TABLE ... CLONE AS, ATTACH PARTITION ... FROM o MOVE PARTITION ... TO TABLE adoptaran partes de un MergeTree simple en un ReplacingMergeTree, SummingMergeTree o AggregatingMergeTree. El nivel de fusión de la parte adoptada ahora se restablece a 0 cuando los motores de origen y destino son distintos, de modo que el destino la deduplica en la siguiente fusión. #107481 (groeneai).
  • Ahora se realiza un mejor seguimiento de la cancelación de consultas mientras se espera el cuórum en ReplicatedMergeTree. #107513 (nickitat).
  • Contabiliza en el rastreador de memoria la memoria utilizada por la biblioteca rapidjson (en prettyPrintJSON, JSONMergePatch y el analizador JSON de rapidjson), de modo que las entradas patológicas se rechacen con MEMORY_LIMIT_EXCEEDED en lugar de asignar memoria sin límite. #107555 (Algunenano).
  • Corrige un Logical error: Stream ... variant_discr ... is not found que podía producirse al fusionar o leer una parte de MergeTree generada por una mutación de una tabla con una columna Dynamic. #107562 (alexey-milovidov).
  • Corrige un LOGICAL_ERROR (updateFormatPrewhereInfo called more than once) generado al consultar una fuente file(), url() o de almacenamiento de objetos con un PREWHERE y un WHERE explícitos mientras optimize_prewhere_after_pushdown estaba habilitado. #107568 (groeneai).
  • Se corrigió una excepción del servidor (error lógico Digest does not match) que podía producirse con RENAME TABLE, RENAME DATABASE o CREATE OR REPLACE TABLE que involucraran una tabla TimeSeries dentro de una base de datos Replicated. Ahora se admite cambiar el nombre de una tabla TimeSeries. #107583 (groeneai).
  • Corrige DROP TABLE de una tabla TimeSeries en una base de datos Replicated, que anteriormente dejaba tablas internas sin eliminar y la tarea de eliminación en segundo plano se reintentaba indefinidamente (DROP TABLE ... SYNC se quedaba bloqueado). #107604 (groeneai).
  • Se corrigieron dos vulnerabilidades de recorrido de rutas en el protocolo de obtención de partes replicadas que podían permitir a una réplica maliciosa escribir archivos fuera del directorio de la parte. #107606 (antonio2368).
  • Se corrigió un problema por el que ALTER TABLE ... REPLACE PARTITION en una tabla MergeTree simple restauraba las partes reemplazadas tras reiniciar el servidor, lo que hacía que la tabla devolviera tanto las filas de reemplazo como las filas antiguas reemplazadas. #107623 (groeneai).
  • Se corrigió un LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”) al insertar en una vista materializada cuya tabla de destino TO declara una columna con un Enum más amplio que el producido por el SELECT de la vista. La ampliación válida de Enum ahora se aplica en la ruta de inserción de la vista materializada, igual que en un INSERT ... SELECT directo. #107648 (groeneai).
  • Se corrige el error NUMBER_OF_COLUMNS_DOESNT_MATCH al consultar una tabla Distributed (o usar réplicas paralelas) que tiene varias columnas ALIAS expandidas a la misma expresión y se hace referencia a ellas junto con ORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy).
  • Un error transitorio al actualizar las partes de datos de una tabla de solo lectura ya no detiene permanentemente la tarea de actualización en segundo plano. #108034 (alexey-milovidov).
  • Ahora se respeta index_granularity_bytes para las columnas de estado de AggregateFunction. Anteriormente, se ignoraba el límite de bytes por gránulo para estas columnas (por ejemplo, los estados uniqExact en tablas AggregatingMergeTree y proyecciones de agregación), lo que generaba gránulos mucho mayores que el límite configurado y aumentaba la amplificación de lectura y el uso de memoria durante las consultas. #108297 (groeneai).
  • Se corrigió que insert_quorum = 'auto' no rechazara las inserciones de inmediato cuando había menos de la mayoría de las réplicas activas. Estas inserciones ahora fallan inmediatamente con TOO_FEW_LIVE_REPLICAS, en lugar de escribir una parte local y agotar posteriormente el tiempo de espera con UNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey).
  • Se corrigió un bloqueo del servidor durante inserciones asíncronas con deduplicación cuando optimize_on_insert deja vacío el bloque insertado (por ejemplo, filas cuya suma es cero en SummingMergeTree). #109229 (Diskein).
  • Se corrige la pérdida de datos de una columna sin expresión predeterminada cuando una fusión se ejecuta simultáneamente con ALTER TABLE ... RENAME COLUMN, o cuando los únicos valores de la columna provienen de una actualización ligera UPDATE. La columna podía eliminarse de la parte fusionada, por lo que todos sus valores se leían como NULL. #109356 (groeneai).
  • Se corrigió una terminación poco frecuente del servidor al fusionar estados de agregación de uniqExact en paralelo con GROUPING SETS, ROLLUP o CUBE. #109389 (groeneai).
  • Se corrigió que las fusiones de rollup se reprogramaran indefinidamente. #109410 (Michicosun).
  • Se corrigieron las mutaciones GROUP BY en tablas con columnas virtuales materializadas o persistentes. #109532 (Michicosun).
  • Se corrigió el error UNKNOWN_IDENTIFIER: Missing columns: '_block_offset' al ejecutar ALTER TABLE ... MATERIALIZE INDEX sobre el índice minmax implícito creado por add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column en una tabla con partes recién insertadas (de nivel 0). Ahora el índice se crea para esas partes en lugar de producir un error. #110236 (groeneai).
  • Se corrigió que una réplica de almacenamiento de objetos de solo lectura (un disco configurado con read_only = true) no detectara partes nuevas mediante refresh_parts_interval, y que table_disk = true fuera rechazado en dicho disco con “table_disk is not supported for non-ObjectStorage disks”. #110460 (jkartseva).
  • Se corrige un LOGICAL_ERROR (“No set is registered for key”) en ALTER TABLE ... DROP COLUMN, mutaciones ALTER TABLE ... DELETE/UPDATE y DELETE ligero, en tablas con una columna ALIAS cuya expresión usa un operador IN (incluso a través de otra columna ALIAS). #111039 (PedroTadim).
  • Corrige casos en los que no se aplicaba una política de filas a las proyecciones de MergeTree durante la ejecución de consultas. #112329 (yariks5s).
  • Corrige el error lógico ReadBufferFromEncryptedFile: Wrong file position al leer una parte Compact de un disco encrypted con E/S directa, que hacía que las fusiones quedaran bloqueadas en system.replication_queue. #112943 (alexey-milovidov).
  • Corrige la lectura de la base de datos interna _temporary_and_external_tables mediante la función de tabla merge y el motor de tabla Merge, que permitía que una sesión leyera las tablas temporales de otras sesiones y usuarios, y provocaba una excepción en la ruta del analizador antiguo. Ahora, una expresión regular de bases de datos omite esa base de datos y se prohíbe mencionarla explícitamente, al igual que acceder a ella directamente. #113224 (alexey-milovidov).
  • Corrige el problema por el que una política de filas que contenía una subconsulta escalar se evaluaba una sola vez y, tras leer la tabla mediante una tabla Merge, se reutilizaba indefinidamente. La condición de la política analizada se almacena en caché y se comparte entre todas las consultas; leerla mediante Merge reescribía la expresión almacenada en caché in situ, lo que también provocaba una carrera de datos entre consultas simultáneas que usaban la misma política. #113563 (alexey-milovidov).
  • Corrige errores CANNOT_CONVERT_TYPE al leer una tabla Merge que contiene una tabla Distributed con réplicas paralelas de clave personalizada. #113742 (alexey-milovidov).
  • Corrige Logical error: No set is registered for key ... al leer mediante una tabla Merge cuyo hijo declara una columna ALIAS que contiene IN y cuyos hijos difieren en el valor predeterminado de esa columna. #113757 (groeneai).
  • Corrige una omisión de política de filas por la que la función de tabla mergeTreeIndex exponía los valores de la clave primaria y del índice minmax de las filas ocultas por una política de filas SELECT en la tabla de origen; ahora se prohíbe leer mergeTreeIndex para una tabla con una política de filas. #115304 (yariks5s).

Correcciones de tipos de datos y de serialización

  • Se corrigió una excepción en ARRAY JOIN al usar tipos numéricos LowCardinality. #91784 (Ergus).
  • Se corrigió la creación silenciosa de columnas NOT NULL como Nullable cuando data_type_default_nullable = 1 y la tabla se crea en una base de datos Replicated o mediante ON CLUSTER. #97572 (xiaohuanlin).
  • Se corrigió el número incorrecto de filas devuelto por una consulta a una MaterializedView con query_plan_enable_optimizations = 0 cuando la vista asigna una columna integer a una columna Bool. #100692 (Maximus5).
  • Se corrigieron metadatos incoherentes de partes tras mutaciones de columnas con serializaciones no predeterminadas. #102817 (korowa).
  • Se corrigió la propagación de NULL al leer subcolumnas extraídas de columnas Nullable(Tuple(...)). Por ejemplo, para tup Nullable(Tuple(s Nullable(String))), SELECT tup.s ahora devuelve correctamente NULL en las filas donde la tupla externa es NULL, en lugar de valores no válidos. Esto abarca todos los tipos de elementos que pueden representar NULL: Nullable, Dynamic, Variant y LowCardinality(Nullable(...)). #102942 (nihalzp).
  • Se corrigió que recursiveRemoveLowCardinality eliminara nombres personalizados de tipos geométricos (p. ej., LineString frente a Ring, MultiLineString frente a Polygon), lo que provocaba una interpretación incorrecta del tipo geométrico. #103041 (jh0x).
  • Se corrigió que dictGetOrNull sobrescribiera silenciosamente otras columnas de la proyección SELECT con NULL al invocarse con una columna clave Nullable cuyos valores no están presentes en el diccionario. La función modificaba in situ un mapa de valores nulos con alias de entrada; ahora realiza una copia profunda de la columna de resultados antes de modificarla. #104327 (groeneai).
  • Se corrigió una excepción en consultas distribuidas que contenían una tupla IN vacía en la clave de segmentación cuando optimize_skip_unused_shards_rewrite_in está habilitado. #104966 (alexey-milovidov).
  • Se corrigió la estimación de selectividad de PREWHERE mediante estadísticas count-min para columnas Float32, incluidas comparaciones con literales Float64. #105047 (hanfei1991).
  • Se corrigió ILLEGAL_TYPE_OF_ARGUMENT al fusionar los estados de agregación de quantileExactWeightedInterpolated, quantileDD o quantilePrometheusHistogram con sus equivalentes plurales quantilesXxxMerge (y viceversa). Las variantes singular y plural de estas tres familias de cuantiles comparten el mismo estado de agregación interno, pero no figuraban en la tabla interna de asignación de nombres, por lo que se rechazaban tanto la fusión de estados entre funciones como la optimización de fusión de funciones para estas familias. #105189 (groeneai).
  • Corrige resultados incorrectos de toStartOfWeek, toLastDayOfWeek, toMonday, toStartOfMonth, toLastDayOfMonth, toStartOfQuarter y toStartOfYear para argumentos Date32 y DateTime64 cuyo resultado queda fuera del rango de Date: en lugar de desbordarse a fechas arbitrarias, los resultados anteriores a 1970-01-01 ahora se limitan a 1970-01-01 y los posteriores a 2149-06-06 se limitan a 2149-06-06. Esto también corrige resultados de consulta incorrectos (partes y gránulos descartados incorrectamente) cuando estas funciones se usaban en WHERE sobre una clave Date32 o DateTime64 que contenía valores fuera de rango. #105244 (yariks5s).
  • Corrige un error lógico en arrayRemove cuando el primer argumento es un array de Variant cuyas alternativas son incompatibles con el tipo del segundo argumento y variant_throw_on_type_mismatch está deshabilitado. La función ahora considera que la comparación “nunca es igual” y devuelve el array sin cambios, en lugar de provocar un fallo de assertTypeEquality en el servidor. #105248 (groeneai).
  • Corrige que toFloat64/toUInt32/toString/etc. en Dynamic ignoraran cast_keep_nullable. #105467 (Avogar).
  • Corrige un segfault del servidor en uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (y cadenas de combinadores similares sobre uniq) cuando se usan con GROUP BY ... WITH ROLLUP, WITH CUBE o WITH TOTALS y un argumento Nullable. #105470 (groeneai).
  • Corrige que toStartOfMillisecond y toStartOfMicrosecond devolvieran un resultado desviado casi un segundo para valores DateTime64 negativos (anteriores a la época), y corrige el desbordamiento de enteros con signo detectado por UndefinedBehaviorSanitizer en toStartOfSecond, toStartOfMillisecond y toStartOfMicrosecond para entradas DateTime64 cercanas a INT64_MIN. #105482 (groeneai).
  • Corrige la finalización del servidor al deserializar estados singleValueOrNull para JSON. #105535 (Avogar).
  • Corrige que se ignorara input_format_try_infer_datetimes durante la inserción en datos compartidos en JSON. #105544 (Avogar).
  • Corrige el desbordamiento circular de DateTime para valores fuera de rango en JSONExtract y durante la deserialización de texto. #105551 (Avogar).
  • Corrige un fallo al insertar tuplas de distintos tamaños en la misma cláusula VALUES en una columna String. #105582 (Avogar).
  • Corrige el error NOT_IMPLEMENTED en toString a partir de DateTime con Timezone que contiene un valor NULL. #105587 (yariks5s).
  • Añade validación para columnas Dynamic aplanadas malformadas en la entrada Native. #105666 (Avogar).
  • Corrige un LOGICAL_ERROR (Unexpected return type from if) generado durante la planificación de consultas para expresiones if cuyo tipo de resultado es Variant y cuya segunda o tercera rama es un if con condición constante sobre un literal UInt64 que cabe en Int64. #105680 (groeneai).
  • Corrige Bad get: has Decimal32, requested Decimal128 en sumMap y sumMapWithOverflow sobre una columna Nested(... Nullable(Decimal(P, S))) cuando se serializa el estado de agregación (p. ej., réplicas paralelas, sumMapState mediante un formateador de estado binario o agregación externa). #105816 (groeneai).
  • Corrige los errores Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality al usar apply_mutations_on_fly = 1 en una tabla con mutaciones UPDATE/DELETE pendientes aplicadas sobre la marcha, encoladas antes de una mutación ALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano).
  • Corrige el error Cannot find column en consultas distribuidas con un filtro IN Array(...) al usar el nuevo analizador. #105894 (KochetovNicolai).
  • Corrige una terminación del servidor cuando una columna con STATISTICS se modificaba a Nullable mientras otro ALTER la eliminaba simultáneamente. #105917 (groeneai).
  • Rechaza bytes IntervalKind fuera de rango durante la decodificación de tipos de RowBinaryWithNamesAndTypes (input_format_binary_decode_types_in_binary_format = 1) con un error INCORRECT_DATA claro, en lugar de construir un DataTypeInterval con un tipo no válido que posteriormente podría provocar comportamiento indefinido en rutas de hash. #106261 (groeneai).
  • Lee la subcolumna ‘null’ como una ruta JSON en Nullable(JSON), en lugar de como mapa de valores nulos. #106295 (Avogar).
  • Corrige una lectura fuera de límites en sipHash64Keyed, sipHash128Keyed y sipHash128ReferenceKeyed al calcular el hash de una columna cuyos arrays están todos vacíos y cuya clave no es constante. #106355 (Algunenano).
  • Corrige un error que impedía a los usuarios utilizar subconsultas escalares en el primer argumento de IN cuando el segundo argumento es una tupla no constante. #106610 (yariks5s).
  • Corrige que se ignorara session_timezone al serializar columnas LowCardinality(DateTime) en formatos de texto (CSV, TSV, JSONEachRow, etc.). Anteriormente, tras la primera escritura de una columna LowCardinality(DateTime) en un servidor, todas las consultas posteriores que escribían esa columna mostraban la cadena de hora local en la primera zona horaria detectada, independientemente de session_timezone. #106634 (groeneai).
  • Corrige una terminación del servidor en if y multiIf cuando la condición es un valor constante Nullable(Nothing). #106678 (groeneai).
  • Revierte un cambio que hacía que sumMap y el combinador -Map rechazaran tipos de valores numéricos con nombres personalizados (como SimpleAggregateFunction(sum, T) y Bool) con ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, lo que interrumpía agregaciones que funcionaban anteriormente. #106729 (fm4v).
  • Corrige una excepción Bad cast al descartar partes mediante estadísticas MinMax cuando una columna clave es LowCardinality y la constante del predicado es LowCardinality(Nullable(...)). #106793 (groeneai).
  • Corrige un error lógico en parseDateTime con bytes de entrada no ASCII. #106856 (Avogar).
  • Corrige la excepción THERE_IS_NO_COLUMN en consultas distribuidas que usan la optimización optimize_rewrite_aggregate_function_with_if cuando el argumento de la función de agregación requiere una conversión al tipo Nullable. #106908 (yakov-olkhovskiy).
  • Corrige un desbordamiento de enteros con signo (comportamiento indefinido) en arrayLevenshteinDistanceWeighted y arraySimilarity cuando los arrays de pesos contienen valores enteros grandes. La distancia ponderada ahora se acumula en un entero de mayor tamaño para pesos enteros, por lo que los valores de peso grandes ya no se desbordan y conservan la precisión. #106934 (groeneai).
  • Corrige un fallo (Source column is not Map / SIGSEGV) al fusionar bloques ordenados que contienen una columna Variant con una variante Map cuyo orden de almacenamiento local difiere del orden global. #107011 (groeneai).
  • Corrige el error TYPE_MISMATCH (“Cannot convert string … to type …”) en consultas ORDER BY <numeric column> ... LIMIT n cuando la materialización diferida situaba otra columna antes de la columna de ordenación. El umbral top-K ahora se lee de la columna de ordenación correcta. #107060 (groeneai).
  • Corrige un ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a compuesto que reutiliza un nombre de columna liberado (un “intercambio”) entre columnas de distintos tipos. La parte materializada registraba el tipo de columna incorrecto, por lo que un SELECT posterior fallaba con Conversion between numeric types and IPv6 is not supported (o se interrumpía al cargar la parte en compilaciones de depuración). #107064 (groeneai).
  • Corrige resultados no deterministas de la función roundDown cuando el array de límites contiene NaN. El mismo valor de entrada podía devolver un límite finito o NaN según las filas circundantes del lote. Los límites NaN ahora se ignoran, por lo que el resultado depende únicamente de los límites finitos. #107065 (groeneai).
  • Corrige que quantileTDigest y quantileTDigestWeighted generaran DECIMAL_OVERFLOW para argumentos Date y DateTime cuando el cuantil interpolado es fraccionario, pero está dentro del rango (por ejemplo, quantileTDigestWeighted(date, weight) con valores que caben todos en el tipo). El resultado fraccionario ahora se trunca al tipo de resultado, de forma coherente con quantilesTDigestWeighted; los valores realmente fuera de rango siguen generando un error. #107066 (groeneai).
  • Corrige el truncamiento silencioso de valores enteros fuera de rango en definiciones de tipo Enum8/Enum16. Enum8('a' = 200) ahora genera ARGUMENT_OUT_OF_BOUND en lugar de crear silenciosamente Enum8('a' = -56). #107081 (groeneai).
  • Corrige el orden incorrecto de las filas (y un LOGICAL_ERROR “Rows are not sorted with permutation” en compilaciones de depuración) en consultas ORDER BY ... LIMIT con varias columnas que ordenan por columnas Nullable cuando varias filas empatan en las columnas iniciales. #107094 (groeneai).
  • Corrige Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple' al leer una columna Array(Tuple(...)) cuyo valor se completa con valores predeterminados, por ejemplo, después de ALTER TABLE ... ADD COLUMN o de aplicar sobre la marcha una mutación ALTER TABLE ... CLEAR COLUMN sin finalizar. #107232 (groeneai).
  • Rechaza usos no compatibles de columnas AggregateFunction en expresiones TTL al ejecutar CREATE TABLE (por ejemplo, TTL toDateTime(state)) en lugar de fallar posteriormente durante la ejecución de TTL con ILLEGAL_TYPE_OF_ARGUMENT. Esto también abarca estados incluidos en alternativas de Variant y valores Dynamic. Los consumidores válidos que admiten estados, como finalizeAggregation, siguen aceptándose. #107366 (Ria-K912).
  • Corrige arrayResize con un argumento de tamaño Decimal: ahora el tamaño se interpreta según su valor real (por ejemplo, arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) devuelve un elemento) en lugar de según su representación interna sin escalar. #107389 (alexey-milovidov).
  • Corrige LOGICAL_ERROR: Unexpected return type from materialize (y errores similares de incompatibilidad de tipos) al usar apply_mutations_on_fly = 1 en una tabla con un UPDATE pendiente aplicado sobre la marcha cuya columna de destino también se lee como entrada de función en un UPDATE anterior aplicado sobre la marcha, antes de una mutación ALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai).
  • Corrige la conversión silenciosa de valores NULL en cadenas vacías al insertar datos Arrow/ORC en una columna LowCardinality(Nullable(…)). Se trataba de una regresión introducida en la versión 26.5. #107532 (Ergus).
  • Corrige un LOGICAL_ERROR (“Input nodes size mismatch in dag”) cuando una consulta con make_distributed_plan = 1 realiza una unión mediante una clave envuelta en una función y ambos lados no tienen un tipo común (por ejemplo, ON intDiv(-1, t1.key) = t2.key con una clave derecha UInt64). #107701 (groeneai).
  • Corrige el cálculo de hashes incorrectos en la deduplicación de inserciones para columnas String y Array con la configuración de servidor insert_deduplication_version = new_unified_hash: las inserciones idénticas podían no deduplicarse porque el hash de deduplicación dependía de la posición de la fila dentro del bloque insertado. #107915 (CheSema).
  • Corrige una terminación del servidor en has al buscar en un Map con claves Dynamic usando un argumento LowCardinality. #107956 (groeneai).
  • Corrige una regresión de rendimiento en subcolumnas Map usadas con PREWHERE. #107988 (Avogar).
  • Corrige un error lógico al convertir una columna Dynamic o Variant anidada en una Tuple a un tipo de elemento no Nullable con accurateCastOrNull o accurateCastOrDefault. #108061 (alexey-milovidov).
  • Corrige una excepción de error lógico Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t> cuando una consulta LIKE lee de un índice text mediante la ruta alternativa de lectura directa en una columna almacenada de forma dispersa. #108068 (groeneai).
  • Corrige un LOGICAL_ERROR (“Unexpected return type from if”) al leer una columna con apply_mutations_on_fly = 1 después de ejecutar ALTER UPDATE col = ... WHERE <cond> con una condición no constante o falsa, seguido de ALTER MODIFY COLUMN col <new type>. #108128 (groeneai).
  • Corrige el signed integer overflow (comportamiento indefinido) en dateDiff con las unidades hour y minute para valores extremos de DateTime64 próximos a los límites del rango de Int64. #108229 (groeneai).
  • Corrige una excepción del servidor (Logical error en IColumn::insertFrom) al convertir un Array(Dynamic) o Array(Variant) a QBit con accurateCastOrNull, por ejemplo, accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai).
  • Corrige que parseDateTimeBestEffort con zona horaria genere CANNOT&#95;PARSE&#95;DATETIME en filas NULL de toString(Nullable(DateTime64)). #108310 (yariks5s).
  • Corrige un bloqueo del servidor (desbordamiento de pila) provocado por expresiones muy anidadas como [[[ ... ]]] o array(array( ... )) cuando max_parser_depth se establece en un valor elevado. #108493 (Algunenano).
  • Corrige una proyección SELECT * que devolvía el valor predeterminado del tipo de una columna (por ejemplo, 0) en lugar de su valor DEFAULT (por ejemplo, -1) al leer una columna añadida con ALTER TABLE ... ADD COLUMN ... DEFAULT después de crear la proyección. Las lecturas de la tabla base ya eran correctas; solo se veían afectadas las lecturas atendidas por la proyección, hasta que se reconstruía. #108569 (tiandiwonder).
  • Corrige la desactivación silenciosa de la poda de particiones y de clave primaria cuando una columna de clave LowCardinality(FixedString) (o LowCardinality(Nullable(FixedString))) estaba envuelta en una función de la clave, por ejemplo, PARTITION BY sipHash64(k) % N con WHERE k = 'literal'. Estas consultas examinaban todas las particiones en lugar de podarlas. #108777 (groeneai).
  • Conserva el orden original de las claves en la serialización de Map por buckets para corregir las operaciones de comparación que dependen de él. #109178 (Avogar).
  • Corrige la inferencia de esquema de los formatos Arrow, ArrowStream, Avro y de los lectores heredados de ORC y Parquet, que devolvía Nullable(Tuple) para columnas struct que admiten valores nulos, aunque el tipo Nullable(Tuple) no está permitido (allow_experimental_nullable_tuple_type está desactivado). DESCRIBE devolvía un tipo que CREATE TABLE rechaza, por lo que la creación de una tabla o la inserción de datos con el esquema inferido fallaba con el error Nullable Tuple type is not allowed. #109185 (nihalzp).
  • Corrige un error por el que los valores DEFAULT de las columnas no se aplicaban en INSERT INTO TABLE FUNCTION (por ejemplo, remote(...) o file(...)) con datos VALUES en línea cuando el propio servidor analiza esos datos (send_table_structure_on_insert_with_inline_data = 0). Un NULL explícito insertado en una columna no Nullable con un DEFAULT se convertía en 0 en lugar del valor predeterminado declarado. Ahora se comporta como un INSERT en una tabla normal y como el protocolo HTTP. #109258 (groeneai).
  • Se corrigió un segfault en groupArrayLastMerge. Ahora se valida la deserialización del estado de la función de agregación, por lo que un estado dañado no provoca accesos fuera de límites. #109485 (mstetsyuk).
  • Se corrigió un segfault en la función de agregación largestTriangleThreeBuckets al rechazar estados dañados de funciones de agregación durante la deserialización. #109492 (mstetsyuk).
  • Se corrigió la lectura de una columna Parquet con un Tuple no anulable cuando el tipo de ClickHouse solicitado lo encapsula en Nullable (p. ej., Nullable(Tuple(...))), que anteriormente fallaba con TYPE_MISMATCH. #109615 (groeneai).
  • El lector nativo de Parquet v3 ahora puede leer una columna struct físicamente anulable (un grupo OPTIONAL de Parquet) como Nullable(Tuple(...)). Anteriormente generaba TYPE_MISMATCH. #109898 (groeneai).
  • Se corrigió un bloqueo del servidor (desbordamiento de pila nativa) al copiar o destruir un literal Array/Tuple/Map/Object profundamente anidado, por ejemplo, en una consulta con un literal muy anidado y un valor elevado de max_parser_depth. #110393 (Algunenano).
  • Se corrigieron resultados incorrectos de IS NULL / IS NOT NULL / count() con optimize_functions_to_subcolumns en una columna convertida en Nullable mediante un ALTER MODIFY COLUMN T de solo metadatos a Nullable(T). En las partes escritas antes de la conversión, la subcolumna .null se rellenaba con el valor predeterminado del tipo de almacenamiento (NULL), en lugar de derivarse de la columna principal físicamente presente, por lo que las filas existentes no nulas se notificaban incorrectamente como NULL. #110584 (groeneai).
  • Se corrigió un LOGICAL_ERROR (“Bad cast from ColumnString to ColumnLowCardinality”) durante el análisis del índice de clave primaria cuando una columna clave LowCardinality está encapsulada en una cadena de CAST anidados que vuelve a introducir LowCardinality, p. ej., WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. En builds de depuración y con sanitizadores, esto abortaba el servidor; en builds de lanzamiento, fallaba la consulta. #111050 (groeneai).
  • Se corrigió la lectura de datos Arrow y ArrowStream con columnas Array o Map anidadas vacías generadas por Apache Arrow Java anterior a la versión 19.0.0 (incluida con Apache Spark), que anteriormente se rechazaban con un error INCORRECT_DATA porque el búfer de desplazamientos era demasiado pequeño. #111101 (Algunenano).
  • Se corrigieron un error lógico Block structure mismatch (en builds de depuración y con sanitizadores) y un error Illegal types of arguments en operaciones de conjuntos sobre columnas compatibles de estado de agregación (p. ej., quantileState y quantilesState(0.9)) anidadas dentro de columnas contenedoras como Tuple, Array, Map, Nullable o Variant. #111191 (alexey-milovidov).
  • Se añadió validación para datos corruptos de índices replicados recibidos a través del protocolo nativo. #112331 (Avogar).
  • Se corrigió una lectura fuera de límites durante la deduplicación de inserciones cuando un INSERT pasa por una vista materializada que cambia el número de filas antes de escribir en una tabla de destino particionada. #112649 (CheSema).
  • Se corrigió una escritura fuera de los límites al leer una columna DECIMAL de Parquet cuyo tipo físico es más ancho que el tipo al que corresponde su precisión declarada; por ejemplo, DECIMAL(9, 2) almacenado físicamente como INT64. Estos archivos Parquet son válidos y otros escritores los generan, pero el lector dimensionaba la columna de destino según la precisión declarada, mientras que el decodificador escribía con el ancho físico, lo que corrompía la memoria. Ahora, al leer este tipo de archivo también se genera DECIMAL_OVERFLOW cuando un valor no cabe en la precisión declarada, en lugar de devolver datos corruptos, y se lee sin pérdida con una indicación de tipo de al menos el ancho del tipo físico. #113046 (groeneai).
  • Se corrigió un fallo por el que ATTACH PARTITION FROM, REPLACE PARTITION, MOVE PARTITION TO TABLE y la adición de una réplica ReplicatedMergeTree fallaban con Tables have different ..., METADATA_MISMATCH o INCOMPATIBLE_COLUMNS en tablas cuyas definiciones se habían escrito con paréntesis redundantes, como PARTITION BY (a), ORDER BY (b), INDEX ix (b * c) TYPE minmax, PROJECTION p (SELECT (b) ...), CONSTRAINT c CHECK (a > 0), TTL (d + INTERVAL 10 YEAR) o DEFAULT (a + 1). #114188 (alexey-milovidov).
  • Se corrige un error por el que una entidad de acceso que contiene una configuración con valor Map, como un perfil de configuración con http_response_headers o additional_table_filters, se almacenaba en un formato que ClickHouse no podía volver a leer, lo que hacía que la entidad no pudiera cargarse nunca tras un reinicio. #114620 (groeneai).
  • Se corrige un error por el que has, indexOf, countEqual, mapContainsKey, mapContainsValue y el acceso por subíndice de Map devolvían “no encontrado” para una aguja constante LowCardinality igual al valor predeterminado del tipo de elemento, como un String vacío o el número cero. #114624 (groeneai).
  • Se corrigieron resultados incorrectos de la optimización trivial de GROUP BY ... LIMIT (configuración optimize_trivial_group_by_limit_query) en consultas con DISTINCT, QUALIFY, funciones de ventana o arrayJoin en la proyección: estos consumen o filtran los grupos después de la agregación, por lo que limitar la agregación a LIMIT + OFFSET claves podía devolver muy pocas filas o valores incorrectos. La optimización ya no se aplica a estas consultas. #114695 (alexey-milovidov).
  • Se corrigieron resultados incorrectos para SELECT count(arrayJoin(arr)) con el valor predeterminado optimize_trivial_count_query = 1. Se devolvía el número de filas almacenadas en lugar del número de elementos del array y, en file() y url(), la consulta devolvía 0. #115227 (groeneai).
  • Se corrigió un error por el que uniq, uniqExact, uniqHLL12 y uniqTheta devolvían un resultado incorrecto para un argumento envuelto en una función inyectiva que oculta la nulabilidad, como uniqExact(tuple(x)) sobre una columna Nullable. La optimización optimize_injective_functions_inside_uniq eliminaba la función envolvente, tras lo cual las filas NULL se omitían en lugar de contarse. #115466 (vdimir).
  • Se permite que los lectores de KeeperMap acepten metadatos compartidos cuando claves primarias equivalentes solo difieren en paréntesis externos redundantes. #115642 (skuznetsov-clickhouse).

Correcciones en los índices de texto y de omisión

  • Corrige un aborto del servidor cuando una consulta usa comparaciones coalesce/ifNull anidadas (p. ej., WHERE coalesce(a, b, coalesce(c, d), e) = const) en una tabla MergeTree con varios índices de omisión minmax y use_skip_indexes_for_disjunctions = 1. La reescritura del índice de omisión de <op>(coalesce(...), const) ahora se aplica recursivamente a los argumentos internos de coalesce, de modo que la RPN de cada índice coincide con la RPN de la plantilla, tal como presupone el código de seguimiento de disyunciones. #103929 (groeneai).
  • Corrige NOT_FOUND_COLUMN_IN_BLOCK, lanzado por ALTER TABLE ... MATERIALIZE INDEX en partes creadas en 25.8 que contienen un índice de omisión sobre una columna añadida mediante un ALTER TABLE ... ADD COLUMN independiente. Durante el recálculo forzado, la mutación ahora lee correctamente todas las columnas requeridas por cada índice de omisión y proyección preexistentes en la parte. #105039 (groeneai).
  • Corrige un subconteo silencioso en consultas SELECT cuando use_query_condition_cache = 1 (valor predeterminado). Una consulta con la forma PREWHERE pk_prefix = X WHERE non_pk IN (...) sobre una columna con un índice de omisión de filtro Bloom contaminaba la QueryConditionCache para el predicado pk_prefix = X, por lo que una posterior consulta inocua SELECT count() ... WHERE pk_prefix = X devolvía un resultado incorrecto, con un conteo inferior al real. Afectaba a todas las versiones 26.x. #105686 (groeneai).
  • Corrige una excepción cuando una consulta de búsqueda vectorial usa un índice vectorial, otro índice de omisión como minmax y use_skip_indexes_on_data_read = 1. #106473 (shankar-iyer).
  • Corrige “Too many marks” en un índice de texto de una parte combinada vacía. #106867 (azat).
  • Corrige resultados incorrectos al consultar una tabla ReplacingMergeTree con FINAL y un filtro en un índice de texto mientras query_plan_optimize_lazy_final estaba habilitado. La optimización diferida de FINAL generaba pasos de lectura que no reproducían la lectura directa desde el índice de texto, por lo que el filtro descartaba todas las filas coincidentes. #106894 (Ergus).
  • Corrige LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) cuando una constante Variant que contiene un miembro LowCardinality se compara con una columna clave cuya expresión de clave es una función determinista no monótona (por ejemplo, un índice de omisión minmax sobre sipHash64(col)). #107111 (groeneai).
  • Corrige resultados incorrectos (a menudo vacíos) de ORDER BY <col> LIMIT n cuando la optimización use_skip_indexes_for_top_k está activa y una parte con un índice de omisión minmax en la columna de ordenación tiene filas eliminadas mediante una eliminación ligera con DELETE. La optimización ya no clasifica el minmax obsoleto de las partes con eliminaciones ligeras por delante de las partes que contienen las filas superiores vigentes. #107320 (groeneai).
  • Corrige que el índice de omisión Set no descarte gránulos de columnas LowCardinality. #107868 (thevar1able).
  • La configuración use_skip_indexes_on_data_read ahora puede revertirse a su valor predeterminado anterior a la versión 26.1 (false) mediante la configuración compatibility, lo que ofrece una alternativa ante una regresión de rendimiento en la que la ruta de lectura de datos impide la poda de rangos de marcas de los índices de omisión minmax/set/bloom_filter. #108330 (egor-click).
  • Se corrigió la lectura directa desde varios índices de texto parcialmente materializados. #108607 (CurtizJ).
  • Se corrigió el problema por el que un índice de texto definido en mapValues(map) o mapKeys(map) no se utilizaba silenciosamente al consultar una tabla a través de una tabla con motor Distributed usando el analyzer. El índice se utilizaba para la tabla local y mediante cluster()/remote(), pero una consulta a través de una tabla con motor Distributed lo omitía (y fallaba con INDEX_NOT_USED al usar force_data_skipping_indices). #109188 (groeneai).
  • Se corrigió un bloqueo del servidor en CREATE HYPOTHETICAL INDEX ... TYPE set (y ngrambf_v1/tokenbf_v1) cuando se omitía el argumento de índice obligatorio. Estas sentencias ahora se rechazan con un error claro. #109294 (groeneai).
  • Se corrigieron resultados incorrectos de las funciones has, mapContainsKey y mapContainsValue con una subcadena vacía cuando había un índice de texto. #110246 (rschu1ze).
  • Se corrigió el error ATTEMPT_TO_READ_AFTER_EOF al fusionar partes con un índice de texto si una de las partes fusionadas estaba vacía, por ejemplo, tras una mutación que eliminaba todas las filas de la parte. #112490 (CurtizJ).
  • Se corrigió un bloqueo en la optimización del plan de consulta cuando una cláusula WHERE contiene una constante de cadena grande con muchos puntos y la tabla tiene un índice de omisión bloom_filter, tokenbf_v1, ngrambf_v1 o text. Al comparar el nombre de una columna de filtro con las columnas del índice JSONAllPaths(...), se enumeraban todas las divisiones del nombre por cada punto, lo que hacía que la creación de condiciones de índices de omisión fuera cuadrática respecto de la longitud de la constante. #113289 (groeneai).
  • Se corrigió el problema por el que ORDER BY ... LIMIT devolvía menos filas de las solicitadas, o incluso ninguna, cuando una política de filas era el único filtro de la consulta y la columna de ordenación tenía un índice de omisión minmax. La optimización top-K restringía la lectura antes de aplicar la política de filas. #114073 (alexey-milovidov).

Correcciones del lago de datos

  • Corrige una excepción de error lógico al leer tablas Iceberg cuya versión de formato se actualizó mediante una herramienta externa (p. ej., Spark). #100407 (alexey-milovidov).
  • Corrige una excepción (LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') al leer tablas Iceberg que contienen archivos de datos ORC con la optimización de PREWHERE habilitada. #101206 (groeneai).
  • Corrige excepciones LOGICAL_ERROR al leer tablas de lago de datos Iceberg o DeltaLake a través de rutas que pueden llegar a la canalización de lectura sin un datalake_table_state fijado, como actualizaciones simultáneas de metadatos de Iceberg o lecturas de merge en tablas DeltaLake. #102033 (groeneai).
  • Corrige el error esporádico Logical error: 'Database <name> not found' de DataLakeConfiguration::getCatalog al cargar una tabla con motor Iceberg dentro de una base de datos normal durante la carga asíncrona de metadatos. #103775 (groeneai).
  • Corrige las lecturas excesivas de metadatos del catálogo y de S3 cuando una sentencia INSERT o DDL hace referencia a una tabla inexistente en una base de datos de catálogo DataLake con show_data_lake_catalogs_in_system_tables habilitado. La ruta de sugerencias para errores tipográficos cargaba los metadatos completos de Iceberg de cada tabla de todo el catálogo, lo que podía agotar la memoria en catálogos grandes. #104124 (il9ue).
  • Corrige el valor inflado de read_bytes (y los bytes/s derivados que se muestran en system.query_log, la barra de progreso, etc.) al leer archivos Parquet. La implementación anterior informaba el tamaño comprimido total del grupo de filas en cada fragmento, por lo que al leer K de N columnas se contabilizaba en exceso por N / K. Ahora solo se suma el tamaño de las columnas seleccionadas. También corrige el seguimiento del progreso a nivel de archivo en las tablas Iceberg, que antes nunca informaba el tamaño del archivo de datos. #105413 (groeneai).
  • Corrige resultados incorrectos al leer una tabla Iceberg con iceberg_use_version_hint = 1 después de que otro escritor (como la función de tabla icebergLocal/icebergS3) avance la tabla sin esta configuración. version-hint.text ahora se mantiene sincronizado con cada escritor una vez que existe el archivo, por lo que los lectores posteriores que usan la sugerencia ven la instantánea más reciente. #105682 (groeneai).
  • Las escrituras de Iceberg ahora preservan los valores NULL en columnas de partición Nullable(T). Anteriormente, un NULL escrito por ClickHouse aparecía como el valor predeterminado del tipo interno (0 para int) al leerse de nuevo con Spark u otros lectores de Iceberg. #105862 (groeneai).
  • Corrige las eliminaciones por posición con merge-on-read de Iceberg v2 que devolvían filas incorrectas cuando un único archivo de borrado hace referencia a varios archivos de datos y varios archivos de borrado se aplican al mismo archivo de datos. Las entradas de eliminación ahora se filtran según la ruta del archivo al que hacen referencia. #105888 (groeneai).
  • Corrige que el motor de tabla IcebergLocal pasara a ser de solo lectura después de un ciclo DETACH + ATTACH o de reiniciar el servidor, lo que hacía que todos los INSERT posteriores fallaran con Local object storage Local is readonly. (READONLY). #106016 (groeneai).
  • Corrige que la caché del sistema de archivos se deshabilitara silenciosamente para Azure Blob Storage (p. ej., tablas Delta Lake en Azure) porque los metadatos del objeto no incluían el ETag del blob. #106091 (thewisenerd).
  • Se añadió validación de rutas para las tablas de Delta Lake a fin de impedir que los metadatos accedan a objetos fuera de la ubicación de almacenamiento configurada. #106115 (scanhex12).
  • La poda de particiones de Iceberg ahora gestiona correctamente los filtros WHERE partition_col = (SELECT ... FROM ...) en los que el analizador encapsula el resultado de la subconsulta escalar en un _CAST(Const, 'TargetType') interno con tipos de origen y destino coincidentes. Anteriormente, estos filtros deshabilitaban la poda de particiones y provocaban un análisis completo de la tabla. #106204 (groeneai).
  • Se corrigió un problema por el que los catálogos REST de Iceberg con tablas se informaban incorrectamente como vacíos. #106301 (LefterisXefteris).
  • Se corrigió una excepción NOT_FOUND_COLUMN_IN_BLOCK al consultar una tabla Iceberg o S3 con un WHERE compuesto que contiene IS NOT NULL en una columna que no figura en la lista SELECT, al usar el lector nativo de Parquet V3. #106443 (tiandiwonder).
  • Se corrigió el informe de progreso inflado al leer tablas Iceberg con filtros _file o _path. Anteriormente, el progreso de total_bytes_to_read incluía todos los archivos del manifiesto independientemente del filtrado. #106491 (PedroTadim).
  • Se corrigió una excepción del servidor (error lógico std::out_of_range) al insertar en una tabla Iceberg cuyos nombres de columna del bloque de escritura no coinciden con los ID de campo del esquema más reciente (por ejemplo, después de que un escritor concurrente cambie el nombre de una columna dentro de la ventana de iceberg_metadata_staleness_ms). La inserción ahora falla con un error de consulta claro en lugar de abortar el servidor. #107279 (groeneai).
  • Se corrigió un posible desbordamiento de pila del servidor (crash) al leer un esquema o valor profundamente anidado en los formatos MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg y Paimon. Estas entradas profundamente anidadas ahora se rechazan con una excepción. #107341 (Algunenano).
  • Se corrigió un crash (LOGICAL_ERROR en compilaciones de depuración) y un error silencioso que producía resultados incorrectos (en compilaciones de lanzamiento) al leer una tabla Iceberg cuyos metadatos vuelven a asociar un schema-id existente con un esquema diferente entre versiones de metadatos. Estos metadatos ahora se rechazan con ICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai).
  • Se corrigió la lectura de tablas Iceberg v3 cuyos archivos de datos Parquet contienen columnas reservadas de linaje de filas (como _row_id); el lector nativo de Parquet ya no genera ICEBERG_SPECIFICATION_VIOLATION para ID de campo reservados que no forman parte del esquema de la tabla. #107377 (gregakinman).
  • Se corrigió una excepción espuria filesystem error: in last_write_time: No such file or directory al enumerar un directorio de almacenamiento de objetos en un disco local (por ejemplo, una tabla Iceberg en un disco local) mientras los archivos se reemplazan de forma concurrente. Las entradas eliminadas de forma concurrente ahora se omiten de la enumeración en lugar de abortarla. #107432 (groeneai).
  • Se corrigió el error ‘Account must be specified’ al leer una tabla de Delta Lake en Azure. #107620 (SmitaRKulkarni).
  • Se corrigió un bloqueo al leer tablas Iceberg con archivos de borrado por igualdad. Si una columna admitía valores nulos en el archivo de borrado por igualdad, pero no en el esquema de la tabla (o viceversa), los valores leídos del archivo de borrado se insertaban mediante una conversión sin comprobar en una columna de distinto tipo (una confusión de tipos de columna), lo que corrompía la columna y provocaba el bloqueo del servidor. #109551 (mstetsyuk).
  • Se corrigió un falso error ICEBERG_SPECIFICATION_VIOLATION al leer una tabla Iceberg cuyo tipo decimal (u otro tipo primitivo parametrizado) se serializaba con distintos espacios en blanco en los archivos de metadatos; por ejemplo, decimal(20,0) en los metadatos de la tabla y decimal(20, 0) en el manifiesto. Estas cadenas de tipos equivalentes según la especificación ahora se comparan ignorando los espacios en blanco. #109676 (groeneai).
  • Se corrigió la lectura de tablas Iceberg cuyo orden de clasificación predeterminado hace referencia a una columna que requiere comillas (por ejemplo, @timestamp). Estas tablas no se podían leer porque el ORDER BY de almacenamiento sintetizado se construía a partir del nombre de columna sin procesar y no se podía analizar, lo que generaba SYNTAX_ERROR. #110233 (groeneai).
  • Se corrigió la lectura de tablas Paimon que contienen una columna ARRAY o MAP que admite valores nulos. Estas tablas no se podían leer porque el mapeador de esquemas envolvía el tipo compuesto en Nullable, algo que ClickHouse no permite; por ello, tanto DESC como SELECT fallaban con Nested type Array(Nullable(Int32)) cannot be inside Nullable type. Ahora, una columna compuesta que admite valores nulos se asigna a un tipo compuesto sin Nullable, y los valores NULL se leen como valores vacíos. #113450 (groeneai).
  • Se registra el espacio de nombres de Iceberg en el catálogo antes de escribir archivos de tabla (necesario para SeaweedFS). #114285 (azat).

Correcciones de S3/Azure/almacenamiento de objetos

  • Se corrigió la excepción “Distributed task iterator is not initialized” al usar url, s3 o funciones de tabla similares en consultas con réplicas paralelas habilitadas. #100146 (alexey-milovidov).
  • Se corrigió un posible segfault del servidor en funciones de tabla de clúster (s3Cluster, urlCluster, fileCluster, …) cuando el planificador genera un SELECT con la marca recursive_with establecida, pero sin expresión WITH. #105433 (groeneai).
  • Se corrigió el pushdown de filtros de Parquet y ORC para predicados IN (subquery), lo que permite aplicar la poda de grupos de filas, páginas y filtros Bloom en lecturas de file, url, s3 y almacenamiento de objetos. #105863 (arsenmuk).
  • Se corrigió la excepción LOGICAL_ERROR durante la predescarga de caché cuando un objeto remoto de S3 se sobrescribe con contenido más corto entre la enumeración y la lectura. #106375 (fm4v).
  • Se corrigió que la función de tabla s3 ignorara silenciosamente una partition_strategy posicional en minúsculas (p. ej., hive). #107297 (jkartseva).
  • Se corrigió una regresión por la que establecer compatibility = '26.6' (lo que habilita implícitamente la estrategia de partición hive) aceptaba silenciosamente {_partition_id} en rutas de tablas de S3 y almacenamiento de objetos, en lugar de generar BAD_ARGUMENTS. #107437 (LefterisXefteris).
  • Se corrigió que s3 y otras funciones de tabla de almacenamiento de objetos generaran LOGICAL_ERROR en lugar de BAD_ARGUMENTS cuando se duplica un argumento clave-valor, p. ej., s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai).
  • Se corrigió una excepción del servidor (Logical error: 'index >= result.start') al formatear una consulta malformada que mezcla las formas posicional y con nombre del argumento secreto de las funciones de tabla s3/gcs, p. ej., s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai).
  • Se corrigió la prioridad de la configuración de S3 para que un bloque de endpoint <s3> específico de una URL tenga precedencia sobre los valores predeterminados de <s3> de nivel superior. #109251 (bharatnc).
  • Se corrigieron errores 411 Length Required de servicios de Azure: el transporte HTTP de Azure basado en Poco ahora establece Content-Length a partir del cuerpo de la solicitud para clientes del SDK que no establecen el encabezado por sí mismos (p. ej., Azure Key Vault). #110299 (thevar1able).

Correcciones de S3Queue

  • Corrige un bloqueo del servidor (acceso fuera de límites) en S3Queue/AzureQueue con enable_hash_ring_filtering = 1 cuando un lote contenía un archivo no procesable y, al mismo tiempo, fallaba la solicitud a Keeper para marcar el lote como en procesamiento. #108977 (groeneai).
  • Corrige filtraciones de credenciales en SHOW CREATE, system.query_log, los registros del servidor y la salida de EXPLAIN. Ahora, todas las formas de localizador de S3 ocultan session_token y los secretos de Google ADC, los valores de extra_credentials/headers en cualquier posición de argumento, las claves secretas duplicadas o generadas mediante expresiones, las formas posicionales no válidas (error seguro) y las credenciales integradas en URL de S3; esto abarca las funciones de tabla s3/s3Cluster con URL explícita y colecciones con nombre, los motores de tabla basados en S3 (S3, GCS, los motores de lago de datos, S3Queue), el motor de base de datos S3, BACKUP ... TO S3 y el motor de base de datos Backup. Además, los argumentos secretos de encrypt/decrypt/HMAC construidos mediante una expresión, incluidos los insertados desde una UDF de SQL, ahora se ocultan en los nombres de proyección, EXPLAIN QUERY TREE y EXPLAIN actions. #109768 (Algunenano).
  • Corrige el modo ordenado de S3Queue/AzureQueue con nodos de procesamiento persistentes: los bloqueos de bucket ahora se renuevan durante el streaming, de modo que la limpieza por TTL (persistent_processing_node_ttl_seconds) no elimine los bloqueos de un procesador activo. Si aun así se pierde la propiedad del bloqueo, se detecta y se informa (un error lógico y el evento de perfil ObjectStorageQueueBucketLockLostOwnership), y el streaming se recupera con un nuevo iterador de archivos. #110292 (kssenii).

Correcciones de seguridad y de control de acceso

  • Se corrigió un fallo del servidor (SIGSEGV) que podía provocar cualquier usuario con permisos de CREATE TABLE al enviar CREATE TABLE ... TO INNER UUID '...' sin una cláusula ENGINE mediante HTTP o el protocolo nativo. El mismo error también bloqueaba el cliente. El analizador ahora informa correctamente del error BAD_ARGUMENTS en lugar de desreferenciar un puntero nulo. #105579 (groeneai).
  • Se corrigió un fallo del servidor al consultar tablas DeltaLake con allow_experimental_delta_kernel_rs habilitado y una credencial u opción que contenía bytes no válidos (la FFI de Rust generaba un pánico al cruzar el límite extern "C"). #106109 (Algunenano).
  • Se corrigieron múltiples lecturas fuera de los límites del montón en el lector del formato Arrow IPC (ArrowColumnToCHColumn). Un archivo Arrow malformado podía declarar más filas de las que contenían sus búferes, declarar longitudes de elementos secundarios list/struct/map incompatibles con su elemento principal, proporcionar desplazamientos de lista no monotónicos o truncar un bitmap de validez secundario, lo que provocaba lecturas más allá del final de las asignaciones del montón. Cualquier usuario con el privilegio SELECT podía provocar este problema mediante file(), format(), funciones de tabla o entradas de ArrowFlight. Ahora se validan todos los búferes de datos, desplazamientos, view-struct y bitmap de validez antes de cualquier acceso a punteros sin procesar, y se comprueba la coherencia de las formas y los desplazamientos de list/struct/map. #106395 (Algunenano).
  • Se corrigió un error por el que las columnas used_privileges y missing_privileges de system.query_log podían contener cadenas de privilegios filtradas de consultas anteriores no relacionadas de otro usuario, base de datos o sesión. #106425 (alexey-milovidov).
  • Se corrigió un desbordamiento de búfer del montón (fallo del servidor) en decodeHTMLComponent al decodificar cadenas que contenían las entidades HTML expansivas &nGt; o &nLt;, que podía provocar cualquier usuario con una única consulta SELECT. #106741 (Algunenano).
  • Se corrigieron resultados de consulta incorrectos causados por la caché de condiciones de consulta cuando las mutaciones sobre la marcha (apply_mutations_on_fly) o las partes de parche filtraban filas antes de PREWHERE. Una consulta que leía con apply_mutations_on_fly = 1 podía contaminar la caché, de modo que una consulta posterior con apply_mutations_on_fly = 0 y el mismo predicado omitía marcas que debería haber leído y devolvía demasiadas pocas filas. La misma corrección también cubre las políticas de seguridad a nivel de fila, que se anteponen como filtro a PREWHERE: una consulta ejecutada bajo una política de fila restrictiva podía contaminar la caché para una consulta posterior que utilizara el mismo predicado sin esa política. #107145 (groeneai).
  • Se corrigió un desbordamiento de búfer del montón (fallo del servidor) en windowFunnel al finalizar un estado manipulado de una función de agregación con un tipo de evento fuera de rango, que podía provocar cualquier usuario con una única consulta SELECT. #107412 (uwezkhan).
  • Se corrigió un problema por el que currentUser(), user(), SESSION_USER y authenticatedUser() se evaluaban como una cadena vacía durante el vaciado de inserciones asíncronas (con async_insert = 1). Esto afectaba a las expresiones de columna DEFAULT/MATERIALIZED y a las vistas materializadas que hacían referencia a estas funciones, que almacenaban silenciosamente una cadena vacía en lugar del usuario que realizó la inserción. #107541 (groeneai).
  • Cuando se asignan varias cuotas al mismo usuario o rol, ahora todas se aplican conjuntamente (una consulta se rechaza si se supera cualquiera de ellas), en lugar de aplicar solo una cuota elegida de forma no determinista. SHOW QUOTA y system.quota_usage ahora muestran todas las cuotas aplicadas al usuario actual. #107664 (alexey-milovidov).
  • SYSTEM RESET DDL WORKER ahora requiere el nuevo privilegio SYSTEM RESET DDL WORKER. Anteriormente, cualquier usuario autenticado (incluidos los usuarios readonly) podía ejecutarlo y restablecer repetidamente el estado del worker de DDL, bloqueando las operaciones DDL ON CLUSTER. #108460 (groeneai).
  • Se corrigió la identificación de usuarios mediante ssl_certificate para que un único comodín * coincida exactamente con un componente del nombre (RFC 6125 6.4.3). Anteriormente, un comodín en un sujeto CN o SAN DNS: (por ejemplo, *.corp.example.com) también coincidía con nombres de varias etiquetas, como evil.deep.corp.example.com, lo que permitía al titular de un certificado para un subdominio más profundo autenticarse como el usuario comodín. La coincidencia de SAN URI: no ha cambiado. #108472 (groeneai).
  • Los comandos del protocolo MySQL wire COM_FIELD_LIST (mysql_list_fields) y COM_INIT_DB (USE database) ahora aplican el mismo control de acceso que sus equivalentes en SQL (SHOW COLUMNS/DESCRIBE y USE). Anteriormente, podían revelar los nombres de columnas de tablas para las que el usuario solo tenía permisos parciales sobre las columnas y cambiar la base de datos actual sin el privilegio SHOW DATABASES. #108508 (groeneai).
  • http_forbid_headers ahora realiza las coincidencias sin distinguir entre mayúsculas y minúsculas. Los nombres de los encabezados HTTP no distinguen entre mayúsculas y minúsculas, por lo que prohibir Authorization ahora también bloquea authorization, AUTHORIZATION y otras variantes. Los patrones header_regexp configurados ahora también se comparan sin distinguir entre mayúsculas y minúsculas, sin necesidad de la marca explícita (?i). #108509 (groeneai).
  • Se corrigió una vulnerabilidad de divulgación de metadatos por la que DESCRIBE loop('db', 'table') y DESCRIBE loop(<inner table function>) omitían la comprobación de acceso a SHOW COLUMNS / al origen, lo que permitía a usuarios sin privilegios leer el esquema de columnas de una tabla. #108624 (groeneai).
  • Se corrigió un error de inicio por el que una base de datos DataLakeCatalog creada con una versión anterior (25.12 o anterior) y un auth_header malformado no podía adjuntarse tras actualizar a la versión 26.2 o posterior, lo que impedía iniciar el servidor. Ahora, auth_header se valida solo en CREATE y, en ATTACH, el catálogo se crea de forma diferida en el primer uso en lugar de durante el inicio. Por tanto, una única base de datos de catálogo mal configurada o inaccesible ya no bloquea el inicio del servidor. #108674 (groeneai).
  • Se reforzaron las conexiones de RabbitMQ frente a tramas AMQP maliciosamente grandes y se aplicaron sistemáticamente las comprobaciones de remote_url_allow_hosts a rabbitmq_address. #112479 (kssenii).
  • Se corrigió un caso en el que CREATE TABLE ... ENGINE = Distributed(...) sin una lista de columnas podía revelar la estructura de una tabla local que el usuario que la creaba no tenía permiso para ver. Cuando el servidor local ejecuta un CREATE por sí mismo, la estructura ahora se infiere en el contexto del propio usuario, por lo que se requiere SHOW COLUMNS en la tabla de destino, como ya ocurre con el motor Remote. No se cubre un CREATE reproducido desde la cola DDL (ON CLUSTER o dentro de una base de datos Replicated). #113220 (groeneai).
  • Se corrigió un caso en el que CREATE TABLE ... ENGINE = Buffer(...) sin una lista de columnas podía revelar la estructura de una tabla de destino que el usuario que la crea no tiene permiso para ver. En un CREATE ejecutado por el propio servidor local, la estructura ahora se infiere en el contexto del usuario, por lo que se requiere SHOW COLUMNS en el destino, como ya ocurre con Merge y Remote. Esto no cubre un CREATE reproducido desde la cola DDL (ON CLUSTER o dentro de una base de datos Replicated). #113372 (groeneai).
  • Se limitó el tamaño del mensaje de inicio del protocolo de conexión de PostgreSQL, que se lee antes de la autenticación. #115708 (alexey-milovidov).

Correcciones de Backup y restauración

  • Se corrigió un aborto del servidor durante RESTORE de copias de seguridad que contienen tablas con dependencias cíclicas. #103824 (thevar1able).
  • Se corrigió el problema por el que se ignoraba la clase de almacenamiento de S3 (s3_storage_class / s3_storage_class_name) para los objetos escritos mediante carga multiparte en discos S3 y almacenamiento de objetos, lo que provocaba que los objetos grandes se crearan con la clase predeterminada STANDARD. El nombre de la opción ahora se acepta como s3_storage_class y s3_storage_class_name para discos, almacenamiento de objetos y copias de seguridad. #106214 (alexey-milovidov).
  • Se corrigió un problema por el que SYSTEM RELOAD CONFIG descartaba la configuración de Azure Blob Storage por endpoint (como use_native_copy), lo que hacía que se ignorara la configuración de un disco para BACKUP/RESTORE hasta reiniciar el servidor. #106357 (jkartseva).
  • Se corrigió el fallo de las copias de seguridad con FILE_DOESNT_EXIST cuando se recopila el destino de REPLACE de una vista materializada actualizable en una base de datos Replicated o Shared cuya vista materializada aún no se ha instanciado en la réplica que inicia la copia de seguridad. #106411 (jkartseva).
  • Se corrigió que Azure BACKUP/RESTORE ignorara la configuración de endpoint para discos azure_blob_storage con formato heredado. #106784 (jkartseva).
  • Se corrigió BACKUP a AzureBlobStorage: al copiar un archivo de datos dentro de una copia de seguridad, el objeto de destino se escribía fuera del directorio de la copia de seguridad. Las comprobaciones de existencia de objetos de copia de seguridad en destinos S3 ahora usan solicitudes HeadObject exactas en lugar de listar prefijos, lo que evita coincidencias falsas con claves de prefijos similares. #107153 (pamarcos).
  • Las copias de seguridad incrementales ya no almacenan credenciales de S3 en el localizador <base_backup> del archivo de metadatos .backup. Las copias de seguridad creadas con use_same_s3_credentials_for_base_backup = 1, o con credenciales explícitas de copia de seguridad base que coincidan con este localizador, almacenan un marcador no secreto y se restauran sin configuración adicional durante la restauración; para las copias de seguridad creadas con credenciales explícitas distintas para la copia de seguridad base o argumentos adicionales de autenticación base, páselos a RESTORE mediante la configuración base_backup. Las copias de seguridad creadas por versiones anteriores con credenciales incrustadas siguen pudiendo restaurarse. #107357 (pamarcos).
  • Se corrigió RESTORE para las tablas ReplicatedMergeTree, de modo que las partes con contenido duplicado de una copia de seguridad se conserven en lugar de deduplicarse silenciosamente. #107652 (pamarcos).
  • Un marcador de posición {_partition_id} en la ruta de un motor similar a un archivo (S3, AzureBlobStorage, URL, etc.) sin una partition_strategy explícita vuelve a implicar la estrategia wildcard, independientemente de file_like_engine_default_partition_strategy. Esto restaura la compatibilidad con versiones anteriores para DDL anteriores a la 26.6 que empezaron a fallar con BAD_ARGUMENTS (“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”). #111279 (fm4v).

Correcciones de ClickHouse Keeper

  • Corrige la limpieza de snapshots de Keeper tras escrituras fallidas, de modo que los snapshots parciales se eliminen de forma segura y las escrituras fallidas puedan reintentarse sin avanzar latest_snapshot_meta. #105779 (antonio2368).
  • Corrige los fallos de Keeper durante la sincronización de seguidores cuando la nueva cola de respuestas del despachador de solicitudes podía llenarse antes de que se iniciara el hilo de respuestas. #106049 (antonio2368).
  • Corrige el bloqueo ocasional de Keeper durante el inicio cuando la configuración nuraft_max_log_gap_in_stream se establece en un valor distinto del predeterminado (el valor predeterminado es 0, es decir, desactiva la canalización de solicitudes append_entries). #106220 (al13n321).
  • El TLS interno de Raft de Keeper ahora respeta la configuración openSSL.client.verificationMode. Anteriormente, la verificación de certificados de pares siempre estaba habilitada para la comunicación Raft entre instancias de Keeper, independientemente de esta configuración, por lo que none se ignoraba silenciosamente. Ahora, none desactiva explícitamente la verificación de certificados de pares de Raft, mientras que la ausencia de esta configuración mantiene el comportamiento anterior, seguro de forma predeterminada. Las configuraciones que establezcan explícitamente none dejarán de verificar los certificados de pares de Raft tras la actualización, conforme a la configuración especificada. #106726 (antonio2368).
  • Corrige la recreación espuria de sesiones de ZooKeeper al recargar la configuración. #107096 (azat).
  • Corrige un error en ClickHouse Keeper por el que los metadatos de snapshots informados mediante last_snapshot (y zk_latest_snapshot_size en mntr) podían retroceder tras instalar un snapshot obsoleto o duplicado. Esto también podía permitir que un snapshot local con el mismo índice sobrescribiera un archivo de snapshot registrado mientras aún se transmitía a un par o se cargaba en S3. #107321 (antonio2368).
  • Corrige el bloqueo de una vista materializada actualizable si se pierde la conexión con ZooKeeper en un momento inoportuno. #108234 (al13n321).
  • Corrige las mutaciones con un parámetro de consulta como partición (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): el valor de partición sustituido se serializaba en la entrada de mutación de una forma que no podía analizarse de nuevo, lo que impedía cargar la tabla (en las tablas replicadas, en cada réplica). Ahora también se verifica que los comandos de mutación puedan analizarse de nuevo antes de escribirse en ZooKeeper o en disco, de modo que una discrepancia similar haga fallar la consulta ALTER en lugar de inutilizar la tabla. #111518 (al13n321).
  • Corrige el desbordamiento numérico al analizar datos para system.zookeeper_info. #111629 (kssenii).

Correcciones de fallos y mejoras de estabilidad

  • Corrige la excepción NOT_FOUND_COLUMN_IN_BLOCK al usar LIMIT BY con columnas constantes junto con DISTINCT y ORDER BY en el nuevo analizador. #93195 (ashrithb).
  • Mejora la estabilidad de la conexión con HiveCatalog mediante la incorporación de un mecanismo de reintento automático y lógica de reconexión para gestionar errores TTransportException al comunicarse con Hive Metastore. #98471 (otselnik).
  • Corrige el plegado de constantes durante el análisis en funciones de cortocircuito (if, multiIf, and, or, etc.) para que las ramas estáticamente inalcanzables ya no generen excepciones durante el análisis. Por ejemplo, WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) ahora devuelve correctamente 0 en lugar de fallar con un error de división por cero. #103157 (fastio).
  • Corrige una finalización del servidor que podía producirse al llamar a runningAccumulate en una función de agregación que devuelve su propio estado. #105085 (antaljanosbenjamin).
  • Corrige getServerSetting para que devuelva el valor efectivo actual de las configuraciones del servidor modificables en tiempo de ejecución (como max_server_memory_usage, mark_cache_size, max_concurrent_queries, tamaños de grupos de subprocesos, etc.), en consonancia con lo que informa system.server_settings. #105172 (alexey-milovidov).
  • Corrige la excepción NOT_FOUND_COLUMN_IN_BLOCK al combinar ORDER BY ... WITH FILL INTERPOLATE y LIMIT N BY con el analizador habilitado. #105481 (yakov-olkhovskiy).
  • Corrige una excepción del servidor (error lógico Trying to execute PLACEHOLDER action) al usar como lado derecho de IN una CTE MATERIALIZED cuyo cuerpo es una subconsulta correlacionada. Esta CTE ahora se rechaza durante el análisis, de forma coherente con el rechazo del mismo patrón cuando se hace referencia directamente a la CTE en FROM. #105518 (groeneai).
  • Corrige que variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false no capturara excepciones durante la ejecución de funciones. #105543 (Avogar).
  • Corrige la excepción NOT_FOUND_COLUMN_IN_BLOCK cuando una expresión TTL hace referencia a una subcolumna. #105578 (Avogar).
  • Corrige un bloqueo del servidor que podía producirse al cancelar una consulta que leía de PostgreSQL —mediante la función de tabla postgresql, el motor de tabla PostgreSQL o un diccionario con una fuente PostgreSQL— (por ejemplo, con KILL QUERY), si fallaba la cancelación de la consulta remota de PostgreSQL. #105949 (rorylshanks).
  • Corrige un posible bloqueo debido a un literal de cadena demasiado grande enviado en la consulta. #105996 (nickitat).
  • Corrige la excepción INVALID_WITH_FILL_EXPRESSION al usar INTERPOLATE () (vacío) con un prefijo de ordenación en ORDER BY y use_with_fill_by_sorting_prefix habilitado. Las columnas del prefijo de ordenación ahora se excluyen correctamente del conjunto de interpolación implícito, en consonancia con el comportamiento de INTERPOLATE (col) especificado explícitamente. #106001 (yakov-olkhovskiy).
  • Los estados malformados de AggregateFunction(uniqTheta, ...) procedentes de entradas RowBinary o parámetros de consulta ahora se rechazan con CORRUPTED_DATA en lugar de provocar la finalización del servidor. #106260 (groeneai).
  • Se corrige un bloqueo y un posible error NOT_FOUND_COLUMN_IN_BLOCK al usar la optimización basada en restricciones (optimize_using_constraints) con subconsultas correlacionadas. #106349 (Algunenano).
  • Se corrige la excepción NUMBER_OF_COLUMNS_DOESNT_MATCH al consultar una tabla Distributed con dos o más columnas ALIAS que se expanden a la misma expresión (p. ej., ambas definidas como toString(x)), o cuando la misma expresión se escribe tanto como referencia a una columna ALIAS como directamente en la lista SELECT, con una cláusula ORDER BY. #106404 (yakov-olkhovskiy).
  • Se corrigió el error LOGICAL_ERROR “Trying to get name of not a column: ExpressionList” generado por consultas que pasan un asterisco dentro de multiIf a un argumento de función de tabla, p. ej., numbers(multiIf(*, ...), 2). Ahora la consulta rechaza el patrón no resoluble con UNSUPPORTED_METHOD. #106647 (groeneai).
  • Se rechazan patrones glob patológicos de file que provocarían una recursión ilimitada al enumerar directorios. Ahora se impone una profundidad máxima de recursión de 1000; las consultas que la superen generan TOO_DEEP_RECURSION en lugar de abortar el servidor por desbordamiento de pila. #106676 (groeneai).
  • Se corrige la excepción 'Trying to read from input() twice.' generada cuando la función de tabla input se encapsula en una CTE no MATERIALIZED a la que se hace referencia desde más de un punto de la consulta. Ahora la consulta se rechaza con el error claro INVALID_USAGE_OF_INPUT durante la planificación. input es un flujo de cliente de un solo uso y solo puede consumirlo una única fuente del plan de consulta. #106682 (groeneai).
  • Se corrigen columnas incoherentes (que posteriormente provocan LOGICAL_ERROR) tras una excepción (p. ej., MEMORY_LIMIT_EXCEEDED) durante el análisis. #106802 (azat).
  • Se corrige un bloqueo del servidor (SIGSEGV) al leer datos Protobuf truncados con input_format_allow_errors_num > 0. #106905 (atsarevskiy).
  • Se corrige un bloqueo del servidor (desreferenciación de puntero nulo) al ejecutar TRUNCATE o DROP en una tabla EmbeddedRocksDB cuyo identificador de RocksDB se había liberado; por ejemplo, una tabla read_only cuyo directorio de datos se vació mediante un TRUNCATE anterior. #106940 (groeneai).
  • Se corrige una excepción (std::length_error notificada como LOGICAL_ERROR) al leer desde una función de tabla *Cluster, como urlCluster, con una configuración de max_streams_for_files_processing_in_cluster_functions muy elevada. El número de flujos ahora se limita a un valor razonable. #106946 (groeneai).
  • Se corrigió la finalización del servidor cuando una consulta distribuida se cancelaba inmediatamente antes de enviarse a un shard. #106950 (groeneai).
  • Se corrigió una excepción del servidor (error lógico this->visited_views == right->visited_views) en INSERT cuando dos vistas materializadas de la misma tabla de origen escriben en la misma tabla de destino y una vista dependiente lee de esa tabla, con materialized_views_squash_parallel_inserts habilitado. #107027 (groeneai).
  • Se corrigió una excepción LOGICAL_ERROR al insertar en una tabla DeltaLake con columnas que no coinciden con su esquema de escritura (por ejemplo, una columna Nested que se aplana en subcolumnas, o una función de tabla con un subconjunto explícito de columnas). Ahora, estas inserciones fallan con un error INCOMPATIBLE_COLUMNS orientado al usuario. #107058 (groeneai).
  • Se corrigió un LOGICAL_ERROR (“Table expression … data must be initialized”) que se producía cuando un selector de asterisco calificado (por ejemplo, x.*) hacía referencia por nombre a una CTE recursiva dentro de su propio término recursivo. Estos selectores ahora expanden las columnas de la tabla recursiva, igual que ya lo hacen una columna calificada (x.a) o un selector no calificado (*) en esa posición. #107144 (groeneai).
  • Se corrigió un LOGICAL_ERROR (“Unexpected exception in refresh scheduling”) que podía provocar que el servidor entrara en un ciclo de fallos al reiniciarse cuando una vista materializada actualizable tiene una dependencia REFRESH ... DEPENDS ON <name> cuyo nombre sin calificar coincide con una tabla temporal o con el nombre de una CTE. #107156 (groeneai).
  • Se corrigió un LOGICAL_ERROR (Variant N (T) has size X, but expected Y) cuando se aplica una función como toString o concat a una columna Variant o Dynamic que contiene una única variante no vacía junto con valores NULL, y la función devuelve sin cambios la columna de entrada. #107374 (groeneai).
  • Se corrigió un LOGICAL_ERROR (block.rows() == getRows()) que se producía en un INSERT asíncrono en una tabla Alias cuando use_strict_insert_block_limits estaba habilitado. #107400 (groeneai).
  • Se corrigió una excepción del servidor (Logical error: Not-ready Set is passed as the second argument for function 'in') cuando una expresión de clave (ORDER BY, PRIMARY KEY, PARTITION BY o un INDEX de omisión) contenía un operador IN con una tabla en el lado derecho, por ejemplo, ORDER BY (x IN some_table). Estas expresiones de clave ahora se rechazan al crear la tabla. #107424 (groeneai).
  • Se corrigió un fallo poco frecuente del servidor durante el procesamiento de DISTINCT que podía ocurrir si fallaba una asignación de memoria (por ejemplo, al alcanzar un límite de memoria) mientras se inicializaba el conjunto de claves distintas. #107467 (groeneai).
  • Se corrigieron errores en operaciones de DeltaLake tras la expiración de credenciales temporales de S3 actualizando las credenciales almacenadas en caché antes de la siguiente operación. Las credenciales de asunción de rol de STS también se actualizan tras fallos de autenticación. #107480 (ahmadov).
  • Se corrigió un LOGICAL_ERROR (Not-ready Set is passed as the second argument for function 'in') al consultar una tabla con una clave PARTITION BY y una subconsulta IN/NOT IN incluida en una expresión más amplia, por ejemplo, WHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai).
  • Corrige un fallo (desreferenciación de puntero nulo) que podía producirse al ejecutar localmente un plan de consulta distribuida (make_distributed_plan + distributed_plan_execute_locally) con log_formatted_queries = 1. #107570 (groeneai).
  • Corrige un fallo del servidor al leer una vista materializada cuyo destino es una tabla Distributed cuando la consulta se ejecuta con enable_analyzer = 0. #107653 (groeneai).
  • Corrige un fallo del servidor (SIGSEGV) al leer datos Protobuf con input_format_allow_errors_num > 0, cuando un mensaje válido precede a otro incorrecto (que se puede omitir) en el mismo bloque. #107739 (atsarevskiy).
  • Corrige el bloqueo durante varios minutos de las funciones de tabla odbc y jdbc, que ignoraban la cancelación de consultas (KILL QUERY, max_execution_time) cuando el puente dejaba de responder durante la inferencia de la estructura de la tabla remota. #107809 (alexey-milovidov).
  • Corrige un posible fallo (desreferenciación de puntero nulo) cuando la sobrescritura de database/db de una colección con nombre pasada a remote()/remoteSecure() no es un nombre de base de datos constante; por ejemplo, remote(nc, database = (SELECT 1)). Ahora la consulta devuelve un error claro en lugar de provocar un fallo. #108271 (groeneai).
  • Las consultas de búsqueda vectorial que seleccionan la columna _distance ahora devuelven un error adecuado en lugar de fallar con un LOGICAL_ERROR. #108423 (rschu1ze).
  • Corrige un posible fallo (desbordamiento del búfer del montón) cuando se utilizaba como clave de GROUP BY una columna de estado de una función de agregación de la familia quantileTDigest y varios hilos la serializaban simultáneamente. #110263 (groeneai).
  • Corrige la poda incorrecta derivada del análisis del índice de clave primaria en tablas con una clave de ordenación inversa (descendente) (ORDER BY (g, r DESC)). Un gránulo que abarcaba un cambio en una columna de clave inicial seguido de una columna de clave descendente podía podarse incorrectamente y descartar filas coincidentes. #111059 (nihalzp).
  • Corrige un error lógico block.rows() == getRows() (una lectura fuera de límites y una deduplicación de inserciones defectuosa en compilaciones de producción) cuando un INSERT pasa por una vista materializada dependiente cuyo destino es un Alias y cuya consulta interna cambia el número de filas, con una tabla con deduplicación accesible tras el alias. #111103 (alexey-milovidov).
  • Corrige un segfault debido a un acceso a memoria fuera de límites al deserializar un estado de función de agregación malformado que contiene un valor String. Estos estados ahora se validan y rechazan en lugar de provocar segfaults. #111606 (mstetsyuk).
  • Corrige un fallo al leer un archivo Parquet con metadatos de filtro de Bloom incoherentes. Estos archivos también podían devolver silenciosamente menos filas de las debidas. #112498 (tiandiwonder).
  • Corrige un fallo de segmentación y una corrupción silenciosa de datos cuando un INSERT en el motor File o la función de tabla file agrega datos a un archivo no vacío en un formato que no admite anexarlos, como Avro. La escritura mediante un descriptor de archivo o una ruta particionada omitía la comprobación existente, por lo que se suprimía el prefijo de formato y se escribía un segundo encabezado tras los bytes existentes, dejando el archivo ilegible. Este tipo de INSERT ahora se rechaza con CANNOT_APPEND_TO_FILE, como ya sucede con una ruta simple. #112839 (groeneai).
  • Corrige el bloqueo de DROP TABLE y SYSTEM STOP VIEW cuando una vista materializada actualizable se bloquea durante la planificación de su consulta de actualización. #113188 (evillique).
  • Corrige una terminación poco frecuente del servidor cuando las entradas de la cola de inserciones asíncronas tenían plazos idénticos. #113363 (mstetsyuk).
  • Corrige la corrupción de memoria del montón al leer Parquet mediante un formato de entrada que gestiona su propio búfer de lectura, por ejemplo, un diccionario con SOURCE(FILE(... format 'Parquet')). Las tareas de prelectura y decodificación en segundo plano aún podían leer y escribir en el búfer después de que el pipeline lo liberara, lo que podía provocar la finalización del servidor. #114668 (groeneai).
  • Corrige un bloqueo al eliminar una tabla TimeSeries cuyo nombre se ordena lexicográficamente antes que los nombres de sus tablas internas, por ejemplo, una tabla llamada -ts, o al eliminar una vista materializada declarada con ENGINE = TimeSeries. La operación de eliminación se autobloqueaba mediante la protección DDL y no podía cancelarse con KILL QUERY. #114953 (groeneai).

Otras correcciones de errores

  • Las funciones like, ilike, notLike, notILike y match ahora admiten un haystack constante con una aguja no constante (p. ej., 'foo' LIKE pattern_column), lo que antes generaba ILLEGAL_COLUMN. #100479 (Onyx2406).
  • Corrige el error NOT_FOUND_COLUMN_IN_BLOCK al seleccionar desde una VIEW sobre una tabla con una proyección normal. #101218 (amosbird).
  • Rechaza valores Float64 negativos (p. ej., -100.5) en configuraciones de workload como max_bytes_per_second, max_cpus, etc. Antes solo se validaban los enteros negativos, lo que permitía que los valores de punto flotante negativos crearan silenciosamente nodos de scheduler defectuosos. #101842 (groeneai).
  • Las lecturas desde almacenamiento de objetos ahora responden con rapidez a la cancelación de consultas. #103016 (SmitaRKulkarni).
  • Corrige que input_format_max_block_size_bytes se ignorara silenciosamente durante el análisis de INSERT cuando max_insert_block_size_bytes es 0 (el valor predeterminado). La configuración ahora limita correctamente el tamaño de los bloques generados por los formatos de entrada basados en filas. #103068 (Fgrtue).
  • Corrige que ClickHouse produjera ocasionalmente tokens GSSAPI no válidos debido a la eliminación incorrecta de bytes nulos finales. #103114 (EmeraldShift).
  • EXPLAIN SYNTAX expande las vistas parametrizadas. #103263 (jrdi).
  • Corrige la corrupción de datos al escribir Parquet (y otros formatos con tráiler, como ORC y Arrow) en HDFS mediante INSERT INTO FUNCTION hdfs(...). Desde la versión 26.1, WriteBufferFromHDFS no vaciaba su búfer de trabajo al ejecutar finalize(), por lo que se perdían silenciosamente hasta los últimos DBMS_DEFAULT_BUFFER_SIZE bytes de cada archivo, incluido el pie PAR1 de Parquet. Al leer estos archivos se devolvía Not a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai).
  • Corrige resultados incorrectos y un posible error lógico en subconsultas correlacionadas cuando se establece un límite de tamaño de join (max_rows_in_join / max_bytes_in_join) junto con join_overflow_mode = 'break'. El join creado internamente para evaluar una subconsulta correlacionada ahora ignora esos límites definidos por el usuario, por lo que ya no puede detenerse prematuramente ni descartar filas. #103322 (groeneai).
  • Corrige resultados incorrectos o la omisión de una proyección cuando una proyección de agregación contiene varias agregaciones sumIf con distintas condiciones IN (...). #104765 (Ergus).
  • Corrige que deltaSumTimestamp devuelva resultados incorrectos para tipos enteros con signo que cruzan el cero. #104830 (thevar1able).
  • Corrige el error Logical error: 'Metadata is not initialized' generado por DELETE FROM en una tabla Iceberg, DeltaLake o Hudi recién adjunta cuyo archivo de metadatos está corrupto o no se puede cargar. En su lugar, se devuelve una excepción habitual orientada al usuario y el servidor continúa en ejecución. #104917 (groeneai).
  • Las consultas ATTACH TABLE name <clauses>; que incluyen cláusulas de almacenamiento (ORDER BY, PARTITION BY, PRIMARY KEY, SAMPLE BY, TTL, UNIQUE KEY o SETTINGS del motor) sin ENGINE ahora generan BAD_ARGUMENTS, en lugar de volver a adjuntar silenciosamente la tabla con su definición almacenada y descartar las cláusulas especificadas por el usuario. Los SETTINGS de sesión a nivel de consulta (como log_comment) se siguen aplicando. Use ATTACH TABLE t; para volver a adjuntar la tabla con los metadatos almacenados, o ALTER TABLE t MODIFY SETTING ... después de ATTACH para cambiar la configuración. #105068 (groeneai).
  • Se corrigieron un desbordamiento del búfer de montón al leer archivos Arrow o ArrowStream con desplazamientos intermedios corruptos en una columna binaria o de cadena, y una desreferenciación de puntero nulo al leer columnas Arrow geoetiquetadas. #105449 (Algunenano).
  • Se corrigió un cierre del servidor al leer subcolumnas Dynamic de una tabla Memory comprimida después de ALTER. #105464 (Avogar).
  • Se incluyó skip_first_lines en la clave de la caché de esquemas para los formatos WithNames. #105469 (Avogar).
  • Se corrigió histogram, que producía resultados incorrectos con entradas pequeñas no ordenadas. #105548 (Avogar).
  • Se corrigió el uso de la tabla de inserción en funciones de tabla cuando optimize_trivial_insert_select está habilitado. #105555 (Avogar).
  • Se corrigió la pérdida de datos acumulados entre filas en la función de ventana estimateCompressionRatio. #105581 (Avogar).
  • La extracción de valores de partición de Hive ahora respeta la configuración cast_string_to_date_time_mode y, de forma predeterminada, acepta timestamps ISO 8601 con sufijos de zona horaria (p. ej., +0000, +00:00, Z) en las claves de partición. #105584 (alexey-milovidov).
  • Se corrigió la recuperación de errores del formato de entrada Template tras filas malformadas. #105735 (niyue).
  • Se corrigió el formato de SYSTEM INSTRUMENT ADD para que los argumentos del controlador estén separados por un único espacio, y se rechazan las listas no válidas de argumentos de instrumentación SLEEP con más de dos valores o con un intervalo cuyo mínimo sea mayor que el máximo. #105984 (pamarcos).
  • Se corrigió el fallo silencioso de las operaciones de partición de ALTER TABLE con claves de partición Bool. #106004 (Avogar).
  • Se corrigieron JSONExtractRaw y JSONHas para rutas JSON tipadas con valores predeterminados. #106005 (Avogar).
  • Se corrigió un prefijo / incorrecto en rutas base vacías de configuraciones de lago de datos. #106013 (thewisenerd).
  • Se corrigió que system.dictionaries devolviera 0 filas tras una revocación parcial de SHOW DICTIONARIES. #106105 (Avogar).
  • Corrige resultados incorrectos en consultas sobre tablas cuyo ORDER BY contiene una función monótonamente decreciente, como (c0 / -42) o intDiv(c0, -42). Los predicados sobre la columna subyacente (por ejemplo, c0 < 0) podían descartar erróneamente gránulos que contenían filas coincidentes, lo que provocaba resultados incompletos. #106136 (nihalzp).
  • Se añadió validación para estados de agregación DDSketch malformados durante la inserción. #106236 (yariks5s).
  • Se corrigió la consistencia de la caché del sistema de archivos tras degradaciones fallidas de SLRU, evitando que las entradas quedaran bloqueadas en estado de expulsión. También se corrigieron el redimensionamiento de la caché dividida System/Data y la limpieza de espacio libre para que los límites se actualicen de forma atómica y se pueda recuperar espacio de ambos segmentos de caché. #106286 (kssenii).
  • Se corrigió una conversión incorrecta de valores Float16 subnormales a Float32 (por ejemplo, al leerlos de archivos .npy de NumPy), causada por un desplazamiento de mantisa desfasado en una posición. #106343 (jh0x).
  • Corrige regexpExtract(haystack, pattern) para que los patrones sin grupo de captura devuelvan la coincidencia completa en lugar de generar INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai).
  • Corrige un error lógico al crear un diccionario de polígonos a partir de datos de origen que contienen coordenadas de puntos NaN o infinitas. Estas coordenadas ahora se rechazan con un error claro. #106423 (alexey-milovidov).
  • Los diccionarios HTTP ahora pueden especificar encabezados de solicitud mediante colecciones con nombre. #106459 (ZelvaMan).
  • Los valores de enumeración Avro malformados ahora se validan y rechazan con una excepción, en lugar de provocar accesos a memoria fuera de los límites y la terminación del servidor. #106476 (mstetsyuk).
  • Corrige que LIMIT WITH TIES y LIMIT WITH TIES fraccionario no respetaran la intercalación de ORDER BY ... COLLATE al determinar empates. Las filas iguales según la intercalación (por ejemplo, '1' y '01' con intercalación numérica) se comparaban byte a byte, por lo que algunas filas empatadas se descartaban erróneamente del resultado. #106539 (nihalzp).
  • Corrige que las optimizaciones DISTINCT en orden y LIMIT BY en orden (incluido LIMIT BY negativo) devolvieran resultados incorrectos cuando la entrada se ordenaba con una intercalación (ORDER BY ... COLLATE). Las filas iguales según la intercalación (por ejemplo, 'a' y 'A' con una intercalación sin distinción entre mayúsculas y minúsculas) se ordenan por clave de intercalación y no son adyacentes por valor, por lo que la optimización en orden ahora se omite cuando se utiliza un colacionador. #106564 (nihalzp).
  • Se corrigió una condición de carrera durante el cierre del consumidor de NATS que podía terminar el servidor. #106692 (mstetsyuk).
  • Se corrigieron varios problemas de seguridad de memoria y agotamiento de recursos en lectores de formatos accesibles desde entradas no confiables: una lectura fuera de los límites del montón en el manejo de la longitud de los niveles de definición/repetición de DataPageV2 del lector nativo de Parquet, un desbordamiento de pila en archivos Parquet con esquemas profundamente anidados y asignaciones que ignoraban max_memory_usage al analizar geometrías GeoParquet WKB/WKT y cadenas/bytes de Avro. #106739 (Algunenano).
  • Se corrigió que keeper_server.http_control.secure_port enviara respuestas HTTP en texto sin cifrar a clientes HTTPS. El puerto seguro ahora sirve HTTPS correctamente. #106822 (linjiayu1025-collab).
  • Se corrigió que SHOW CREATE ROW POLICY emitiera restrictive/permissive en minúsculas en lugar de mayúsculas, de forma incoherente con otras palabras clave. #106865 (valerypetrov).
  • Se corrigió que las partes se marcaran como dañadas y se desconectaran en cada recarga de partes (reinicio del servidor, DETACH o ATTACH) en tablas con una columna LowCardinality(Nullable(...)) en la clave de partición. Desde la versión 26.5, el archivo de índice minmax de cada parte no se escribía cuando el mínimo y el máximo de dicha columna eran NULL, aunque la comprobación de consistencia de la parte seguía requiriéndolo. Las partes escritas por las versiones afectadas no incluyen el archivo de índice minmax y aún deben volver a adjuntarse manualmente. #106945 (PedroTadim).
  • Se corrigió que elapsed_us siempre fuera cero y que read_rows/read_bytes se contabilizaran por debajo de su valor real en system.processors_profile_log y system.query_log para consultas de vaciado de inserciones asíncronas (AsyncInsertFlush). #106982 (cwurm).
  • Se corrigió un error lógico Block structure mismatch in UnionStep stream (abortado del servidor en builds de depuración/sanitizer, Code: 49 en builds de lanzamiento) que se producía cuando una rama de un UNION/INTERSECT/EXCEPT leía una columna serializada como Sparse, mientras que la rama homóloga leía la misma columna completa (por ejemplo, al insertar en una vista materializada). #107041 (groeneai).
  • Se corrigió el orden incorrecto de las filas en consultas ORDER BY sobre UNION ALL con optimize_read_in_order y read_in_order_use_virtual_row habilitados. #107053 (vdimir).
  • Se corrigió un error de sintaxis cuando una cláusula FORMAT, SETTINGS o INTO OUTFILE sigue a SHOW ROW POLICIES o SHOW MASKING POLICIES (p. ej., SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai).
  • Se corrigió que trimLeft, trimRight y trimBoth (y los alias ltrim, rtrim, trim) generaran TOO_LARGE_STRING_SIZE cuando el conjunto personalizado de caracteres para recortar tenía más de 16 caracteres. Los conjuntos de recorte de cualquier longitud vuelven a ser compatibles. #107071 (fm4v).
  • Se corrigió un desbordamiento de enteros con signo en quantileExactExclusive, quantilesExactExclusive, quantileExactInclusive y quantilesExactInclusive que podía producir resultados incorrectos para entradas Int64 que abarcaran un rango amplio. #107154 (groeneai).
  • Las recargas de configuración ya no vuelven a ejecutar los scripts de inicio, lo que evita que las acciones de inicio que solo deben ejecutarse una vez vuelvan a ejecutarse. #107187 (mstetsyuk).
  • Se corrigió el orden incorrecto de los resultados de ORDER BY sobre UNION ALL con optimize_read_in_order habilitado cuando la canalización de la unión se reducía debido a la configuración de max_streams_for_union_step; ahora se omite esta reducción cuando el plan depende de flujos de salida ordenados de UNION. #107208 (vdimir).
  • Se corrigió una posible desreferenciación de puntero nulo al resolver la configuración del proxy durante la fase final de apagado del servidor. #107231 (PedroTadim).
  • Se corrigió ORDER BY ... WITH FILL, que producía filas adicionales cuando una columna de ORDER BY anterior a la columna de relleno usa una intercalación COLLATE. Las filas ahora se agrupan por el prefijo de ordenación mediante esa intercalación, de acuerdo con el orden de clasificación. #107365 (groeneai).
  • Se corrigió el comportamiento indefinido al pasar un valor de coma flotante no finito (como nan o inf) como argumento de marca de tiempo o duración a las funciones de tabla prometheusQuery / prometheusQueryRange. Ahora, dicho argumento genera BAD_ARGUMENTS en lugar de producir una marca de tiempo inválida. #107417 (groeneai).
  • Se corrigieron resultados incorrectos de la optimización optimize_rewrite_aggregate_function_with_if para funciones de agregación que preservan valores de carga útil NULL (la familia *_respect_nulls: anyRespectNulls, first_value_respect_nulls, anyLast_respect_nulls, last_value_respect_nulls). La optimización ya no reescribe f(if(cond, x, NULL)) a la forma -If para dichas funciones. #107430 (groeneai).
  • Se añadió validación para límites malformados en la entrada ORC. #107580 (al13n321).
  • Se corrigió una denegación de servicio no autenticada por agotamiento de memoria en el puerto del protocolo MySQL. #107599 (tiandiwonder).
  • Se corrigió un problema que impedía usar la interfaz MySQL con MySQL Connector/J 8.2.0 y versiones posteriores (incluida la serie 9.x). El campo info del paquete OK ahora está codificado con longitud, como en el servidor MySQL, por lo que el controlador JDBC puede conectarse. #107693 (alexey-milovidov).
  • Se corrigió el error lógico Block structure mismatch in UnionStep stream (abortado del servidor en compilaciones de depuración/sanitizador, Code: 49 en compilaciones de lanzamiento) que se producía cuando las ramas hermanas de un UNION/INTERSECT/EXCEPT diferían solo en su predicado WHERE y el predicado de una de ellas se reducía a una constante en una columna Const. #107719 (groeneai).
  • La lectura de datos Arrow y ArrowStream con columnas String o Binary vacías generadas por Apache Arrow Java anterior a la versión 19.0.0 (incluido Apache Spark) ya no produce INCORRECT_DATA. #107764 (Algunenano).
  • Los bloques Native malformados cuyo discriminador Variant hace referencia a una variante inexistente ahora se rechazan de forma segura. #107991 (uwezkhan).
  • Se corrigió una regresión de rendimiento al leer columnas Dynamic con varios hilos. #107997 (Avogar).
  • El ajuste obsoleto del lago de datos storage_catalog_url ahora se rechaza correctamente mediante la protección del catálogo (anteriormente solo se comprobaban storage_catalog_type y storage_aws_access_key_id), y el mensaje de error enumera todos los ajustes obsoletos. #108040 (alexey-milovidov).
  • Se corrigió un problema por el que la función/motor de tabla ArrowFlight rechazaba una colección con nombre que omitía la clave opcional dataset con el error No such key 'dataset'. #108041 (alexey-milovidov).
  • Los secretos y las credenciales ahora se enmascaran en system.query_views_log.view_query en lugar de exponerse en el SQL registrado de las vistas. #108214 (Fidelaggio).
  • Se corrigió el problema por el que type_json_allow_duplicated_key_with_literal_and_nested_object no funcionaba con rutas tipadas en JSON. #108218 (Avogar).
  • Se corrigió un comportamiento indefinido (se pasaba un puntero nulo a memcpy) en las funciones detectCharset y detectLanguageUnknown cuando la cadena de entrada supera los 32768 bytes y no se puede detectar ningún juego de caracteres. #108250 (groeneai).
  • Se corrigió el error NOT_FOUND_COLUMN_IN_BLOCK en consultas que usan las columnas virtuales _part_starting_offset/_part_offset en WHERE junto con la materialización diferida. #108287 (vdimir).
  • Se ocultan los argumentos secretos de funciones como encrypt, decrypt y HMAC en la salida de EXPLAIN actions, EXPLAIN header y EXPLAIN PIPELINE cuando format_display_secrets_in_show_and_select está deshabilitado (el valor predeterminado). #108386 (Algunenano).
  • CREATE OR REPLACE ahora se ejecuta correctamente para una vista materializada actualizable cuando su destino TO ya pertenece a esa misma vista. Los destinos que pertenecen a otra vista siguen rechazándose. #108392 (evillique).
  • Se restringió la ruta del modelo de catboostEvaluate al directorio user_files, al igual que para file() y las fuentes de diccionario. Anteriormente, la función aceptaba una ruta arbitraria del sistema de archivos sin comprobar que estuviera contenida en user_files, lo que permitía comprobar la existencia de archivos fuera de user_files y desencadenar su lectura. Ahora los modelos deben estar ubicados dentro de user_files. #108463 (groeneai).
  • Se corrigió el problema por el que CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE dejaba la nueva vista sin suscripción a su tabla de origen, lo que descartaba silenciosamente todas las filas insertadas después del reemplazo. #108728 (alexey-milovidov).
  • Se corrigió un fallo de segmentación al combinar estados de agregación de uniqExact con GROUPING SETS, ROLLUP o CUBE y max_threads > 1. #108928 (Algunenano).
  • Se corrigió un posible error lógico “Unexpected substream … for column …” al actualizar la configuración de compatibilidad. #109496 (Avogar).
  • La función getClientHTTPHeader ahora trata los nombres de encabezado sin distinguir entre mayúsculas y minúsculas, de acuerdo con la RFC 9110; en particular, el encabezado authorization ahora se filtra independientemente de cómo se escriba. #109791 (Felixoid).
  • Se corrigió la pérdida silenciosa de datos con inserciones asíncronas y deduplicación (async_insert=1, async_insert_deduplicate=1). Cuando varias entradas de inserción asíncrona con valores distintos de insert_deduplication_token se combinaban en un único vaciado que escribía en particiones distintas, cada token se registraba en el registro de deduplicación de todas las particiones afectadas por el vaciado, no solo en la partición donde se insertaban sus propias filas. Posteriormente, una inserción que reutilizaba uno de esos tokens en una partición en la que nunca se habían insertado filas con ese token se deduplicaba silenciosamente. Ahora los tokens se registran únicamente en la partición donde realmente se insertaron sus filas. #111049 (groeneai).
  • Se corrigieron las inserciones asíncronas en formato Native para evitar que una entrada almacenada temporalmente en el búfer que se vuelve incompatible tras ALTER ... MODIFY COLUMN provoque el error de todo el lote. #111108 (Felixoid).
  • Se corrigió CREATE OR REPLACE de un diccionario con un objeto de otro tipo: fallaba con CANNOT_DETACH_DICTIONARY_AS_TABLE después de confirmar el reemplazo, lo que dejaba una tabla _tmp_replace_* huérfana. #111142 (evillique).
  • Se corrigió una fuga de memoria de certificados de pares durante handshakes TLS con la verificación de certificados habilitada. #111425 (thevar1able).
  • Se corrigió un error lógico Block structure mismatch in IntersectOrExceptStep stream: different number of columns que podía ocurrir cuando la optimización de división de filtros (query_plan_split_filter) se aplicaba a un WHERE cuyo nombre de columna de filtro también era el de una columna de entrada. La optimización dejaba una columna interna __split_filter en la cabecera de salida de la rama, que luego difería de la rama asociada de una operación de conjuntos como INTERSECT o UNION. #111930 (groeneai).
  • Se corrigieron resultados incorrectos en filtros o expresiones ORDER BY que usan toString con valores Time, Time64 o DateTime en zonas horarias con horario de verano. También se restauró la optimización de lectura en orden para ORDER BY sobre un prefijo de la clave de ordenación de la tabla y para conversiones de String a Nullable(String). #113291 (vdimir).
  • Se corrigió ATTACH de una tabla Kafka cuando kafka_num_consumers supera el límite derivado del número de núcleos de CPU. #113390 (evillique).
  • Se deshabilitó el análisis de índices distribuido al usar proyecciones para evitar resultados de consulta incorrectos. #115132 (azat).
  • Se corrigió un error en la función formatRowNoNewline que podía producir resultados incorrectos o un error lógico cuando una fila se formateaba como un resultado vacío. #115669 (alexey-milovidov).
  • Ya no se devuelve memoria sin inicializar en el resultado de un literal de cadena binaria cuya longitud no es múltiplo de ocho ni desde el descompresor LZ4 cuando un bloque comprimido no tiene cuerpo. #115704 (alexey-milovidov).
  • Se incluyeron las rutas de los objetos en los hashes de deduplicación para evitar la deduplicación incorrecta de valores de objetos distintos. #115866 (Felixoid).
Última modificación el 26 de septiembre de 2026