Cambios incompatibles con versiones anteriores
Cambios en consultas y sintaxis
- El operador
INahora usa una semántica de valores exactos para el tipoBool: solo0y1del conjunto coinciden con valoresBool. Antes, los valores numéricos mayores que255en el conjunto deINse convertían incorrectamente a true, por lo queSELECT CAST(1, 'Bool') IN (256)devolvía1. Ahora devuelve correctamente0. #93115 (Ashrith Bandla). - Se corrigió la precedencia del operador
NOTpara ajustarla al estándar SQL:NOTahora tiene menor precedencia queIS NULL,BETWEEN,LIKEy los operadores aritméticos. Por ejemplo,NOT (x) IS NULLahora se interpreta comoNOT (x IS NULL)en lugar de(NOT x) IS NULL. Esto puede cambiar el resultado de las consultas que dependían del comportamiento anterior (no estándar). #97680 (Alexey Milovidov). SELECTya no se permite como identificador sin comillas en un elemento de la lista de expresionesWITH. #101059 (Aruj Bansal).- El operador
INahora rechaza conversiones deDecimalcon pérdida dentro de tipos compuestos (Tuple,Array,Map), lo que hace que su comportamiento sea coherente con las comparaciones escalares de nivel superior. Antes, las comprobaciones de precisión solo se aplicaban a valores escalares de nivel superior: por ejemplo,CAST('33.3', 'Decimal64(1)') IN (33.33)devolvía correctamente0, peroCAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])devolvía incorrectamente1. Ahora ambos casos devuelven correctamente0. #101812 (Nihal Z. Miaji).
Cambios en los tipos de datos
- Las versiones de serialización de los tipos de datos ahora también se propagan a los tipos de datos anidados. Por ejemplo, la versión de serialización
with_size_streamde String antes solo se aplicaba a las columnas String de nivel superior y a los elementos de Tuple; ahora se aplica a cualquier tipo String dentro de cualquier tipo anidado, como Array, Map, Variant o JSON. Esto se controla mediante el setting de MergeTreepropagate_types_serialization_versions_to_nested_types, que ahora está habilitado de forma predeterminada. Después de este cambio, las partes de datos recién creadas no pueden leerse con versiones anteriores, pero las partes antiguas sí pueden leerse en la versión nueva. Las actualizaciones son seguras, pero no las reversiones a versiones anteriores. #94859 (Pavel Kruglov). - Se corrigió el orden de bytes de la serialización binaria de
QBitpara usar el formato little-endian. #101378 (Raufs Dunamalijevs).
Cambios en el almacenamiento y los índices
- Se corrigieron los metadatos de las proyecciones normales para que las proyecciones con claves de ordenación de varias columnas se reconozcan correctamente. #91352 (Amos Bird).
- Se corrigió un problema por el que los archivos de los índices de omisión no respetaban la configuración
replace_long_file_name_to_hash, lo que provocaba errores de “File name too long” y fallos al leer índices con nombres largos. Ahora, cuando los nombres de archivo de los índices de omisión superanmax_file_name_length, se reemplazan por un hash, igual que ocurre con los archivos de columna. Esto es retrocompatible (los servidores nuevos leen las partes antiguas), pero una reversión (o el uso de servidores antiguos durante una actualización gradual) puede hacer que se ignoren los índices con nombres largos. #97128 (Raúl Marín).
Características eliminadas
- Se eliminó el tipo de índice de omisión
hypothesis. Era una característica experimental poco conocida y de utilidad práctica limitada. Crear tablas conINDEX ... TYPE hypothesisahora genera un error. #96874 (Alexey Milovidov). - Se eliminó la función experimental
detectProgrammingLanguage. #99567 (Alexey Milovidov).
Cambios en los ajustes y la configuración
- Se cambió el valor predeterminado de
mysql_datatypes_support_levelde vacío adecimal,datetime64,date2Date32, lo que permite, de forma predeterminada, la correspondencia correcta de MySQLDATEconDate32,DECIMAL/NUMERICconDecimalyDATETIME/TIMESTAMPcon precisión conDateTime64. Anteriormente, las columnas MySQLDATEse correspondían conDate, que no puede representar fechas anteriores a 1970-01-01, lo que provocaba corrupción de datos. #97716 (Alexey Milovidov).
Cambios en las inserciones y la deduplicación
- La inserción asíncrona ahora está habilitada de forma predeterminada: ClickHouse agrupa por defecto todas las inserciones pequeñas en lotes. Esto se rige por la configuración
compatibility: establecercompatibilityen una versión inferior a 26.2 restablece el valor predeterminado anterior defalse. Las inserciones asíncronas pueden activarse o desactivarse en varios niveles: en los perfiles de usuario de la configuración, para la sesión, para la consulta o para la tabla MergeTree. #97590 (Sema Checherinda).
Cambios en las tablas del sistema
- Se revirtió el cambio en la columna
skip_indexesdesystem.query_log. #101018 (Alexey Milovidov).
Otros cambios incompatibles
mergeTreeAnalyzeIndexes{,UUID}ahora acepta un Array de nombres de partes en lugar de una expresión regular, ya que las expresiones regulares son lentas (funcionalidad experimental). #98474 (Azat Khuzhin).- La biblioteca H3 se ha actualizado a la versión 4, lo que mejora la precisión de los cálculos de longitud, área y otras métricas. Este cambio no es retrocompatible porque los nuevos resultados difieren de los anteriores. #100348 (Alexey Milovidov).
- Se ha cambiado la forma en que la tabla
Mergemaneja las columnas virtuales. Si la tabla subyacente contiene_tableo_database, estas columnas se leen desde el almacenamiento; de lo contrario, se rellenan después del paso de lectura mediante el paso de expresión. #101742 (Mikhail Artemenko).
Nuevas características
Funciones
- Se añadió la función
naturalSortKey(s)para claves de ordenación natural. #90322 (Nazarii Piontko). - Se añadió la función
arrayAutocorrelation(arr [, max_lag]), que calcula la autocorrelación normalizada de un array numérico para cada desfase. Admite arrays de enteros, coma flotante y decimales. #94776 (Wenyu Chen). - La función
has()ahora es compatible con el tipo JSON para comprobar la existencia de rutas, de forma similar aMap. #96927 (DQ). - Se añadió la función de tabla
mergeTreeTextIndex(database, table, index), que lee datos directamente desde un índice de texto. Puede usarse para introspección o para realizar agregaciones sobre datos del índice de texto. #97003 (Anton Popov). - Se añadió la función SQL
obfuscateQuery. #98305 (Xuewei Wang). - Se añadieron las funciones
caseFoldUTF8yremoveDiacriticsUTF8para el plegado de mayúsculas y minúsculas en Unicode y la eliminación de marcas diacríticas. #98973 (George Larionov). - La función
printfahora admite cadenas de formato no constantes, lo que permite usar un patrón de formato distinto por fila según los valores de las columnas. #98991 (Yash). - Se añadió la función
highlight(), que envuelve las apariciones de términos de búsqueda en una cadena de texto con etiquetas HTML (por defecto<em>/</em>). Admite coincidencias ASCII sin distinción entre mayúsculas y minúsculas, la combinación automática de coincidencias superpuestas y etiquetas de apertura/cierre personalizadas. #99131 (Peng). - Se añadió la función de cadena
normalizeUTF8NFKCCasefoldpara la normalización Unicode NFKC_Casefold, que combina la normalización NFKC con el plegado de mayúsculas y minúsculas. #99276 (George Larionov). - Se añadió el tokenizador
unicode_wordpara índices de texto completo y la funcióntokens. Divide el texto usando reglas de límite de palabra de Unicode: las palabras ASCII se forman con caracteres conectores (guion bajo, dos puntos, punto y comilla simple), mientras que los caracteres Unicode no ASCII se convierten en tokens de un solo carácter. Las stop words configurables usan por defecto signos de puntuación CJK comunes. #99357 (Amos Bird). - Se añadió la función
arrayTranspose, que toma una matriz bidimensional (matriz) y la transpone. #101214 (Vitaly Baranov). - Se añadió la función
hasPhrase(aliasmatchPhrase) para la búsqueda de frases (secuencias continuas de tokens). La búsqueda es de fuerza bruta y aún no es compatible con el índice de texto. #101997 (Elmi Ahmadov). - Se añadió
dotProductcomo función de distancia compatible para índices de similitud vectorial. La dirección de ordenación ahora se valida para todas las funciones de distancia a fin de evitar resultados incorrectos sin avisar. #102254 (Renzo). - La función
stemahora puede aplicar stemming a todas las palabras/tokens de columnasString,FixedString,Array([Fixed]String),Nullable,LowCardinalityyConst. #99137 (Jimmy Aguilar Mena). - La función
stemya no es experimental (anteriormente, era necesario habilitarallow_experimental_nlp_functions). #102399 (Jimmy Aguilar Mena). - Se añadió la función
JSONAllValues, que devuelve todos los valores de una columnaJSONcomoArray(String), con los valores serializados en representación textual y ordenados por sus nombres de path. También se añadió compatibilidad con índices de texto para la expresiónJSONAllValuesen columnasJSON: cuando se crea un índice de texto enJSONAllValues(json_column), se usa automáticamente para filtrar consultas sobre subcolumnas deJSON(p. ej.,json_column.key1 = 'value'). #100730 (Anton Popov). - Se añadieron unidades compatibles con PostgreSQL al operador
EXTRACT:EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADEyMILLENNIUM. También se corrigióEXTRACT(WEEK FROM date), que anteriormente generaba un error. #100274 (Alexey Milovidov). - Se añadió compatibilidad con la función
toDaysInMonth()mediante azúcar sintáctico del parser para la sintaxis de la función estándar SQLOVERLAY. La funciónoverlayya existe; esto añade compatibilidad con la forma basada en palabras clave que usaPLACING,FROMyFORcomo separadores. #101681 (Desel72). - Los valores de
DateyDate32ahora pueden sumarse a los valores deTimeyTime64mediante el operador+, lo que produce un resultadoDateTimeoDateTime64. Por ejemplo,SELECT toDate('2024-01-15') + toTime('14:30:25')devuelve2024-01-15 14:30:25. El resultado se calcula en la zona horaria de la sesión, y los resultados fuera de rango se gestionan de acuerdo con la configuracióndate_time_overflow_behavior. #102421 (Nihal Z. Miaji).
Características de SQL y de las consultas
- Cuando un parámetro tiene tipo
Nullabley no se especifica, ahora se asume que su valor esNULL. #93869 (Vikash Kumar). - ClickHouse ahora puede omitir partes de datos completas en consultas
SELECTbasándose en estadísticas mín./máx. #94140 (zoomxi). - Se añadió compatibilidad con las CTE materializadas, que evalúan las CTE una sola vez durante la ejecución de la consulta y almacenan sus resultados en tablas temporales. #94849 (Dmitry Novik).
- Ahora se pueden usar ciertas funciones sin paréntesis en SQL. #95949 (Aly Kafoury).
- Se añadió la sintaxis de subcolumna combinada
json.@pathpara el tipoJSON. Devuelve el valor literal comoDynamicsi la ruta contiene un escalar, el subobjeto comoDynamicsi la ruta contiene un objeto anidado, oNULLsi la ruta no existe. #98788 (Pavel Kruglov). - Se añadió la palabra clave
SOMEpara expresiones de subconsulta. Se comporta de forma idéntica aANY. #99842 (Artem Kytkin). - Se añadió compatibilidad con
SET TIME ZONE 'tz'como alias deSET session_timezone. #99883 (phulv94). - Se añadió compatibilidad con la cláusula
VALUESestándar de SQL como expresión de tabla enFROM, por ejemplo,SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). - Se añadió compatibilidad con literales compuestos de intervalos del estándar SQL con calificadores de rango
TO, por ejemplo,INTERVAL '1:30' HOUR TO MINUTE, que se descomponen internamente en sumas de intervalos. #100453 (Desel72). - Se añadió el comando
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'para los modos ordered y unordered. #100709 (Bharat Nallan).
Motores de tabla y almacenamiento
- Se añadió compatibilidad con la lectura incremental para el motor de tabla
Paimon, con seguimiento del progreso de instantáneas respaldado por Keeper, incluidas lecturas delta de instantáneas concretos mediantepaimon_target_snapshot_id. #93655 (XiaoBinMu). - Se añadió compatibilidad con ZooKeeper auxiliar en
DatabaseReplicated. #95590 (RinChanNOW). - Se añadió compatibilidad para leer tipos timestamp de nanosegundos de Iceberg v3 (
timestamp_nsytimestamptz_ns), asignados aDateTime64(9)yDateTime64(9, 'UTC'). Esto permite que ClickHouse lea datos de Iceberg con estos tipos en el esquema; no constituye compatibilidad completa con Iceberg v3 ni permite escribir Iceberg v3 con estos tipos. #97132 (Dmitry Kovalev). - Se añadió
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')para tablas Iceberg. #97904 (murphy-4o). - Se añadió una nueva caché SLRU para metadatos de Parquet para mejorar el rendimiento de lectura al eliminar la necesidad de volver a descargar archivos solo para leer sus metadatos. #98140 (Grant Holly).
- Se añadió compatibilidad con índices de omisión de MergeTree para columnas JSON usando
JSONAllPathscon los tipos de índicebloom_filter,tokenbf_v1,ngrambf_v1ytext(invertido), lo que permite omitir gránulos según el conjunto de rutas JSON presentes en cada gránulo. #98886 (Pavel Kruglov). - Se añadió el índice de proyección
commit_order, que reorganiza los datos en orden de inserción. #99004 (Mikhail Artemenko). - Se añadió serialización en buckets para columnas
Mapen MergeTree (map_serialization_version = 'with_buckets'). Las claves se dividen en buckets basados en hash, de modo que al leer una sola clave (m['key']) solo se lee un bucket en lugar de toda la columna, lo que proporciona una aceleración de entre 2 y 49 veces en búsquedas de una sola clave, según el tamaño del mapa. El número de buckets y la estrategia de bucketización pueden controlarse mediante los nuevos ajustes de MergeTreemap_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficientymap_buckets_min_avg_size. El ajustemap_serialization_version_for_zero_level_partsmantiene la serialización básica para las inserciones a fin de evitar la sobrecarga de escritura, mientras que las partes fusionadas usan buckets. Los índices de omisión sobremapKeys/mapValuesson compatibles con la serialización en buckets, yoptimize_functions_to_subcolumnsreescribem['key']como una lectura de subcolumna por clave cuando hay buckets disponibles. #99200 (Pavel Kruglov).
Inserción y deduplicación
- Se implementó un nuevo comportamiento de
max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rowsymin_insert_block_size_bytesen el proceso de compactación, controlado por la configuración de compatibilidaduse_strict_insert_block_limits. #94207 (Kirill Kopnev).
Ajustes y configuración
- Se añadió el ajuste de MergeTree
table_readonlypara marcar tablas como de solo lectura y evitar inserciones y modificaciones. #97652 (Alexey Milovidov). - Se añadió el ajuste
use_partition_pruning(aliasuse_partition_key). Establécelo enfalsepara desactivar la poda de particiones basada en la clave de partición. #97888 (Nihal Z. Miaji). - Cada entrada
type=httpen<protocols>ahora puede especificar una clave<handlers>personalizada que apunte a una sección de configuración<http_handlers_*>independiente, lo que permite aplicar distintas reglas de enrutamiento HTTP por puerto. #98414 (Amos Bird). - Se añadieron dos ajustes de MergeTree —
replicated_fetches_min_part_levelyreplicated_fetches_min_part_level_timeout_seconds— que permiten a las réplicas omitir la recuperación de partes recién insertadas (sin fusionar) desde otras réplicas, reduciendo la sobrecarga de replicación durante periodos de ingestión intensa. #98625 (tanner-bruce). - Se añadió el ajuste de servidor
restore_access_entities_with_current_grants. Cuando está habilitado, los usuarios/roles restaurados ven sus privilegios limitados a lo que el usuario que realiza la restauración puede conceder (con la misma semántica queGRANT CURRENT GRANTS), en lugar de fallar conACCESS_DENIED. #98795 (pufit). - Se añadieron los ajustes
max_skip_unavailable_shards_numymax_skip_unavailable_shards_ratiopara limitar cuántos segmentos pueden omitirse sin aviso cuandoskip_unavailable_shardsestá habilitado. Si el número o la proporción de segmentos no disponibles supera el umbral configurado, se lanza una excepción en lugar de devolver resultados incompletos sin aviso. #99369 (Alexey Milovidov). - Se implementaron cuotas por hash de consulta normalizada para proteger los servicios públicos de ClickHouse frente a abusos.
NORMALIZED_QUERY_HASHse admite como tipo de clave de cuota — una cuota independiente por cada consulta normalizada única, de modo queCREATE QUOTA q KEYED BY normalized_query_hashcontrola cada consulta distinta por separado.QUERIES_PER_NORMALIZED_HASHse admite como tipo de recurso de cuota — limita el número máximo de ejecuciones de una misma consulta normalizada dentro de un intervalo, por lo queMAX queries_per_normalized_hash = 100evita que un mismo patrón de consulta se ejecute más de 100 veces. #99586 (Alexey Milovidov). - El ajuste de MergeTree
auto_statistics_typesahora usaminmax, uniqde forma predeterminada, por lo que las estadísticas minmax y uniq se crean automáticamente para todas las columnas adecuadas de las tablas nuevas.materialize_statistics_on_insertahora usafalsede forma predeterminada, por lo que las estadísticas se generan durante las fusiones en lugar de en el momento de la inserción, reduciendo la sobrecarga de inserción. Establecematerialize_statistics_on_insert = 1para restaurar el comportamiento anterior. #101275 (Han Fei). - Se añadió el ajuste de actualización
prefer_dependency_replicapara las cadenas de dependencias de vistas materializadas, con el fin de reducir la pérdida de datos causada por el retraso de replicación entre réplicas. #101591 (Seva Potapov).
Autenticación
- Se añadió la opción de configuración LDAP por servidor
<follow_referrals>(valor predeterminado:false) para controlar si el client de LDAP sigue referencias. Desactivar el seguimiento de referencias evitatimeoutsy bloqueos al buscar desde un base DN raíz de dominio de Active Directory, y genera menos ruido en el log. #96765 (paf91).
Tablas del sistema
- Se añadió
system.histogram_metric_log, una nueva tabla del sistema que realiza instantáneas periódicas de todas las métricas de histograma (p. ej., latencias de S3/Azure y duraciones de las etapas de procesamiento de solicitudes de Keeper). La columnavaluedesystem.histogram_metricsahora esFloat64para ofrecer mayor flexibilidad y compatibilidad con el modelo de datos de Prometheus. #103046 (Miсhael Stetsyuk).
Características experimentales
- Se añadió el códec de compresión de punto flotante ALP (sin fallback de ALP_rd para valores
doubleno comprimibles). #91362 (Nazarii Piontko). - Se añadieron indicaciones de tipo diferidas experimentales para columnas JSON. Cuando se habilitan mediante
allow_experimental_json_lazy_type_hints,ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)que solo agrega o modifica indicaciones de tipo se completa al instante como una operación de solo metadatos, sin reescribir los datos históricos. Las indicaciones de tipo se aplican en tiempo de consulta a las partes antiguas y se materializan durante los INSERT y las fusiones en segundo plano. #97412 (tanner-bruce). - Se añadió compatibilidad con dialectos SQL externos mediante la biblioteca
polyglot. #99496 (Alexey Milovidov). - Se añadió la configuración
query_plan_optimize_join_order_randomize, que aleatoriza las estadísticas utilizadas para reordenar el join, lo que resulta útil para realizar pruebas. #100643 (Vladimir Cherkasov). - Se añadió compatibilidad con funciones de IA en ClickHouse, lo que permite a los usuarios llamar a endpoints de OpenAI y Anthropic mediante SQL.
aiGeneratese incluye como la primera función de este tipo. #100831 (George Larionov). - Se añadieron las funciones de IA
aiClassify,aiExtractyaiTranslatepara utilizar APIs de LLM en ClickHouse. #100832 (George Larionov). - Se añadió compatibilidad con lagos de datos en Azure con Delta Kernel. #102202 (Smita Kulkarni).
Mejoras del rendimiento
Rendimiento de JOIN
- Pequeñas mejoras en
HashJoinyConcurrentHashJoin. #96663 (Yarik Briukhovetskyi). - Se añadió compatibilidad para invertir los lados de los joins
ANTI,SEMIyFULLen función de las estadísticas del optimizador. #97498 (Hechem Selmi). - Se redujo la contención en la caché en los joins
RIGHTyFULLcomprobando siJoinUsedFlagsestá activado antes de escribir. #99274 (Hechem Selmi). - Se aceleraron los joins hash sobre claves
Int32eInt64con un rango pequeño mediante una tabla hash de índice directo. #99275 (Hechem Selmi).
Optimización de consultas
- Se optimizó el skipping de gránulos para
pointInPolygonen polígonos grandes y se corrigió un error por el que el análisis de índice depointInPolygonarrojaba errores durante el pruning de la primary key. #91633 (Nihal Z. Miaji). optimize_read_in_orderahora se respeta al leer projections. #95885 (Andrey Zvonov).- Se optimizó ligeramente la lectura desde el Diccionario del text index, lo que mejora el rendimiento general del análisis del text index. #97519 (Anton Popov).
- Se mejoró el rendimiento del análisis del text index para consultas con conditions combinadas que involucran tanto columnas indexadas como no indexadas. Anteriormente, la optimización de salida anticipada durante el análisis de índice se deshabilitaba incorrectamente en esos casos. #98096 (Anton Popov).
- Se mejoró el rendimiento de las consultas con expressions constantes que generan arrays o maps muy largos. #98287 (Alexey Milovidov).
- Se corrigió el análisis de condiciones de clave para primary keys
DateTime64comparadas con constantes enteras, lo que antes impedía el Granule pruning. #98410 (Amos Bird). - La setting
optimize_syntax_fuse_functionsahora está habilitada de forma predeterminada. #98424 (Alexey Milovidov). - El partition pruning ahora está permitido cuando el predicado contiene cualquier operador de comparación (
=,<,>,!=) y la partition key está envuelta en una chain de funciones determinista (por ejemplo, conPARTITION BY x, predicados comocityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026otoYYYYMM(x) != 2026usarán la partition key para el pruning). #98432 (Nihal Z. Miaji). - La optimización read-in-order y el pruning de la primary key ahora están permitidos cuando el tipo de destino de
CASTesNullabley la conversión es monotónica; por ejemplo, conPRIMARY KEY x, ClickHouse puede usar la optimización read-in-order paraORDER BY x::Nullable(UInt64)y el pruning de la primary key para predicados comoWHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji). - El pruning de índice y el filter pushdown ahora están permitidos cuando una columna integral se compara con un literal float; por ejemplo, predicados como
WHERE x < 10.5ahora pueden usar la primary key para el pruning, y filtros comoprime < 1e9onumber < 1e5ahora hacen pushdown para las table functionsprimes()ynumbers()en lugar de provocar una ejecución no acotada. #98516 (Nihal Z. Miaji). - Las consultas que filtran por columnas de primary key de MergeTree con alternancias regex sobre strings literales, como
^(abc-1|abc-2), ahora pueden usar el pruning de la primary key cuando las alternativas comparten un prefix común. #98988 (Yash). - Se optimizaron
INTERSECT ALLyEXCEPT ALL. #99097 (Raufs Dunamalijevs). - Se agregó soporte para la optimización
read_in_order_use_virtual_rowen lecturas en orden inverso. #99198 (Vladimir Cherkasov). - Consultas discontinuas más rápidas para columnas
LowCardinalitycon un único diccionario. #99285 (Ivan Babrou). - Se corrigió el escalado negativo en consultas cortas con aggregation en máquinas con muchos núcleos. Cuando una consulta lee pocas marcas, la pipeline ya no se expande a
max_threadsdespués de la aggregation, lo que evita la sobrecarga de flujos casi vacíos. #99493 (Alexey Milovidov). - Se mejoró el rendimiento de las consultas con réplicas paralelas al seleccionar correctamente el tamaño de la tarea de lectura. #99801 (Nikita Taranov).
- Se eliminaron los elementos redundantes al final de
ORDER BYuna vez que todas las claves deGROUP BYquedan cubiertas por el prefijo deORDER BY. #100157 (Alexey Milovidov). - Se optimizaron las consultas aplicando la cláusula
LIMITdentro deUNION ALL. #100364 (Alexey Milovidov). - Se añadió soporte de compilación JIT para comparaciones de columnas
StringyFixedStringenORDER BY, lo que mejora entre un 6 y un 17 % el rendimiento de ordenación en la fase de combinación para claves de ordenación dominadas por cadenas. #100577 (Raúl Marín). - Cuando
read_in_order_use_virtual_rowestá habilitado junto con la nueva configuraciónread_in_order_use_virtual_row_per_block, la información de límites de filas virtuales ahora se emite después de cada block leído de MergeTree, lo que permite que la combinación vuelva a priorizar las fuentes a mitad del flujo para las partes cuyos datos quedan completamente filtrados porWHERE/PREWHERE/JOIN. #100603 (Vladimir Cherkasov). - Mejor paralelización de consultas con vistas simples (sobre una tabla MergeTree subyacente) ejecutadas con réplicas paralelas. #100815 (Igor Nikonov).
- Se añadió soporte para réplicas paralelas sobre vistas simples (incluidas las vistas
UNION ALLcompatibles sobre tablasMergeTree) cuandoparallel_replicas_allow_view_over_mergetree=1. Esto paraleliza la consulta externa de la vista en lugar de la interna, aumentando la paralelización de consultas entre nodos. #100958 (Igor Nikonov). - Se optimizó la lectura en orden de la clave primaria para
full_sorting_mergecuando hay filtros conINen el plan de consulta. #101261 (Nikita Taranov). - Se mejoró el rendimiento de
INSERT VALUESpara columnasMap,ArrayyTuplecuando los valores se pasan como cadenas escapadas (por ejemplo,'{\'key\':1}'), evitando recurrir innecesariamente al analizador de expresiones SQL. #102119 (Joanna Hulboj).
Rendimiento de funciones y agregación
- Se mejoró el rendimiento de la función
levenshteinDistance. #94543 (Joanna Hulboj). - Se optimizaron las conversiones en lote del tipo Decimal al evitar llamadas a funciones por elemento. #95923 (Konstantin Bogdanov).
- Se mejoró el rendimiento de las consultas
LIKE. #98149 (Elmi Ahmadov). - Se optimizó la aggregate function
avgWeightedmediante el uso de acumuladores locales en lugar de almacenamiento y reenvío por fila a través del estado de agregación, con mejoras de rendimiento de hasta un 27 % para entradasNullable. #98793 (Antonio Andelic). - Se aceleraron las funciones
var*Stableystddev*Stablepara columnasFloat64mediante la desvirtualización del bucle interno. Esto permite optimizaciones del compilador (FMA/registros) que alteran los resultados de coma flotante a nivel de ULP. #99460 (Riyane El Qoqui). - Se utiliza la codificación base58 optimizada de Firedancer para entradas de 32/64 bytes (automática para
base58Encode) y se permite usar la decodificación base58 optimizada si el resultado decodificado tiene 32/64 bytes (de forma explícita conbase58Decode('...', 32)). #99461 (Joanna Hulboj). - Se optimizó la función
cutURLParametereliminando desplazamientos de memoria innecesarios. #100218 (Nikita Semenov). - Conversión más rápida de float a string para valores enteros grandes al ampliar la ruta rápida de
itoacon redondeo compatible con dragonbox. #100649 (Raúl Marín). - Se reemplazó dragonbox por zmij para lograr una conversión de float a string entre 1,5 y 3 veces más rápida. #100650 (Raúl Marín).
- Conversión más rápida de
Int128/UInt128a string al sustituir la división por software por reducción de Barrett y desenrollar el bucle de conversión. #100671 (Raúl Marín). - Se evitó crear threads redundantes en la fusión paralela de
UniqExactSet. #100686 (Jiebin Sun). - Se añadió fusión paralela por lotes para
UniqExactSet. #100687 (Jiebin Sun).
Rendimiento de almacenamiento y E/S
- Se redujo la contención de bloqueos durante operaciones de solo lectura en tablas ReplicatedMergeTree con mutaciones finalizadas. #95771 (Eduard Karacharov).
- Iceberg ahora puede precargar metadatos en la caché de forma asíncrona, habilitado al establecer
iceberg_metadata_async_prefetch_period_msal crear la tabla. Las consultasSELECTsobre tablas Iceberg ahora pueden especificar el parámetroiceberg_metadata_staleness_ms, lo que permite a ClickHouse basarse en la versión en caché de los metadatos si es más reciente que la antigüedad especificada; de lo contrario, se consulta el catálogo Iceberg remoto para obtener los metadatos más recientes. Esto puede eliminar llamadas al catálogo Iceberg durante el procesamiento de solicitudes, con una mejora visible del rendimiento. #96191 (Arsen Muk). - El modo ordered de S3Queue ahora usa S3
ListObjectsV2StartAfterpara evitar volver a listar todo el historial del prefijo, lo que reduce las llamadas aListObjects. #96370 (Venkata Vineel). - Se habilitaron lecturas paralelas en el motor de tabla YTsaurus. #97343 (MikhailBurdukov).
- Se mejoró el rendimiento de los lagos de datos. En versiones anteriores, la lectura desde el almacenamiento de objetos no ajustaba el pipeline al número de hilos de procesamiento. #99548 (Alexey Milovidov).
- Se permitió la precarga al leer un archivo remoto mediante la caché de páginas en espacio de usuario. #99919 (Alexey Milovidov).
- Se corrigió una regresión significativa del rendimiento de INSERT cuando
deduplicate_insert=enable(valor predeterminado desde la versión 26.2) al diferir el cálculo del hash de los datos, moviéndolo del squashing al sink, y usar hash por lotes de columnas medianteupdateHashWithValueRange, lo que reduce la sobrecarga de ~2.5s a ~0.5s para 5M de filas con 22 columnas. #101494 (Sema Checherinda).
Optimización de memoria
- En las inserciones síncronas, ahora se puede omitir el bloque original (necesario para la deduplicación) para ahorrar memoria. #96661 (Sema Checherinda).
- Se mejoró el rendimiento y se redujo el uso de memoria de las funciones de ventana paralelas en ciertos escenarios, así como de las cargas de trabajo de
arrayFoldcon arrays grandes. Esto también puede reducir la presión por fallos de página y mejorar la estabilidad de las consultas afectadas cuando los límites de memoria son estrictos. #98892 (filimonov).
Mejoras
Consultas y SQL
- Las proyecciones de agregación ahora son compatibles correctamente en vistas. #88798 (Amos Bird).
optimize_aggregators_of_group_by_keysahora optimiza correctamente las funciones de agregación en consultasGROUPING SETS. #93935 (Xiaozhe Yu).- Se añadió compatibilidad con la optimización que convierte joins
OUTERenINNERconjoin_use_nulls. #95968 (Vladimir Cherkasov). - Se amplió
cast_keep_nullablepara que funcione con tiposDynamic/JSON. Cuando está habilitado, convertirNULLdesde tipos que pueden serNullabledevuelveNULL; de lo contrario,NULLlanza el errorCANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. #96504 (Seva Potapov). - Se añadió la cláusula
ROLEaCREATE USER. #97074 (Vitaly Baranov). - Se añadió información sobre filtros diferidos como un elemento independiente en la salida de la consulta
EXPLAIN(al usar políticas de fila/PREWHERE con FINAL). #97374 (Yarik Briukhovetskyi). - Se añadió compatibilidad con expresiones de join de tablas entre paréntesis en la cláusula
FROM, p. ej.SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - Se aplican índices de omisión de datos durante el análisis distribuido de índices. #97767 (Azat Khuzhin).
- La clave de ordenación de una tabla ahora puede ser una expresión como
toDate(time), y las decisiones sobre no diferir esas expresiones se toman cuando forman parte de filtros. #98237 (Yarik Briukhovetskyi). - El optimizador del orden de join ahora infiere predicados transitivos de equi-join a partir de condiciones de join existentes. Por ejemplo, dado
A.x = B.x AND B.x = C.x, se reconoce la equivalenciaA.x = C.x, lo que permite al optimizador considerar joins directos entre tablas conectadas transitivamente. Esto puede mejorar la calidad del plan para esquemas en estrella y en copo de nieve. La funcionalidad se controla mediante la nueva configuraciónenable_join_transitive_predicates(desactivada de forma predeterminada). #98479 (Alexander Gololobov). - Cuando
apply_row_policy_after_finaloapply_prewhere_after_finalestá habilitado, las condiciones compuestas conANDen las políticas de fila y enPREWHEREahora se descomponen para extraer átomos de la clave de ordenación para el análisis de índices de clave primaria. Antes, si un filtro diferido contenía una mezcla de predicados sobre la clave de ordenación y otros que no lo eran (p. ej.x > 1 AND y != 'foo'), toda la expresión se excluía del análisis de índices. #98513 (Yarik Briukhovetskyi). - Ahora, solo las réplicas “vivas” (a las que se puede conectar) participan en el análisis distribuido de índices. #98521 (Azat Khuzhin).
- Se limitó el número de nodos usados en la heurística automática de réplicas paralelas al número real de nodos del clúster (en lugar de solo la configuración
max_parallel_replicas). #98668 (Nikita Taranov). - Se implementaron hedged requests y lectura asíncrona para el análisis distribuido de índices. #98724 (Azat Khuzhin).
- Se añadió compatibilidad con la cláusula
SAMPLEen el análisis distribuido de índices. #98931 (Azat Khuzhin). - Se añadió compatibilidad con la monotonicidad en la multiplicación, lo que permite la poda de la clave primaria para expresiones
key * constant. #98983 (Amos Bird). - Los mensajes de error del analizador ya no muestran todas las columnas de una tabla (lo que podía producir excepciones de más de 150 KB). Las listas de columnas ahora están limitadas a 10 elementos. #99002 (Yash).
- Las estadísticas de columnas de subconsultas con JOIN ahora se devuelven correctamente para que la consulta padre pueda usarlas para reordenar los JOIN. #99096 (Alexander Gololobov).
- Ahora se permite
ALTER TABLE MODIFY COLUMN x TTL ...sin especificar el tipo de la columna. #99208 (Nikolay Degterinsky). - Se mejoró la salida de
EXPLAIN PLAN pretty=1: ahora imprime las columnas de salida de la consulta de nivel superior, muestra etiquetas/símbolos de relaciones JOIN con la estimación de filas del resultado y la localidad, e incluye las columnas de salida por paso para los pasos de JOIN/source. #99462 (Kirill Kopnev). - Se corrigió el fallo de la función de tabla
merge()con un errorUNKNOWN_IDENTIFIERal consultar columnas que no están presentes en todas las tablas distribuidas/remotas subyacentes. #99833 (Alexey Milovidov). ConditionSelectivityEstimatorya no se usa en el optimizador cuando la condición no está en CNF (por ejemplo,where a = 0, que es una única condición en la que las estadísticas no pueden ayudar). #100110 (Han Fei).- Se aplicó
distributed_index_analysis_min_indexes_bytes_to_activatedespués de la poda de particiones. #100477 (Azat Khuzhin). EXPLAIN PIPELINEahora admite la configuracióndistributed=1para incluir fragmentos remotos del pipeline. #100513 (Nikita Taranov).use_partition_pruning = 0ahora también desactiva la poda del índiceMinMaxy la optimización del conteo en las columnas de la clave de partición, además de desactivar la poda basada en claves de partición. #100904 (Nihal Z. Miaji).EXPLAIN [PLAN] pretty=1ahora imprime expresiones en un formato legible para humanos. #100927 (Kirill Kopnev).accurateCastOrNullyaccurateCastOrDefaultahora admiten tipos de destinoTuple, incluidosTuplesanidados con elementosNullable. Antes, estas funciones rechazaban destinosTupleporqueTupleno podía estar dentro deNullable. #100942 (Nihal Z. Miaji).- Ahora puede usar una coma final en la cláusula
WITHantes de una consultaSELECT. #101093 (Aruj Bansal). - Se implementó la materialización diferida de columnas para ReplacingMergeTree con FINAL cuando el predicado es lo suficientemente selectivo. #101647 (Nikolai Kochetov).
- Se mejoraron las estimaciones predeterminadas de selectividad para condiciones sin estadísticas, ajustándolas a heurísticas estándar del sector: 0.1 para la selectividad de la condición
LIKEy 0.33 para la selectividad de una condición desconocida. #101653 (Alexander Gololobov). - Se incorporó en línea la subconsulta VIEW en el árbol de consulta para permitir aplicar más optimizaciones a la VIEW. #100830 (Dmitry Novik).
Funciones
- Ahora se puede usar entrada nativa de JSON/Object para las funciones
JSONExtract. #96711 (Fisnik Kastrati). - Se introdujo la función SQL
tokensForLikePattern, que tokeniza patronesLIKErespetando la semántica de los comodines:%y_se tratan como comodines, los comodines escapados (\%,\_) se tratan como literales y se descartan los tokens adyacentes a comodines no escapados. #97872 (Amos Bird). - Se implementó la función
toDaysInMonth(), que devuelve el número de días del mes correspondiente a la fecha especificada. #99227 (Vitaly Baranov). - Se cambió el nombre del tokenizador
unicodeWordaasciiCJK. #100956 (George Larionov). - Se añadió azúcar sintáctico a nivel de parser para la sintaxis de la función estándar SQL
OVERLAY. La funciónoverlayya existe; esto añade soporte para la forma basada en palabras clave que utilizaPLACING,FROMyFORcomo separadores. #101681 (Desel72). - La función
ngramsahora rechaza longitudes de ngram no válidas. Por ejemplo,SELECT ngrams('abc', 0)ahora devuelve un error. #101922 (Robert Schulze). - Se añadió soporte para el tokenizador
arrayen la optimización deLIKE. #102880 (Elmi Ahmadov).
Motores de tabla y almacenamiento
- Se añadió un hilo de limpieza dedicado para MergeTree para evitar retrasos en la limpieza bajo una carga intensa de merges. #91574 (Amos Bird).
- Las tablas con reglas
DELETE TTLahora pueden usar el algoritmo de vertical merge. #97332 (murphy-4o). - Las marcas de los índices secundarios ahora se precalientan cuando está habilitada la configuración
prewarm_mark_cache(se cargan en la caché de marcas de índice durante la obtención de partes de datos y el arranque de la tabla). #97772 (Anton Popov). - Ahora se pueden crear índices de texto sobre columnas
Nullable([Fixed]String)yArray(Nullable([Fixed]String)). #98118 (Jimmy Aguilar Mena). - Cancelación anticipada de merges en segundo plano en
DROP DATABASEpara ordinary shared merge tree. #98161 (Shaohua Wang). - Se añadió la configuración
finalize_projection_parts_synchronouslypara permitir la finalización síncrona de las partes de proyección durante INSERT, reduciendo el uso máximo de memoria en tablas con muchas proyecciones, mientras se conserva por defecto el comportamiento asíncrono existente. #98228 (Amos Bird). - Se añadió la configuración de MergeTree
share_nested_offsets(valor predeterminadotrue). Cuando se establece enfalse, las columnas Array con nombres con puntos (por ejemplo,n.a,n.b) se tratan como columnas independientes en lugar de compartir archivos de desplazamiento y validar que los tamaños de los arrays sean iguales como parte de la semántica heredada de Nested. #98416 (Amos Bird). - Se optimizó
TRUNCATE DATABASE TABLES LIKEprecancelando merges en paralelo. #98597 (Shaohua Wang). - Se redujo la contención de bloqueos en
MergeTreeBackgroundExecutorliberando los recursos de las tareas sin adquirir el bloqueo. #98604 (Dmitry Novik). TRUNCATE DATABASEahora responde a la cancelación de consultas. #98828 (Shaohua Wang).- Se reinicia la caché de estadísticas después de cambiar una configuración de MergeTree. #98520 (Han Fei).
- Se añadió la configuración de MergeTree
compress_per_column_in_compact_partspara controlar cómo se organizan los bloques comprimidos dentro de las partes compactas. Cuando estrue(valor predeterminado, que conserva el comportamiento actual), cada columna inicia un nuevo bloque comprimido, lo que permite la descompresión selectiva. Cuando esfalse, todas las columnas dentro de un gránulo se empaquetan en el mismo bloque comprimido, lo que mejora la tasa de compresión y el rendimiento de lectura para cargas de trabajo que siempre leen todas las columnas. #101114 (Amos Bird). - El índice de texto ahora es GA y permanece habilitado independientemente de la configuración
compatibility, lo que evita su desactivación inesperada durante la restauración de copias de seguridad o al ejecutarse en modo de compatibilidad. #101518 (Nikita Fomichev). - Se añadió soporte para el índice de texto creado sobre
mapValues(map)con el operadorIN. #99286 (Anton Popov). - Se mejoró el análisis de varios índices de texto usados simultáneamente en la misma consulta. La configuración
use_skip_indexes_on_data_readya no es necesaria para la optimización de direct read de los índices de texto. #102255 (Anton Popov). - Se añadió compatibilidad con el análisis de índices de texto para la función
hasPhrasemediante el modoHINT. #102438 (Elmi Ahmadov). - Las estadísticas de columna MinMax ahora almacenan los valores mínimo y máximo como
Field(con tipo) en lugar deFloat64. El formato serializado incluye el nombre de tipo de la columna junto con los valores. La versión del archivo de estadísticas pasa a V2; los archivos escritos por versiones anteriores requieren volver a materializarse (ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).
Lagos de datos
- Se añadió una nueva consulta para comprobar el estado de
DataLakeCatalog. #94690 (Smita Kulkarni). - Se mejoraron las operaciones de escritura de Iceberg para Unity Catalog. #98162 (Konstantin Vedernikov).
- Se reconstruyeron las entidades de
IcebergManifestFilepara que el mantenimiento del código sea menos propenso a errores (y también se corrigieron algunos problemas de caché de archivos manifest). #98231 (Daniil Ivanik). - Se mejoró
ALTER TABLE ... EXECUTE expire_snapshots(...)de Iceberg con un soporte más amplio para argumentos. #99130 (murphy-4o). - Se cambió la interfaz de las inserciones de Iceberg con el catálogo. Se marcaron como obsoletas las opciones
storage_catalog_type,storage_aws_access_key_idy otras similares. #100334 (Konstantin Vedernikov). - Se corrigió el manejo inconsistente de rutas en Iceberg causado por el uso combinado de rutas de almacenamiento y rutas de metadatos; se exigió que las tablas Iceberg escriban una ubicación de tabla que sea una URL o una ruta absoluta; se añadió un mecanismo alternativo para contar tamaños de archivo en Azure; se manejó
version-hint.txtde forma compatible con Spark; se introdujeron abstracciones a nivel de tipo para reducir la confusión entre tipos de rutas; y se corrigió el uso de eliminaciones por posición. #100420 (Daniil Ivanik). - Se evitó escanear todo el catálogo remoto del lago de datos en busca de sugerencias de tablas del tipo “Maybe you meant …” cuando
show_data_lake_catalogs_in_system_tablesestá deshabilitado. #100452 (Alsu Giliazova). - La información del objeto utilizada para analizar archivos de datos de Iceberg ahora contiene el número de filas del archivo y su tamaño en bytes, extraídos del archivo manifest. #100645 (Daniil Ivanik).
- Se añadió un mecanismo de poda para Delta Lake con columnas virtuales. #101634 (Konstantin Vedernikov).
S3 y almacenamiento de objetos
- Se añadió un marcador de posición
{_schema_hash}para el motor de tabla S3 que inserta un hash de las definiciones de las columnas de la tabla en la ruta de S3. #98265 (Miсhael Stetsyuk). - Se añadió una nueva opción para forzar el uso del estilo virtual/path en los endpoints de S3. #102378 (Konstantin Vedernikov).
Configuración y ajustes
- Los usuarios ahora pueden especificar varios métodos de autenticación en la configuración
users_xml. #91998 (Flip-Liquid). - Ahora se puede establecer la configuración
internal_replicationpara un clúster creado por la base de datos Replicated. #97228 (Pervakov Grigorii). - Se añadió la configuración
allow_nullable_tuple_in_extracted_subcolumns, que controla si las subcolumnas extraídasTuple(...)deTuple,Variant,DynamicyJSONse devuelven comoNullable(Tuple(...))(NULLpara las filas faltantes) o comoTuple(...)(valores de tupla predeterminados para las filas faltantes). Está deshabilitada de forma predeterminada; solo puede cambiarse reiniciando el servidor. #97299 (Nihal Z. Miaji). type_json_allow_duplicated_key_with_literal_and_nested_objectahora está habilitada de forma predeterminada, lo que evita errores por claves duplicadas al analizar JSON como{"a" : 42, "a" : {"b" : 42}}, que ClickHouse puede producir a partir de los datos originales{"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).- Las estadísticas de columnas ahora son GA. La configuración
allow_experimental_statistics(valor predeterminado:false) queda obsoleta en favor deallow_statistics(valor predeterminado:true);allow_statistics_optimizepasa de beta a GA; ClickHouse crea estadísticasminmaxyuniqpara las columnas nuevas (configuración de MergeTreeauto_statistics_types); y, para evitar INSERTs más lentos,materialize_statistics_on_insertahora está deshabilitada de forma predeterminada. #97487 (Han Fei). - Se aclaró la relación entre
enable_parallel_replicasyautomatic_parallel_replicas_mode: una consulta puede usar réplicas paralelas solo sienable_parallel_replicas > 0. Conautomatic_parallel_replicas_mode=1, la decisión se toma durante la planificación en función de las estadísticas recopiladas; conautomatic_parallel_replicas_mode=0, las réplicas paralelas se usan para todas las consultas compatibles, independientemente de las estadísticas. INSERT SELECT en Distributed con réplicas paralelas siempre se comporta como siautomatic_parallel_replicas_mode=0. #97517 (Nikita Taranov). - Se habilitó de forma predeterminada la funcionalidad de suplantación (EXECUTE AS target_user). #97870 (Vitaly Baranov).
- Se añadió la configuración
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(permitida de forma predeterminada), que impide usar perfiles de configuración definidos en la configuración (excepto el perfildefault) para usuarios definidos mediante SQL. #98662 (Alexander Tokmakov). - Se añadió una configuración para controlar el comportamiento ante incompatibilidades de tipos en
VariantyDynamic(lanzar una excepción o devolver null). #99085 (Bharat Nallan). - Se cambió el valor predeterminado de
stderr_reactiondethrowalog_lastpara los UDFs ejecutables. Los UDFs que escriben advertencias en stderr ya no fallan cuando el código de salida es 0, y las excepciones por código de salida ahora incluyen el contenido de stderr. #99232 (Xu Jia). - Se añadió la configuración
input_format_column_name_matching_mode, que permite distintas sensibilidades entre mayúsculas y minúsculas para los formatos de entrada. #99346 (manerone). - Las estadísticas automáticas ya no están habilitadas para las tablas del sistema, ya que rara vez se benefician de ellas. #102862 (Han Fei).
Tablas del sistema y monitorización
- Los índices de descarte de datos utilizados durante la ejecución de la consulta ahora se registran en
system.query_logen una nueva columnaskip_indices. #99793 (Grant Holly). - Se añadió la columna
projections_duration_msasystem.part_log, que registra la duración, en milisegundos, de la fusión o reconstrucción de cada proyección. #98292 (Amos Bird). - Se añadió el alias de columna
INDEX_LENGTHainformation_schema.tables. #101705 (Robert Schulze). information_schema.tablesahora ignora las partes inactivas de la tabla, lo que hace que los valores mostrados del tamaño de la tabla sean más realistas. #101706 (Robert Schulze).
ClickHouse Keeper
find_super_nodesya no se queda bloqueado al recorrer los hijos del primer supernodo, lo que permite encontrar más de uno. #97819 (pufit).- Se marca una sesión de ZooKeeper como expirada en cuanto comienza la finalización, en lugar de esperar a que termine el thread de envío. Esto permite que otros threads establezcan una nueva sesión sin demora. #99102 (Raúl Marín).
- Se omiten las solicitudes obsoletas de Keeper para sesiones que ya se han desconectado, lo que evita recorridos de ida y vuelta innecesarios en Raft. El número de sesiones finalizadas rastreadas está limitado por la configuración de coordination
max_finished_sessions_cache_size. #99246 (Antonio Andelic). - Se evita que el comando
mntrde Keeper se quede bloqueado por contención de bloqueos. #99472 (Antonio Andelic). - Se redujo la contención de bloqueos en el despachador de Keeper al invocar callbacks y despachar read requests fuera del ámbito del mutex, y se añadieron guardas de bloqueo perfiladas para la observabilidad. #99751 (Antonio Andelic).
Gestión de la memoria
- Se añadió el parámetro de configuración
use_separate_cache_arenapara controlar la separación de la arena de caché. #100664 (Seva Potapov).
Formatos de datos
- Se añadió la configuración
output_format_trim_fixed_stringpara eliminar los bytes nulos finales de los valoresFixedStringen los formatos de salida de texto. #97558 (NeedmeFordev). - Ahora es posible procesar archivos GeoParquet que contienen distintos tipos Geo en la misma columna. #97851 (Mark Needham).
- La deserialización de estados binarios de
AggregateFunctionahora requiere consumir toda la entrada. Si hay bytes redundantes adicionales al final, ClickHouse lanza una excepción en lugar de aceptar datos de estado malformados. #98786 (Nihal Z. Miaji). - Los usuarios ahora pueden escribir tipos de datos
Intervalde ClickHouse en el formato Arrow. #99519 (Peter Nguyen). - Se añadió soporte nativo para importar y exportar tipos de datos UUID en los formatos Arrow y Parquet, con inferencia lógica automática para UUIDs de nivel superior y soporte para indicaciones de esquema explícitas para UUIDs anidados. #99521 (Ivan).
- Se tolera la ausencia de relleno al final del último bloque de los archivos Parquet. #99857 (Seva Potapov).
- La exportación de UUIDs a Parquet mediante el codificador Arrow ahora incluye la anotación correcta del tipo UUID, lo que elimina la necesidad de aplicar manualmente CAST a los datos
FixedString(16)al volver a leer los archivos. #100150 (Ivan). - Se añadió soporte nativo para importar tipos de datos Apache Arrow
StringViewyBinaryViewen columnasStringde ClickHouse, lo que mejora la compatibilidad con la ingestión basada en Arrow. #100762 (Ivan). - Se añadió soporte para
Nullable(Tuple)en los formatosArrow,ArrowStream,ORCyParquetheredado. #101272 (Nihal Z. Miaji).
Colecciones con nombre y diccionarios
- Se añadió
sslmodea las claves permitidas para las fuentes de diccionario de PostgreSQL, lo que permite configurar el modo SSL para las conexiones de diccionarios de PostgreSQL (por ejemplo, para AWS RDS, que exige SSL de forma predeterminada). #98014 (mcalfin). - Se evita eliminar colecciones con nombre que son dependencias de fuentes de diccionario. #98127 (Pablo Marcos).
- Se añadió soporte para los tipos
MapyJSON/Objectcomo atributos de diccionario. Ahora los diccionarios pueden almacenar y recuperar tipos complejos, incluidosMap(String, String),Map(String, Array(String)),JSONyNullable(JSON), tanto en los layouts FLAT como HASHED. #98627 (yanglongwei). SYSTEM RELOAD DICTIONARIESahora recarga los diccionarios en orden topológico para que los diccionarios que toman datos de otros diccionarios dispongan de datos actualizados después de la recarga. #98356 (Alexey Milovidov).- Los diccionarios de caché ya no adquieren un bloqueo exclusivo en
hasKeys, lo que reduce la contención al usar un bloqueo compartido para las lecturas de caché. #100796 (liuguangliang).
Otras mejoras
- Las pistas de
ACCESS_DENIEDya no revelan nombres de columnas, a menos que el usuario pueda mostrar todas las columnas requeridas; los nombres de la base de datos y de la tabla siguen siendo visibles en la pista. #91067 (filimonov). - Se recarga la configuración del clúster si cambian las direcciones IP del hostname del servidor local, en lugar de las direcciones IP de cualquier host. #93726 (Zhigao Hong).
- Se vacían los búferes de logging asíncrono en caso de cierre inesperado. #97836 (Azat Khuzhin).
- Se redujo el bloqueo durante el control de acceso. #97894 (Nikita Taranov).
- Se actualizó ClickStack a la versión 2.20.0. #98252 (Aaron Knudtson).
- Se desactiva la generación de SQL con IA (comando
??) en el client embebido (protocolos SSH y WebSocket) para evitar el acceso a las variables de entorno del servidor. #100290 (Alexey Milovidov). - Se envía NACK para los mensajes dañados al usar almacenamiento RabbitMQ. #102157 (Seva Potapov).
Correcciones de errores
Todas las correcciones de errores (haz clic para expandir)
Todas las correcciones de errores (haz clic para expandir)
Correcciones de JOIN
- Se corrigió la ausencia de una columna cuando se usaba un alias de identificador no estándar en un JOIN con el analyzer antiguo. #95679 (Zhigao Hong).
- Se corrigió un resultado incorrecto cuando se usaba el algoritmo
grace_hashcon joins no equi y el bloque izquierdo no podía procesarse por completo debido a restricciones de tamaño en el resultado del join. #97866 (János Benjamin Antal). - Se corrigió un error lógico con
analyzer_compatibility_join_using_top_level_identifieryARRAY JOIN. #98179 (Vladimir Cherkasov). - Se corrigió una excepción
LOGICAL_ERRORcuando unRIGHT JOINdentro de unCROSS JOINera intercambiado por la optimizaciónquery_plan_join_swap_tableen la ruta de código heredada del paso join. #98279 (Alexey Milovidov). - Se corrigió una excepción “Pipeline stuck” en joins
full_sorting_mergecausada por un interbloqueo enPingPongProcessorcuando la optimizaciónFilterBySetOnTheFlycreaba una dependencia circular conMergeJoinTransform. #98454 (Alexey Milovidov). - Se corrigió una excepción de error lógico cuando
CROSS JOINse usaba junto conINNER JOIN USING. #98459 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERRORcuandoarrayJoinse usaba en una expresión de filtro conOUTER JOINyjoin_use_nullshabilitado. #98464 (Alexey Milovidov). - Se corrigió una excepción
BAD_GETy resultados de consulta incorrectos cuando se usaba una expresión no booleana (p. ej.,sin(col)) tanto enWHEREcomo enSELECTcon un JOIN, debido a que la optimización de pushdown de filtros corrompía nodos DAG compartidos. #98681 (Alexey Milovidov). - Se corrigió un
LOGICAL_ERROR“Replica decided to read in Default mode, not in WithOrder” al usarread_in_order_through_joincon réplicas paralelas. #98685 (Alexey Milovidov). LEFT ANTI JOINcon múltiples columnas de clave de join devolvía resultados incorrectos cuandoenable_join_runtime_filters=1(el valor predeterminado). #98871 (Alexander Gololobov).- Se corrigió un error en la optimización
query_plan_convert_any_join_to_semi_or_anti_joinque devolvía un resultado incorrecto para las filas sin coincidencia. #99112 (Yarik Briukhovetskyi). - Se corrigió una excepción en funciones que operan sobre
ColumnReplicatedcon filas no referenciadas producidas por JOIN. #99564 (Hechem Selmi). - Se corrigió un caso poco frecuente en el que un join con reordenación podía producir un resultado incorrecto. #100790 (Yarik Briukhovetskyi).
- Se corrigieron resultados incorrectos cuando un JOIN con la optimización shard-by-PK usaba la caché de condiciones de consulta y algunas partes se filtraban mediante condiciones en caché. #100926 (Groene AI).
- Se corrigió una excepción
NOT_FOUND_COLUMN_IN_BLOCKal usarARRAY JOINconJOIN USINGyanalyzer_compatibility_join_using_top_level_identifierhabilitado. #101507 (Vladimir Cherkasov). - Se corrigió el orden incorrecto de las filas en consultas que usan
ORDER BYcon el algoritmo de joingrace_hash, lo que podía generar resultados incorrectos sin advertencia. #102036 (János Benjamin Antal). - Se corrigió un
LOGICAL_ERROR(tamaño inesperado del tipo de índice) que podía producirse en consultasRIGHT JOINyFULL JOINcuando se configurabamax_bytes_in_join. #102042 (Jimmy Aguilar Mena).
Correcciones de consultas y del analizador
- Se corrigió cómo se guarda el destino de una tabla alias como dependencia DDL cuando no está completamente calificado: ahora se guarda con la base de datos de la tabla alias en lugar de con la base de datos de la sesión. #95175 (Enric Calabuig).
- Se corrigió un error
Block structure mismatch in streamcausado por columnas innecesarias devueltas por la materialización diferida. #96682 (Nikolai Kochetov). - Se corrigió una excepción en la comparación de tuplas que involucraba elementos del tipo
Nothing(p. ej., al comparar con elementos de tuplaNULL) cuando se usaba conGROUPING SETSyORDER BY. #97509 (Alexey Milovidov). - Se corrigió la excepción “Context has expired” en subconsultas correlacionadas que contenían funciones de tabla como
url(). #97544 (Alexey Milovidov). - Se corrigieron excepciones y comportamiento incorrecto en
optimize_syntax_fuse_functionscon proyecciones de agregación, tipos Date y preservación de nombres de columnas. #97545 (Alexey Milovidov). - Se eliminó una query rewrite incorrecta de
replaceRegexpOneaextractque producía resultados erróneos cuando la regexp no coincidía; también se corrigió una excepción cuandoreplaceRegexpOnese usaba conGROUP BY ... WITH CUBEygroup_by_use_nulls=1. #97546 (Alexey Milovidov). - Se corrigieron excepciones
LOGICAL_ERRORcausadas porLowCardinalitydentro de tipos compuestos (Variant,Dynamic,Tuple) enconcatWithSeparator,format, subconsultasIN,GLOBAL INy joins con filtros en tiempo de ejecución. #97831 (Raúl Marín). - Se corrigió una excepción
LOGICAL_ERROR“Chunk info was not set for chunk in MergingAggregatedTransform” al usarARRAY JOINcon la función de tablamerge()sobre varias tablas Distributed combinadas conGROUP BY. #97838 (Raúl Marín). - Se corrigió un error que impedía usar CTE con operaciones insert-select distribuidas. #97889 (Yarik Briukhovetskyi).
- Se corrigió una discrepancia entre columnas. #97921 (Kai Zhu).
- Se corrigió un segfault en la optimización del plan de consulta al convertir un outer join en un inner join con
arrayJoinen una expresión de filtro. #98147 (Alexey Milovidov). - Se corrigió un
LOGICAL_ERROR“Trying to execute PLACEHOLDER action” cuando se referenciaban columnas correlacionadas de consultas externas dentro de funciones lambda comoarrayMap. #98285 (Alexey Milovidov). - Se corrigió una excepción de error lógico en
caseWithExpressioncuando la expresiónCASEinvolucraba argumentosmaterialize(NULL)u otros argumentosNullable(Nothing). #98290 (Alexey Milovidov). - Se corrigió una excepción de conversión inválida al filtrar la columna virtual
_tableen la función de tablamerge. #98291 (Alexey Milovidov). - Se corrigió una excepción cuando
ORDER BY ... WITH FILLse usaba junto conLIMIT BY. #98361 (Alexey Milovidov). - Se corrigió una excepción “Column … query tree node does not have valid source node” al hacer join entre una tabla
Merge(que envuelve una tablaDistributed) y otra tabla. #98376 (Alexey Milovidov). - Se corrigió una excepción “Column identifier is already registered” cuando
count_distinct_optimizationse usaba con una cláusulaQUALIFY. #98433 (Alexey Milovidov). - Se corrigió una excepción “cannot be inside Nullable type” al usar
IN/NOT INcon argumentos de columnaLowCardinality(por ejemplo,a NOT IN (b), dondeaesLowCardinality(String)). #98443 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERROR“Projection cannot increase the number of rows in a block” al fusionar partes con un TTL que elimina todas las filas y una proyección de agregación con una claveGROUP BYconstante. #98458 (Alexey Milovidov). - Se corrigió una excepción en consultas
DISTINCTcuando el uso de proyecciones de agregación ymaterializecausaba diferencias en el tipoLowCardinalityentre la consulta y la proyección. #98462 (Alexey Milovidov). - Se corrigió una excepción de error lógico “Replica decided to read in WithOrder mode, not in ReverseOrder” al usar réplicas paralelas con
optimize_aggregation_in_order. #98467 (Alexey Milovidov). - Se corrigió un resultado inesperado con
read_in_order_use_virtual_rowy funciones monotónicas. #98514 (Vladimir Cherkasov). - Se corrigió un
LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'al usarPREWHEREcon una subconsultaINen tablas MergeTree. #98522 (Alexey Milovidov). - Se corrigió una excepción “Sorting column wasn’t found in the ActionsDAG’s outputs” cuando
query_plan_convert_join_to_inestaba habilitado conquery_plan_merge_expressions = 0. #98526 (Alexey Milovidov). - Se corrigió un
LOGICAL_ERRORcuando unIdentifierquedaba vacío después de la sustitución de parámetros. #98530 (Pervakov Grigorii). - Se corrigió el análisis de índice distribuido con expresiones (no solo columnas) en la clave primaria, lo que provocaba que no se filtraran los gránulos redundantes en réplicas remotas. #98561 (Azat Khuzhin).
- Se corrigió un error lógico “TABLE_FUNCTION is not allowed in expression context” cuando una table function con un alias aparecía varias veces dentro del mismo ámbito de consulta (por ejemplo, en las cláusulas
PREWHEREyQUALIFY). #98557 (Alexey Milovidov). - Se corrigió una excepción “Bad cast from type
DB::TableFunctionNodetoDB::QueryNode” al usar la table functioninputcomo argumento deremote. #98694 (Alexey Milovidov). - Se corrigió una excepción en
LogicalExpressionOptimizerPasscuando una función booleana en una comparaciónequalsdevolvía un tipoVariant. #98712 (Alexey Milovidov). - Se corrigió una excepción
UNKNOWN_IDENTIFIERal consultar la table functionmerge()o el motorMergesobre tablas con columnas JSON con parámetros distintos y columnas ALIAS que hacen referencia a subrutas JSON, con el nuevo analizador habilitado. #98753 (Pavel Kruglov). - Se corrigió la optimización
optimize_skip_unused_shardscon el analizador cuando se usaba un almacenamientoDistributeden unaView. #98754 (Nikolai Kochetov). - Se corrigió una excepción
LOGICAL_ERROR(desajuste en la estructura del bloque enremoveUnusedColumns) que podía producirse conFINAL+PREWHERE+ una expresiónWHEREconstante + agregaciones que no dependen de columnas, comocount(). #98778 (Alexey Milovidov). - Se corrigió una excepción “Inconsistent table names” al usar la table function
view()que contiene JOINs dentro de otro JOIN (solo con el analizador antiguo). #98809 (Alexey Milovidov). - Se corrigió una excepción al combinar
loopcon cluster table functions. #98860 (Konstantin Bogdanov). - Se corrigió un
LOGICAL_ERROR“RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B”. #98900 (Azat Khuzhin). - Se corrigió una excepción “Scalar doesn’t exist” al consultar un segmento remoto con
optimize_const_name_sizeconfigurado yenable_scalar_subquery_optimization = 0. #98979 (andriibeee). - Se corrigió
NOT_FOUND_COLUMN_IN_BLOCKen algunas consultas conGROUP BYy expresiones que incluyen búsquedas inversas en Diccionario, comparaciones de conversiónDate/DateTimey comparaciones de tuplas. #98980 (Nihal Z. Miaji). - Se corrigió un error por el que
EXISTSignoraba las cláusulasLIMITyOFFSETen las subconsultas, lo que provocaba resultados incorrectos cuando la subconsulta no devolvía filas debido a un desplazamiento o a un límite de cero. #99005 (andriibeee). - Se corrigió una excepción “Block structure mismatch” cuando la optimización de propagación de filtros encontraba una expresión
ANDque se cortocircuitaba a una constante conGROUPING SETS. #99010 (Alexey Milovidov). - Se corrigió un
LOGICAL_ERRORal consultar una tabla que tiene tanto una ROW POLICY como una columna ALIAS que usadictGet, provocado por un acceso prematuro a la expresión de tabla durante la resolución de la columna ALIAS en el nuevo analizador. #99065 (Peng). - Se corrigió un fallo de segmentación en un CTE recursivo con
remote()+view(). #99081 (Konstantin Bogdanov). - Se omite el análisis adicional de índices innecesario cuando se aplica la optimización de lectura en orden. #99084 (Vladimir Cherkasov).
- Se corrigieron las verificaciones de acceso durante
InverseDictionaryLookupPass, comprobando el acceso solo una vez antes de ejecutar el paso de optimización. #99210 (Mikhail Artemenko). - Se corrigió
optimize_skip_unused_shardscon el nuevo analizador cuando se usaba una tablaDistributeddentro de una subconsultaIN. #99436 (Nikolai Kochetov). - Se corrigió un error de uso de memoria después de liberarla (
heap-use-after-free) enINTERSECT/EXCEPTcuando la consulta producía nombres de columna duplicados. #99471 (Alexey Milovidov). - Se corrigió un error lógico en
ALTER TABLE ... DROP PARTcuando se usaba un parámetro de consulta tipado para el nombre de la parte. #99489 (Alexey Milovidov). - Se corrigió una excepción
std::length_erroral consultar tablas del sistema vacías con el formato Pretty a través de la interfaz HTTP. #99541 (Alexey Milovidov). - Se corrigió una degradación del rendimiento en el analizador al eliminar columnas no utilizadas de
ARRAY JOIN. #99587 (Dmitry Novik). - Se corrigió una excepción (
Bad get: has Tuple, actual type String) enConditionSelectivityEstimatorcuando una consulta usabaINcon un único parámetro de consulta escalar (por ejemplo,WHERE col IN ({p:String})) en una tabla que tiene estadísticas de columnas yuse_statisticshabilitado. #99614 (Ilya Yatsishin). - Se corrigió una excepción “Block structure mismatch” en consultas con una cláusula
HAVINGen las que la expresión de filtro contenía tanto una agregación envuelta en una función que devuelve NULL comomaterialize(0). #99915 (Alexey Milovidov). - Se corrigió un error lógico con una subconsulta correlacionada dentro de un argumento
untuple. #99917 (Vladimir Cherkasov). - Se corrigió una excepción “Inconsistent AST formatting” en
ALTER TABLE ... MODIFY QUERYcon subconsultas anidadas que conteníanSETTINGScuando el propioALTERtambién teníaSETTINGS. #99938 (Nikita Mikhaylov). - Se corrigió una excepción
LOGICAL_ERROR“Not-ready Set” en la funciónINdurante la optimización del plan de consulta conconvertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERROR“Unexpected node type for table expression … Actual IDENTIFIER” cuando se usaba una subconsulta escalar dentro de un argumento de función de tabla no resuelto. #100014 (Alexey Milovidov). - Se corrigió el número cuadrático de consultas ejecutadas cuando se usaba
distributed_index_analysiscon predicados que contenían subconsultasIN. #100287 (Anton Popov). - Se corrigió una excepción de “Block structure mismatch” al usar
GROUP BY ... WITH TOTALS HAVINGcombinado conUNION DISTINCTy expresionesNullable. #100293 (Alexey Milovidov). - Se corrigió una excepción de “Inconsistent AST formatting” en compilaciones de depuración al usar
GROUP BY CUBE(...) WITH ROLLUPo combinaciones similares. #100376 (Alexey Milovidov). - Se corrigió una excepción al crear una vista con alias de columnas y consultas
SELECT *oEXCEPT/INTERSECT. #100386 (Alexey Milovidov). - Se corrigió una excepción
TOO_MANY_ROWSen consultasSELECT count()conmax_rows_to_read/force_primary_keycuando los datos estaban divididos en múltiples partes con límites de gránulos no alineados. #100408 (Alexey Milovidov). - Se corrigieron casos de
NOT_FOUND_COLUMN_IN_BLOCKen los que la parteSELECTde la proyección tenía columnas que no existían en la parteSELECToriginal de la consulta. #100623 (Yarik Briukhovetskyi). - Ahora se permite pasar una clave de segmentación a las funciones de tabla
cluster()yclusterAllReplicas()al usar una función de tabla como origen (por ejemplo,cluster('name', view(...), sharding_key)). #100665 (Sergey Veletskiy). - Se corrigieron tipos de argumento incorrectos de
AggregateFunctionen el conteo trivial optimizado, lo que provocaba una excepciónNUMBER_OF_ARGUMENTS_DOESNT_MATCHal consultar expresiones comocount(v0 + v1)en tablas distribuidas. #100794 (YjyJeff). - Se corrigió un error lógico, “Invalid action query tree node”, al usar
INTERSECT ALL/UNION ALLcon expresiones reducidas a constantes. #100977 (Alexey Milovidov). - Se corrigió un error
UNKNOWN_IDENTIFIERincorrecto cuando se usaba el mismo alias para varias expresiones enSELECT; ahora se informa correctamente el errorMULTIPLE_EXPRESSIONS_FOR_ALIAS. #101040 (Alexey Milovidov). - Se corrigió una excepción en
DirectJoinMergeTreeEntitycuando los bloques del pipeline contenían columnasColumnConstcombinadas con columnas normales. #101046 (Alexey Milovidov). - Se corrigió un espacio sobrante en el formato de los alias de columnas de CTE (
WITH t (a, b)→WITH t(a, b)). #101049 (Alexey Milovidov). - Se corrigió un fallo en las funciones de tabla
remote/clustercon funciones de tabla anidadas comomergecuando el analizador estaba habilitado. #101055 (Alexey Milovidov). - Se corrigió la aplicación doble de
OFFSETen consultas distribuidas cuandoprefer_localhost_replica=1, lo que producía menos filas de las esperadas. #101071 (Nihal Z. Miaji). - Se corrigió un error “Illegal type Decimal64 of start parameter” en las funciones de agregación de series temporales al usar
serialize_query_plan=1con réplicas paralelas. #101083 (Groene AI). - Se corrigieron resultados de consulta incorrectos cuando se usaba una constante entera grande (p. ej., 256, 2147483648) como predicado booleano en una cláusula
WHEREconANDen tablas MergeTree. #101287 (Groene AI). - Se corrigió un cierre inesperado con “Logical error: Reading from materialized CTE before materialization” cuando una subconsulta escalar hacía referencia a una cadena de materialized CTE dependientes. #101305 (Groene AI).
- Se corrigió una excepción al convertir una cadena con datos adicionales al final al tipo vacío
Tuple(). #102011 (Alexey Milovidov). - Se corrigió un error lógico al analizar una cadena incorrecta de tupla vacía. #102289 (Nihal Z. Miaji).
- Se corrigieron resultados de agregación incorrectos (filas duplicadas) al usar
optimize_aggregation_in_order=1con columnas deGROUP BYordenadas de forma distinta a la clave de ordenación de la tabla. #102299 (Groene AI). - Se corrigió una excepción en
getStructureOfRemoteTablecuando el segmento local devolvía columnas vacías debido a DDL concurrente. #102604 (Alexey Milovidov). - Se optimizaron las cadenas de OR de ROW POLICY a
INen el nuevo analizador. #102915 (Azat Khuzhin). - Se corrigieron resultados incorrectos devueltos por
WHERE x AND toNullable(N)en tablasMergeTreecuandoNes un entero mayor queUInt8(p. ej.,256,65535,2147483648o cualquier entero negativo). #103077 (Groene AI).
Correcciones de MergeTree y almacenamiento
- Se corrigió un error lógico al adjuntar una parte en MergeTree si había varios cambios de nombre encadenados entre su separación y su nueva adjunción. #96351 (Alexey Milovidov).
- Se corrigió el cálculo no determinista de
uncompressed_hashpara partes Compact de MergeTree cuando se usan varios códecs de compresión, lo que podía provocar un comportamiento incorrecto de deduplicación. #97522 (Alexey Milovidov). - Se corrigió que las excepciones
MEMORY_LIMIT_EXCEEDEDse reportaran incorrectamente comoCORRUPTED_DATAdurante las merges de SummingMergeTree y CoalescingMergeTree. #97537 (János Benjamin Antal). hasPartitionIdahora devuelvefalsesi existe otra partición con un ID de partición más alto en el conjunto de partes de datos. #97748 (Mikhail Artemenko).- Se corrigió una mutación después de una actualización ligera con índices secundarios. #98044 (Raúl Marín).
- Se corrigieron resultados incorrectos en consultas FINAL al mezclar índices de omisión de clave primaria y de no clave primaria. #98097 (Raúl Marín).
- Si las columnas de la clave de partición no están cubiertas por la clave de ordenación, la poda de particiones podía omitir incorrectamente particiones que contenían filas que debían “prevalecer” durante la deduplicación FINAL. #98242 (Yarik Briukhovetskyi).
- Se corrigió un posible interbloqueo cuando dos operaciones concurrentes de
MOVE PARTITIONtrabajan con el mismo par de tablas en direcciones opuestas. #98264 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERROR“Invalid binary search result inMergeTreeSetIndex” provocada por la conversióntoDateen columnas de clave con datos a ambos lados del límite de 65535. #98276 (Alexey Milovidov). - Se corrigió un fallo esporádico de deduplicación por el que las reinserciones se deduplicaban incorrectamente debido a un orden de limpieza inconsistente entre los directorios ZooKeeper
blocks/ydeduplication_hashes/. #98293 (Alexey Milovidov). - Se corrigió que las mutaciones
MATERIALIZE INDEXyMATERIALIZE PROJECTIONse quedaran bloqueadas cuando el índice o la proyección se eliminaban antes de que finalizara la mutación. #98369 (Alexey Milovidov). - Se corrigieron resultados incorrectos de poda de particiones después de fusionar partes con columnas de clave de partición
Nullable, causados por límites incorrectos del índice min-max. #98405 (Amos Bird). - Se corrigió una excepción
LOGICAL_ERRORenrenameAndCommitEmptyPartsque podía producirse cuandoTRUNCATE TABLEse ejecutaba de forma concurrente conOPTIMIZE TABLEusando transacciones de MergeTree. #98508 (Alexey Milovidov). - Se corrigió un desbordamiento decimal al realizar poda de particiones con
DateTime64. #98628 (Yarik Briukhovetskyi). - Se corrigió la reaparición de partes de datos obsoletas causada por una limpieza incorrecta de partes de cobertura vacías. #98698 (Shaohua Wang).
- Se corrigió la detección de la utilidad del índice de omisión set en un predicado
ORcon false (es decir,or(x, 0)). #98776 (Azat Khuzhin). - Se corrigió que los índices de omisión (y las condiciones de clave primaria) no se aplicaran a columnas ALIAS cuando la fusión de expresiones del plan de consulta está deshabilitada (
query_plan_merge_expressions = 0oquery_plan_enable_optimizations = 0). #98960 (Peng). - Se corrigió la poda incorrecta o insuficiente cuando se usaban
startsWith,LIKEoNOT LIKEcon una columnaFixedString. Además, la función de conversión deFixedStringaStringahora puede podar gránulos cuando se aplica a una columna clave. #99001 (Nihal Z. Miaji). - Se corrigió una excepción al leer partes de parche (actualizaciones ligeras) sin la columna
_part_offseten el plan de consulta. #99023 (Alexey Milovidov). - Una consulta como
SELECT * FROM table WHERE pk_id = '', dondepk_ides una clave primariaString, ahora usa correctamente el índice de clave primaria para filtrar gránulos. #99027 (Shankar Iyer). - Se corrigió una excepción al crear una tabla con una columna
EPHEMERALque tiene el mismo nombre que una columna virtual (por ejemplo,_part_offset). #99031 (Alexey Milovidov). - Se corrigió
LOGICAL_ERRORdebido a una discrepancia en el orden de las columnas de las partes de parche. #99164 (Pablo Marcos). - Se corrigió que
ALTER TABLE UPDATE/DELETEfallara con un errorMissing columnscuando una tabla tiene una columna MATERIALIZED cuya expresión depende de una columna EPHEMERAL. #99281 (Yash). - Se corrigió la compatibilidad al actualizar tablas replicadas con índices minmax implícitos de la versión 25.10 a versiones más recientes. #99392 (Raúl Marín).
- Se corrigió el marcado incorrecto, en casos raros, de una parte de datos como dañada y su separación tras una consulta
DETACH/ATTACH TABLE. #99529 (Anton Popov). - Se corrigió un fallo de aserción de
rows_sourcesen una fusión vertical cuandoSYSTEM STOP/START MERGESse alterna rápidamente durante la fusión de una tabla con columnasDynamic. #99532 (Alexey Milovidov). - Se corrigió la poda incorrecta de particiones para
toWeek()que provocaba que las consultas conWHERE toWeek(date, mode) = Ndevolvieran resultados vacíos para las semanas 49–52 en tablas particionadas portoYYYYMM(date). #99542 (Takumi Hara). - Se corrigió un
LOGICAL_ERRORal usarALTER TABLE ADD COLUMNpara crear una columnaEPHEMERALcon el mismo nombre que una columna virtual (por ejemplo,_part_offset). #99549 (Alexey Milovidov). - Se corrigió que
CLEAR COLUMNno reconstruyera las proyecciones ni volviera a evaluar las columnas materializadas que dependen de la columna limpiada, lo que podía causar excepciones o corrupción de datos durante fusiones posteriores. #99565 (Desel72). - Una parte con proyecciones desconocidas ya no se marca como perdida para siempre. #99623 (Sema Checherinda).
- Se corrigió una referencia colgante en
injectRequiredColumnsque provocaba un fallo durante la fusión. #99679 (Tuan Pham Anh). - Se corrigió un error lógico durante la fusión de partes de proyección después de
CLEAR COLUMNen una tabla con proyecciones y partes compactas. #100068 (Pavel Kruglov). - Se corrigió un
LOGICAL_ERROR“Stream … not found” al insertar en una tabla con columnasArray(JSON)anidadas en partes wide conoptimize_on_insert=0. #100475 (Pavel Kruglov). - Evalúe los argumentos del engine para
StorageAliasantes de almacenar la definición, de modo que expresiones comocurrentDatabase()se resuelvan como literales antes de guardarse en la base de datos. #100902 (Nikolay Degterinsky). - Se corrigió que
divideeintDivdevolvieranILLEGAL_DIVISIONcuando se usaban en expresiones de filtro durante el análisis de índices en algunos casos. #100928 (Nihal Z. Miaji). - Se corrigió que una optimización de
minmax_count_projectiony deCOUNT(*)trivial quedara deshabilitada de forma permanente tras una eliminación ligera, incluso después de que se fusionaran todas las partes con una máscara de eliminación ligera. #101212 (Anton Popov). - Se corrigió una carrera de dato en
storage_idenIStorage::getDependentViewsByColumn. #101385 (Nikolay Degterinsky). - Se corrigió que
materialize_skip_indexes_on_merge=falseno suprimiera los índices de texto (full-text) durante la fusión. Anteriormente, solo se suprimían los skip indexes no textuales (minmax, set, bloom_filter). #101932 (Groene AI). - Las entradas de caché del índice de similitud vectorial ahora se eliminan después de eliminar una parte (por ejemplo, durante una fusión), lo que corrige que las entradas nunca se expulsaran debido a claves de caché que no coincidían. #99575 (Seva Potapov).
- Se corrigió una excepción
LOGICAL_ERRORfalsa durante el redimensionamiento dinámico de la caché del filesystem debido a una race condition en la promoción de la subcola SLRU. #99850 (Alexey Milovidov). - Se corrigió un posible error lógico durante la lectura de subcolumnas de Map. #101641 (Pavel Kruglov).
- Se corrigió la prioridad de la coincidencia exacta de subcolumnas sobre la coincidencia por prefijo en
getSubcolumnDatapara evitar un posible fallo. #101645 (Pavel Kruglov). - Se corrigió el uso de extremos incorrectos en un índice min-max creado sobre una columna JSON, lo que provocaba resultados de consulta incorrectos. #101918 (Pavel Kruglov).
- Se corrigió un bug de race en SLRU en la caché del filesystem (26.1+) que podía provocar un error lógico de reserva de espacio. #101991 (Kseniia Sumarokova).
- Se corrigió un error lógico
Having zero bytesen la caché, provocado por la sobrescritura de un objeto remoto entrelistyread, lo que antes daba lugar a metadatos de objeto obsoletos. #101219 (Kseniia Sumarokova). - Se corrigió un fallo de aserción
file_offset_of_buffer_end <= getFileSize()al leer tablasLogoStripeLogen almacenamiento de objetos S3 con escrituras concurrentes. #100763 (Alexey Milovidov). - Se corrigió la aplicación del límite de tamaño de la caché al recargar la configuración. #100659 (Aleksei Filatov).
- Se corrigió una terminación con
LOGICAL_ERRORdurante el cambio dinámico de tamaño de la caché del sistema de archivos SLRU, causada por estadísticas de expulsión compartidas entre subcolas y una ruta de recuperación incorrecta para candidatos fallidos. #102396 (Antonio Andelic). - Se corrigió que las optimizaciones
minmax_count_projectiony la trivial deCOUNT(*)quedaran deshabilitadas permanentemente después de una eliminación ligera. #102900 (Anton Popov).
Correcciones de tipos de datos y serialización
- Se corrigió un resultado incorrecto o una excepción durante la lectura de subcolumnas de columnas ALIAS. #95408 (Pavel Kruglov).
- Se corrigió que la función de agregación
sumCountno pudiera leer estados serializados antiguos tras la introducción deNullable(Tuple). #97502 (Nihal Z. Miaji). - Se corrigió un error lógico relacionado con la ausencia de un stream durante
INSERT SELECTcon JSON y buckets en datos compartidos. #97523 (Pavel Kruglov). - Se corrigieron posibles fallos durante la lectura de gránulos vacíos en datos compartidos avanzados en JSON. #97778 (Pavel Kruglov).
- Se corrigió una compilación JIT incorrecta de la función
signpara tipos enteros más amplios queInt8: los valores fuera del rango -128..127 podían producir un signo incorrecto. #98012 (Alexey Milovidov). - Se corrigió que el formato
ProtobufListno funcionara con el motor Kafka porque el estado de lectura no se restablecía entre mensajes. #98151 (Alexey Milovidov). - Se corrigió la corrupción silenciosa de datos al insertar una columna
Datede Parquet/Arrow en una columnaEnum: ahora la conversión de tipos incompatible se rechaza correctamente en lugar de almacenar valores de enum no válidos. #98364 (Alexey Milovidov). - Se corrigió una excepción al leer un archivo Arrow con una columna
Arrayen una tabla con una columnaNested. #98365 (Alexey Milovidov). - Se corrigió una excepción al leer desde
Nullable(Tuple(...))cuando el nombre de un elemento de Tuple colisiona con la subcolumnanullde Nullable. #98372 (Alexey Milovidov). - Se corrigió la conversión incorrecta de Parquet
BoolaFixedStringen el lector nativo V3, que producía bytes sin procesar en lugar de una representación en cadena. #98378 (Alexey Milovidov). - Se corrigió
tryGetColumnDescriptionpara filtrar subcolumnas por el tipo de la columna padre, de forma coherente con otros métodos de búsqueda de columnas. #98391 (Alexey Milovidov). - Se corrigió la reversión de columnas en el motor Buffer al gestionar una excepción durante la anexión de un nuevo bloque. La lógica anterior podía provocar un estado corrupto de las columnas en memoria. #98551 (Pavel Kruglov).
- Se corrigió una excepción
Bad cast from type ColumnConst to ColumnDynamicen la comparación null-safe (<=>/IS NOT DISTINCT FROM) con columnas constDynamicoVariantyNULL. También se corrigió queIS DISTINCT FROMconDynamic/Variantfrente aNULLdevolviera siempre 0 de forma incorrecta. #98553 (Alexey Milovidov). - Se corrigió que
parseDateTimeBestEffortanalizara incorrectamente palabras que empiezan por prefijos de mes o de día de la semana. #98742 (Pavel Kruglov). - Se corrigió una excepción de
reverseUTF8con entrada UTF-8 no válida (truncada). #98770 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERRORen las funciones financieras (financialNetPresentValue,financialInternalRateOfReturn, etc.) al pasar argumentos de tipoBFloat16. #98958 (Alexey Milovidov). - SummingMergeTree ya no suma columnas
Bool(ni otras columnas de tipo domain); los valoresBoolahora se conservan tal cual en lugar de sumarse aritméticamente. #98976 (Yash). - Se corrigió un comportamiento indefinido (desreferenciación de puntero nulo) al alterar una columna version/sign/is_deleted a
EPHEMERALoALIASen motores MergeTree. Ahora esas alteraciones se rechazan correctamente. #98985 (Alexey Milovidov). - Se corrigió que
parseDateTimeBestEffortinterpretara incorrectamente palabras que comienzan con prefijos de mes en formato DD-month-YYYY. #99350 (Pavel Kruglov). - Se corrigió
CHECK TABLEcon serialización dispersa dentro de un Tuple con Dynamic. #99351 (Pavel Kruglov). - Se corrigió un logical error
unordered_map::at: key not founden el formato de salida Avro al serializar columnasEnum8/Enum16con valores no presentes en la definición del enum. #99332 (Desel72). - Se corrigió un error por el que la comparación entre los tipos
Time[64]yDateTime[64]resultaba confusa; los valoresTime[64]ahora se promocionan aDateTime[64]añadiendo1970-01-01como parte de la fecha. #99267 (Yarik Briukhovetskyi). - Se corrigió la deserialización de
\N(NULL) para el tipoVarianten los formatos de texto Escaped/Raw. #99648 (Pavel Kruglov). - Se corrigió un comportamiento indefinido en el lector del formato Avro al leer valores numéricos que desbordan el tipo de columna de destino. Las consultas ahora fallan en caso de desbordamiento en lugar de producir silenciosamente valores incorrectos. #99697 (asyablue22).
- Se corrigió una terminación por falso positivo en
NativeReaderal deserializar un flujo en formato Native con un desajuste en el recuento de filas: se cambió deLOGICAL_ERRORaINCORRECT_DATA. #99822 (Rahul Nair). - Se corrigió una terminación del proceso durante la deserialización de columnas
Tuplecuando el tipo de serialización en el flujo binario esDETACHED. #99823 (Rahul Nair). - Se corrigió la configuración
aggregate_functions_null_for_emptypara que funcione con funciones de agregación que devuelven tipos noNullable, comoArrayoMap(por ejemplo,groupArray,sumMap). #99839 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERRORen la funciónmidpointcuando se invoca con tipos enteros con signo y sin signo combinados. #99867 (Alexey Milovidov). - Se corrigió una excepción
LOGICAL_ERRORen consultas que involucran columnasDynamiccon joins cruzados y filtros en tiempo de ejecución, causada porqueColumnVariant::filtercompartía punteros a columnas Variant en lugar de clonarlos en la ruta de optimizaciónhasOnlyNulls. #100234 (Pavel Kruglov). - Se corrigió un error en arrays de
Variantque podía reinterpretar el tipo de datos al llamar aarrayFirst/arrayLast. Por ejemplo,Array(Variant(Date, Bool))se convertía enBoolcuando el tipo variante subyacente real eraDate. #100255 (timothygk). - Se corrigió un problema que impedía que los formatos
CSVyMsgPackanalizaranNullable(Tuple)correctamente. #100038 (Nihal Z. Miaji). - Se corrigió un problema por el que las funciones
accurateCastOrDefaultyto*OrDefaultno preservaban el tipo de columnaConstpara entradas constantes. #100132 (Alexey Milovidov). - Los parámetros de consulta omitidos con tipo
LowCardinality(Nullable(T))ahora toman correctamenteNULLcomo valor predeterminado, igual queNullable(T). #100144 (Denys Melnyk). - Se corrigió el desbordamiento de enteros con signo (comportamiento indefinido) en
toStartOfIntervalcuando se llamaba con valores de intervalos de milisegundos o microsegundos muy grandes enDateTime64de alta precisión. #100156 (Alexey Milovidov). - Se corrigieron los filtros de runtime de join sobre el tipo de datos
Variant. #100182 (Dmitry Novik). - Se corrigió una conversión de
Time64aUInt64que podía limitar los valores a 24 horas. #100025 (Yarik Briukhovetskyi). - Se corrigió una excepción al calcular el supertipo común para tuples vacías y no vacías con
use_variant_as_common_typehabilitado. #100699 (Antonio Andelic). - Se corrigió el comportamiento indefinido en
positiveModulocuando el divisor sin signo no cabe en el tipo de resultado con signo. #100705 (Raúl Marín). - Se corrigió el comportamiento indefinido (desbordamiento de enteros con signo) en
toStartOfIntervalal usar intervalos de Week, Quarter o Year con un argumentooriginy valores de intervalo extremos. #100817 (Raúl Marín). - Se corrigió un problema que impedía que los combinadores de funciones de agregación
If,Distinct,DistinctIfeIfState, con un tipo de retornoTupley uno o más argumentosNullable, pudieran leer estados serializados antiguos tras la introducción deNullable(Tuple). #100826 (Nihal Z. Miaji). cast_keep_nullable, cuando está habilitado, ya no genera una excepción al convertir un nullDynamicen unVariant. #100864 (Seva Potapov).- Se corrigió una excepción en
intDiv/intDivOrZerosobre arrays de tuples anulables. #100895 (Raúl Marín). - Se corrigió el comportamiento indefinido (desbordamiento de enteros con signo) en
parseDateTimeBestEffortal analizar cadenas de fecha y hora con más de 18 dígitos de fracción de segundo. #100948 (Vasily Chekalkin). - Se corrigió que la función de agregación
sumCountOrDefault, con uno o más argumentosNullable, no pudiera leer estados serializados antiguos tras la introducción deNullable(Tuple). #101021 (Nihal Z. Miaji). - Se corrigió que las columnas ALIAS con tipos
DateTime/DateTime64no aplicaran la conversión de zona horaria cuando la zona horaria declarada difería de la zona horaria de la expresión. #101043 (Alexey Milovidov). - Se eliminó
Nullablede la columna de resultado enarrayIntersecty funciones relacionadas para evitar un desajuste entre serialización y deserialización. #101569 (George Larionov). - Se corrigió que
positiveModulo(tuple, number)se redirigiera incorrectamente a división en lugar de a módulo. #101709 (ClickGap AI Bot). - Se corrigió una salida incorrecta en
formatDateTimecon el especificador%Wbajo determinadas configuraciones de formato no predeterminadas. #101847 (Robert Schulze). - Se corrigió una excepción por incompatibilidad de tipos en
transformcuando la columna predeterminada es const en algunos bloques. #100616 (Pavel Kruglov). - Se permiten row groups vacíos en Parquet. #100653 (Vitaly Baranov).
min/max/argMin/argMaxahora tratan NaN de forma coherente conORDER BY: NaN siempre se omite (solo se devuelve cuando todos los valores son NaN). Antes, los resultados dependían de la posición de NaN en los datos debido a la semántica de comparación no ordenada de IEEE 754. #100448 (Raúl Marín).- Se corrigió una inferencia incorrecta del tipo de dato de fecha en caso de overflow tras el ajuste de la zona horaria. #102674 (Pavel Kruglov).
- Se corrigió que
CASEcon una expresiónDynamicdevolvieraELSEpara todas las filas. #102684 (Pavel Kruglov). - Se corrigió la serialización del tipo
Dynamicaplanado con tipos de datos codificados en binario. #102692 (Pavel Kruglov). - Se corrigió que
cast_string_to_date_time_modese ignorara paraCASTaNullable(DateTime). #103035 (Pavel Kruglov). - Se hizo que la representación de null en la serialización de columnas replicadas y dispersas respetara la configuración (por ejemplo,
format_tsv_null_representation). #102888 (Hechem Selmi).
Correcciones de text index y skip index
- Se corrigió el uso del índice de texto junto con otros índices de omisión. Anteriormente, podían producirse errores lógicos como “Trying to get non-existing mark” cuando un filtro de consulta usaba simultáneamente un índice de texto y otros índices de omisión normales. #98555 (Anton Popov).
- Se corrigió la reconstrucción de los índices de texto durante las fusiones con TTL. #99107 (Anton Popov).
- Se corrigió una validación excesivamente estricta del preprocesador del índice de texto. #99359 (Anton Popov).
- Se eliminó la compatibilidad con funciones negadas (
notEquals,notLike,notIn) en el análisis del índice de texto. Estas funciones nunca podían omitir ningún gránulo, por lo que analizar el índice para ellas solo añadía sobrecarga. #99393 (Anton Popov). - Se corrigió una excepción
NOT_FOUND_COLUMN_IN_BLOCKcuando se hacía referencia a un predicado del índice de texto (p. ej.,hasAllTokens) tanto en las cláusulasSELECTcomoWHEREmediante un alias. #99504 (Anton Popov). - Se corrigieron resultados incorrectos al usar
hasAllTokensconORentre columnas que tienen índices de texto independientes. #99505 (Anton Popov). - Se corrigió la lectura del índice de texto en una tabla con eliminaciones ligeras y políticas de fila existentes. #99661 (Anton Popov).
- Se corrigió el análisis, por parte del índice de texto con preprocesador, de predicados con la función
IN, y también una colisión de tokens buscados que podía provocar resultados incorrectos. #99755 (Anton Popov). - Se corrigió el uso incorrecto del índice de texto con las funciones
startsWithyendsWithen tokenizadores que no admiten coincidencias de subcadenas (array,splitByString). Anteriormente, estos tokenizadores podían producir resultados incorrectos de forma silenciosa. #100151 (Anton Popov). - Se corrigió un fallo poco frecuente cuando se lanzaba una excepción “Memory Limit” al crear el índice de texto. #100213 (Anton Popov).
- Se corrigieron los errores “Not-ready Set is passed as the second argument” durante el análisis de un índice de texto construido sobre
mapValuespara predicados que contenían una cláusulaIN. #100224 (Anton Popov). - Se corrigió un fallo al usar un índice de búsqueda de texto con una cláusula
INque contenía una subconsulta de Tuple, por ejemplo,WHERE (id, str) IN (SELECT (id, str) FROM ...), o cuando el número de columnas de la subconsulta no coincidía con la Tuple del lado izquierdo deIN. #100959 (Anton Popov). - El tokenizador
splitByStringahora rechaza cadenas separadoras vacías. #101928 (Robert Schulze). - El tokenizador
sparseGramsgeneraba tokens más largos que la longitud máxima proporcionada (debido a un+2codificado de forma fija en la implementación). #101934 (Elmi Ahmadov). - Se corrigió una excepción al consultar tablas
MergeoDistributedcon un índice de texto completo y condiciones de filtro combinadas que mezclanhas*TokensconLIKE, conquery_plan_direct_read_from_text_indexhabilitado. #101939 (Jimmy Aguilar Mena). - Se corrigió
hasToken/hasTokenOrNullcon patrones compuestos solo por separadores (p. ej.,'()','!!!') en columnas con un índice de texto: antes, el índice omitía silenciosamente todos los gránulos en lugar de generarBAD_ARGUMENTS(parahasToken) o devolverNULL(parahasTokenOrNull). #102544 (Jimmy Aguilar Mena). - Los ajustes del índice de texto completo (
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read) ya no se desactivan cuando el ajustecompatibilityapunta a una versión anterior a la 26.1. #102422 (Nikita Fomichev). - Se añadió compatibilidad con columnas
ALIASen la optimización de lectura directa desde el índice de texto. #103037 (Anton Popov).
Correcciones en el lago de datos
- Se corrigió una condición de carrera lógica al cambiar la versión del snapshot en el motor de tablas
DeltaLake, y se eliminaron las recargas redundantes y costosas de snapshots. #96226 (Kseniia Sumarokova). - Se corrigieron una excepción
DUPLICATE_COLUMNy valores NULL silenciosos al leer tablas Delta Lake que usan el modo de correspondencia de columnas “name” con campos struct cuyos nombres contienen puntos. #98013 (Caio Ishizaka Costa). - Se corrigió un error al usar Unity catalog sobre GCS. #98456 (Melvyn Peignon).
DataLakeCatalogahora respeta la configuraciónhttp_forbid_headersdel servidor al validar la opciónauth_header. #98827 (Michael Anastasakis).- Ahora se prohíbe crear, adjuntar y actualizar tablas locales de lago de datos fuera de las rutas de usuario; esto se comprueba al crear y actualizar
IDataLakeMetadata. #98936 (Daniil Ivanik). - Se corrigieron las lecturas de Iceberg BigLake: las credenciales de ADC ahora se reenvían al client S3 de GCS (corrigiendo errores 403), las credenciales de OAuth2 se codifican como URL antes de enviarse y el recorrido del espacio de nombres ya no se aborta ante respuestas HTTP 400 de BigLake. #98998 (Nikita Fomichev).
- Se corrigió un error de acceso fuera de límites al consultar solo columnas virtuales de una tabla Iceberg con datos Avro. #99080 (alesapin).
- Se corrigió un crash en
ALTER TABLE ... REMOVE SETTINGSpara el motor de tablas Iceberg. #99108 (alesapin). - Se corrigió un crash muy poco frecuente cuando una tabla Iceberg contiene archivos en formatos mixtos (ORC y Parquet). #99168 (alesapin).
- Se corrigió un crash (desreferenciación de puntero nulo) al ejecutar
ALTER TABLE ... MODIFY COLUMN ... COMMENTen tablas Iceberg. #99838 (Desel72). - ClickHouse ahora maneja correctamente las tablas de estilo Spark (con una ruta absoluta completa para cada archivo o una ruta relativa a la ruta común de la tabla). #99935 (alesapin).
- Se corrigió una excepción cuando una opción de ruta de archivo de metadata de Iceberg contiene un null byte. #100283 (Alexey Milovidov).
- Se corrigió un error de copiar y pegar por el que
delta_lake_snapshot_end_version, configurado sindelta_lake_snapshot_start_version, se ignoraba silenciosamente en lugar de producir un errorBAD_ARGUMENTS. #100454 (Mohammad Lareb Zafar). - Se corrigió un error lógico en tablas Iceberg ordenadas durante mutations. #100499 (alesapin).
- Se corrigió el Polaris catalog con Azure, donde desde la versión 25.12 el catálogo añadía el bucket al principio de la ruta. #100583 (Konstantin Vedernikov).
- Se corrigió una excepción
Logical error: 'partitions_count > 0'al realizar operaciones consecutivas deALTER TABLE UPDATEen una tabla Iceberg particionada. #101278 (Desel72). - Se corrigió
insert-selectdesde un clúster de Delta Lake con ReplicatedMergeTree. #101299 (Konstantin Vedernikov). - Ahora se genera un error cuando se usan
delta_lake_snapshot_versiono las configuraciones de versión de CDF sin DeltaKernel habilitado, en lugar de devolver silenciosamente datos incorrectos. #101489 (Desel72). - Se corrigió un bucle de reintentos de INSERT de Iceberg que fallaba cuando la tabla se había creado con
iceberg_metadata_file_pathy la versión de metadatos de destino ya existía. #101548 (Groene AI). - Se corrigió un fallo del servidor (
LOGICAL_ERROR) al seleccionar desde una vista materializada respaldada por una tabla con el table engine IcebergLocal. #101577 (Groene AI). - Se corrigió un fallo en
ALTER TABLE ... UPDATEde IcebergLocal al usar formato Avro, causado porque los tipos envoltorioLowCardinality/Nullableno se desempaquetaban antes de la serialización. #102337 (Desel72). - Se añadió la columna
hostnameque faltaba asystem.delta_lake_metadata_logysystem.iceberg_metadata_log. #102162 (Michael Russell). - Se corrigió CoalescingMergeTree para el tipo Array. #102384 (Konstantin Vedernikov).
Correcciones de S3/Azure/almacenamiento de objetos
- Se corrigió una excepción en
CachedOnDiskReadBufferFromFile::readBigAt. #97890 (Kseniia Sumarokova). - Se corrigió un fallo por el que, al consultar archivos con un patrón glob (p. ej.,
file('dir/**', 'LineAsString')), se producía una excepción no controlada del sistema de archivos si el directorio contenía un enlace simbólico colgante. Ahora esos enlaces simbólicos colgantes se omiten silenciosamente. #98143 (Mark Andreev). - Se corrigió el uso excesivo de memoria (~514 MiB) durante la autodetección de formato al leer datos que no eran Arrow (p. ej., JSON desde
url()ofile()sin un formato explícito), causado porque el lector ArrowStream interpretaba erróneamente los primeros bytes como una longitud de metadatos enorme. #98893 (Konstantin Bogdanov). - Se corrigió una race condition que podía provocar la excepción “ReadBuffer is canceled” en consultas que usan
urlClustero funciones de tabla de clúster similares. #98955 (Alexey Milovidov). - Se corrigió el mensaje engañoso “inflate failed: buffer error” al leer archivos comprimidos inexistentes mediante la función de tabla
url()con patrones glob. #99034 (Alexey Milovidov). - Se corrigieron las llamadas N+1 a
HeadObjectpara globs con expansión de llaves en S3. #99219 (Konstantin Bogdanov). - Se corrigieron casos en los que números con ceros a la izquierda en una ruta de partición de Hive provocaban errores. #99458 (Yarik Briukhovetskyi).
- Se corrigió un posicionamiento incorrecto en
AsynchronousReadBufferFromFileDescriptorconO_DIRECT. #99678 (Pavel Kruglov). - Se corrigió un error por el que ClickHouse podía omitir archivos si faltaba la cabecera
Content-Lengthen la respuesta a la solicitud HEAD (por ejemplo, debido a transcodificación descompresiva en GCS). #99971 (Yarik Briukhovetskyi). - El servidor ya no deja de arrancar cuando se configura un disco de Azure blob storage pero el endpoint no está accesible temporalmente (p. ej., por un fallo de DNS). #100701 (Raúl Marín).
- Se corrigió un segfault en
s3Clustery en consultas distribuidas debido a un use-after-free en el grupo de conexiones. #100837 (Konstantin Bogdanov). - Se corrigió una excepción que se escapaba del destructor
Client::~Clientde S3 y provocaba la terminación del servidor. #101798 (Gagan Dhakrey). - Se corrigió que el host y el puerto no se registraran correctamente durante la reconexión. #102280 (Grant Holly).
- Se corrigió una excepción del servidor en ClusterDiscovery cuando un clúster estático (definido en la configuración) se quedaba temporalmente sin nodos activos. #102661 (Kseniia Sumarokova).
Correcciones de S3Queue
- S3Queue: se corrigió un error de aserción tras una pérdida de conexión con ZooKeeper, aunque el commit se había realizado correctamente. #100210 (Kseniia Sumarokova).
- Se corrigió la descripción invertida de la columna
alterableensystem.s3_queue_settingsysystem.azure_queue_settings: se intercambiaron los significados de0y1para que coincidan con el comportamiento real del código. #101703 (ClickGap AI Bot).
Correcciones de seguridad y control de acceso
- La función de tabla
loopllamaba ainner_storage->read()directamente, omitiendo la capa del intérprete donde se aplican las políticas de fila, los privilegios a nivel de columna y otras comprobaciones de seguridad. Esto permitía que un usuario restringido por políticas de fila leyera todas las filas medianteloop(table). #97682 (pufit). - Aplicar comprobaciones
READ ON FILEafile()escalar y aDESCRIBE TABLE file(). #98115 (Nikolay Degterinsky). - Aceptar credenciales base64 sin relleno en HTTP Basic Auth. Algunos clientes HTTP omiten el relleno final
=en la cabeceraAuthorization: Basic, lo que antes provocaba fallos de autenticación. #98392 (Amos Bird). - Se corrigió una elusión de RBAC que permitía a los usuarios ejecutar
DESCRIBEsobre cualquier tabla medianteremote(),remoteSecure(),cluster()oclusterAllReplicas()apuntando a localhost, sin requerir el privilegioSHOW_COLUMNS. #98669 (pufit). - Se corrigió un issue por el que
system.grantsomitía los parámetros de expresión regular de los grantsURLyS3en la columnaaccess_object. #98987 (DQ). - Se corrigió una elusión de RBAC que permitía a los usuarios obtener la estructura de la tabla mediante
DESCRIBE TABLEoCREATE TABLE ASen funciones de tabla (mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc(), etc.) sin los privilegios de acceso al origen requeridos. En el caso de las funciones que infieren el esquema a partir de servidores remotos, esto también permitía desencadenar conexiones salientes (SSRF) sin autorización. #99122 (pufit). - Limitar las constraints de settings en el worker de DDL para consultas DDL distribuidas. #99317 (Pablo Marcos).
- Se corrigieron problemas menores con la autenticación TOTP: la opción de CLI
--one-time-passwordcon una contraseña vacía y la validación de los valores de configuración<digits>y<period>. #99322 (Vladimir Cherkasov). - Las credenciales en las cadenas de conexión JDBC, ODBC y NATS ahora se enmascaran en los registros de consultas y en la salida de
SHOW CREATE. En el caso de las cadenas de conexión con formato URI, solo se enmascara la parte correspondiente a la contraseña. El settingnats_tokenahora también se enmascara. #99344 (János Benjamin Antal). - Prohibir la lectura de credenciales de Google desde un archivo local, lo cual era inseguro porque permitía leer otras credenciales si se conocía la ruta del archivo. #99584 (Konstantin Vedernikov).
- Se corrigió que el origen del diccionario de MySQL omitiera
RemoteHostFilterpara parámetros DDL inline. #99720 (Shaohua Wang). - Se corrigió
system.completionspara filtrar correctamente bases de datos, tablas y columnas según los permisos de acceso en todas las combinaciones de grants: por tabla, por base de datos y revoke por columna. #100432 (Shaohua Wang). - Sanitizar
query_iden el handler HTTP para evitar la inyección de CRLF en las cabeceras de respuesta mediante la cabeceraX-ClickHouse-Query-Id. #100500 (Pablo Marcos). - Algunos catálogos podían mostrar secretos en la sección
SETTINGSdeSELECT * FROM system.databases. Ahora esto se impide. #100800 (Konstantin Vedernikov). - Las políticas de fila no se propagaban desde los subplanificadores al planificador principal para el logging, por lo que no aparecían en
query_logpara vistas, subconsultas e instruccionesINSERT SELECT. Ahora se conservan enQueryAccessInfopara el logging. #101044 (Narasimha Pakeer).
Correcciones de copia de seguridad y restauración
- Se corrigió que
max_execution_timeno se aplicara a la copia de seguridad/restauración. #99205 (Kseniia Sumarokova). - Se corrigió una excepción
ReadBuffer is canceled. Can't read from it.en operaciones de copia de seguridad/restauración con archivos zip. #100400 (Alexey Milovidov). - Se validan las rutas de las entradas de archivo en los metadatos de la copia de seguridad para rechazar recorridos de ruta, rutas absolutas y nombres vacíos durante
RESTORE. #100483 (Pablo Marcos). - Se corrigieron el formateo y la clonación del AST de
BACKUP FROM SNAPSHOT. #101405 (Pablo Marcos).
Correcciones de ClickHouse Keeper
- Se corrigió una carrera de dato en el client de ZooKeeper entre el hilo de envío y el hilo de recepción. #97887 (Pablo Marcos).
- Se corrigió la pérdida de datos en Keeper tras un reinicio al usar Azure Blob Storage con metadatos
s3_plainpara el almacenamiento de logs. #97987 (Antonio Andelic). - Se estableció el componente
Watchpara las respuestas de watch enaggregated_zookeeper_logen lugar de dejarlo vacío. #98202 (Antonio Andelic). - Se corrigió un problema por el que ClickHouse Keeper desconectaba a clients Java de ZooKeeper después de una solicitud
addWatch. El Java client espera un cuerpoErrorResponsede 4 bytes, pero Keeper enviaba un cuerpo vacío, lo que provocabaEOFExceptiony la desconexión de la sesión. #98499 (Antonio Andelic). - Se corrigió que las métricas de Keeper
zk_followersyzk_synced_followersno disminuyeran cuando un follower dejaba de estar disponible. Se añadieron las nuevas métricaszk_learnersyzk_synced_non_voting_followersal comandomntr. #98504 (Antonio Andelic). - Se corrigió que el puerto Raft seguro de Keeper ignorara
cipherListydhParamsFilede la configuraciónopenSSL. #98509 (Antonio Andelic). - Se corrigieron mensajes de log engañosos de Keeper como “Receiving request for session X took 9963 ms”, donde el tiempo informado en realidad se pasaba esperando inactivo en
poll()entre heartbeats. #98510 (Antonio Andelic). - Se corrigió que las conexiones TCP de Keeper impidieran un apagado ordenado del servidor al no responder a la señal de apagado. #98525 (Alexey Milovidov).
- Se corrigió una aserción de depuración en
DDLWorkercausada por unfirst_failed_task_nameobsoleto después de que se eliminara una entrada de ZooKeeper durante la recuperación de reinicialización. #99099 (Antonio Andelic). - Se corrigió un caso de crash en Keeper. #99133 (JIaQi Tang).
- Se corrigió un error en Keeper por el que una read request podía quedarse bloqueada (provocando un timeout de sesión) si otra sesión distinta y no relacionada en el mismo servidor se cerraba justo en el momento equivocado. #99484 (Michael Kolupaev).
- Se corrigió un SEGFAULT en NuRaft debido a una race condition. #100444 (Pablo Marcos).
- Se corrigió que
KeeperMapCREATE TABLEfallara con “Cannot create metadata for table” cuando nodos residuales de ZooKeeper de un drop parcial anterior a 25.1 no tenían el nododrop_lock_version. #101623 (Antonio Andelic). - Se corrigió la pérdida del registry de UDF cuando una sesión de ZooKeeper expiraba durante una actualización periódica: todas las user-defined functions podían dejar de estar disponibles hasta que una actualización completa se completara correctamente. #101891 (Nikita Fomichev).
- Se corrigió un crash durante la actualización de UDF causado por que
ZooKeeperRetriesControlreintentaba sobre una sesión de ZooKeeper obsoleta (expirada) sin renovarla. #102059 (Nikita Fomichev).
Correcciones de bloqueos y estabilidad
- Se corrigió un fallo en las funciones del dialecto Kusto
bin(),bin_at(),extract()eindexof()cuando se proporcionan argumentos vacíos. #95736 (NeedmeFordev). - Se corrigió un fallo/assert del servidor en
mapContainsKey/mapContainsKeyLikecon un skip indextokenbf_v1. #97826 (Shankar Iyer). - Se corrigió un fallo del servidor (
std::terminate) causado por una excepción no capturada en el destructor del pool de conexiones HTTP cuando se alcanza el límite estricto del grupo de conexiones con alta concurrencia. #97850 (Antonio Andelic). - Se corrigió un acceso fuera de límites en
ColumnConst::getExtremesque podía causar un fallo cuandoextremes = 1está habilitado. #98263 (Alexey Milovidov). - Se añadieron validaciones de datos corruptos durante la deserialización de
DDSketchpara evitar segfaults, excepciones, bucles infinitos y OOM al leer aggregate function states corruptos dequantilesDD. #98284 (Alexey Milovidov). - Se corrigió una excepción poco frecuente en el ejecutor del pipeline, que podía manifestarse como
Received signal 6(en builds de depuración), cuando la expansión del pipeline compite con la cancelación de la consulta. #98428 (Alexey Milovidov). - Se corrigió una desreferenciación de puntero nulo en
dictGetOrDefaultcuando el argumento de clave esNullable. #98460 (Alexey Milovidov). - Se corrigió un interbloqueo del pipeline al usar
sort_overflow_mode = 'break'junto con funciones de ventana. #98543 (Alexey Milovidov). - Se corrigió un fallo por desreferenciación de puntero nulo en tablas del sistema creadas entre la captura instantánea de las tablas en
IDatabaseTablesIterator::table()y su modificación en otro hilo durante una iteración posterior. #98792 (Grant Holly). - Se corrigió la desviación en el seguimiento de memoria causada por asignaciones fallidas que no se revertían, el comportamiento no definido de
nallocx(0)y un error de desfase de uno en el seguimiento del pico global. Se amplió el seguimiento para cubrir los búferes circulares deio_uring. #98915 (Antonio Andelic). - Se corrigió un fallo del servidor (
std::terminate) al ejecutarALTER TABLE ... DROP PARTen una patch part después de un cambio de esquema (por ejemplo, ADD COLUMN). #99036 (Peng). - Se corrigió un fallo del servidor que podía ocurrir si se lanzaba una excepción por exceder el límite de memoria durante una lectura desde disco en caché. #99042 (Shankar Iyer).
- Se corrigió un fallo provocado por una excepción de límite de memoria lanzada durante la aplicación de una patch part. #99086 (Anton Popov).
- Se corrigió un fallo al usar una tabla Buffer con
SAMPLEcuando el destino no lo admite. #99141 (Kseniia Sumarokova). - Se corrigió un error de heap-use-after-free cuando una tabla se elimina de forma concurrente mientras hay una consulta de lectura en ejecución. #99483 (Alexey Milovidov).
- Se corrigió un heap-buffer-overflow en
CompressionCodecT64y un aborto del proceso enCompressionCodecMultipleal descomprimir datos comprimidos malformados. Ahora los códecs lanzan una excepción en lugar de bloquearse. #99680 (Rahul Nair). - Se corrigió un bucle infinito al leer archivos en formato
Npycon dimensiones de shape negativas. #99812 (Desel72). - Se corrigió un global-buffer-overflow en la función
CRC32con argumentosFixedStringcuando se evaluaba con cero filas durante el cálculo del header del query plan. #99835 (Alexey Milovidov). - Se corrigió un fallo de aserción en
sipHash128Keyed(y funciones hash con clave similares) cuando el argumento de datos es un Map con claves de array u otros tipos de array anidados. #99921 (Alexey Milovidov). - Se corrigió un fallo de aserción al multiplicar estados de agregación
NumericIndexedVectorpor una constante entera par, causado por self-XOR en bitmaps Roaring con alias enpointwiseAddInplace. #99976 (Desel72). - Se corrigió una desreferenciación de nullptr en el Parquet reader cuando la ruta filter-in-decoder encuentra páginas filtradas. #99677 (Alexey Milovidov).
- Se corrigió un fallo del servidor local cuando
CREATE DICTIONARYtiene una definición con un valor de lista que contiene una función inexistente. #100036 (Yakov Olkhovskiy). - Se corrigió un SIGSEGV al leer patch parts después de
ALTER MODIFY COLUMN. #100107 (Nikolay Degterinsky). - Se corrigió un use-of-uninitialized-value en
StringSearcher.h. #100225 (Konstantin Bogdanov). - Se corrigió un fallo del servidor (fallo de aserción) al usar funciones de agregación paramétricas con el combinador Array y argumentos NULL, como
quantileIfArrayArray(0.5)([[NULL]], [[1]]). #100679 (nerve-bot). - Se corrigió un heap-buffer-overflow en
sorted_buffer_gt::insert()de usearch que podía provocar un fallo o corromper la memoria silenciosamente durante la vector similarity search. #100537 (Dustin Healy). - Se corrigió un fallo del servidor (error lógico “Unexpected return type from __topKFilter”) cuando
use_top_k_dynamic_filteringestá habilitado y la columnaORDER BYes de tipoDynamicoVariant. #100742 (Groene AI). - Se corrigió un fallo del servidor al usar la función
has()con PREWHERE/WHERE sobre una clave Tuple que contiene elementos LowCardinality. #100760 (Groene AI). - Se corrigió un segfault por desreferenciación de puntero nulo al cargar diccionarios durante el apagado del servidor. #100839 (Miсhael Stetsyuk).
- Se corrigió un desbordamiento de búfer en
ULIDStringToDateTimecuando la entrada contiene bytes no ASCII. #100843 (Konstantin Bogdanov). - Se corrigió un fallo (
LOGICAL_ERROR) al consultar una tablaMerge(o la table functionmerge()) que abarca varias tablas, incluida una tablaDistributed, condistributed_group_by_no_merge=1habilitado. #100859 (Groene AI). - Se corrigió un fallo al construir un diccionario Polygon a partir de una tabla
MergeTreeque usa serialización de columnas dispersas. #100964 (Anton Popov). - Se corrigió un fallo (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) en los algoritmos de merge cuando la replicación diferida de columnas (enable_lazy_columns_replication) produce columnasColumnReplicatedque pasan a canalizaciones de merge-sort con entradas que llegan tarde. #101036 (Groene AI). - Se corrigió un fallo del servidor (
SIGABRT) al usar funciones de agregación con el combinador internoNull(por ejemplo,sumNull,avgNull) yaggregate_functions_null_for_empty = 1. #101147 (Groene AI). - Se corrigió un use-after-free en la ruta de escritura de la caché del sistema de archivos que podía provocar lecturas de memoria ya liberada al registrar segmentos de archivo completados. #101161 (Groene AI).
- Se corrigió un fallo del servidor con “Trying to attach external table to a ready set without explicit elements” cuando el análisis distribuido de índices encuentra un predicado
GLOBAL INcuyo Set se construyó sin elementos explícitos. #101178 (Groene AI). - Se corrigieron resultados incorrectos en las funciones de agregación
MAX/MINsobre columnasDecimalcuando la compilación JIT está habilitada. #101203 (Raúl Marín). - Se corrigió un fallo del servidor (
LOGICAL_ERROR: Bad cast fromColumnVectortoColumnLowCardinality) al consultar una tablaMergeTreeconORDER BY CAST(lc_column, 'Type'), dondelc_columntiene un tipoLowCardinality. #101220 (Groene AI). - Se corrigió UB en
mergeTreeAnalyzeIndexes()en caso de que el argumento de optimizaciones no sea válido. #101253 (Azat Khuzhin). - Se corrigió un fallo del servidor (Logical error: “Variant … is empty”) cuando una consulta lee simultáneamente una columna
Tupleque contiene un tipoMapDynamicy su subcolumna. #101448 (Groene AI). - Se corrigió un fallo
LOGICAL_ERRORcon el mensaje “Current component is empty” al consultarsystem.part_moves_between_shardsconenforce_keeper_component_trackinghabilitado. #101462 (Groene AI). - Se corrigió un fallo de segmentación en
DataTypeDynamic::create()cuando el fuzzer genera un AST mal formado del tipoDynamic. #101464 (Groene AI). - Se corrigió un fallo (
LOGICAL_ERROR: “ColumnUnique can’t contain null values”) al comparar una columnaLowCardinalitycon una constanteNULLdeVariantmientrasuse_variant_default_implementation_for_comparisonsestá deshabilitado. #101690 (Groene AI). - Se añadió una comprobación para streams vacíos en
Bzip2ReadBufferpara que devuelva EOF en lugar de lanzarUNEXPECTED_END_OF_FILEcuando el stream interno está vacío. #101691 (ClickGap AI Bot). - Se corrigió un fallo por uso de memoria después de liberarla en el scheduler de arrendamiento de CPU cuando el temporizador de espera sobrevive al worker thread cuyos
ProfileEvents::Countersreferencia. #101761 (Antonio Andelic). - Se corrigió un uso fuera de ámbito en la deserialización en paralelo de rutas dinámicas del tipo
Object, que podía provocar fallos al leer tablas con muchas rutas dinámicas. #101823 (Antonio Andelic). - Se corrigió un SIGSEGV en
MergeTreeDataPartWriterWide::cancelcuando un constructor de stream lanza una excepción duranteaddStreams, lo que dejaba una entrada nula encolumn_streams. #101936 (Antonio Andelic). - Se corrigió un fallo de segmentación en mutations sobre materialized columns sin expresión. #102342 (zoomxi).
- Se corrigió un segfault (o
LOGICAL_ERRORen builds de depuración) al leer archivos Parquet con bloom filter push-down habilitado y condiciones de igualdad/desigualdad en la cláusulaWHERE, causado por un acceso a memoria fuera de límites en el precargador de Parquet. #102385 (Groene AI). - Se corrigió una lectura fuera de límites en funciones de búsqueda de cadenas (
countSubstrings,position, etc.) al buscar una subcadena compuesta íntegramente por bytes nulos. #102401 (Raúl Marín). - Se corrigió una lectura fuera de límites en
printfcon un%al final. #102472 (Raúl Marín). - Se corrigió un fallo por
LOGICAL_ERROR“Unexpected number of rows in column subchunk” en el lector nativo de Parquet V3 al leer nullable columns con un filtroWHERE. #102628 (Groene AI). - Se corrigió un fallo del server (SIGSEGV) al leer archivos Avro con schemas recursivos que contenían referencias cíclicas a tipos simbólicos. Ahora estos schemas se detectan y rechazan con un mensaje de error claro. #102853 (Groene AI).
- Se corrigió un fallo del server (aserción
LOGICAL_ERROR) cuando una función sobre una columnaVariantalcanza un memory limit u otra excepción no relacionada con la conversión de tipos durante el cast del resultado enFunctionVariantAdaptor. #102855 (Groene AI). - Se corrigió un fallo del server en builds de depuración/sanitizador cuando se lanza
std::length_errordurante schema inference. #102859 (Groene AI). - Se corrigió un fallo al usar una vista con una cláusula
WHEREen la que la consulta interna produce columnas con tipos distintos de los metadatos de la vista (por ejemplo,Nullablea partir de unLEFT JOINconjoin_use_nulls). #102085 (Miсhael Stetsyuk).
Otras correcciones de errores
- Se corrigió un error por el que las configuraciones explícitas enviadas junto con
compatibilityen la misma solicitud podían ignorarse silenciosamente cuando su valor coincidía con el valor predeterminado del servidor. #97078 (Raufs Dunamalijevs). - Se corrigió un problema por el que el client informaba
NETWORK_ERRORen lugar del parsing error real (con el número de fila correcto) cuando unINSERTcon parsing en paralelo encontraba datos no válidos. #97339 (Alexey Milovidov). - Se corrigió un problema por el que
DROP DATABASEcondatabase_atomic_wait_for_drop_and_detach_synchronouslypodía quedar bloqueado indefinidamente cuando se terminaba la consulta. #97586 (Alexey Milovidov). - Se corrigió un problema por el que
KILL QUERYno podía terminar consultas bloqueadas durante la generación deWITH FILL, la carga de Diccionarios mediantedictGetoALTER DELETEconmutations_sync=1enReplicatedMergeTree. #97589 (Alexey Milovidov). - Se corrigió un error lógico en una consulta de política de enmascaramiento de datos con
ON CLUSTER. #97594 (Bharat Nallan). - Se corrigió una poda de particiones incorrecta al usar
DateTime64anterior al epoch con la funcióntoDate(). #97746 (Yarik Briukhovetskyi). - Se corrigió un
LOGICAL_ERRORdeCannot schedule a fileenINSERTsobreDistributeddebido a una condición de carrera entreDROPeINSERT. #97822 (Azat Khuzhin). - Se corrigió un error lógico “Bad cast from type DB::ColumnConst to DB::ColumnArray” en
kql_array_sort_asc/kql_array_sort_desccuando se invocaban con argumentos de Array constantes. #98251 (Alexey Milovidov). - El servidor HTTP ahora devuelve un mensaje de error en el body de la respuesta para las respuestas 400 Bad Request causadas por headers malformados, en lugar de un body vacío. #98268 (Alexey Milovidov).
- Se corrigieron resultados incorrectos con distributed index analysis (Experimental Feature) y la caché de condiciones de consulta. #98269 (Azat Khuzhin).
- Se corrigió un problema por el que un dictionary source de
MongoDBfallaba con named collections. #98528 (Pablo Marcos). - Ahora se impide eliminar una columna cuando sus subcolumns se usan en expresiones predeterminadas o alias de otras columnas, y se utiliza el analizador para las expresiones predeterminadas en
ALTER DROP COLUMN. #98569 (Nikita Mikhaylov). - Todas las
DB::ExceptiondePocoHTTPClient::makeRequestInternalImplahora se consideran no reintentables, incluidaHTTP_CONNECTION_LIMIT_REACHED. #98598 (Sema Checherinda). - Se corrigieron dos errores en la compilación JIT de expresiones: un error de copiar y pegar en la verificación de tipos de
nativeCastque hacía inalcanzables las ramas de conversión de entero a entero y de float a float, y unnullptrincorrecto de TargetMachine pasado aPassBuilderde LLVM. #98660 (Alexey Milovidov). - Se corrigió una excepción “Inconsistent KeyCondition behavior” en compilaciones de depuración cuando la clave primaria contiene valores NaN de punto flotante, haciendo que
accurateLessyaccurateEqualsmanejen NaN de forma coherente con el orden de clasificación de ClickHouse. #98964 (Alexey Milovidov). - Se corrigió
windowFunnelconstrict_deduplication, que devolvía un nivel incorrecto al encontrar un evento duplicado. #99003 (Yash). - Se hizo que las entradas de
system.trace_logpara las recargas automáticas de los diccionarios de ClickHouse tengan IDs de consulta no vacíos. #98784 (Miсhael Stetsyuk). - Se corrigió que
SYSTEM START REPLICATED VIEWno activara la tarea de actualización. #98797 (Pablo Marcos). - Se corrigió que
WITH FILL STALENESSprodujera filas rellenadas adicionales cuando los datos se leen en varios fragmentos (por ejemplo, con unindex_granularitypequeño). #98895 (Alexey Milovidov). - Se corrigió un fallo en la ofuscación de consultas para identificadores que comienzan con una letra mayúscula, como
Ab. #101450 (Xuewei Wang). - Se corrigió que se ignorara
TABLE_UUID_MISMATCHen la ruta de código sin analizador. #99380 (Azat Khuzhin). - Se corrigió que
clickhouse format --obfuscateprodujera SQL no válido al ofuscar tipos de skip index, nombres de códecs de compresión, nombres de motores de base de datos y definiciones de layout/source de diccionarios. #99260 (Raúl Marín). - Validar los cambios de configuración en las consultas CREATE cuando el propio engine también admite settings. #99279 (János Benjamin Antal).
- Se corrigió que
insert_deduplication_tokense ignorara silenciosamente en consultasINSERT SELECTsinORDER BY ALL. Ahora, proporcionarinsert_deduplication_tokenes suficiente para habilitar la desduplicación independientemente deORDER BY ALL. #99206 (Desel72). - Retrasar el procesamiento hasta que el servidor haya terminado de cargar todas las tablas. #99700 (Seva Potapov).
- Se corrigió el análisis de comillas de estilo shell en los argumentos de la table function
executable. #99794 (Nikita Semenov). - Se corrigió que las consultas de async insert reportaran
written_rows,read_rowsyresult_rowsen cero enquery_logy en la salida del client. #99879 (Sema Checherinda). - Se corrigió que un
INSERTconVALUESfallara cuando los datos iban seguidos de un comentario SQL final (--o/* */) en la línea siguiente. Ahora el comentario se omite en lugar de interpretarse como otra fila. #100016 (Pratima Patel). - Se corrigió una excepción en
arrayRemoveal comparar Tuples con componentes NULL. #100017 (Alexey Milovidov). - Procesar correctamente los valores negativos dentro de
NumericIndexedVectorDataBSI. #100086 (Daniil Ivanik). - Se corrigió un problema por el que la table function
primesno respetaba correctamentemax_rows_to_readen algunos casos, especialmente cuando están presentes offset y step. #100199 (Nihal Z. Miaji). - Los usuarios ya no ven
NATURAL CROSS JOINal consultar el AST de una consulta con natural join que se reescribe comoCROSS JOIN. #100223 (Peter Nguyen). - Se introdujeron algunos cambios menores en funciones: las funciones h3 ahora validan mejor los límites;
readWKBcomprueba los límites de tamaño (un nuevo ajuste,max_wkb_geometry_elements); y las funciones del generador aleatorio limitan el número máximo de iteraciones. #100270 (Alexey Milovidov). - Se corrigió un issue por el que
cutURLParameterpodía omitir parámetros incorrectamente cuando aparecían como subcadenas de otros parámetros. #100280 (Nikita Semenov). - Se corrigió una excepción
LOGICAL_ERRORenestimateCompressionRatiocuando el parámetroblock_size_byteses extremadamente grande. #100298 (Alexey Milovidov). - Se corrigió un problema por el que
DROP TABLEquedaba bloqueado indefinidamente en tablas con motor Kafka cuando los consumers se quedaban atascados en un rebalance tras un error de heartbeat. #100388 (Alexey Milovidov). - Se validan las dimensiones de la forma del formato Npy frente al tamaño del archivo y los límites de desbordamiento para evitar denegaciones de servicio mediante archivos
.npymanipulados. También se rechazan las formas vacías y se limita la memoria por fila a 2 GiB. #100625 (Raúl Marín). - Se corrigió que
session_timezonese ignorara al analizar valoresDateTimedurante async inserts (TCP) y en todas las inserciones por HTTP. #100647 (Sema Checherinda). - Se hizo
StorageRabbitMQ::shutdownidempotente y se añadieron comprobaciones defensivas de null, ya que ahora se llama dos veces (enStreamingStorageRegistryyDatabaseCatalog). #100455 (Miсhael Stetsyuk). - Se corrigió una excepción
LOGICAL_ERRORal usaraccurateCastOrNullcon el tipo de destinoQBit. #100470 (Raufs Dunamalijevs). - Se corrigió que la sintaxis
LIMIT m OFFSET n WITH TIESno funcionara (equivalente aLIMIT n, m WITH TIES, que ya funcionaba). #100491 (Nihal Z. Miaji). - Se corrigió un segfault en el que
SerializationInfoTuple::addhacía unassert_castsobre una referencia simple deSerializationInfoal fusionar partes después de queALTER MODIFY COLUMNcambiara una columna de un tipo noTupleaTuple. #100509 (Miсhael Stetsyuk). - Se corrigió una excepción “No set is registered for key” al usar
INcon columnasNullable(Tuple)que tienen campos con nombre y elementosLowCardinality. #100523 (Alexey Milovidov). - Se corrigió que
EXECUTE ASignorara las cláusulasFORMATeINTO OUTFILEespecificadas en la consulta. #100538 (pufit). - Se corrigió el formato inconsistente del AST para
SAMPLEcon unOFFSETa nivel de consulta. #100579 (Pavel Kruglov). - Se corrigieron los errores “La tabla de destino no existe” en las vistas materializadas con tablas internas durante el inicio asíncrono, causados por un orden incorrecto en las dependencias de inicio. #100946 (Nikolay Degterinsky).
- Se corrigió una excepción en
optimizeLazyMaterializationcuando se usa una proyección con PREWHERE junto conORDER BY ... LIMIT. #101115 (Anton Popov). - Se corrigió un mensaje de error incorrecto al llamar a
intExp10con un argumento NaN: decíaintExp2en lugar deintExp10. #101582 (Krishna Chaitanya). - Se corrigió que
allow_statistics=0no bloquearaALTER TABLE ADD STATISTICSniALTER TABLE DROP STATISTICS. #101585 (Krishna Chaitanya). - Se corrigió que
CREATE TABLE ... AS merge()ignorara la lista explícita de columnas y, en su lugar, infiriera automáticamente las columnas a partir de las tablas de origen, lo que provocaba erroresNOT_FOUND_COLUMN_IN_BLOCKcuandomerge_table_max_tables_to_look_for_schema_inferenceera lo bastante bajo y las tablas de origen tenían esquemas distintos. #101663 (Miсhael Stetsyuk). - Se corrigió que la creación de un diccionario
RANGE_HASHEDaceptara silenciosamente un atributo de rangoMAXinexistente y usara una configuración de tipos incorrecta cuando los atributos de rango mínimo y máximo tenían tipos diferentes. #101732 (Yakov Olkhovskiy). - Se corrigieron errores en las funciones
arrayLevenshteinDistanceWeightedyarraySimilarity. #101767 (Mikhail f. Shiryaev). - Se corrigió que la API de consultas de Prometheus ignorara los cuerpos de formulario de las solicitudes POST. #101794 (James Cunningham).
- Se corrigió un falso negativo de
shouldPatchFunctionenSYSTEM INSTRUMENT ADDcuando la cadena de búsqueda aparece por primera vez dentro de un argumento de plantilla del nombre de símbolo desmangleado. #101885 (Pablo Marcos). - Se corrigió la descripción de
system.codecsparaAES_256_GCM_SIVpara que mostraraAES-256en lugar deAES-128. #101917 (Jimmy Aguilar Mena). - Se corrigió un comportamiento indefinido al analizar paquetes de consulta del protocolo nativo con valores
QueryProcessingStageno válidos. #101972 (Raúl Marín). - Se cerró la conexión TCP cuando se produce una excepción durante el análisis inicial de la consulta, para evitar leer datos basura de un flujo desincronizado. #101989 (Raúl Marín).
- Se corrigieron los casos en los que
Timecon valores negativos devolvía un resultado incorrecto al compararse conDateTime. #102056 (Yarik Briukhovetskyi). - Se corrigieron los espacios que faltaban al dar formato a unlock snapshot. #102063 (Han Fei).
- No se podían inicializar, en una réplica nueva, las tablas Alias sin una tabla de destino en Database Replicated. #102397 (Nikolay Degterinsky).
- Los
INSERTsimples sin vistas materializadas ya no solicitan un número excesivo de slots y threads deConcurrencyControl(max_threadsen lugar demax_insert_threads), lo que evita el agotamiento de slots de CC y el aumento descontrolado del número de threads en clusters con alto throughput deINSERT. #102961 (Sema Checherinda). - Se reintrodujo
ArrowMemoryPoolpara poder lanzarMEMORY_LIMIT_EXCEEDEDy evitar el OOM del kernel. #102999 (Azat Khuzhin). - Se corrigió un tipo de argumento incorrecto que se mostraba en los mensajes de error de las funciones de búsqueda de cadenas (p. ej.,
locate,position) cuando los argumentos se pasan en orden invertido (locate(needle, haystack)confunction_locate_has_mysql_compatible_argument_order = 1). #103102 (Alex Kuleshov). - Se corrigió el bloqueo indefinido de
waitForPausecuando se llama adisableFailPointsin que haya ningún thread pausado en el failpoint. #103119 (Shaohua Wang).