Cambios incompatibles con versiones anteriores
Cambios en las consultas y la sintaxis
- Las funciones de ventana
RANKyDENSE_RANKahora rechazan argumentos y lanzanNUMBER_OF_ARGUMENTS_DOESNT_MATCH, conforme al SQL standard. Anteriormente, consultas comoRANK(x) OVER (ORDER BY id)se aceptaban sin más, ignorando el argumento, lo que solía generar confusión entre los usuarios. Para restaurar el comportamiento permisivo anterior, establezcaallow_rank_dense_rank_arguments = 1. #104324 (groeneai).
Cambios en los tipos de datos
icebergHashyicebergBucketahora rechazan los argumentosInt128,UInt128,Int256,UInt256yDecimal256con un error explícito. Anteriormente, truncaban silenciosamente los valores de mayor tamaño y generaban hash con colisiones. La especificación de Iceberg solo define el cálculo de hash para enteros de 32/64 bits y decimales con una precisión de hasta 38; convierta aInt64oDecimal128para mantener el comportamiento anterior en los valores que quepan. #105866 (Algunenano).toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,CASTaUUIDyNullable(UUID),accurateCastOrNullaUUIDy los formatos de entrada que parsean un UUID a partir de texto (Avro,MsgPack,JSONExtract, …) ahora rechazan las cadenas que tienen la longitud correcta pero contienen caracteres no hexadecimales. Anteriormente, esas entradas se convertían silenciosamente en un UUID inventado al leer más allá del final de la tabla de lookup de dígitos hexadecimales. AhoratoUUIDlanzaCANNOT_PARSE_UUIDy las variantesOr*devuelvenNULL, el UUID con valor cero o el valor predeterminado suministrado. #104370 (groeneai).- Los tipos
DynamicyVariantahora se validan en la clausePARTITION BYde la ventana; antes esto no se comprobaba cuandoallow_suspicious_types_in_group_byestá disabled. Las consultas que particionan una ventana sobre una columnaDynamicoVariantahora lanzan un error a menos queallow_suspicious_types_in_group_by = 1. #105450 (Avogar).
Cambios en el almacenamiento y los índices
- Se rechazan valores Dynamic/Variant anidados en agregaciones min/max e índices minmax. Anteriormente, solo se comprobaban valores Dynamic/Variant de nivel superior. #105468 (Avogar).
- El valor predeterminado del SETTING del servidor
insert_deduplication_versioncambia decompatible_double_hashesanew_unified_hash. La deduplicación de inserciones ahora funciona sobre todo el bloque insertado (por inserción), en lugar de por parte/partición: un reintento de la misma inserción se sigue deduplicando, pero dos inserciones distintas que generan una parte idéntica ya no se deduplican entre sí, y las inserciones reordenadas de las mismas filas ya no se deduplican. Establezcainsert_deduplication_version = compatible_double_hashespara restaurar el comportamiento anterior. La deduplicación de inserciones asíncronas también se rige por la ventana síncrona connew_unified_hash: tanto su habilitación (replicated_deduplication_window) como su retención (replicated_deduplication_window_seconds, 1 hora de forma predeterminada) siguen los SETTINGs síncronos, por lo que*_for_async_insertses una configuración heredada y solo se aplica aold_separate_hashes/compatible_double_hashes. Las instancias que actualicen directamente desde una versión cuyo valor predeterminado eraold_separate_hashesdeben ejecutarse primero concompatible_double_hasheshasta que haya transcurrido la ventana de deduplicación relevante más larga (incluidareplicated_deduplication_window_for_async_inserts, cuyo valor predeterminado es una semana, si se usan inserciones asíncronas) antes de usarnew_unified_hash. Las cargas de trabajo asíncronas que cambien desdecompatible_double_hashesdeben primero aumentarreplicated_deduplication_window[_seconds]hasta la ventana asíncrona (y ejecutarse durante una ventana asíncrona completa), detener las inserciones asíncronas o mantenerse encompatible_double_hashes, porquenew_unified_hashya no comprueba los ID deasync_blocksde mayor duración. #107886 (CheSema). - Se corrige el problema por el que
hasTokencon un needle que contiene un separador devolvía resultados silenciosamente mediante un índice de texto, en lugar de generarBAD_ARGUMENTS. #108189 (Ergus).
Funciones eliminadas
- Ya no es posible usar el Parquet reader ni el writer basados en Arrow, ahora obsoletos. En su lugar siempre se utiliza la implementación native. Los SETTINGS que seleccionaban o ajustaban las implementaciones antiguas ahora son obsoletos y se ignoran:
input_format_parquet_use_native_reader_v3,output_format_parquet_use_custom_encoder,output_format_parquet_version,output_format_parquet_compliant_nested_typesyoutput_format_parquet_unsupported_types_as_binary. El Native writer siempre escribe Parquet V2.6+ con tipos anidados compatibles, y generaUNKNOWN_TYPEpara los tipos no compatibles en lugar de escribirlos como raw binary. #100949 (alexey-milovidov). - Se eliminó el SETTING obsoleto
allow_experimental_query_deduplicationy el comportamiento experimental no compatible de deduplicación de consultas asociado. #99398 (devcrafter). ALTER TABLE ... REPLACE PARTITION ... FROM ...ya no elimina silenciosamente los datos de la partición de destino cuando la tabla de origen no tiene partes en la partición solicitada. Anteriormente, dicha solicitud eliminaba la partición de destino sin escribir nada en su lugar. Ahora se rechaza conBAD_ARGUMENTSde forma predeterminada. Este es un cambio incompatible con versiones anteriores: unREPLACE PARTITIONdesde un origen vacío que antes se ejecutaba correctamente (borrando el destino) ahora generará un error tras la actualización. Para restaurar el comportamiento anterior de borrado silencioso, establezca el nuevo SETTINGallow_replace_partition_from_empty_source = 1(por consulta o en el perfil), o establezcacompatibilityen26.5o una versión anterior. Para eliminar explícitamente los datos de destino, useALTER TABLE ... DROP PARTITION .... #104939 (groeneai).- Se eliminaron las funciones experimentales de KQL (Kusto)
array_sort_ascyarray_sort_desc, así como sus implementaciones SQL,kql_array_sort_ascykql_array_sort_desc. Estas funciones eran experimentales, tenían una implementación de baja calidad y provocaban errores de corrección y del analizador sintáctico. Las consultas que usan estos nombres ahora devuelvenUNKNOWN_FUNCTION. #108101 (groeneai).
Nuevas características
Funciones
- Se añadió compatibilidad con la función de PromQL
histogram_quantileen las funciones de tablaprometheusQueryyprometheusQueryRange. Esto permite calcular cuantiles a partir de los buckets de histogramas clásicos de Prometheus identificados por la etiquetale. #103477 (Yasumoto). - Se añadió la función
h3PolygonToCellsWithContainment, que admite modos de contención centrada, de contención completa y de solapamiento. #104455 (yousefQadry). - Ahora se puede especificar un argumento de precisión opcional para las funciones
formatReadableSize,formatReadableDecimalSizeyformatReadableQuantity, que controla el número de dígitos después del punto decimal. El valor predeterminado es 2, lo que mantiene el comportamiento previo. #104648 (antoniofilipovic). - Se añadieron los alias de agregación
min_byymax_byparaargMinyargMax. #105712 (itsjoeoui).
Funcionalidades de SQL y consultas
formatReadableTimeDeltaahora acepta como entrada expresionesINTERVALde tipos distintos deMonthyYear. #64315 (Beetelbrox).- Se añadió compatibilidad con el formato de salida PNG, lo que permite renderizar directamente los resultados de las consultas como imágenes PNG. #74691 (m7kss1).
- Se introdujo una función de reserva de memoria para cargas de trabajo. Consulte la documentación sobre planificación de cargas de trabajo. #82414 (serxa).
- Se añadieron las opciones
IPV4_PREFIX_BITSeIPV6_PREFIX_BITSpara cuotas identificadas medianteIP_ADDRESSoFORWARDED_IP_ADDRESS, lo que permite compartir los límites de cuota por subred IP en lugar de aplicarlos por separado a cada dirección IP completa. #89270 (adityachopra29). - Se implementó
ADD ENUM VALUESen consultasALTER TABLEpara simplificar la adición de nuevos valores a un tipo Enum existente sin necesidad de volver a especificar todos los valores Enum actuales. #93830 (ilejn). - Se añadió el formato de entrada
GeoJSONpara lectura. #98124 (mneedham). - Se añadió un posprocesador al índice de texto que transforma los tokens tras la tokenización. #98939 (Ergus).
- Se añadió compatibilidad opcional con nodos TTL en ClickHouse Keeper. Los nodos TTL caducan automáticamente al finalizar su tiempo de vida configurado y no pueden tener nodos secundarios. #100397 (scanhex12).
- Se añadió almacenamiento de posiciones de tokens para índices de texto, con el fin de admitir búsquedas exactas con
hasPhrase. Habilite el argumento de índicesupport_phrase_searchy la configuración deMergeTreeallow_experimental_text_index_phrase_search. #103172 (ahmadov). - Se añadieron las funciones arrayTopK y arrayBottomK: -
arrayTopK(k, array)devuelve los K elementos más grandes en orden descendente -arrayBottomK(k, array)devuelve los K elementos más pequeños en orden ascendente. #104563 (vitlibar). - Se añadió compatibilidad para seleccionar columnas mediante patrones de nombre con
* LIKE '<pattern>'y* ILIKE '<pattern>', incluidas formas calificadas comotable.* LIKE '<pattern>'ytable.* ILIKE '<pattern>'.LIKEbusca coincidencias en los nombres de columna distinguiendo entre mayúsculas y minúsculas;ILIKE, sin distinguirlas. #104569 (niyue). - Se añadieron consultas continuas para tablas
MergeTreemediante una secuencia de lecturas de instantáneas. #105114 (Michicosun). - Se añadió el formato
RowBinaryWithNamesAndTypesAndDefaultspara mejorar la compatibilidad con la evolución del esquema. #105736 (mzitnik). - Se añadieron funciones para servir Mapbox Vector Tiles directamente desde SQL:
MVTEncodeGeomproyecta una geometría en el espacio de píxeles de una tesela de mapa Slippy y la recorta;MVTEncodeagrega las geometrías proyectadas de un grupo en los bytes binarios de una tesela de una sola capa; yMVTBoundingBox/MVTBoundingBoxMercatordevuelven el cuadro delimitador de una tesela para limitar las filas a esta. Se admiten geometrías de puntos, líneas y polígonos. También están disponibles con los alias de PostGISST_AsMVTGeomyST_AsMVT. #106107 (saarthak2002). - Se añadieron
LOCALTIMEyLOCALTIMESTAMP(sintaxis estándar de SQL/PostgreSQL).LOCALTIMESTAMPes un alias denow()(devuelveDateTime);LOCALTIMEdevuelve la hora actual como un valorTime. #106139 (thomas-cabral). - Se añadieron dos nuevas estrategias de
load_balancing,hostname_longest_common_prefixyhostname_longest_common_suffix, que prefieren la réplica cuyo hostname comparte con el hostname del iniciador el prefijo común más largo (o, respectivamente, el sufijo). Son útiles cuando el centro de datos se codifica como prefijo o sufijo de hostnames cuyos segmentos numéricos tienen longitud variable, situaciones en las que las estrategias existentesnearest_hostnameyhostname_levenshtein_distanceseleccionan la réplica equivocada. #107360 (den-crane). - Nuevas funciones
quantizeBFloat16ToInt8ydequantizeInt8ToBFloat16: un códec escalar que comprime los componentes de embedding a 8 bits mediante un cuantificador gaussiano Lloyd-Max de 256 niveles, del que se pueden extraer códigos Int4/Int2/binarios mediante truncamiento de bits. #108102 (alexey-milovidov).
Motores de tabla y almacenamiento
Configuración y ajustes
- Se añadió el SETTING
output_format_always_write_decimal_point_in_float_and_decimalpara imprimir siempre el punto decimal en los números de coma flotante yDecimalen formatos de texto, incluso cuando el valor es un número entero. Por ejemplo, muestra1.en lugar de1. Está deshabilitado de forma predeterminada. #62614 (qoega). - Se añadió un nuevo SETTING inmutable de
MergeTree,allow_tuple_element_aggregation, deshabilitado de forma predeterminada. Cuando está habilitado,SummingMergeTree,AggregatingMergeTreeyCoalescingMergeTreeaplanan recursivamente las columnasTupley agregan cada elemento hoja de forma independiente durante las fusiones, como si fuera una columna de nivel superior:SummingMergeTreelo suma,AggregatingMergeTreefusiona su estado de función de agregación yCoalescingMergeTreeconserva su último valor no NULL. El SETTING debe especificarse al crear la tabla y los motores que no lo admiten lo ignoran silenciosamente. #98039 (JingYanchao). - Se añadió el SETTING
output_format_float_precisionpara controlar el número de dígitos decimales en la salida de texto de números de coma flotante. #99721 (phulv94). - Se añadieron los SETTINGs de tabla de MergeTree
materialize_projections_on_insertymaterialize_projections_on_merge. Cuandomaterialize_projections_on_insert = 0, los INSERT omiten la creación de partes de proyección, lo que mejora el rendimiento de inserción en tablas con muchas proyecciones. Cuandomaterialize_projections_on_merge = 1, una fusión reconstruye una proyección que falta en todas sus partes de origen, por lo que las proyecciones pueden crearse durante las fusiones en lugar de durante la inserción. Las fusiones siguen combinando únicamente partes que comparten el mismo conjunto de proyecciones. #100993 (cwurm). - Se añadió un nuevo SETTING de S3Queue,
after_processing_move_preserve_path. Cuando se habilita junto conafter_processing='move'yafter_processing_move_prefix, los objetos procesados se mueven conservando toda su ruta de origen bajo el prefijo de destino, en lugar de aplanarse para conservar solo el nombre de archivo. #105354 (asya-ch). - Se añadieron los elementos de configuración del controlador HTTP
url_prefixyfull_url_prefixpara hacer coincidir todas las rutas con un prefijo determinado, así como los elementos explícitosurl_regexp,full_url_regexpyheaders_regexp. La sintaxis heredada<url>regex:...</url>sigue siendo compatible. #107492 (vitlibar).
Autenticación
- Se añadió una credencial
external_idopcional para el acceso a S3 basado en roles. #106941 (eliangidoni). - Se añadió a la tabla
system.session_loginformación sobre el certificado TLS del cliente (subjects, número de serie, issuer y período de validez) para mejorar la observabilidad de la autenticación basada en certificados. #107679 (alexey-milovidov).
Tablas del sistema
- Se añadió la tabla
system.iceberg_files, que expone metadatos por archivo de las tablas Iceberg, con una fila por cada archivo de datos o de borrado en el snapshot actual de cada tabla. #104415 (asya-ch). - Se añadieron índices de omisión hipotéticos (de tipo «qué pasaría si»). Use
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...para definir un índice de omisión virtual con ámbito de sesión y, a continuación,EXPLAIN WHATIF SELECT ...para estimar su ratio de omisión y coste sin materializarlo. Los índices definidos son visibles en la nueva tablasystem.hypothetical_indexes. #104608 (yariks5s). - Se añadió la tabla del sistema
system.constraints, que proporciona información sobre todas las restricciones CHECK y ASSUME de todas las tablas, incluidos el nombre, el tipo y la expresión de cada restricción. #105337 (PedroTadim). - Se añadió una nueva tabla del sistema,
system.documentation, que recopila en una sola tabla la documentación de referencia integrada de los componentes uniformes del sistema (funciones, motores de tabla, tipos de datos, configuraciones, formatos y otros), con la documentación renderizada en Markdown. #107463 (alexey-milovidov).
Funcionalidades experimentales
- Se añadió el algoritmo experimental de reordenación de JOIN
dphyppara INNER JOIN como opción del SETTINGquery_plan_optimize_join_order_algorithm, así como el SETTINGquery_plan_optimize_join_order_max_searched_plans, que limita la búsqueda del orden de los JOIN y recurre al siguiente algoritmo de la cadena cuando se supera dicho límite; establézcala en0para mantener el comportamiento anterior de búsqueda ilimitada. #98798 (davenger). - Se añadió el modo de aplicación diferida de listas de postings para el índice de texto. Cuando se habilita mediante
SET allow_experimental_text_index_lazy_apply = 1ySET text_index_posting_list_apply_mode = 'lazy', las listas de postings se decodifican bajo demanda con granularidad de bloques empaquetados mediante un enfoque basado en cursores, en lugar de materializarse por completo en mapas de bits Roaring, lo que reduce el uso de memoria y el tiempo de CPU en consultas selectivas sobre índices de texto. #100035 (fastio). - Se permite adjuntar controladores prometheus al puerto HTTP principal con un prefijo opcional. #104975 (JTCunning).
- Se añadió un SETTING experimental de MergeTree,
packed_skip_index_max_bytes, que agrupa substreams pequeños de índices de omisión en un único archivoskp_idx.packedpor parte, lo que reduce la presión sobre los inodos cuando se definen muchos índices de omisión en una tabla. La decisión se toma por substream en el momento de la escritura: los substreams cuyo tamaño serializado se mantiene por debajo del umbral se incluyen en el archivo; los de mayor tamaño conservan la disposición independienteskp_idx_<name>.idx2/.mrk2. Una misma parte puede combinar ambas disposiciones. Los índices de texto completo no son compatibles y siempre se almacenan en archivos individuales. El valor predeterminado es 0 (empaquetado deshabilitado). #105321 (Algunenano). - Se admite la serialización
Bufferspara UDF de WebAssembly medianteABI BUFFERED_V1, y se añadewebassembly_udf_enable_fuelcomo SETTING persistente de funciones UDF de WASM. #105574 (antonio2368). - Ejecución de consultas distribuidas en varias etapas: el planificador divide el plan de consulta en etapas conectadas mediante intercambios de dispersión / difusión / recopilación / reorganización, y envía los fragmentos del plan a los nodos worker. Los datos entre etapas se transmiten mediante TCP o se transfieren mediante archivos temporales en almacenamiento de objetos compartido; la ruta admite reorganización distribuida, hash joins de difusión, agregación mediante reorganización y ordenación distribuida. La funcionalidad es experimental y está deshabilitada de forma predeterminada. #106020 (davenger).
- El motor experimental de planes de consultas distribuidas (
make_distributed_plan) ahora puede usar un puerto distinto para el envío de tareas y el intercambio de streaming por worker, configurado por réplica en<remote_servers>mediantestateless_worker_portystreaming_exchange_port. Si no se configuran, se utilizan los puertos anteriores a nivel de servidor (stateless_worker_client.portydistributed_query.streaming_exchange_port). Esto permite ejecutar varios workers en un mismo host. #107885 (davenger).
Mejoras del rendimiento
Rendimiento de JOIN
- Implementa la aplicación diferida de índices de selector y de replicación cuando un JOIN va seguido de un LIMIT selectivo, TopN u otro JOIN. Para controlar el número de columnas de payload necesario para habilitar los índices de selector diferidos, utiliza el SETTING
query_plan_min_columns_for_join_lazy_indexing(0 significa que la optimización está deshabilitada). Para controlar el LIMIT al que se aplica la optimización, utiliza el SETTINGquery_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi). - Permite que
ASOF JOINuse el algoritmo de joinparallel_hash, paralelizando la compilación entre valores distintos de las claves de igualdad. Anteriormente, ASOF se excluía incondicionalmente deparallel_hash. #105375 (gregakinman). - Comparte el FixedHashMap del hash join como filtro en tiempo de ejecución de JOIN en el lado de sondeo. Cuando la tabla hash del lado de compilación es (o puede convertirse en) un FixedHashMap, se publica como filtro en tiempo de ejecución y sustituye el
Set/BloomFilterque, de otro modo, instalaríaBuildRuntimeFilterStep. Esta función se controla mediante el nuevo SETTINGenable_join_runtime_filter_shared_fixed_hash_table(valor predeterminado:true). #105640 (wudidapaopao). - La reordenación de JOIN mediante DP ahora se permite con réplicas paralelas. #105889 (nickitat).
- Se mejora el plan de consulta cuando JOIN usa filtros en tiempo de ejecución (
enable_join_runtime_filtershabilitado de forma predeterminada): el modelo de costes de reordenación de joins ahora puede atravesarWindowTransform(y otros pasos del plan que preservan las filas) en el subárbol derecho y utiliza el recuento de filas subyacente y el NDV por columna en lugar de asumir que no hay estadísticas. #107229 (UnamedRus).
Optimización de consultas
- Se mejoró el rendimiento del análisis de índices de texto en búsquedas con varios tokens al optimizar el manejo de tokens poco frecuentes. #98226 (CurtizJ).
- Se mejoró el rendimiento de las funciones
encrypt,decryptyhalfMD5al evitar búsquedas implícitas del proveedor de OpenSSL por cada fila en OpenSSL 3.x. #99105 (thevar1able). - Se compactan los bloques de origen antes de
projection.calculate()duranteMATERIALIZE PROJECTIONpara reducir el número de partes temporales de proyección y la sobrecarga de fusión. Aceleración de ~3,4 veces en una tabla de 50 millones de filas. #100047 (amosbird). - Los usuarios ahora se benefician de un mayor rendimiento de los filtros de tiempo de ejecución aproximados y los índices de filtro Bloom. #100201 (cv4g).
- Se aceleran las consultas
ORDER BY ... LIMIT BYejecutandoLIMIT BYdentro de cada flujo ordenado en paralelo duranteSortcuando las columnas deLIMIT BYson un prefijo de las deORDER BY. Esto reduce el número de filas que pasan por la fusión de ordenación final y por cualquier paso posterior de la canalización. Esta optimización se controla mediante la nueva configuraciónquery_plan_push_limit_by_into_sort(habilitada de forma predeterminada). #104000 (nihalzp). - Se reduce la sobrecarga por consulta en consultas SELECT sencillas (análisis sintáctico, análisis y planificación). Por ejemplo,
SELECT count() FROM hitsdesde una única conexión es aproximadamente un 50 % más rápido. #104513 (Algunenano). - Se mejoró el rendimiento de
bitmapContainspara estadosgroupBitmapdistintos deUInt64al evitar llamadas repetidas arb_maxdurante las comprobaciones de rango. #105960 (niyue). - Se mejoró el rendimiento de inserción para columnas
LowCardinalitycon índicesbloom_filter. #106410 (EmeraldShift). - Se mejoró el rendimiento de las funciones
L2DistanceTransposedycosineDistanceTransposedpara el tipo de datosQBit. #106701 (rienath). - Se mejoró el rendimiento del análisis de consultas sobre tablas con muchas columnas al evitar calcular hashes de nodos de columna —que incluyen toda la expresión de la tabla de origen— cuando no es necesario. El análisis de subconsultas
SELECT *anidadas sobre una tabla con ~1200 columnas ahora es unas 50 veces más rápido. #106957 (novikd). - Se mejoró el rendimiento de las funciones
encrypt,decrypt,tryDecrypt,aes_encrypt_mysqlyaes_decrypt_mysqlhasta en un orden de magnitud, recuperando el rendimiento perdido durante la migración de BoringSSL a OpenSSL 3.x (24.4). #107339 (thevar1able). - Se mejoró la ejecución de
arrayElementenArray(LowCardinality(String))y de las funciones LIKE para mapas con claves o valoresLowCardinality(String)al evitar la materialización innecesaria de cadenas. #107450 (EmeraldShift). - Se redujo el uso de CPU y se mejoró el rendimiento de evaluación de índices de omisión en consultas que filtran columnas
DateTime64. #107707 (shankar-iyer). - Se mejoró el rendimiento de las búsquedas de subcadenas que no distinguen entre mayúsculas y minúsculas, incluidas
positionCaseInsensitiveUTF8,ILIKEymultiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano). - Se corrigió una regresión de rendimiento de aproximadamente un 16 % en el rendimiento del códec de coma flotante
FPCen ARM, introducida cuando sus tablas de predictores empezaron a usarVectorWithMemoryTracking. #108182 (groeneai). - Se corrigió una regresión de rendimiento por la que una sola eliminación ligera
DELETEdeshabilitaba la caché de condiciones de consulta de toda la tabla. Las consultas selectivas repetidas sobre una tabla que hubiera sido modificada mediante una eliminación ligera dejaban de descartar gránulos y pasaban a leer todas las marcas. #112947 (fm4v). - Se limitó el coste de estimar la selectividad de
col IN (...)a partir de las estadísticas de columnas, que podía añadir cientos de milisegundos a la planificación de una sola consulta. El estimador ya no ejecuta la subconsulta decol IN (subquery)para rellenar un conjunto del que solo necesita un valor de selectividad; en su lugar, omite los conjuntos no construidos. Para conjuntos con un tamaño superior al del nuevo ajustestatistics_max_set_size_for_exact_selectivity_estimation(10000 de forma predeterminada), la selectividad se deriva ahora del tamaño del conjunto y de los límites de su rango. #114389 (nickitat).
Rendimiento de funciones y agregaciones
- Optimiza el análisis del índice de clave primaria para claves primarias largas y de alta cardinalidad. En el caso de una clave primaria larga, el tiempo de ejecución del análisis de índices depende ahora principalmente de la complejidad del filtro de la consulta —las columnas de clave que utiliza realmente—, y no de la longitud de la clave primaria. Por tanto, ampliar la clave de ordenación supone una sobrecarga adicional insignificante para el análisis de índices de consultas que filtran solo unas pocas de sus columnas. Para una clave primaria de alta cardinalidad, en la que ClickHouse conserva en memoria únicamente un prefijo selectivo de las columnas de clave y no carga las columnas finales, el análisis de índices ahora trabaja solo con ese prefijo en memoria en lugar de con toda la clave. La optimización está habilitada de forma predeterminada y se puede desactivar con el nuevo SETTING
use_lightweight_primary_key_index_analysis. #91836 (nihalzp). - Reduce el uso máximo de memoria al fusionar resultados parciales de agregación de dos niveles con estados de agregación grandes (p. ej.,
groupArray), liberando de forma incremental los estados de origen de cada bucket durante la fusión, en lugar de mantenerlos todos activos hasta que finalice. #102330 (yurifedoseev). - Nueva optimización de
GROUP BYpara claves de alta cardinalidad distribuidas uniformemente, que distribuye las filas entre los hilos mediante el hash de la clave de agrupación, de modo que cada hilo agrega un subconjunto disjunto de claves sin necesidad de una fase de fusión. Establezcaenable_sharding_aggregator = 1para habilitarla. #104233 (nihalzp). - Acelera las consultas
LIMIT BYen tablasMergeTreeparticionadas ejecutandoLIMIT BYen paralelo dentro del flujo de cada partición, en lugar de fusionar todos los flujos en uno antes de aplicar el límite. Esto se aplica cuando la expresión de partición es una función determinista de las columnas deLIMIT BY, de modo que ningún grupo deLIMIT BYpuede abarcar dos particiones. Se controla mediante el nuevo SETTINGallow_limit_by_partitions_independently(habilitado de forma predeterminada). #105126 (nihalzp). - Acelera las consultas
SELECT ... LIMIT N BY <cols>cuando<cols>son un prefijo de la clave de ordenación de la tabla, o pasan a serlo después de queWHERE col = constfije las columnas iniciales. Con esta opción habilitada,MergeTreelee los datos en orden de clave primaria yLIMIT BYprimero filtra en modo de flujo, con memoria O(1) por flujo ordenado, descartando la mayor parte de los datos; a continuación, ejecuta elLIMIT BYnormal sobre los datos reducidos para obtener el resultado final. Se controla mediante el nuevo SETTINGoptimize_limit_by_in_order(habilitado de forma predeterminada). #105135 (nihalzp). - Acelera las consultas
LIMIT BYeliminando expresiones de clave redundantes: se descarta una clave que es una función determinista de las demás claves (p. ej.,LIMIT 5 BY x, f(x)pasa a serLIMIT 5 BY x) y una función inyectiva de una clave se sustituye por su argumento (p. ej.,LIMIT 5 BY toString(x)pasa a serLIMIT 5 BY x). Esto permite evaluar menos expresiones y de menor coste por fila. Se controla mediante los nuevos SETTINGsoptimize_limit_by_function_keysyoptimize_injective_functions_in_limit_by, ambas habilitadas de forma predeterminada. #106818 (nihalzp). - Acelera el análisis de consultas con muchas llamadas a funciones o llamadas profundamente anidadas eliminando un hash redundante del árbol de consultas de la caché de resolución de funciones. #107516 (novikd).
- Paraleliza el procesamiento del resultado de una CTE recursiva: una operación
GROUP BYu otra operación sobre un resultado grande deWITH RECURSIVEya no está limitada a un único hilo. #107694 (alexey-milovidov).
Rendimiento de almacenamiento y E/S
- Los clientes de S3 con el mismo endpoint y bucket comparten una caché, lo que evita detectar regiones duplicadamente. #96802 (zvonand).
- Se mejoró el rendimiento de copia en el almacenamiento de objetos al copiar blobs en paralelo. #105089 (asya-ch).
- Se evita leer el contenido de los archivos al usar el formato de entrada One con funciones de tabla de tipo archivo, como file y s3. #105157 (niyue).
- La clave primaria de
MergeTreey los índices de omisión ahora pueden descartar gránulos en filtros dondeifNullocoalesceenvuelven una condición, comoifNull(key = 0, 0)ocoalesce(key = 0, 0). Estos predicados —que los generadores de consultas suelen emitir para convertir una comparación que podría devolverNULLen un valor booleano definido— antes eran opacos para el análisis de índices y no permitían omitir gránulos. Esto amplía el SETTING existenteallow_key_condition_coalesce_rewrite(habilitado de forma predeterminada). #106272 (andyzzhao). - Se mejoró el rendimiento de decodificación de las columnas Parquet
FLOATyDOUBLEcodificadas conBYTE_STREAM_SPLIT. #106376 (Algunenano). - Se corrigieron bloqueos prolongados al iniciar sesión y al iniciar consultas con el almacenamiento de acceso replicado cuando se modifican a la vez muchas entidades de acceso (políticas de fila, roles, cuotas y perfiles de configuración). Cada caché por entidad ahora se recalcula una vez por lote de notificaciones, en lugar de una vez por cada entidad modificada, lo que elimina trabajo cuadrático que podía mantener bloqueado el acceso durante minutos. #107672 (azat).
- Se corrigió una regresión de rendimiento por la que la lectura de muchos archivos pequeños desde el almacenamiento de objetos mediante
s3y otras funciones de tabla dejó de realizar prefetch y pasó a usar lecturas síncronas, ralentizando considerablemente las lecturas de muchos archivos pequeños en un solo hilo o con baja concurrencia. #108872 (fm4v). - Se habilitó el prefetch inicial de objetos pequeños cuando las lecturas del almacenamiento de objetos pasan por la caché del sistema de archivos (
filesystem_cache_name). Antes, las lecturas de muchos archivos pequeños, como la ingesta conS3Queue, seguían siendo síncronas y estaban limitadas por la latencia cuando la caché del sistema de archivos estaba habilitada. #109478 (fm4v). - Se mejoró la optimización de
PREWHEREpara subcolumnasMapal tener en cuenta su tamaño en disco. #110623 (Avogar). - La materialización diferida ahora se aplica a consultas con
FINAL, un filtro y unLIMITpequeño, incluso sinORDER BY(paraReplacingMergeTree). #110722 (KochetovNicolai). - Se redujo el tiempo de CPU dedicado a la deduplicación durante los vaciados de inserciones asíncronas que abarcan muchas particiones. #111150 (valerypetrov).
- Se corrigió una regresión de CPU en consultas que realizan muchas lecturas pequeñas e independientes de la misma parte de
MergeTreecuando la tabla tiene columnasLowCardinality. La comprobación que determina si una parte tiene un único diccionario compartido examinaba cada marca de toda la parte en cada tarea de lectura; ahora localiza mediante búsqueda binaria cada secuencia de marcas iguales. Las consultas de este tipo en tablas con unaindex_granularitypequeña eran hasta varias veces más lentas desde la versión 26.6. #116134 (groeneai).
Optimización de memoria
- Se redujo hasta diez veces la memoria utilizada por los metadatos del tipo
Enumen tablas con columnasEnum. Las búsquedas de valor a nombre se mantienen igual de rápidas o son más rápidas, mientras que las búsquedas de nombre a valor durante el análisis y la deserialización pueden ser más lentas. #95668 (qoega). - Se redujo el uso máximo de memoria de
BACKUPal dejar de copiar la lista interna de información de archivos al escribir entradas de copia de seguridad (algo significativo para copias de seguridad que contienen millones de archivos). #111162 (jkartseva).
Mejoras
Consultas y SQL
- Identifica las columnas por posición (en lugar de por nombre) al eliminar columnas no utilizadas del plan de consulta. Esto permite eliminar columnas no utilizadas cuando existen nombres de columna duplicados. #100586 (antaljanosbenjamin).
- Se añadió
SESSION_USERcomo alias decurrentUser()que no distingue entre mayúsculas y minúsculas, para lograr compatibilidad con PostgreSQL y el estándar SQL. #106081 (takumihara). - Se redujo la latencia de cancelación de las consultas ejecutadas mediante el protocolo de red de PostgreSQL: KILL QUERY ahora interrumpe la serialización de salida dentro de un único fragmento, en lugar de esperar a que se envíe el fragmento completo al cliente. #106535 (rvasin).
- Corrige un error
ILLEGAL_TYPE_OF_ARGUMENTen consultas distribuidas conserialize_query_plan = 1que contienen una lambda con un argumento constante (p. ej.,arrayMap(t -> t.2, ...)). Las columnas constantes de los nodosINPUTdeActionsDAGahora se conservan durante la serialización del plan de consulta. #107124 (alexey-milovidov). - Se redujo la latencia de cancelación de las consultas ejecutadas mediante el protocolo de red de MySQL: KILL QUERY ahora interrumpe la serialización de salida dentro de un único fragmento, en lugar de esperar a que se envíe el fragmento completo al cliente. #107228 (rvasin).
Funciones
EXPLAIN SYNTAXahora representa de forma coherente los operadores como llamadas a funciones en la salida de explicación (por ejemplo,plus(1, 2)en lugar de1 + 2). #94681 (1abdelhalim).- Ahora se admite la sintaxis de estilo PostgreSQL
expr OP SOME(array)/expr OP ALL(array)(con un lado derecho que no es una subconsulta) y se reescribe comohas/NOT haspara=/<>, o como lambdasarrayExists/arrayAllpara otros operadores de comparación. No se aceptaANYen la forma de array porqueanytambién es una función de agregación; useSOMEen su lugar. La forma de subconsulta deANY/SOME/ALLsigue convirtiéndose enIN/NOT IN. #105129 (alexey-milovidov). - Se añadió compatibilidad con las funciones
multiSearchAny,multiSearchAnyUTF8ymultiMatchAnyen los índices de texto. También se mejoró el análisis de índices de texto para la funciónmatch: ahora los patrones con grupos alternativos pueden omitir más gránulos. #106279 (CurtizJ). - La función
h3PolygonToCellsahora aplica el límite máximo de tamaño de array al conjunto de polígonos de unMultiPolygon, valida los códigos de retorno de la biblioteca H3 subyacente y rechaza argumentosMultiLineStringen lugar de devolver silenciosamente un resultado vacío. #106399 (Algunenano). - La deserialización de los estados de las funciones de agregación
contingency,cramersV,cramersVBiasCorrectedytheilsUahora valida que los recuentos almacenados formen una tabla de contingencia coherente y, de lo contrario, genera una excepciónCORRUPTED_DATA. #107185 (nihalzp). - Se mejora la estimación de cardinalidad en el optimizador del plan de consulta: una columna generada por una función determinista de un único argumento (por ejemplo,
toYear(date)) ahora hereda como límite superior el número de valores distintos de su argumento, en lugar de quedar sin estadísticas, lo que permite una reordenación de joins más precisa. #107757 (davenger).
Motores de tabla y almacenamiento
- Corrige los consumidores del motor de tabla Kafka que seguían usando un intervalo de sondeo corto tras la asignación de particiones, para que vuelvan a usar el valor configurado de
kafka_poll_timeout_msy eviten sondeos vacíos excesivos, partes insertadas más pequeñas y sobrecarga adicional de fusión tras los reequilibrios. #100431 (sugaf1204). - Los motores de tabla para lagos de datos, incluidos
IcebergyDeltaLake, ahora pueden usar discos S3 y Azure con caché, lo que permite que las lecturas repetidas utilicen la caché del sistema de archivos. #102017 (RinChanNOWWW). - Permite fusionar con el PREWHERE existente, en una segunda pasada del optimizador, los filtros introducidos después de la selección PREWHERE inicial (pushdown de predicados, filtros de tiempo de ejecución o un PREWHERE explícito junto con un WHERE establecido por el planificador), en lugar de mantenerlos como un paso Filter independiente sobre la lectura de MergeTree. #105445 (yariks5s).
- Se añadió el SETTING
wait_for_part_commit_in_dependent_materialized_views. Cuando está habilitada, una vista materializada en cascada que se vuelve a unir a su origen puede ver la fila que se está insertando. #105943 (ahmadov). - Compatibilidad con PostgreSQL para
EXTRACT(TIMEZONE_HOUR FROM dt)yEXTRACT(TIMEZONE_MINUTE FROM dt), que extraen las partes de hora y minuto de un desplazamiento de zona horaria, y paraEXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>), que extraen el valor de un intervalo. #106227 (vinayakj592). - Se implementó
SYSTEM RESTART DISK <name>: ahora recarga los metadatos de un disco en memoria y vuelve a examinar las partes de datos de las tablas de réplicas de solo lectura ubicadas en él. Esto permite que una réplica de solo lectura de una tabla en almacenamiento compartidoplain_rewritabledetecte, bajo demanda, los datos escritos por otro servidor, sin esperar arefresh_parts_intervalni reiniciar el servidor. #106645 (jrdi). - Omite cargas innecesarias de archivos de marcas para datos compartidos avanzados de JSON. #107051 (Avogar).
- Se añadió el SETTING, aplicable al momento de creación,
materialized_postgresql_use_extended_date_and_time_typespara el motor de base de datosMaterializedPostgreSQL. De forma predeterminada (habilitada), las columnasdate/timestampde PostgreSQL se infieren comoDate32/DateTime64; establecerla en0al ejecutarCREATE DATABASEinfiere los tipos más restringidosDate/DateTime. El SETTING no es aplicable al motor de tablaMaterializedPostgreSQL. #107428 (alexey-milovidov). - MergeTree ahora puede leer un flujo comprimido cuyos bloques usan códecs diferentes. Este es el requisito previo en el lado de lectura para la selección adaptativa de códecs. #108592 (rienath).
- Usa el índice de omisión
bloom_filterpara predicadosINen una columna indexada directamente cuandotransform_null_in = 1y el conjuntoINno contiene ningún valorNULL. Antes, el índice se omitía en estas consultas, lo que obligaba a realizar un escaneo completo. #111329 (groeneai).
S3 y almacenamiento de objetos
- Registra los privilegios en
system.query_log.used_privilegespara todas las comprobaciones de acceso concedidas, incluidas las que siguen la rutaisGrantedque no genera excepciones (checkAccessWithFilter). Anteriormente, solo se registraban los privilegios comprobados mediante puntos de entrada que generan excepciones (checkAccess/checkGrantOption), por lo queREAD ON FILE/READ ON S3/READ ON AZURE/READ ON URLno aparecían en el registro de auditoría de consultasDESCRIBE,CREATE TABLE ASy similares que usan las funciones de tablafile/s3/azure/url. La aplicación del control de acceso no cambia. #104693 (alexbakharew). - Completa de forma asíncrona la solicitud final de carga multiparte de S3 mediante el rastreador de tareas, de modo que pueda solaparse con la carga de la última parte en lugar de ejecutarse secuencialmente durante la finalización. #105487 (asya-ch).
- Se aumentó de una a seis horas la configuración predeterminada de
persistent_processing_node_ttl_secondsparaS3QueueyAzureQueue, lo que evita que los procesos de larga duración o reiniciados pierdan el bloqueo del bucket demasiado pronto. #106838 (kssenii). - Admite los valores
REDUCED_REDUNDANCY,STANDARD_IA,ONEZONE_IA,GLACIER_IRyEXPRESS_ONEZONE(además deSTANDARDeINTELLIGENT_TIERING) para la configuracións3_storage_class_name. #107251 (adityaksolves). - La ruta de ejemplo de particionamiento Hive para tablas de almacenamiento de objetos (p. ej.,
S3) se resuelve al usar la tabla por primera vez, en lugar de duranteCREATE/ATTACH, por lo que un endpoint inaccesible ya no bloquea la creación de tablas ni el inicio del servidor. #111842 (evillique).
Ajustes y configuración
- Hacer que la estrategia de partición Hive sea la predeterminada en la configuración de compatibilidad
file_like_engine_default_partition_strategy. #86746 (kssenii). - Se añadieron cuatro nuevas configuraciones de tabla MergeTree para controlar los parámetros predeterminados de los índices de texto:
text_index_dictionary_block_size,text_index_dictionary_block_frontcoding_compression,text_index_posting_list_block_sizeytext_index_posting_list_codec. Estas configuraciones permiten ajustar el comportamiento de los índices de texto a nivel de tabla sin especificar parámetros en cada definición de índice. Los argumentos explícitos de cada índice siguen teniendo prioridad. #100626 (CurtizJ). - Añadir la configuración
output_format_pretty_use_nbsp_for_paddingpara representar el relleno del diseño de tabla en los formatosPrettyde estilo tabular mediante el ESPACIO DE NO SEPARACIÓNU+00A0cuandooutput_format_pretty_grid_charsetseaUTF-8. Esto ayuda a que la salidaPrettycopiada conserve la alineación de las tablas en herramientas que contraen los espacios normales. La configuración está deshabilitada de forma predeterminada y la salida con el juego de caracteresASCIIconserva los espacios normales. #103559 (ashrithb). - Admitir la compatibilidad con el analizador anterior mediante la configuración
analyzer_compatibility_allow_non_aggregate_in_having. Si está habilitada, las condiciones sin agregación se moverán de HAVING a WHERE. #104232 (novikd). OPTIMIZE TABLE ... ON CLUSTERy otras instrucciones DDL ya no se bloquean cuando la tabla de destino tienetable_readonly = 1. La configuración ahora genera un nuevo código de error específico,TABLE_IS_PERMANENTLY_READ_ONLY, queDDLWorkertrata como no reintentable (a diferencia deTABLE_IS_READ_ONLY, un error transitorio que se produce durante desconexiones temporales de ZooKeeper enReplicatedMergeTree). La configuracióntable_readonlytambién se rechaza ahora explícitamente paraReplicatedMergeTree, tanto durante la creación como medianteALTER MODIFY SETTING. #105109 (alexey-milovidov).- El orden descendente en las claves de ordenación de
MergeTree(p. ej.,ORDER BY (time DESC, key)) ahora siempre es compatible y ya no requiere la configuración experimentalallow_experimental_reverse_key, que ha quedado obsoleta. #106440 (nikitamikhaylov). - Admitir
keyed_by_normalized_query_hashpara las cuotas definidas en la configuración estática del servidor (users.xml), en consonancia con la sintaxis DDL existenteCREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov). - La configuración de compatibilidad ya no aplica configuraciones obsoletas, por lo que no las marca como modificadas ni genera advertencias sobre ellas. #107737 (UberDever).
- Se añadió la configuración
analyzer_compatibility_multiple_joins_qualify_column_names(valor predeterminado:false). Cuando está habilitada y la cláusulaFROMde una consulta contiene dos o másJOIN, los nombres de las columnas de resultado generados por el analizador imitan la reescritura de múltiples JOIN del analizador anterior: las columnas expandidas desde*se denominan<alias-or-table>.<column>, y una referencia a una columna sin alias en la listaSELECTconserva el nombre exactamente como se escribió. Esto permite que las consultas externas que hacen referencia a esos nombres cualificados, comoSELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...), funcionen como lo hacían con el analizador anterior. También se corrigió un problema por el que el analizador perdía los nombres cualificados de las columnas de resultado expandidas desde*cuandogroup_by_use_nullsse combinaba conROLLUP,CUBEoGROUPING SETS, lo que producía nombres de columnas de resultado duplicados e impedía las referencias externas a esas columnas. #110746 (novikd). - Se añadió la configuración
analyzer_compatibility_apply_final_to_all_joined_tables, que restaura el comportamiento anterior: el modificadorFINALde la tabla situada más a la izquierda de un JOIN también se aplicaba a las demás tablas combinadas. La configuración se registra en el historial de cambios de configuración, por lo quecompatibilitycon versiones anteriores a la 26.6 restaura automáticamente la semántica anterior. #111589 (fm4v). - Se añadió una nueva configuración de MergeTree,
text_index_version, que controla la versión del formato en disco de los índices de texto:v0_initial,v1_with_codecov2_with_positions. Durante una actualización progresiva o antes de una reversión de versión, establézcala en una versión anterior para que los servidores más recientes sigan escribiendo partes de índices de texto en un formato que los servidores más antiguos aún puedan leer; la configuración de compatibilidad la ajusta automáticamente. #111803 (CurtizJ).
Tablas del sistema y monitorización
- Rellena
used_storagesensystem.query_logcon el nombre del motor de almacenamiento al consultar tablas a través de DataLakeCatalog. #100706 (melvynator). - Añade las columnas
current_projection,current_projection_progress,projections_completedyprojections_remainingasystem.mergespara mostrar el progreso de fusión de las proyecciones. #102611 (amosbird). - Los motores de tabla ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas
description,syntax,examples,introduced_inyrelatedde la tablasystem.table_engines. #106177 (alexey-milovidov). - Los motores de base de datos ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas
description,syntax,examples,introduced_inyrelatedde la tablasystem.database_engines. #106178 (alexey-milovidov). - Los tipos de datos ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas
description,syntax,examples,introduced_inyrelatedde la tablasystem.data_type_families. #106180 (alexey-milovidov). - Los formatos de entrada/salida ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas
description,examples,introduced_inyrelatedde la tablasystem.formats. #106181 (alexey-milovidov). - Los combinadores de funciones de agregación ahora incluyen documentación integrada, que puede consultarse mediante las nuevas columnas
description,syntax,examples,introduced_inyrelatedde la tablasystem.aggregate_function_combinators. #106185 (alexey-milovidov). - Se añadió una nueva tabla
system.data_skipping_index_typesque enumera los tipos de índices de omisión de datos disponibles, junto con su documentación integrada (description,syntax,examples,introduced_in,related). #106186 (alexey-milovidov). - Se añadió una nueva tabla
system.disk_typesque enumera los tipos de disco disponibles, junto con su documentación integrada (description,syntax,examples,introduced_in,related). #106187 (alexey-milovidov). - Se añadieron las métricas asíncronas
TotalUncompressedBytesOfMergeTreeTablesyTotalUncompressedBytesOfMergeTreeTablesSystem, que informan del tamaño total sin comprimir de los datos almacenados en tablas de la familia MergeTree. #106364 (alexey-milovidov). - Añade el evento de perfil
GlobalMemoryLimitExceededpara que los operadores puedan supervisar cuándo se alcanza el límite de memoria de todo el servidor. #106466 (sacheendra). - Se añadieron las métricas asíncronas
ExecutableUserDefinedFunctionMemoryResidentBytesyExecutableUserDefinedFunctionProcesses, que informan sobre la memoria residente (VmRSS) y el número de procesos en ejecución de las funciones definidas por el usuarioexecutableyexecutable_pool, incluidos los procesos descendientes y los trabajadores inactivos del grupo. #107300 (HanziJiang). - Se añadió
show_remote_databases_in_system_tables, habilitado de forma predeterminada, para que los usuarios puedan ocultar las bases de datosMySQLyPostgreSQLdesystem.tables,system.columnsysystem.completions.show_data_lake_catalogs_in_system_tablessigue controlando únicamente la visibilidad deDataLakeCatalog. #104416 (pamarcos). #109082 (pamarcos).
ClickHouse Keeper
- Diversos cambios en Keeper que lo hacen aproximadamente el doble de rápido en general (mejor procesamiento por lotes, canalización de mensajes al líder y de adiciones al log). #101757 (al13n321).
- Añade más eventos del perfil de Keeper, tanto del lado del servidor como del client, para watches. #105336 (scanhex12).
- Añade una nueva tabla
system.keeper_snapshots, exclusiva de Keeper, con información sobre snapshots locales de ClickHouse Keeper. #105571 (mstetsyuk). - Añade una nueva tabla
system.keeper_changelogs, exclusiva de Keeper, con información sobre archivos de changelog locales de ClickHouse Keeper (log de Raft). #105617 (mstetsyuk). - Añade una tabla
system.keeper_clusterexclusiva de Keeper. Contiene una fila por cada miembro del clúster de Raft según lo ve el Keeper actual. #105646 (mstetsyuk). - Reduce el uso máximo de memoria al aplicar snapshots recibidos en ClickHouse Keeper con
KeeperMemoryStorage. #105851 (antonio2368). - Añade
coordination_settingsde Keeper para limitar la admisión de entradas de log no confirmadas deNuRafty aplicar throttling a los sondeos inversos de append-entries. #106108 (antonio2368).
Gestión de memoria
- Se corrigieron mensajes de error de sintaxis que podían incluir bytes de memoria adyacente después de que el analizador retrocediera más allá del final de una instrucción. #105086 (groeneai).
- Se redujo el uso de memoria al abrir una copia de seguridad (para
RESTOREo como base de unBACKUPincremental). Los metadatos de.backupahora se analizan como un flujo en lugar de cargarse en un árbol de documentos XML en memoria, lo que evita asignar un árbol DOM de varios gigabytes en el caso de copias de seguridad grandes, especialmente incrementales. #109107 (jkartseva). - Se redujo el uso máximo de memoria al finalizar un
BACKUP. Al escribir los metadatos de la copia de seguridad, ya no se copia la información de todos los archivos a un vector temporal (lo que, en copias de seguridad con millones de archivos, consumía transitoriamente varios gigabytes); ahora se recorre directamente. #109861 (jkartseva).
Formatos de datos
- Ahora se pueden insertar campos Fixed de Avro para variantes de enteros de 8, 16, 32 y 64 bits. #98139 (patrickpichler).
- El formato
AvroConfluentahora reintenta el cliente HTTP de Confluent Schema Registry ante fallos transitorios (timeouts de transporte, conexión rechazada, errores de DNS y HTTP5xx/408/429) con backoff exponencial, en lugar de cancelar el INSERT ante el primer fallo de red. Los nuevos settingsformat_avro_schema_registry_max_retries(valor predeterminado:5) yformat_avro_schema_registry_retry_initial_backoff_ms(valor predeterminado:100) controlan la política. Los errores de validación del esquema (HTTP409y JSON de Avro malformado) siguen siendo irrecuperables. #106661 (groeneai). - Se conservaron los códigos de error originales de ClickHouse para los errores devueltos mediante Apache Arrow. #107267 (azat).
Colecciones con nombre y diccionarios
- Se añadió la configuración
enable_compressionpara la función de tablamysql, el motor de tablaMySQL, el motor de base de datosMySQL, el diccionarioSOURCE(MYSQL)y las colecciones con nombre. Al habilitarla, ClickHouse negocia la compresión a nivel de protocolo MySQL para todos los datos transferidos a través de la conexión. #103229 (bernardlim). - Se añadió una nueva tabla
system.dictionary_layoutsque enumera las estructuras de diccionario disponibles junto con documentación integrada (description,syntax,examples,introduced_in,related). #106182 (alexey-milovidov). - Se añadió una nueva tabla
system.dictionary_sourcesque enumera las fuentes de diccionario disponibles junto con documentación integrada (description,syntax,examples,introduced_in,related). #106184 (alexey-milovidov). - El tipo de almacenamiento efectivo de las colecciones con nombre ya está disponible como
named_collections_storage.typeensystem.server_settingsy mediantegetServerSetting('named_collections_storage_type'). #111806 (pamarcos).
Otras mejoras
- Se mejoraron las sugerencias de nombres de tablas en los mensajes de error: ya no sugieren exactamente el mismo nombre e incluyen el nombre de la base de datos (p. ej., “¿Quizás quiso decir other_db.my_table?”). #95116 (matt-metivier).
- Se mejoró el mensaje de error para identificadores no resueltos en consultas sin cláusula FROM, sugiriendo añadir una. #101769 (Onyx2406).
- Se corrigió un problema por el que
PREWHEREcon una subconsultaINen columnas de clave primaria no usaba el índice de clave primaria para la poda de gránulos, lo que provocaba escaneos completos de tabla en lugar de leer solo los gránulos relevantes. #102570 (nikitamikhaylov). - Las vistas materializadas actualizables ahora continúan actualizándose después de reemplazar su tabla de destino mediante
EXCHANGE TABLESy eliminar la tabla antigua. Anteriormente, las actualizaciones podían fallar con una excepciónUNKNOWN_TABLEporque conservaban el UUID de la tabla antigua. #102724 (seva-potapov). - Se activa
enable_join_transitive_predicatesde forma predeterminada. #103724 (davenger). - La vista materializada actualizable ahora admite
REFRESH DEPENDS ONpara desencadenar actualizaciones al actualizarse otra RMV, en lugar de según una programación basada en tiempo. (REFRESH EVERY ... DEPENDS ONya existía, pero no se podía usar de forma fiable para este caso de uso). Consulte la documentación de CREATE MATERIALIZED VIEW. #104440 (al13n321). - Se añade la opción
EXPLAIN PIPELINEpara compactar cadenas repetidas de procesadores. #104662 (niyue). - Se añadió
REGEXP_SUBSTRcomo alias deregexpExtractque no distingue entre mayúsculas y minúsculas, para compatibilidad con Oracle/MySQL/Snowflake. #105122 (alexey-milovidov). - Se añadió
date_part('unit', expr)como azúcar sintáctico paraEXTRACT(unit FROM expr). Se admiten todos los tipos de intervalos estándar y los adicionales de PostgreSQL (epoch,dow,doy,isodow,isoyear,century,decade,millennium). #105127 (alexey-milovidov). QueryConditionCacheahora registra individualmente los gránulos descartados por el filtro, incluso dentro de lotes de lectura que superan parcialmente PREWHERE, lo que reduce el número de marcas que las consultas posteriores con la misma condición deben volver a leer. #105335 (hanfei1991).- Se añade compatibilidad con BFloat16 para funciones de predicados numéricos. #105391 (mohhddhassan).
- Se admiten estadísticas básicas, una estadística compacta por columna que almacena mínimos y máximos numéricos, la longitud media de las cadenas y recuentos de NULL cuando corresponde. #106048 (hanfei1991).
- Se admite un modificador
NULL/NOT NULLal final deALTER TABLE ... ADD/MODIFY COLUMN, al igual que enCREATE TABLE. #106150 (takumihara). - El optimizador PREWHERE ahora agrupa los conjunciones que hacen referencia al mismo conjunto de columnas antes de estimar la selectividad, de modo que condiciones como
a > 2500 AND a < 2502se evalúan conjuntamente como un rango combinado (~0,02 % de selectividad), en lugar de como dos predicados independientes (~50 % cada uno). Esto permite ordenar con mayor precisión las condiciones PREWHERE cuando hay estadísticas de columnas disponibles. #106337 (hanfei1991). - No se muestra el preámbulo “Stack trace (when copying this message, always include the lines below):” en los mensajes de excepción cuando el stack trace está vacío. #106524 (alexey-milovidov).
- Corregido
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)en discos cifrados para que copie datos en lugar de crear enlaces físicos. #106731 (nikitamikhaylov). - Corregida la lectura de datos de tablas en bases de datos
DataLakeCatalogconcatalog_type = 'onelake'mediante el uso predeterminado del endpoint Blob de OneLake (.blob.fabric.microsoft.com). Establezcaonelake_use_blob_endpoint = falsepara conservar el comportamiento anterior del endpoint DFS (.dfs.fabric.microsoft.com). #106843 (scanhex12). - Reducida la sobrecarga de CPU del registro asíncrono con tasas elevadas de registros al notificar al consumidor de registros solo cuando la cola pasa de estar vacía a no estarlo, en lugar de hacerlo con cada mensaje. #107352 (nikitamikhaylov).
- Corregida la lectura de la longitud de
auth_responseen el handshake de MySQL, donde un byte de longitud>= 128se interpretaba como un valor de varios gigabytes porque se leía como uncharcon signo. #107384 (uwezkhan). MaterializedPostgreSQLahora asigna las columnas de PostgreSQLnumeric(p, 0)con una precisión superior a 76 (por ejemplo,numeric(78, 0), utilizado para enteros de 256 bits) aInt256de ClickHouse, en lugar de generar el error “Precision too big”. Los valores que no caben enInt256se rechazan con un error claro. #107431 (alexey-milovidov).Nullable(Tuple(...))ahora está en fase Beta. Está deshabilitado de forma predeterminada; establezcaenable_nullable_tuple_type = 1para usarlo. #107754 (nihalzp).- Las inserciones asíncronas ya no registran la lista completa de
query_iden el niveltrace/debug, lo que, desde la versión 26.2, podía saturartext_logen servicios con mucho tráfico de inserciones asíncronas. Las líneas detalladas ahora se registran en el niveltest. #107852 (CheSema). - Reducido el uso de metadatos de la caché del sistema de archivos mediante la liberación rápida de las entradas de prioridad invalidadas. #107903 (kssenii).
- Un índice de omisión
bloom_filteren una columnaArrayahora se utiliza paraarrayJoin(column) IN (set),arrayJoin(column) GLOBAL IN (set)yarrayJoin(column) = const, igual que ya se utilizaba parahasAny(column, set)yhas(column, const). Anteriormente, estas formas dearrayJoin ...recurrían a un análisis completo. #109536 (groeneai). IS NOT DISTINCT FROMeIS TRUEahora usan índices de clave primaria y minmax para descartar gránulos, igual que=. Anteriormente,k IS NOT DISTINCT FROM 42y(k = 42) IS TRUEescaneaban todos los gránulos. #110006 (groeneai).
Correcciones de errores
Correcciones de JOIN
- Se corrigió la función
nested(utilizada internamente porARRAY JOIN), que eliminabaLowCardinalityde los tipos de columna y provocaba queArray(LowCardinality(String))se convirtiera enArray(String)en la salida. #98974 (Onyx2406). - Se corrigió la reordenación de joins que descartaba silenciosamente las filas sin coincidencia de un
RIGHT/LEFT JOINcuando se combinaba mediante comas (cross join) con otra tabla; por ejemplo,t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. Anteriormente, la consulta devolvía el resultado de un inner join en lugar del de un outer join. #101684 (groeneai). - Se corrigió un
LOGICAL_ERROR(“Port is not connected”, código 49) que podía producirse al ejecutar consultas que incluían una VIEW con agregación dentro de un JOIN. #102574 (Ergus). - Se corrigió el problema por el que
max_rows_to_transferymax_bytes_to_transferse ignoraban silenciosamente en consultasGLOBAL INyGLOBAL JOINcon el nuevo analizador. Ahora, los ajustes generanSET_SIZE_LIMIT_EXCEEDED(o interrumpen la ejecución, segúntransfer_overflow_mode) cuando la tabla externa materializada supera el límite configurado, de acuerdo con el comportamiento del analizador antiguo. #104119 (groeneai). - Se corrigieron resultados incorrectos o fallos de consulta en consultas
JOINque usanjoin_algorithm = 'direct'con una tablaMergeTreeen el lado derecho cuando la optimización reordenaba las columnas de búsqueda. #104174 (groeneai). - Se corrigió un error por el que las consultas que combinaban
arrayJoinconORDER BY ... LIMITdespués de unJOINpodían devolver silenciosamente cero filas. La optimización del plan de consulta que eleva la evaluación de funciones por encima deSortingStepya no se aplica cuando la expresión elevada contienearrayJoin, ya quearrayJoinpuede cambiar el número de filas. #104558 (groeneai). - Se corrigió un error lógico en algunos casos de uso de
LIMIT BYnegativo conARRAY JOIN. #105403 (nihalzp). - Se añadió un nuevo ajuste de compatibilidad,
analyzer_compatibility_prefer_alias_over_subcolumn(deshabilitado de forma predeterminada). Cuando está habilitado, el nuevo analizador prefiere interpretar los identificadores de varias partes como prefijos de alias en lugar de como coincidencias con subcolumnas Tuple o columnas con puntos, restaurando el comportamiento del intérprete anterior. Esto evita erroresAMBIGUOUS_IDENTIFIER(y relacionados) cuando una consulta une una tabla cuyo nombre coincide con el de una tabla interna de una CTE/subconsulta que usaSELECT *sobre un join, caso en el que las columnas renombradas mediante asterisco (por ejemplo,b.id) podrían filtrar los identificadores de la tabla interna al ámbito externo. #105491 (vdimir). - Se corrigieron posibles resultados incorrectos en consultas que combinan un outer join con un inner join posterior que hace referencia al lado que aporta valores nulos del outer join. La reordenación de joins podía elegir un plan que incorporaba las condiciones del inner join en la cláusula ON del outer join. #105992 (vdimir).
- Se mejoró la compatibilidad con el analizador antiguo. Si la tabla tiene columnas como
x.a Array, x.b Array, x String, se prefieren los arrays paraARRAY JOIN x. #106069 (KochetovNicolai). - Se corrigió una excepción en consultas
INNER JOINcon una tablaMergeTreevacía en el lado izquierdo cuando están habilitadosenable_parallel_replicas,query_plan_use_new_logical_join_stepyquery_plan_optimize_join_order_algorithm = 'greedy'. #106338 (KochetovNicolai). - Corrige un error lógico (
Left and right columns have same names) en el optimizador del orden de JOIN que podía producirse en JOIN ejecutados con réplicas paralelas cuando dos relaciones del grafo de JOIN comparten nombres de columnas. #106418 (alexey-milovidov). - Corrige una excepción
LOGICAL_ERROR(Invalid number of rows in Chunk) enJoiningTransformpara unLEFT JOINcon claves únicas en el lado derecho, una condiciónONmixta y un valor pequeño demax_joined_block_size_rows. #106928 (groeneai). - Corrige una excepción (
LOGICAL_ERROR) en el filtro en tiempo de ejecución de JOIN cuando la clave de JOIN contiene un tipoVariantoDynamicanidado dentro de unaTuple,ArrayoMap, y el lado derecho del JOIN tiene un único valor distinto. #106931 (groeneai). - Corrige un
LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y) al ejecutar una función sobre una columnaDynamiccreada mediante un JOIN sobreDynamic(por ejemplo, las filas no unidas de unRIGHT/FULL JOINo una subconsultaEXISTScorrelacionada que se descorrelaciona en un JOIN). #107095 (groeneai). - Corrige una excepción de error lógico
Bad cast from type DB::IColumn const* to DB::ColumnNullable const*cuando se pasa un asterisco calificado (t.*) sobre una claveJOIN ... USINGa una función de agregación y el otro lado de un OUTER JOIN tiene una claveNullable(conjoin_use_nulls = 0). #107129 (groeneai). - Corrige un error lógico (
Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) cuando la optimización de inserción de disyunciones (predicados parciales) inserta una condición sobre una claveUSINGcuyo tipo se amplía mediante el JOIN. También corrige un bloqueo del servidor (fallo de segmentación) en el analizador al resolver identificadores en consultasJOIN ... USINGque contienen ramasif/multiIfevaluables como constantes que hacen referencia a identificadores desconocidos. #107407 (groeneai). - Corrige el filtro en tiempo de ejecución de JOIN que producía resultados incorrectos para columnas JSON. #107663 (Avogar).
- Corrige una excepción de error lógico
Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>cuando un asterisco calificado (t.*) selecciona una claveJOIN USINGy ese JOIN está anidado bajo un JOINPASTE/CROSS/por coma o un JOINONexterno, conjoin_use_nulls = 0. #108043 (groeneai). - Corrige un error en el nuevo analizador por el que FINAL en una tabla de un JOIN (por ejemplo,
FROM t1 FINAL JOIN t2) se aplicaba incorrectamente también a las demás tablas unidas, lo que podía ralentizar esas consultas. #108979 (vdimir). - Con
analyzer_compatibility_join_using_top_level_identifier = 1, ahora un identificador enJOIN ... USINGpuede resolverse a partir de un alias definido en una subexpresión dentro de la lista SELECT (por ejemplo,SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), igualando el comportamiento del analizador antiguo. Anteriormente, solo se consideraban los alias de proyección de nivel superior, y estas consultas fallaban con una excepciónUNKNOWN_IDENTIFIERincluso con la configuración habilitada. La sugerencia de error que recomienda habilitar esta configuración ahora también se genera cuando el alias coincidente está anidado. #110739 (novikd). - Se corrigió el error
INCOMPATIBLE_TYPE_OF_JOINen un joinANYsobre una tabla con engineJoincuando un filtroWHEREen una columna del lado derecho permitía al planificador de consultas reescribir el join comoSEMIoANTI. Las tablas con engineJointienen una strictness declarada fija que no se puede cambiar, por lo que ahora se rechaza la conversión para estas tablas. #111362 (groeneai). - Se corrigió
TYPE_MISMATCH(“Key type for complex key … does not match”) cuando unJOINcon un diccionario utiliza una clave de joinNullable,LowCardinalityoLowCardinality(Nullable)y la clave del diccionario no está envuelta. La búsqueda en diccionario de joins directos ahora normaliza la clave al tipo de clave declarado del diccionario (como ya hacendictGet/dictHas), y una claveNULLnunca coincide. #111857 (groeneai). - Se corrigió
AMBIGUOUS_COLUMN_NAME(Block structure mismatch in (columns with identical name must have identical structure)) en una consulta que repite una condiciónJOIN ONenWHEREconjoin_use_nulls = 1. Ahora esta consulta devuelve su resultado en lugar de fallar. #112007 (groeneai). - Se corrigieron resultados incorrectos o la finalización del servidor en
JOINdirectos con diccionarios cuya clave utiliza serialización dispersa. #112327 (groeneai). - Se corrigieron resultados incorrectos cuando un hash join tiene una única clave
LowCardinalityde un tipo de más de 8 bytes (UInt128,Int128,UInt256,Int256y sus variantesNullable). Este join devolvía silenciosamente filas cuyos valores de clave no eran iguales. #113230 (groeneai). - Se corrigió la poda de partes y gránulos para una condición
JOIN ONque implica columnas constantes del otro lado. #113484 (vdimir). - Se corrigió un valor incorrecto devuelto para una columna virtual como
_tableo_database, seleccionada del lado derecho de un JOIN gestionado porDirectKeyValueJoin(un almacenamiento key-value comoEmbeddedRocksDB,KeeperMap,Rediso un diccionario). En su lugar, la consulta devolvía el contenido de una columna de datos o fallaba conLOGICAL_ERROR. #113698 (groeneai).
Correcciones en consultas y en el analizador
- Corrige un error por el que splitMultipartQuery generaba el error “Consulta vacía” en consultas que terminaban con un comentario después de un punto y coma. #85491 (yariks5s).
- Corrige el caso en el que el analizador sintáctico no aceptaba un alias después de una subconsulta en DESCRIBE TABLE y generaba un error de sintaxis. #100205 (yariks5s).
- Corrige que la cláusula
FORMATfuera consumida porINSERTen lugar de aplicarse a la salida deEXPLAINenEXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406). - Corrige que las consultas SELECT fueran significativamente más lentas cuando se ejecutaban INSERT simultáneos. Anteriormente, una canalización INSERT reservaba slots de CPU hasta
max_threadsal inicio de la consulta, incluso cuando la mayoría nunca se utilizaba, lo que privaba de recursos a los SELECT simultáneos. La asignación de slots de CPU ahora se realiza según la demanda: la canalización solo solicita slots a medida que envía trabajo paralelizable. Se aplica tanto al control de concurrencia como al planificador de CPU preventivo para cargas de trabajo. La nueva configuración del servidorconcurrent_threads_lazy_allocation(valor predeterminado:true) sirve como mecanismo de reversión. #102928 (seva-potapov). - Corrige un error por el que
ALTER TABLE ... MODIFY SETTINGen una tablaEmbeddedRocksDBpodía persistir un valor de configuración no válido en el archivo de metadatos de la tabla, incluso cuando el servidor rechazaba la consulta. En el siguiente reinicio del servidor, la tabla no podía adjuntarse debido aCANNOT_PARSE_BOOL(o un error de análisis similar) y, en bases de datos donde los errores de carga son fatales, el servidor se negaba a iniciarse. Los valores de configuración no válidos ahora se rechazan antes de escribir metadatos. #103417 (groeneai). - Corrige
INSERTde streaming coninput_format_max_block_wait_mspara la interfazHTTPy paraINSERT SELECT FROM input, de modo que los bloques de entrada parciales se vacíen antes de que finalice la solicitud. #104534 (alexey-milovidov). - Corrige que la expresión
CASEdevolviera la ramaELSEen lugar de la ramaTHENcorrespondiente cuando tanto la expresión como un valorWHENeranNULL. #105556 (Algunenano). - Corrige la compatibilidad con el uso de UDF de SQL de
WASMen definiciones deMATERIALIZED VIEW. #106161 (niyue). - Corrige que
INTERPOLATE ()generaraINVALID_WITH_FILL_EXPRESSIONcuando las columnas de ORDER BY tenían alias en la lista SELECT con el analizador anterior. #106252 (yakov-olkhovskiy). - Las funciones
base58Encode,base58DecodeytryBase58Decodeahora respetanmax_execution_timey la cancelación de consultas con entradas grandes, y rechazan entradas de más de 10 KB en lugar de ejecutarse durante mucho tiempo. El límite se puede configurar mediante la nueva configuraciónfunction_base58_max_input_size(0lo desactiva). #106428 (alexey-milovidov). - Corrige un error que producía resultados incorrectos, por el que
WHERE c0 = constno devolvía filas en tablas conORDER BY f(c0)cuandof(const)se evalúa como NaN; por ejemplo,ORDER BY sqrt(c0)con una constante negativa. El análisis de la clave primaria descartaba incorrectamente todos los gránulos y contaminaba la caché de condiciones de consulta para consultas posteriores. #106507 (groeneai). - Se corrigieron resultados incorrectos para
SELECT c, count() FROM t WHERE c GROUP BY cen tablas con la_minmax_count_projectionimplícita, una proyección de agregación explícita o una proyección normal: todos los grupos se reducían a una sola fila con una clave constante y el número total de filas. #106590 (groeneai). - Se hizo que
FORMATtambién se aplique a la salida deEXPLAINdeEXPLAIN ... INSERT ... SELECT ... FORMAT ...cuandoSETTINGSprecede aFORMATo el formato de salida esValues. #106686 (alexey-milovidov). - Se corrigió un error espurio poco frecuente
RESOURCE_ACCESS_DENIED(“Scheduler queue with resource request is about to be destructed”) en una consulta a la que se había concedido acceso a un recurso de carga de trabajo, causado por la reutilización de un objeto de solicitud local al hilo que conservaba el fallo de una solicitud anterior. #106690 (alexey-milovidov). - Se corrigieron
match,extract,extractAllycountMatches, que devolvían resultados incorrectos para expresiones regulares con secuencias de escape hexadecimales u octales. #106709 (ofeliacode). - Se corrigió un desbordamiento por defecto de enteros en el analizador del protocolo de conexión PostgreSQL, donde un mensaje con un campo de longitud inferior a 4 provocaba que
size - 4se desbordara y unresize/ignorede tamaño excesivo. #107485 (uwezkhan). - Con
enable_analyzer = 1(el valor predeterminado), al consultar una tabla por su nombre sin calificar cuando solo existe en otra base de datos, ahora se sugiere la tabla correcta; por ejemplo,SELECT * FROM functionsmuestraMaybe you meant system.functions?. Anteriormente, el nuevo analizador mostraba un errorUnknown table expression identifiersin sugerencias, mientras que el analizador anterior ya ofrecía una sugerencia útil. #107550 (groeneai). - Se corrigió un aborto del servidor (
std::terminate, señal 6) durante el desmontaje de una consulta con plan distribuido (make_distributed_plan = 1) cuando una comprobación de estado de un trabajador no lograba reprogramar la siguiente comprobación (por ejemplo,CANNOT_SCHEDULE_TASKdurante el apagado oMEMORY_LIMIT_EXCEEDED). La consulta ahora falla correctamente y el servidor sigue en ejecución. #107575 (groeneai). - Se corrigieron resultados incorrectos en consultas distribuidas que seleccionaban columnas
ALIAScon una subexpresión común: las columnas podían desalinearse y los valores devolverse en la columna equivocada. #107675 (vdimir). - Se corrigió un error lógico
Inconsistent AST formattingpara una función de ventana sin argumentos dentro de una declaraciónCODECo de motor (p. ej.,CODEC(cume_dist() OVER (...))); dicha función ahora conserva sus paréntesis para que la consulta supere un ciclo de formato/análisis. #107806 (alexey-milovidov). getClientHTTPHeaderahora se trata correctamente como no determinista, por lo que su resultado ya no se reutiliza incorrectamente en la caché de resultados de consultas. #108029 (alexey-milovidov).- Se corrigieron resultados incorrectos al usar
SELECT [...] SAMPLE [...]junto con la caché de condiciones de consulta (la configuraciónuse_query_condition_cache = 1, que también es el valor predeterminado). #108488 (groeneai). - Corrige
NOT_FOUND_COLUMN_IN_BLOCKcuando se asigna un alias a un predicado compuesto enGROUP BYy se vuelve a hacer referencia a él, conenable_identifier_resolve_cachehabilitado (de forma predeterminada). La optimizaciónoptimize_and_compare_chainno era idempotente y un nodo resuelto compartido acumulaba un conjuncional transitivo duplicado. #108553 (groeneai). - Corrige el error
NUMBER_OF_COLUMNS_DOESNT_MATCHcuando una subconsulta sobre una tablaDistributedlee dos o más columnasALIASque se expanden a la misma expresión (por ejemplo,a1 String ALIAS toString(x), a2 String ALIAS toString(x)) y alimenta una consulta externa, p. ej.,SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai). - Corrige el error
UNKNOWN_IDENTIFIERenALTER TABLE ... DROP COLUMNcuando otra columna tiene una expresiónDEFAULToMATERIALIZEDque define y hace referencia a un alias insertado en línea. #109374 (alexey-milovidov). - Corrige que
system.tablesomitiera silenciosamente bases de datos para usuarios con permisos por base de datos cuando la consulta solo lee las columnasname/database. Introducido en 26.2. #109723 (samay-sharma). - Corrige el error
UNKNOWN_IDENTIFIERen columnas calificadas con el nombre de una CTE (cte_name.column) en consultas almacenadas en vistas cuando el analizador está habilitado. #111386 (novikd). - Corrige
NOT_FOUND_COLUMN_IN_BLOCKcuando una consultaFINALfiltra por una columna de la clave de ordenación que no figura en la listaSELECTy el filtro se mueve aPREWHERE(por ejemplo,SELECT s FROM t FINAL WHERE k GROUP BY sconoptimize_move_to_prewhere_if_final = 1). #111721 (groeneai). - Corrige el inicio del servidor y el fallo de
ATTACHconWITH RECURSIVE is not supported with the old analyzeren una vista con una CTE recursiva cuandoenable_analyzer = 0es el valor predeterminado del servidor. #112784 (evillique). - Corrige la propagación de los ajustes de consulta y el manejo de NULL en
accurateCastOrDefault. #114912 (alexey-milovidov). - Corrige que
read_rows,read_bytes,written_rowsywritten_bytesensystem.query_thread_loginformaran un total acumulado durante la vida útil del hilo en lugar de los valores de la consulta registrada. Se veían afectadas las filas de los hilos de larga duración agrupados, en particular el hiloHTTPHandlerque inicia la consulta. #115596 (groeneai).
Correcciones de MergeTree y de almacenamiento
- Ahora se pueden eliminar las partes separadas con el sufijo
tryN. #58957 (antaljanosbenjamin). - Se corrige una excepción
MULTIPLE_EXPRESSIONS_FOR_ALIASen consultas con alias de proyección duplicados (por ejemplo,SELECT *, day + 365 AS day) dentro de subconsultas anidadas al ejecutarse con réplicas paralelas. #80310 (alexey-milovidov). - Se corrigió la selección incorrecta del códec de compresión para partes de
MergeTreecuando se configuraba explícitamente el ajuste a nivel de tabladefault_compression_codec. Las partes escritas durante las inserciones, las fusiones y para las proyecciones usaban el códec predeterminado global del servidor en lugar del ajuste a nivel de tabla. Ahora también se cubre la parte vacía generada por una mutación que elimina todos los datos. #101784 (Onyx2406). - Se corrigen errores
MULTIPLE_EXPRESSIONS_FOR_ALIASgenerados por réplicas remotas al ejecutar consultas que hacen referencia a alias de proyección enPREWHERE/WHERE/HAVING/QUALIFY(p. ej.,SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) oSELECT *sobre autojoins con nombres de columna coincidentes, con réplicas paralelas yparallel_replicas_local_plan = 0. #103806 (groeneai). - Se corrige una parte de parche dañada tras ejecutar
ALTER TABLE ... DROP PARTITION ID 'patch-...'seguido deDETACH/ATTACH TABLE. Anteriormente, la parte de cobertura vacía se escribía sinpartition.datnisource_parts.dat, lo que provocaba una entradabroken-on-start_patch-...ensystem.detached_partsdespués del siguiente attach o reinicio del servidor. #104353 (groeneai). - Se corrigió el reemplazo silencioso de datos por valores predeterminados cuando
ALTER TABLE ... RENAME COLUMNse ejecutaba simultáneamente conOPTIMIZE TABLE ... FINALu otra fusión en segundo plano. #104822 (groeneai). - Se corrigieron dos casos de
LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materializedgenerados por consultas conenable_materialized_cte: (1) una CTE materializada reutilizada y filtrada medianteIN (subquery)sobre otra CTE materializada, y (2) una CTE materializada a la que se hace referencia tanto directamente como dentro de un filtroWHERE ... IN (...)que accede a una clave primaria de MergeTree mediante una subconsulta IN anidada.EXPLAINsobre las mismas consultas también se veía afectado, ya que los errores se producían durante la optimización del plan. #105041 (novikd). - Con
skip_cache_on_disk_failure = 1, las consultas ahora continúan cuandoFileCacheno puede crear un directorio de caché en disco. El fallo se registra en lugar de hacer que falle la consulta. #105250 (Diskein). - Se corrigió la excepción de error lógico
Mutation of Memory table produced incomplete outputgenerada porALTER TABLE <memory_table> APPLY PATCHESyALTER TABLE <memory_table> APPLY DELETED MASK. Las tablasMemoryno poseen partes de parche ni máscaras de eliminación, por lo que ambos comandos ahora se tratan correctamente como operaciones sin efecto. #105286 (groeneai). - Se corrige
CANNOT_CONVERT_TYPEparaMergesobreMergesobreDistributedcondistributed_group_by_no_merge=1. #105330 (azat). - Se corrigió que
singleValueOrNullMergedevolviera un valor concreto en lugar deNULLal fusionar un estado que ya había observado varios valores distintos. #105734 (fallintoplace). - Corrige un fallo en la función de tabla
mongodb, el almacenamiento MongoDB y la fuente de diccionarios MongoDB cuando el nombre de la colección está vacío o contiene bytes NUL. #105776 (Algunenano). - Corrige el rechazo de
ALTER TABLE ... CLEAR COLUMNpara las columnas explícitascolumns_to_sumdeSummingMergeTreeyCoalescingMergeTree. #105785 (antonio2368). - Corrige errores
UNKNOWN_DATABASEal crear una vista parametrizada cuyo nombre de base de datos se proporciona mediante un parámetro de consulta. #105799 (groeneai). - Restaura la optimización de lectura en orden para las tablas
Mergeal usar el analizador. #105867 (KochetovNicolai). - Corrige las mutaciones
UPDATEyDELETEen tablas Iceberg a las que se accede mediante un catálogo, incluidas las actualizaciones y eliminaciones repetidas que no afectan a ninguna fila. #106111 (scanhex12). - Corrige que
optimize_skip_unused_shardsno se aplicara (y que force_optimize_skip_unused_shards fallara erróneamente) al consultar una tablaDistributeda través de una tablaMergeo de la función de tablamerge, con el predicado aplicado sobre ellas. #106250 (KochetovNicolai). - Corrige un error lógico
Column identifier ... is already registeredcuando un predicado de mutación (DELETE/UPDATE) contiene una subconsultaIN/EXISTSque lee de una expresión de tabla predeterminada anidada en otra subconsulta. #106414 (alexey-milovidov). - Corrige resultados incorrectos esporádicos en consultas
ORDER BY ... DESCal leer partes anchas en orden inverso conread_in_order_use_virtual_row_per_block = 1y un valor pequeño demax_block_size. #106429 (vdimir). - Corrige una excepción
Bad cast exceptionen diccionarios Redis que usanSTORAGE_TYPE 'simple'con una disposicióncache/directy una única clave de cadena (compleja); estos diccionarios ahora funcionan y las claves compuestas con almacenamientosimpleinforman de un error claro. #106501 (vdimir). - Corrige la excepción
Mutation of Memory table produced incomplete outputgenerada por comandosALTER TABLE <memory_table>que no tienen efectos sobre los datos por fila en un motorMemory, incluidosAPPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTIONyREWRITE PARTS. Las tablasMemoryno poseen estas estructuras, por lo que estos comandos ahora se tratan como operaciones sin efecto. #106621 (groeneai). - Corrige el fallo que impedía iniciar el servidor con
Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)cuando una tablaMergeTreetiene una parte de índice de omisión con cero gránulos y un archivo de marcas no vacío en disco. #106675 (groeneai). - Corrige el caso en el que las réplicas paralelas no se aplicaban a una vista con UNION debido a una tabla vacía en la UNION. #106900 (devcrafter).
- Corrige una excepción de error lógico
conflicted_part_name.has_value()que podía producirse durante una inserción síncrona en una tablaReplicatedMergeTreecuando el bloque insertado se había deduplicado por completo y ya se había eliminado el nodo de deduplicación de la parte en conflicto (por ejemplo, mediante unDROP PARTITIONsimultáneo). #107026 (groeneai). - Corrige el poco frecuente
LOGICAL_ERROR“Attempt to release query context that does not exist” y el fallo del servidor asociado al leer tablasMergeTreemediante un disco de caché del sistema de archivos creado conenable_filesystem_query_cache_limit = 1. #107028 (groeneai). - Corrige un fallo del servidor al mover una parte vacía a un disco
plain_rewritable(por ejemplo, conALTER TABLE ... MOVE PARTITION ... TO DISKpara una parte vacía conservada debido aremove_empty_parts = 0). #107040 (groeneai). - Corrige una excepción
Logical error: Too large size passed to allocatoral ejecutarINSERTen una tablaMergeTreecuandoadaptive_write_buffer_initial_sizese establece en un valor extremadamente grande. El tamaño inicial del búfer de escritura adaptativo ahora se limita al tamaño máximo del búfer. #107104 (groeneai). - Corrige lotes de
ALTER TABLE ... ON CLUSTERque combinanMODIFY SETTING/RESET SETTINGcon un cambio de comentario (por ejemplo,MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) y que se aplicaban solo en la réplica líder, dejando las demás réplicas desincronizadas. También corrige que unMODIFY COLUMN ... COMMENTposicional oSETTINGSpor columna se clasificara erróneamente como un cambio local de metadatos que solo afecta a comentarios, lo que omitía la reordenación de columnas de los metadatos replicados y podía provocarINCOMPATIBLE_COLUMNSal reiniciar la réplica. #107142 (groeneai). - Corrige el error
Argument ... of GROUPING function is not a part of GROUP BY clauseen consultas que usan la funcióngroupingcon la configuracióngroup_by_use_nullshabilitada. #107206 (KochetovNicolai). - Corrige consultas de actualización ligera
UPDATEcon réplicas paralelas heredadas habilitadas en tablasMergeTreeno replicadas. #107246 (groeneai). - Corrige una posible excepción de error lógico en SYSTEM SYNC DATABASE REPLICA … STRICT y hace que el modificador STRICT surta efecto para las réplicas de bases de datos. #107344 (PedroTadim).
- Corrige
Logical error: 'Duplicate announcement received for replica number N', que podía producirse con réplicas paralelas cuando una subconsulta escalar contenía subconsultas anidadas que leían la misma tabla. #107381 (groeneai). - Corrige la pérdida silenciosa de datos en
MergeTreesimple (no replicado) al ejecutarREPLACE PARTITION,MOVE PARTITION,DETACH PARTITIONoDETACH PARTen una partición que aún tiene parches de actualización ligeraUPDATEsin aplicar. Estas operaciones ahora rechazan el comando (como ya haceReplicatedMergeTree) e indican que se useALTER TABLE ... APPLY PATCHES, en lugar de revertir silenciosamente la actualización confirmada. #107386 (groeneai). - Corrige que
MaterializedPostgreSQLdejara de replicar silenciosamente los cambios cuando el nombre de la base de datos o de la tabla de PostgreSQL contiene letras mayúsculas (el consumidor depgoutputsolicitaba un nombre de publicación sin comillas y en minúsculas que no coincidía con la publicación que conservaba las mayúsculas). #107423 (alexey-milovidov). - Corrige el error
THERE_IS_NO_COLUMNcuandooptimize_if_transform_strings_to_enum = 1y la expresiónif/transformoptimizada sobre literales de cadena es una clave deGROUP BYuORDER BYen una tabla Distributed o con réplicas paralelas. #107455 (groeneai). - Se corrigió un problema por el que
SELECT ... FINALyOPTIMIZE TABLE ... FINALdevolvían filas duplicadas después de queCREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROMoMOVE PARTITION ... TO TABLEadoptaran partes de unMergeTreesimple en unReplacingMergeTree,SummingMergeTreeoAggregatingMergeTree. El nivel de fusión de la parte adoptada ahora se restablece a 0 cuando los motores de origen y destino son distintos, de modo que el destino la deduplica en la siguiente fusión. #107481 (groeneai). - Ahora se realiza un mejor seguimiento de la cancelación de consultas mientras se espera el cuórum en ReplicatedMergeTree. #107513 (nickitat).
- Contabiliza en el rastreador de memoria la memoria utilizada por la biblioteca rapidjson (en
prettyPrintJSON,JSONMergePatchy el analizador JSON de rapidjson), de modo que las entradas patológicas se rechacen conMEMORY_LIMIT_EXCEEDEDen lugar de asignar memoria sin límite. #107555 (Algunenano). - Corrige un
Logical error: Stream ... variant_discr ... is not foundque podía producirse al fusionar o leer una parte deMergeTreegenerada por una mutación de una tabla con una columnaDynamic. #107562 (alexey-milovidov). - Corrige un
LOGICAL_ERROR(updateFormatPrewhereInfo called more than once) generado al consultar una fuentefile(),url()o de almacenamiento de objetos con unPREWHEREy unWHEREexplícitos mientrasoptimize_prewhere_after_pushdownestaba habilitado. #107568 (groeneai). - Se corrigió una excepción del servidor (error lógico
Digest does not match) que podía producirse conRENAME TABLE,RENAME DATABASEoCREATE OR REPLACE TABLEque involucraran una tablaTimeSeriesdentro de una base de datosReplicated. Ahora se admite cambiar el nombre de una tablaTimeSeries. #107583 (groeneai). - Corrige
DROP TABLEde una tablaTimeSeriesen una base de datosReplicated, que anteriormente dejaba tablas internas sin eliminar y la tarea de eliminación en segundo plano se reintentaba indefinidamente (DROP TABLE ... SYNCse quedaba bloqueado). #107604 (groeneai). - Se corrigieron dos vulnerabilidades de recorrido de rutas en el protocolo de obtención de partes replicadas que podían permitir a una réplica maliciosa escribir archivos fuera del directorio de la parte. #107606 (antonio2368).
- Se corrigió un problema por el que
ALTER TABLE ... REPLACE PARTITIONen una tablaMergeTreesimple restauraba las partes reemplazadas tras reiniciar el servidor, lo que hacía que la tabla devolviera tanto las filas de reemplazo como las filas antiguas reemplazadas. #107623 (groeneai). - Se corrigió un
LOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) al insertar en una vista materializada cuya tabla de destinoTOdeclara una columna con unEnummás amplio que el producido por elSELECTde la vista. La ampliación válida deEnumahora se aplica en la ruta de inserción de la vista materializada, igual que en unINSERT ... SELECTdirecto. #107648 (groeneai). - Se corrige el error
NUMBER_OF_COLUMNS_DOESNT_MATCHal consultar una tablaDistributed(o usar réplicas paralelas) que tiene varias columnasALIASexpandidas a la misma expresión y se hace referencia a ellas junto conORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy). - Un error transitorio al actualizar las partes de datos de una tabla de solo lectura ya no detiene permanentemente la tarea de actualización en segundo plano. #108034 (alexey-milovidov).
- Ahora se respeta
index_granularity_bytespara las columnas de estado deAggregateFunction. Anteriormente, se ignoraba el límite de bytes por gránulo para estas columnas (por ejemplo, los estadosuniqExacten tablasAggregatingMergeTreey proyecciones de agregación), lo que generaba gránulos mucho mayores que el límite configurado y aumentaba la amplificación de lectura y el uso de memoria durante las consultas. #108297 (groeneai). - Se corrigió que
insert_quorum = 'auto'no rechazara las inserciones de inmediato cuando había menos de la mayoría de las réplicas activas. Estas inserciones ahora fallan inmediatamente conTOO_FEW_LIVE_REPLICAS, en lugar de escribir una parte local y agotar posteriormente el tiempo de espera conUNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey). - Se corrigió un bloqueo del servidor durante inserciones asíncronas con deduplicación cuando
optimize_on_insertdeja vacío el bloque insertado (por ejemplo, filas cuya suma es cero enSummingMergeTree). #109229 (Diskein). - Se corrige la pérdida de datos de una columna sin expresión predeterminada cuando una fusión se ejecuta simultáneamente con
ALTER TABLE ... RENAME COLUMN, o cuando los únicos valores de la columna provienen de una actualización ligeraUPDATE. La columna podía eliminarse de la parte fusionada, por lo que todos sus valores se leían como NULL. #109356 (groeneai). - Se corrigió una terminación poco frecuente del servidor al fusionar estados de agregación de
uniqExacten paralelo conGROUPING SETS,ROLLUPoCUBE. #109389 (groeneai). - Se corrigió que las fusiones de rollup se reprogramaran indefinidamente. #109410 (Michicosun).
- Se corrigieron las mutaciones
GROUP BYen tablas con columnas virtuales materializadas o persistentes. #109532 (Michicosun). - Se corrigió el error
UNKNOWN_IDENTIFIER: Missing columns: '_block_offset'al ejecutarALTER TABLE ... MATERIALIZE INDEXsobre el índice minmax implícito creado poradd_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_columnen una tabla con partes recién insertadas (de nivel 0). Ahora el índice se crea para esas partes en lugar de producir un error. #110236 (groeneai). - Se corrigió que una réplica de almacenamiento de objetos de solo lectura (un disco configurado con
read_only = true) no detectara partes nuevas medianterefresh_parts_interval, y quetable_disk = truefuera rechazado en dicho disco con “table_disk is not supported for non-ObjectStorage disks”. #110460 (jkartseva). - Se corrige un LOGICAL_ERROR (“No set is registered for key”) en
ALTER TABLE ... DROP COLUMN, mutacionesALTER TABLE ... DELETE/UPDATEy DELETE ligero, en tablas con una columna ALIAS cuya expresión usa un operador IN (incluso a través de otra columna ALIAS). #111039 (PedroTadim). - Corrige casos en los que no se aplicaba una política de filas a las proyecciones de MergeTree durante la ejecución de consultas. #112329 (yariks5s).
- Corrige el error lógico
ReadBufferFromEncryptedFile: Wrong file positional leer una parteCompactde un discoencryptedcon E/S directa, que hacía que las fusiones quedaran bloqueadas ensystem.replication_queue. #112943 (alexey-milovidov). - Corrige la lectura de la base de datos interna
_temporary_and_external_tablesmediante la función de tablamergey el motor de tablaMerge, que permitía que una sesión leyera las tablas temporales de otras sesiones y usuarios, y provocaba una excepción en la ruta del analizador antiguo. Ahora, una expresión regular de bases de datos omite esa base de datos y se prohíbe mencionarla explícitamente, al igual que acceder a ella directamente. #113224 (alexey-milovidov). - Corrige el problema por el que una política de filas que contenía una subconsulta escalar se evaluaba una sola vez y, tras leer la tabla mediante una tabla
Merge, se reutilizaba indefinidamente. La condición de la política analizada se almacena en caché y se comparte entre todas las consultas; leerla medianteMergereescribía la expresión almacenada en caché in situ, lo que también provocaba una carrera de datos entre consultas simultáneas que usaban la misma política. #113563 (alexey-milovidov). - Corrige errores
CANNOT_CONVERT_TYPEal leer una tablaMergeque contiene una tablaDistributedcon réplicas paralelas de clave personalizada. #113742 (alexey-milovidov). - Corrige
Logical error: No set is registered for key ...al leer mediante una tablaMergecuyo hijo declara una columnaALIASque contieneINy cuyos hijos difieren en el valor predeterminado de esa columna. #113757 (groeneai). - Corrige una omisión de política de filas por la que la función de tabla mergeTreeIndex exponía los valores de la clave primaria y del índice minmax de las filas ocultas por una política de filas SELECT en la tabla de origen; ahora se prohíbe leer mergeTreeIndex para una tabla con una política de filas. #115304 (yariks5s).
Correcciones de tipos de datos y de serialización
- Se corrigió una excepción en
ARRAY JOINal usar tipos numéricosLowCardinality. #91784 (Ergus). - Se corrigió la creación silenciosa de columnas
NOT NULLcomoNullablecuandodata_type_default_nullable = 1y la tabla se crea en una base de datosReplicatedo medianteON CLUSTER. #97572 (xiaohuanlin). - Se corrigió el número incorrecto de filas devuelto por una consulta a una
MaterializedViewconquery_plan_enable_optimizations = 0cuando la vista asigna una columnaintegera una columnaBool. #100692 (Maximus5). - Se corrigieron metadatos incoherentes de partes tras mutaciones de columnas con serializaciones no predeterminadas. #102817 (korowa).
- Se corrigió la propagación de
NULLal leer subcolumnas extraídas de columnasNullable(Tuple(...)). Por ejemplo, paratup Nullable(Tuple(s Nullable(String))),SELECT tup.sahora devuelve correctamenteNULLen las filas donde la tupla externa esNULL, en lugar de valores no válidos. Esto abarca todos los tipos de elementos que pueden representarNULL:Nullable,Dynamic,VariantyLowCardinality(Nullable(...)). #102942 (nihalzp). - Se corrigió que
recursiveRemoveLowCardinalityeliminara nombres personalizados de tipos geométricos (p. ej.,LineStringfrente aRing,MultiLineStringfrente aPolygon), lo que provocaba una interpretación incorrecta del tipo geométrico. #103041 (jh0x). - Se corrigió que
dictGetOrNullsobrescribiera silenciosamente otras columnas de la proyecciónSELECTconNULLal invocarse con una columna claveNullablecuyos valores no están presentes en el diccionario. La función modificaba in situ un mapa de valores nulos con alias de entrada; ahora realiza una copia profunda de la columna de resultados antes de modificarla. #104327 (groeneai). - Se corrigió una excepción en consultas distribuidas que contenían una tupla
INvacía en la clave de segmentación cuandooptimize_skip_unused_shards_rewrite_inestá habilitado. #104966 (alexey-milovidov). - Se corrigió la estimación de selectividad de
PREWHEREmediante estadísticas count-min para columnasFloat32, incluidas comparaciones con literalesFloat64. #105047 (hanfei1991). - Se corrigió
ILLEGAL_TYPE_OF_ARGUMENTal fusionar los estados de agregación dequantileExactWeightedInterpolated,quantileDDoquantilePrometheusHistogramcon sus equivalentes pluralesquantilesXxxMerge(y viceversa). Las variantes singular y plural de estas tres familias de cuantiles comparten el mismo estado de agregación interno, pero no figuraban en la tabla interna de asignación de nombres, por lo que se rechazaban tanto la fusión de estados entre funciones como la optimización de fusión de funciones para estas familias. #105189 (groeneai). - Corrige resultados incorrectos de
toStartOfWeek,toLastDayOfWeek,toMonday,toStartOfMonth,toLastDayOfMonth,toStartOfQuarterytoStartOfYearpara argumentosDate32yDateTime64cuyo resultado queda fuera del rango deDate: en lugar de desbordarse a fechas arbitrarias, los resultados anteriores a1970-01-01ahora se limitan a1970-01-01y los posteriores a2149-06-06se limitan a2149-06-06. Esto también corrige resultados de consulta incorrectos (partes y gránulos descartados incorrectamente) cuando estas funciones se usaban enWHEREsobre una claveDate32oDateTime64que contenía valores fuera de rango. #105244 (yariks5s). - Corrige un error lógico en
arrayRemovecuando el primer argumento es un array deVariantcuyas alternativas son incompatibles con el tipo del segundo argumento yvariant_throw_on_type_mismatchestá deshabilitado. La función ahora considera que la comparación “nunca es igual” y devuelve el array sin cambios, en lugar de provocar un fallo deassertTypeEqualityen el servidor. #105248 (groeneai). - Corrige que
toFloat64/toUInt32/toString/etc. en Dynamic ignorarancast_keep_nullable. #105467 (Avogar). - Corrige un segfault del servidor en
uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(y cadenas de combinadores similares sobreuniq) cuando se usan conGROUP BY ... WITH ROLLUP,WITH CUBEoWITH TOTALSy un argumento Nullable. #105470 (groeneai). - Corrige que
toStartOfMillisecondytoStartOfMicroseconddevolvieran un resultado desviado casi un segundo para valoresDateTime64negativos (anteriores a la época), y corrige el desbordamiento de enteros con signo detectado porUndefinedBehaviorSanitizerentoStartOfSecond,toStartOfMillisecondytoStartOfMicrosecondpara entradasDateTime64cercanas aINT64_MIN. #105482 (groeneai). - Corrige la finalización del servidor al deserializar estados
singleValueOrNullparaJSON. #105535 (Avogar). - Corrige que se ignorara
input_format_try_infer_datetimesdurante la inserción en datos compartidos en JSON. #105544 (Avogar). - Corrige el desbordamiento circular de
DateTimepara valores fuera de rango enJSONExtracty durante la deserialización de texto. #105551 (Avogar). - Corrige un fallo al insertar tuplas de distintos tamaños en la misma cláusula VALUES en una columna String. #105582 (Avogar).
- Corrige el error NOT_IMPLEMENTED en
toStringa partir de DateTime con Timezone que contiene un valor NULL. #105587 (yariks5s). - Añade validación para columnas Dynamic aplanadas malformadas en la entrada Native. #105666 (Avogar).
- Corrige un
LOGICAL_ERROR(Unexpected return type from if) generado durante la planificación de consultas para expresionesifcuyo tipo de resultado esVarianty cuya segunda o tercera rama es unifcon condición constante sobre un literalUInt64que cabe enInt64. #105680 (groeneai). - Corrige
Bad get: has Decimal32, requested Decimal128ensumMapysumMapWithOverflowsobre una columnaNested(... Nullable(Decimal(P, S)))cuando se serializa el estado de agregación (p. ej., réplicas paralelas,sumMapStatemediante un formateador de estado binario o agregación externa). #105816 (groeneai). - Corrige los errores
Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinalityal usarapply_mutations_on_fly = 1en una tabla con mutacionesUPDATE/DELETEpendientes aplicadas sobre la marcha, encoladas antes de una mutaciónALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano). - Corrige el error
Cannot find columnen consultas distribuidas con un filtroIN Array(...)al usar el nuevo analizador. #105894 (KochetovNicolai). - Corrige una terminación del servidor cuando una columna con
STATISTICSse modificaba aNullablemientras otroALTERla eliminaba simultáneamente. #105917 (groeneai). - Rechaza bytes
IntervalKindfuera de rango durante la decodificación de tipos deRowBinaryWithNamesAndTypes(input_format_binary_decode_types_in_binary_format = 1) con un errorINCORRECT_DATAclaro, en lugar de construir unDataTypeIntervalcon un tipo no válido que posteriormente podría provocar comportamiento indefinido en rutas de hash. #106261 (groeneai). - Lee la subcolumna ‘null’ como una ruta JSON en Nullable(JSON), en lugar de como mapa de valores nulos. #106295 (Avogar).
- Corrige una lectura fuera de límites en
sipHash64Keyed,sipHash128KeyedysipHash128ReferenceKeyedal calcular el hash de una columna cuyos arrays están todos vacíos y cuya clave no es constante. #106355 (Algunenano). - Corrige un error que impedía a los usuarios utilizar subconsultas escalares en el primer argumento de
INcuando el segundo argumento es una tupla no constante. #106610 (yariks5s). - Corrige que se ignorara
session_timezoneal serializar columnasLowCardinality(DateTime)en formatos de texto (CSV, TSV, JSONEachRow, etc.). Anteriormente, tras la primera escritura de una columnaLowCardinality(DateTime)en un servidor, todas las consultas posteriores que escribían esa columna mostraban la cadena de hora local en la primera zona horaria detectada, independientemente desession_timezone. #106634 (groeneai). - Corrige una terminación del servidor en
ifymultiIfcuando la condición es un valor constanteNullable(Nothing). #106678 (groeneai). - Revierte un cambio que hacía que
sumMapy el combinador-Maprechazaran tipos de valores numéricos con nombres personalizados (comoSimpleAggregateFunction(sum, T)yBool) conILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed, lo que interrumpía agregaciones que funcionaban anteriormente. #106729 (fm4v). - Corrige una excepción
Bad castal descartar partes mediante estadísticasMinMaxcuando una columna clave esLowCardinalityy la constante del predicado esLowCardinality(Nullable(...)). #106793 (groeneai). - Corrige un error lógico en
parseDateTimecon bytes de entrada no ASCII. #106856 (Avogar). - Corrige la excepción
THERE_IS_NO_COLUMNen consultas distribuidas que usan la optimizaciónoptimize_rewrite_aggregate_function_with_ifcuando el argumento de la función de agregación requiere una conversión al tipo Nullable. #106908 (yakov-olkhovskiy). - Corrige un desbordamiento de enteros con signo (comportamiento indefinido) en
arrayLevenshteinDistanceWeightedyarraySimilaritycuando los arrays de pesos contienen valores enteros grandes. La distancia ponderada ahora se acumula en un entero de mayor tamaño para pesos enteros, por lo que los valores de peso grandes ya no se desbordan y conservan la precisión. #106934 (groeneai). - Corrige un fallo (
Source column is not Map/SIGSEGV) al fusionar bloques ordenados que contienen una columnaVariantcon una varianteMapcuyo orden de almacenamiento local difiere del orden global. #107011 (groeneai). - Corrige el error
TYPE_MISMATCH(“Cannot convert string … to type …”) en consultasORDER BY <numeric column> ... LIMIT ncuando la materialización diferida situaba otra columna antes de la columna de ordenación. El umbral top-K ahora se lee de la columna de ordenación correcta. #107060 (groeneai). - Corrige un
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO acompuesto que reutiliza un nombre de columna liberado (un “intercambio”) entre columnas de distintos tipos. La parte materializada registraba el tipo de columna incorrecto, por lo que unSELECTposterior fallaba conConversion between numeric types and IPv6 is not supported(o se interrumpía al cargar la parte en compilaciones de depuración). #107064 (groeneai). - Corrige resultados no deterministas de la función
roundDowncuando el array de límites contieneNaN. El mismo valor de entrada podía devolver un límite finito oNaNsegún las filas circundantes del lote. Los límitesNaNahora se ignoran, por lo que el resultado depende únicamente de los límites finitos. #107065 (groeneai). - Corrige que
quantileTDigestyquantileTDigestWeightedgeneraranDECIMAL_OVERFLOWpara argumentosDateyDateTimecuando el cuantil interpolado es fraccionario, pero está dentro del rango (por ejemplo,quantileTDigestWeighted(date, weight)con valores que caben todos en el tipo). El resultado fraccionario ahora se trunca al tipo de resultado, de forma coherente conquantilesTDigestWeighted; los valores realmente fuera de rango siguen generando un error. #107066 (groeneai). - Corrige el truncamiento silencioso de valores enteros fuera de rango en definiciones de tipo
Enum8/Enum16.Enum8('a' = 200)ahora generaARGUMENT_OUT_OF_BOUNDen lugar de crear silenciosamenteEnum8('a' = -56). #107081 (groeneai). - Corrige el orden incorrecto de las filas (y un
LOGICAL_ERROR“Rows are not sorted with permutation” en compilaciones de depuración) en consultasORDER BY ... LIMITcon varias columnas que ordenan por columnasNullablecuando varias filas empatan en las columnas iniciales. #107094 (groeneai). - Corrige
Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple'al leer una columnaArray(Tuple(...))cuyo valor se completa con valores predeterminados, por ejemplo, después deALTER TABLE ... ADD COLUMNo de aplicar sobre la marcha una mutaciónALTER TABLE ... CLEAR COLUMNsin finalizar. #107232 (groeneai). - Rechaza usos no compatibles de columnas
AggregateFunctionen expresiones TTL al ejecutarCREATE TABLE(por ejemplo,TTL toDateTime(state)) en lugar de fallar posteriormente durante la ejecución de TTL conILLEGAL_TYPE_OF_ARGUMENT. Esto también abarca estados incluidos en alternativas deVarianty valoresDynamic. Los consumidores válidos que admiten estados, comofinalizeAggregation, siguen aceptándose. #107366 (Ria-K912). - Corrige
arrayResizecon un argumento de tamañoDecimal: ahora el tamaño se interpreta según su valor real (por ejemplo,arrayResize([1, 2, 3], 1.5::Decimal(2, 1))devuelve un elemento) en lugar de según su representación interna sin escalar. #107389 (alexey-milovidov). - Corrige
LOGICAL_ERROR: Unexpected return type from materialize(y errores similares de incompatibilidad de tipos) al usarapply_mutations_on_fly = 1en una tabla con unUPDATEpendiente aplicado sobre la marcha cuya columna de destino también se lee como entrada de función en unUPDATEanterior aplicado sobre la marcha, antes de una mutaciónALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai). - Corrige la conversión silenciosa de valores NULL en cadenas vacías al insertar datos Arrow/ORC en una columna LowCardinality(Nullable(…)). Se trataba de una regresión introducida en la versión 26.5. #107532 (Ergus).
- Corrige un
LOGICAL_ERROR(“Input nodes size mismatch in dag”) cuando una consulta conmake_distributed_plan = 1realiza una unión mediante una clave envuelta en una función y ambos lados no tienen un tipo común (por ejemplo,ON intDiv(-1, t1.key) = t2.keycon una clave derechaUInt64). #107701 (groeneai). - Corrige el cálculo de hashes incorrectos en la deduplicación de inserciones para columnas
StringyArraycon la configuración de servidorinsert_deduplication_version = new_unified_hash: las inserciones idénticas podían no deduplicarse porque el hash de deduplicación dependía de la posición de la fila dentro del bloque insertado. #107915 (CheSema). - Corrige una terminación del servidor en
hasal buscar en unMapcon clavesDynamicusando un argumentoLowCardinality. #107956 (groeneai). - Corrige una regresión de rendimiento en subcolumnas
Mapusadas conPREWHERE. #107988 (Avogar). - Corrige un error lógico al convertir una columna
DynamicoVariantanidada en unaTuplea un tipo de elemento noNullableconaccurateCastOrNulloaccurateCastOrDefault. #108061 (alexey-milovidov). - Corrige una excepción de error lógico
Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>cuando una consultaLIKElee de un índicetextmediante la ruta alternativa de lectura directa en una columna almacenada de forma dispersa. #108068 (groeneai). - Corrige un
LOGICAL_ERROR(“Unexpected return type from if”) al leer una columna conapply_mutations_on_fly = 1después de ejecutarALTER UPDATE col = ... WHERE <cond>con una condición no constante o falsa, seguido deALTER MODIFY COLUMN col <new type>. #108128 (groeneai). - Corrige el
signed integer overflow(comportamiento indefinido) endateDiffcon las unidadeshouryminutepara valores extremos deDateTime64próximos a los límites del rango deInt64. #108229 (groeneai). - Corrige una excepción del servidor (
Logical errorenIColumn::insertFrom) al convertir unArray(Dynamic)oArray(Variant)aQBitconaccurateCastOrNull, por ejemplo,accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai). - Corrige que
parseDateTimeBestEffortcon zona horaria genereCANNOT_PARSE_DATETIMEen filasNULLdetoString(Nullable(DateTime64)). #108310 (yariks5s). - Corrige un bloqueo del servidor (desbordamiento de pila) provocado por expresiones muy anidadas como
[[[ ... ]]]oarray(array( ... ))cuandomax_parser_depthse establece en un valor elevado. #108493 (Algunenano). - Corrige una proyección
SELECT *que devolvía el valor predeterminado del tipo de una columna (por ejemplo,0) en lugar de su valorDEFAULT(por ejemplo,-1) al leer una columna añadida conALTER TABLE ... ADD COLUMN ... DEFAULTdespués de crear la proyección. Las lecturas de la tabla base ya eran correctas; solo se veían afectadas las lecturas atendidas por la proyección, hasta que se reconstruía. #108569 (tiandiwonder). - Corrige la desactivación silenciosa de la poda de particiones y de clave primaria cuando una columna de clave
LowCardinality(FixedString)(oLowCardinality(Nullable(FixedString))) estaba envuelta en una función de la clave, por ejemplo,PARTITION BY sipHash64(k) % NconWHERE k = 'literal'. Estas consultas examinaban todas las particiones en lugar de podarlas. #108777 (groeneai). - Conserva el orden original de las claves en la serialización de Map por buckets para corregir las operaciones de comparación que dependen de él. #109178 (Avogar).
- Corrige la inferencia de esquema de los formatos
Arrow,ArrowStream,Avroy de los lectores heredados deORCyParquet, que devolvíaNullable(Tuple)para columnasstructque admiten valores nulos, aunque el tipoNullable(Tuple)no está permitido (allow_experimental_nullable_tuple_typeestá desactivado).DESCRIBEdevolvía un tipo queCREATE TABLErechaza, por lo que la creación de una tabla o la inserción de datos con el esquema inferido fallaba con el errorNullable Tuple type is not allowed. #109185 (nihalzp). - Corrige un error por el que los valores
DEFAULTde las columnas no se aplicaban enINSERT INTO TABLE FUNCTION(por ejemplo,remote(...)ofile(...)) con datosVALUESen línea cuando el propio servidor analiza esos datos (send_table_structure_on_insert_with_inline_data = 0). UnNULLexplícito insertado en una columna noNullablecon unDEFAULTse convertía en0en lugar del valor predeterminado declarado. Ahora se comporta como unINSERTen una tabla normal y como el protocolo HTTP. #109258 (groeneai). - Se corrigió un segfault en
groupArrayLastMerge. Ahora se valida la deserialización del estado de la función de agregación, por lo que un estado dañado no provoca accesos fuera de límites. #109485 (mstetsyuk). - Se corrigió un segfault en la función de agregación
largestTriangleThreeBucketsal rechazar estados dañados de funciones de agregación durante la deserialización. #109492 (mstetsyuk). - Se corrigió la lectura de una columna Parquet con un
Tupleno anulable cuando el tipo de ClickHouse solicitado lo encapsula enNullable(p. ej.,Nullable(Tuple(...))), que anteriormente fallaba conTYPE_MISMATCH. #109615 (groeneai). - El lector nativo de Parquet v3 ahora puede leer una columna struct físicamente anulable (un grupo OPTIONAL de Parquet) como
Nullable(Tuple(...)). Anteriormente generabaTYPE_MISMATCH. #109898 (groeneai). - Se corrigió un bloqueo del servidor (desbordamiento de pila nativa) al copiar o destruir un literal
Array/Tuple/Map/Objectprofundamente anidado, por ejemplo, en una consulta con un literal muy anidado y un valor elevado demax_parser_depth. #110393 (Algunenano). - Se corrigieron resultados incorrectos de
IS NULL/IS NOT NULL/count()conoptimize_functions_to_subcolumnsen una columna convertida enNullablemediante unALTER MODIFY COLUMN Tde solo metadatos aNullable(T). En las partes escritas antes de la conversión, la subcolumna.nullse rellenaba con el valor predeterminado del tipo de almacenamiento (NULL), en lugar de derivarse de la columna principal físicamente presente, por lo que las filas existentes no nulas se notificaban incorrectamente como NULL. #110584 (groeneai). - Se corrigió un
LOGICAL_ERROR(“Bad cast from ColumnString to ColumnLowCardinality”) durante el análisis del índice de clave primaria cuando una columna claveLowCardinalityestá encapsulada en una cadena deCASTanidados que vuelve a introducirLowCardinality, p. ej.,WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. En builds de depuración y con sanitizadores, esto abortaba el servidor; en builds de lanzamiento, fallaba la consulta. #111050 (groeneai). - Se corrigió la lectura de datos
ArrowyArrowStreamcon columnasArrayoMapanidadas vacías generadas por Apache Arrow Java anterior a la versión 19.0.0 (incluida con Apache Spark), que anteriormente se rechazaban con un errorINCORRECT_DATAporque el búfer de desplazamientos era demasiado pequeño. #111101 (Algunenano). - Se corrigieron un error lógico
Block structure mismatch(en builds de depuración y con sanitizadores) y un errorIllegal types of argumentsen operaciones de conjuntos sobre columnas compatibles de estado de agregación (p. ej.,quantileStateyquantilesState(0.9)) anidadas dentro de columnas contenedoras comoTuple,Array,Map,NullableoVariant. #111191 (alexey-milovidov). - Se añadió validación para datos corruptos de índices replicados recibidos a través del protocolo nativo. #112331 (Avogar).
- Se corrigió una lectura fuera de límites durante la deduplicación de inserciones cuando un
INSERTpasa por una vista materializada que cambia el número de filas antes de escribir en una tabla de destino particionada. #112649 (CheSema). - Se corrigió una escritura fuera de los límites al leer una columna
DECIMALdeParquetcuyo tipo físico es más ancho que el tipo al que corresponde su precisión declarada; por ejemplo,DECIMAL(9, 2)almacenado físicamente comoINT64. Estos archivosParquetson válidos y otros escritores los generan, pero el lector dimensionaba la columna de destino según la precisión declarada, mientras que el decodificador escribía con el ancho físico, lo que corrompía la memoria. Ahora, al leer este tipo de archivo también se generaDECIMAL_OVERFLOWcuando un valor no cabe en la precisión declarada, en lugar de devolver datos corruptos, y se lee sin pérdida con una indicación de tipo de al menos el ancho del tipo físico. #113046 (groeneai). - Se corrigió un fallo por el que
ATTACH PARTITION FROM,REPLACE PARTITION,MOVE PARTITION TO TABLEy la adición de una réplicaReplicatedMergeTreefallaban conTables have different ...,METADATA_MISMATCHoINCOMPATIBLE_COLUMNSen tablas cuyas definiciones se habían escrito con paréntesis redundantes, comoPARTITION BY (a),ORDER BY (b),INDEX ix (b * c) TYPE minmax,PROJECTION p (SELECT (b) ...),CONSTRAINT c CHECK (a > 0),TTL (d + INTERVAL 10 YEAR)oDEFAULT (a + 1). #114188 (alexey-milovidov). - Se corrige un error por el que una entidad de acceso que contiene una configuración con valor
Map, como un perfil de configuración conhttp_response_headersoadditional_table_filters, se almacenaba en un formato que ClickHouse no podía volver a leer, lo que hacía que la entidad no pudiera cargarse nunca tras un reinicio. #114620 (groeneai). - Se corrige un error por el que
has,indexOf,countEqual,mapContainsKey,mapContainsValuey el acceso por subíndice deMapdevolvían “no encontrado” para una aguja constanteLowCardinalityigual al valor predeterminado del tipo de elemento, como unStringvacío o el número cero. #114624 (groeneai). - Se corrigieron resultados incorrectos de la optimización trivial de
GROUP BY ... LIMIT(configuraciónoptimize_trivial_group_by_limit_query) en consultas conDISTINCT,QUALIFY, funciones de ventana oarrayJoinen la proyección: estos consumen o filtran los grupos después de la agregación, por lo que limitar la agregación aLIMIT + OFFSETclaves podía devolver muy pocas filas o valores incorrectos. La optimización ya no se aplica a estas consultas. #114695 (alexey-milovidov). - Se corrigieron resultados incorrectos para
SELECT count(arrayJoin(arr))con el valor predeterminadooptimize_trivial_count_query = 1. Se devolvía el número de filas almacenadas en lugar del número de elementos del array y, enfile()yurl(), la consulta devolvía0. #115227 (groeneai). - Se corrigió un error por el que
uniq,uniqExact,uniqHLL12yuniqThetadevolvían un resultado incorrecto para un argumento envuelto en una función inyectiva que oculta la nulabilidad, comouniqExact(tuple(x))sobre una columnaNullable. La optimizaciónoptimize_injective_functions_inside_uniqeliminaba la función envolvente, tras lo cual las filas NULL se omitían en lugar de contarse. #115466 (vdimir). - Se permite que los lectores de KeeperMap acepten metadatos compartidos cuando claves primarias equivalentes solo difieren en paréntesis externos redundantes. #115642 (skuznetsov-clickhouse).
Correcciones en los índices de texto y de omisión
- Corrige un aborto del servidor cuando una consulta usa comparaciones
coalesce/ifNullanidadas (p. ej.,WHERE coalesce(a, b, coalesce(c, d), e) = const) en una tablaMergeTreecon varios índices de omisiónminmaxyuse_skip_indexes_for_disjunctions = 1. La reescritura del índice de omisión de<op>(coalesce(...), const)ahora se aplica recursivamente a los argumentos internos decoalesce, de modo que la RPN de cada índice coincide con la RPN de la plantilla, tal como presupone el código de seguimiento de disyunciones. #103929 (groeneai). - Corrige
NOT_FOUND_COLUMN_IN_BLOCK, lanzado porALTER TABLE ... MATERIALIZE INDEXen partes creadas en 25.8 que contienen un índice de omisión sobre una columna añadida mediante unALTER TABLE ... ADD COLUMNindependiente. Durante el recálculo forzado, la mutación ahora lee correctamente todas las columnas requeridas por cada índice de omisión y proyección preexistentes en la parte. #105039 (groeneai). - Corrige un subconteo silencioso en consultas
SELECTcuandouse_query_condition_cache = 1(valor predeterminado). Una consulta con la formaPREWHERE pk_prefix = X WHERE non_pk IN (...)sobre una columna con un índice de omisión de filtro Bloom contaminaba laQueryConditionCachepara el predicadopk_prefix = X, por lo que una posterior consulta inocuaSELECT count() ... WHERE pk_prefix = Xdevolvía un resultado incorrecto, con un conteo inferior al real. Afectaba a todas las versiones 26.x. #105686 (groeneai). - Corrige una excepción cuando una consulta de búsqueda vectorial usa un índice vectorial, otro índice de omisión como
minmaxyuse_skip_indexes_on_data_read = 1. #106473 (shankar-iyer). - Corrige “Too many marks” en un índice de texto de una parte combinada vacía. #106867 (azat).
- Corrige resultados incorrectos al consultar una tabla
ReplacingMergeTreeconFINALy un filtro en un índice de texto mientrasquery_plan_optimize_lazy_finalestaba habilitado. La optimización diferida deFINALgeneraba pasos de lectura que no reproducían la lectura directa desde el índice de texto, por lo que el filtro descartaba todas las filas coincidentes. #106894 (Ergus). - Corrige
LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) cuando una constanteVariantque contiene un miembroLowCardinalityse compara con una columna clave cuya expresión de clave es una función determinista no monótona (por ejemplo, un índice de omisiónminmaxsobresipHash64(col)). #107111 (groeneai). - Corrige resultados incorrectos (a menudo vacíos) de
ORDER BY <col> LIMIT ncuando la optimizaciónuse_skip_indexes_for_top_kestá activa y una parte con un índice de omisiónminmaxen la columna de ordenación tiene filas eliminadas mediante una eliminación ligera conDELETE. La optimización ya no clasifica el minmax obsoleto de las partes con eliminaciones ligeras por delante de las partes que contienen las filas superiores vigentes. #107320 (groeneai). - Corrige que el índice de omisión Set no descarte gránulos de columnas LowCardinality. #107868 (thevar1able).
- La configuración
use_skip_indexes_on_data_readahora puede revertirse a su valor predeterminado anterior a la versión 26.1 (false) mediante la configuracióncompatibility, lo que ofrece una alternativa ante una regresión de rendimiento en la que la ruta de lectura de datos impide la poda de rangos de marcas de los índices de omisiónminmax/set/bloom_filter. #108330 (egor-click). - Se corrigió la lectura directa desde varios índices de texto parcialmente materializados. #108607 (CurtizJ).
- Se corrigió el problema por el que un índice de texto definido en
mapValues(map)omapKeys(map)no se utilizaba silenciosamente al consultar una tabla a través de una tabla con motorDistributedusando el analyzer. El índice se utilizaba para la tabla local y mediantecluster()/remote(), pero una consulta a través de una tabla con motorDistributedlo omitía (y fallaba conINDEX_NOT_USEDal usarforce_data_skipping_indices). #109188 (groeneai). - Se corrigió un bloqueo del servidor en
CREATE HYPOTHETICAL INDEX ... TYPE set(yngrambf_v1/tokenbf_v1) cuando se omitía el argumento de índice obligatorio. Estas sentencias ahora se rechazan con un error claro. #109294 (groeneai). - Se corrigieron resultados incorrectos de las funciones
has,mapContainsKeyymapContainsValuecon una subcadena vacía cuando había un índice de texto. #110246 (rschu1ze). - Se corrigió el error
ATTEMPT_TO_READ_AFTER_EOFal fusionar partes con un índice de texto si una de las partes fusionadas estaba vacía, por ejemplo, tras una mutación que eliminaba todas las filas de la parte. #112490 (CurtizJ). - Se corrigió un bloqueo en la optimización del plan de consulta cuando una cláusula
WHEREcontiene una constante de cadena grande con muchos puntos y la tabla tiene un índice de omisiónbloom_filter,tokenbf_v1,ngrambf_v1otext. Al comparar el nombre de una columna de filtro con las columnas del índiceJSONAllPaths(...), se enumeraban todas las divisiones del nombre por cada punto, lo que hacía que la creación de condiciones de índices de omisión fuera cuadrática respecto de la longitud de la constante. #113289 (groeneai). - Se corrigió el problema por el que
ORDER BY ... LIMITdevolvía menos filas de las solicitadas, o incluso ninguna, cuando una política de filas era el único filtro de la consulta y la columna de ordenación tenía un índice de omisiónminmax. La optimización top-K restringía la lectura antes de aplicar la política de filas. #114073 (alexey-milovidov).
Correcciones del lago de datos
- Corrige una excepción de error lógico al leer tablas Iceberg cuya versión de formato se actualizó mediante una herramienta externa (p. ej., Spark). #100407 (alexey-milovidov).
- Corrige una excepción (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') al leer tablas Iceberg que contienen archivos de datos ORC con la optimización de PREWHERE habilitada. #101206 (groeneai). - Corrige excepciones
LOGICAL_ERRORal leer tablas de lago de datosIcebergoDeltaLakea través de rutas que pueden llegar a la canalización de lectura sin undatalake_table_statefijado, como actualizaciones simultáneas de metadatos deIcebergo lecturas demergeen tablasDeltaLake. #102033 (groeneai). - Corrige el error esporádico
Logical error: 'Database <name> not found'deDataLakeConfiguration::getCatalogal cargar una tabla con motorIcebergdentro de una base de datos normal durante la carga asíncrona de metadatos. #103775 (groeneai). - Corrige las lecturas excesivas de metadatos del catálogo y de S3 cuando una sentencia INSERT o DDL hace referencia a una tabla inexistente en una base de datos de catálogo DataLake con
show_data_lake_catalogs_in_system_tableshabilitado. La ruta de sugerencias para errores tipográficos cargaba los metadatos completos de Iceberg de cada tabla de todo el catálogo, lo que podía agotar la memoria en catálogos grandes. #104124 (il9ue). - Corrige el valor inflado de
read_bytes(y los bytes/s derivados que se muestran ensystem.query_log, la barra de progreso, etc.) al leer archivos Parquet. La implementación anterior informaba el tamaño comprimido total del grupo de filas en cada fragmento, por lo que al leer K de N columnas se contabilizaba en exceso porN / K. Ahora solo se suma el tamaño de las columnas seleccionadas. También corrige el seguimiento del progreso a nivel de archivo en las tablas Iceberg, que antes nunca informaba el tamaño del archivo de datos. #105413 (groeneai). - Corrige resultados incorrectos al leer una tabla Iceberg con
iceberg_use_version_hint = 1después de que otro escritor (como la función de tablaicebergLocal/icebergS3) avance la tabla sin esta configuración.version-hint.textahora se mantiene sincronizado con cada escritor una vez que existe el archivo, por lo que los lectores posteriores que usan la sugerencia ven la instantánea más reciente. #105682 (groeneai). - Las escrituras de Iceberg ahora preservan los valores NULL en columnas de partición
Nullable(T). Anteriormente, un NULL escrito por ClickHouse aparecía como el valor predeterminado del tipo interno (0paraint) al leerse de nuevo con Spark u otros lectores de Iceberg. #105862 (groeneai). - Corrige las eliminaciones por posición con merge-on-read de
Icebergv2 que devolvían filas incorrectas cuando un único archivo de borrado hace referencia a varios archivos de datos y varios archivos de borrado se aplican al mismo archivo de datos. Las entradas de eliminación ahora se filtran según la ruta del archivo al que hacen referencia. #105888 (groeneai). - Corrige que el motor de tabla
IcebergLocalpasara a ser de solo lectura después de un cicloDETACH+ATTACHo de reiniciar el servidor, lo que hacía que todos losINSERTposteriores fallaran conLocal object storage Local is readonly. (READONLY). #106016 (groeneai). - Corrige que la caché del sistema de archivos se deshabilitara silenciosamente para Azure Blob Storage (p. ej., tablas Delta Lake en Azure) porque los metadatos del objeto no incluían el ETag del blob. #106091 (thewisenerd).
- Se añadió validación de rutas para las tablas de Delta Lake a fin de impedir que los metadatos accedan a objetos fuera de la ubicación de almacenamiento configurada. #106115 (scanhex12).
- La poda de particiones de Iceberg ahora gestiona correctamente los filtros
WHERE partition_col = (SELECT ... FROM ...)en los que el analizador encapsula el resultado de la subconsulta escalar en un_CAST(Const, 'TargetType')interno con tipos de origen y destino coincidentes. Anteriormente, estos filtros deshabilitaban la poda de particiones y provocaban un análisis completo de la tabla. #106204 (groeneai). - Se corrigió un problema por el que los catálogos REST de
Icebergcon tablas se informaban incorrectamente como vacíos. #106301 (LefterisXefteris). - Se corrigió una excepción
NOT_FOUND_COLUMN_IN_BLOCKal consultar una tabla Iceberg o S3 con unWHEREcompuesto que contieneIS NOT NULLen una columna que no figura en la listaSELECT, al usar el lector nativo de Parquet V3. #106443 (tiandiwonder). - Se corrigió el informe de progreso inflado al leer tablas Iceberg con filtros
_fileo_path. Anteriormente, el progreso detotal_bytes_to_readincluía todos los archivos del manifiesto independientemente del filtrado. #106491 (PedroTadim). - Se corrigió una excepción del servidor (error lógico
std::out_of_range) al insertar en una tablaIcebergcuyos nombres de columna del bloque de escritura no coinciden con los ID de campo del esquema más reciente (por ejemplo, después de que un escritor concurrente cambie el nombre de una columna dentro de la ventana deiceberg_metadata_staleness_ms). La inserción ahora falla con un error de consulta claro en lugar de abortar el servidor. #107279 (groeneai). - Se corrigió un posible desbordamiento de pila del servidor (crash) al leer un esquema o valor profundamente anidado en los formatos MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg y Paimon. Estas entradas profundamente anidadas ahora se rechazan con una excepción. #107341 (Algunenano).
- Se corrigió un crash (
LOGICAL_ERRORen compilaciones de depuración) y un error silencioso que producía resultados incorrectos (en compilaciones de lanzamiento) al leer una tabla Iceberg cuyos metadatos vuelven a asociar unschema-idexistente con un esquema diferente entre versiones de metadatos. Estos metadatos ahora se rechazan conICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai). - Se corrigió la lectura de tablas Iceberg v3 cuyos archivos de datos Parquet contienen columnas reservadas de linaje de filas (como
_row_id); el lector nativo de Parquet ya no generaICEBERG_SPECIFICATION_VIOLATIONpara ID de campo reservados que no forman parte del esquema de la tabla. #107377 (gregakinman). - Se corrigió una excepción espuria
filesystem error: in last_write_time: No such file or directoryal enumerar un directorio de almacenamiento de objetos en un disco local (por ejemplo, una tabla Iceberg en un discolocal) mientras los archivos se reemplazan de forma concurrente. Las entradas eliminadas de forma concurrente ahora se omiten de la enumeración en lugar de abortarla. #107432 (groeneai). - Se corrigió el error ‘Account must be specified’ al leer una tabla de Delta Lake en Azure. #107620 (SmitaRKulkarni).
- Se corrigió un bloqueo al leer tablas Iceberg con archivos de borrado por igualdad. Si una columna admitía valores nulos en el archivo de borrado por igualdad, pero no en el esquema de la tabla (o viceversa), los valores leídos del archivo de borrado se insertaban mediante una conversión sin comprobar en una columna de distinto tipo (una confusión de tipos de columna), lo que corrompía la columna y provocaba el bloqueo del servidor. #109551 (mstetsyuk).
- Se corrigió un falso error
ICEBERG_SPECIFICATION_VIOLATIONal leer una tabla Iceberg cuyo tipo decimal (u otro tipo primitivo parametrizado) se serializaba con distintos espacios en blanco en los archivos de metadatos; por ejemplo,decimal(20,0)en los metadatos de la tabla ydecimal(20, 0)en el manifiesto. Estas cadenas de tipos equivalentes según la especificación ahora se comparan ignorando los espacios en blanco. #109676 (groeneai). - Se corrigió la lectura de tablas Iceberg cuyo orden de clasificación predeterminado hace referencia a una columna que requiere comillas (por ejemplo,
@timestamp). Estas tablas no se podían leer porque elORDER BYde almacenamiento sintetizado se construía a partir del nombre de columna sin procesar y no se podía analizar, lo que generabaSYNTAX_ERROR. #110233 (groeneai). - Se corrigió la lectura de tablas Paimon que contienen una columna
ARRAYoMAPque admite valores nulos. Estas tablas no se podían leer porque el mapeador de esquemas envolvía el tipo compuesto enNullable, algo que ClickHouse no permite; por ello, tantoDESCcomoSELECTfallaban conNested type Array(Nullable(Int32)) cannot be inside Nullable type. Ahora, una columna compuesta que admite valores nulos se asigna a un tipo compuesto sinNullable, y los valoresNULLse leen como valores vacíos. #113450 (groeneai). - Se registra el espacio de nombres de Iceberg en el catálogo antes de escribir archivos de tabla (necesario para SeaweedFS). #114285 (azat).
Correcciones de S3/Azure/almacenamiento de objetos
- Se corrigió la excepción “Distributed task iterator is not initialized” al usar
url,s3o funciones de tabla similares en consultas con réplicas paralelas habilitadas. #100146 (alexey-milovidov). - Se corrigió un posible segfault del servidor en funciones de tabla de clúster (
s3Cluster,urlCluster,fileCluster, …) cuando el planificador genera unSELECTcon la marcarecursive_withestablecida, pero sin expresiónWITH. #105433 (groeneai). - Se corrigió el pushdown de filtros de
ParquetyORCpara predicadosIN (subquery), lo que permite aplicar la poda de grupos de filas, páginas y filtros Bloom en lecturas defile,url,s3y almacenamiento de objetos. #105863 (arsenmuk). - Se corrigió la excepción
LOGICAL_ERRORdurante la predescarga de caché cuando un objeto remoto de S3 se sobrescribe con contenido más corto entre la enumeración y la lectura. #106375 (fm4v). - Se corrigió que la función de tabla
s3ignorara silenciosamente unapartition_strategyposicional en minúsculas (p. ej.,hive). #107297 (jkartseva). - Se corrigió una regresión por la que establecer
compatibility = '26.6'(lo que habilita implícitamente la estrategia de particiónhive) aceptaba silenciosamente{_partition_id}en rutas de tablas deS3y almacenamiento de objetos, en lugar de generarBAD_ARGUMENTS. #107437 (LefterisXefteris). - Se corrigió que
s3y otras funciones de tabla de almacenamiento de objetos generaranLOGICAL_ERRORen lugar deBAD_ARGUMENTScuando se duplica un argumento clave-valor, p. ej.,s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai). - Se corrigió una excepción del servidor (
Logical error: 'index >= result.start') al formatear una consulta malformada que mezcla las formas posicional y con nombre del argumento secreto de las funciones de tablas3/gcs, p. ej.,s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai). - Se corrigió la prioridad de la configuración de S3 para que un bloque de endpoint
<s3>específico de una URL tenga precedencia sobre los valores predeterminados de<s3>de nivel superior. #109251 (bharatnc). - Se corrigieron errores
411 Length Requiredde servicios de Azure: el transporte HTTP de Azure basado en Poco ahora estableceContent-Lengtha partir del cuerpo de la solicitud para clientes del SDK que no establecen el encabezado por sí mismos (p. ej., Azure Key Vault). #110299 (thevar1able).
Correcciones de S3Queue
- Corrige un bloqueo del servidor (acceso fuera de límites) en
S3Queue/AzureQueueconenable_hash_ring_filtering = 1cuando un lote contenía un archivo no procesable y, al mismo tiempo, fallaba la solicitud a Keeper para marcar el lote como en procesamiento. #108977 (groeneai). - Corrige filtraciones de credenciales en
SHOW CREATE,system.query_log, los registros del servidor y la salida deEXPLAIN. Ahora, todas las formas de localizador deS3ocultansession_tokeny los secretos de Google ADC, los valores deextra_credentials/headersen cualquier posición de argumento, las claves secretas duplicadas o generadas mediante expresiones, las formas posicionales no válidas (error seguro) y las credenciales integradas en URL de S3; esto abarca las funciones de tablas3/s3Clustercon URL explícita y colecciones con nombre, los motores de tabla basados en S3 (S3,GCS, los motores de lago de datos,S3Queue), el motor de base de datosS3,BACKUP ... TO S3y el motor de base de datosBackup. Además, los argumentos secretos deencrypt/decrypt/HMAC construidos mediante una expresión, incluidos los insertados desde una UDF de SQL, ahora se ocultan en los nombres de proyección,EXPLAIN QUERY TREEyEXPLAIN actions. #109768 (Algunenano). - Corrige el modo ordenado de
S3Queue/AzureQueuecon nodos de procesamiento persistentes: los bloqueos de bucket ahora se renuevan durante el streaming, de modo que la limpieza por TTL (persistent_processing_node_ttl_seconds) no elimine los bloqueos de un procesador activo. Si aun así se pierde la propiedad del bloqueo, se detecta y se informa (un error lógico y el evento de perfilObjectStorageQueueBucketLockLostOwnership), y el streaming se recupera con un nuevo iterador de archivos. #110292 (kssenii).
Correcciones de seguridad y de control de acceso
- Se corrigió un fallo del servidor (SIGSEGV) que podía provocar cualquier usuario con permisos de
CREATE TABLEal enviarCREATE TABLE ... TO INNER UUID '...'sin una cláusulaENGINEmediante HTTP o el protocolo nativo. El mismo error también bloqueaba el cliente. El analizador ahora informa correctamente del errorBAD_ARGUMENTSen lugar de desreferenciar un puntero nulo. #105579 (groeneai). - Se corrigió un fallo del servidor al consultar tablas DeltaLake con
allow_experimental_delta_kernel_rshabilitado y una credencial u opción que contenía bytes no válidos (la FFI de Rust generaba un pánico al cruzar el límiteextern "C"). #106109 (Algunenano). - Se corrigieron múltiples lecturas fuera de los límites del montón en el lector del formato Arrow IPC (
ArrowColumnToCHColumn). Un archivo Arrow malformado podía declarar más filas de las que contenían sus búferes, declarar longitudes de elementos secundarios list/struct/map incompatibles con su elemento principal, proporcionar desplazamientos de lista no monotónicos o truncar un bitmap de validez secundario, lo que provocaba lecturas más allá del final de las asignaciones del montón. Cualquier usuario con el privilegioSELECTpodía provocar este problema mediantefile(),format(), funciones de tabla o entradas de ArrowFlight. Ahora se validan todos los búferes de datos, desplazamientos, view-struct y bitmap de validez antes de cualquier acceso a punteros sin procesar, y se comprueba la coherencia de las formas y los desplazamientos de list/struct/map. #106395 (Algunenano). - Se corrigió un error por el que las columnas
used_privilegesymissing_privilegesdesystem.query_logpodían contener cadenas de privilegios filtradas de consultas anteriores no relacionadas de otro usuario, base de datos o sesión. #106425 (alexey-milovidov). - Se corrigió un desbordamiento de búfer del montón (fallo del servidor) en
decodeHTMLComponental decodificar cadenas que contenían las entidades HTML expansivas≫⃒o≪⃒, que podía provocar cualquier usuario con una única consultaSELECT. #106741 (Algunenano). - Se corrigieron resultados de consulta incorrectos causados por la caché de condiciones de consulta cuando las mutaciones sobre la marcha (
apply_mutations_on_fly) o las partes de parche filtraban filas antes dePREWHERE. Una consulta que leía conapply_mutations_on_fly = 1podía contaminar la caché, de modo que una consulta posterior conapply_mutations_on_fly = 0y el mismo predicado omitía marcas que debería haber leído y devolvía demasiadas pocas filas. La misma corrección también cubre las políticas de seguridad a nivel de fila, que se anteponen como filtro aPREWHERE: una consulta ejecutada bajo una política de fila restrictiva podía contaminar la caché para una consulta posterior que utilizara el mismo predicado sin esa política. #107145 (groeneai). - Se corrigió un desbordamiento de búfer del montón (fallo del servidor) en
windowFunnelal finalizar un estado manipulado de una función de agregación con un tipo de evento fuera de rango, que podía provocar cualquier usuario con una única consultaSELECT. #107412 (uwezkhan). - Se corrigió un problema por el que
currentUser(),user(),SESSION_USERyauthenticatedUser()se evaluaban como una cadena vacía durante el vaciado de inserciones asíncronas (conasync_insert = 1). Esto afectaba a las expresiones de columnaDEFAULT/MATERIALIZEDy a las vistas materializadas que hacían referencia a estas funciones, que almacenaban silenciosamente una cadena vacía en lugar del usuario que realizó la inserción. #107541 (groeneai). - Cuando se asignan varias cuotas al mismo usuario o rol, ahora todas se aplican conjuntamente (una consulta se rechaza si se supera cualquiera de ellas), en lugar de aplicar solo una cuota elegida de forma no determinista.
SHOW QUOTAysystem.quota_usageahora muestran todas las cuotas aplicadas al usuario actual. #107664 (alexey-milovidov). SYSTEM RESET DDL WORKERahora requiere el nuevo privilegioSYSTEM RESET DDL WORKER. Anteriormente, cualquier usuario autenticado (incluidos los usuariosreadonly) podía ejecutarlo y restablecer repetidamente el estado del worker de DDL, bloqueando las operaciones DDLON CLUSTER. #108460 (groeneai).- Se corrigió la identificación de usuarios mediante
ssl_certificatepara que un único comodín*coincida exactamente con un componente del nombre (RFC 6125 6.4.3). Anteriormente, un comodín en un sujetoCNo SANDNS:(por ejemplo,*.corp.example.com) también coincidía con nombres de varias etiquetas, comoevil.deep.corp.example.com, lo que permitía al titular de un certificado para un subdominio más profundo autenticarse como el usuario comodín. La coincidencia de SANURI:no ha cambiado. #108472 (groeneai). - Los comandos del protocolo MySQL wire
COM_FIELD_LIST(mysql_list_fields) yCOM_INIT_DB(USE database) ahora aplican el mismo control de acceso que sus equivalentes en SQL (SHOW COLUMNS/DESCRIBEyUSE). Anteriormente, podían revelar los nombres de columnas de tablas para las que el usuario solo tenía permisos parciales sobre las columnas y cambiar la base de datos actual sin el privilegioSHOW DATABASES. #108508 (groeneai). http_forbid_headersahora realiza las coincidencias sin distinguir entre mayúsculas y minúsculas. Los nombres de los encabezados HTTP no distinguen entre mayúsculas y minúsculas, por lo que prohibirAuthorizationahora también bloqueaauthorization,AUTHORIZATIONy otras variantes. Los patronesheader_regexpconfigurados ahora también se comparan sin distinguir entre mayúsculas y minúsculas, sin necesidad de la marca explícita(?i). #108509 (groeneai).- Se corrigió una vulnerabilidad de divulgación de metadatos por la que
DESCRIBE loop('db', 'table')yDESCRIBE loop(<inner table function>)omitían la comprobación de acceso aSHOW COLUMNS/ al origen, lo que permitía a usuarios sin privilegios leer el esquema de columnas de una tabla. #108624 (groeneai). - Se corrigió un error de inicio por el que una base de datos
DataLakeCatalogcreada con una versión anterior (25.12 o anterior) y unauth_headermalformado no podía adjuntarse tras actualizar a la versión 26.2 o posterior, lo que impedía iniciar el servidor. Ahora,auth_headerse valida solo enCREATEy, enATTACH, el catálogo se crea de forma diferida en el primer uso en lugar de durante el inicio. Por tanto, una única base de datos de catálogo mal configurada o inaccesible ya no bloquea el inicio del servidor. #108674 (groeneai). - Se reforzaron las conexiones de RabbitMQ frente a tramas AMQP maliciosamente grandes y se aplicaron sistemáticamente las comprobaciones de
remote_url_allow_hostsarabbitmq_address. #112479 (kssenii). - Se corrigió un caso en el que
CREATE TABLE ... ENGINE = Distributed(...)sin una lista de columnas podía revelar la estructura de una tabla local que el usuario que la creaba no tenía permiso para ver. Cuando el servidor local ejecuta unCREATEpor sí mismo, la estructura ahora se infiere en el contexto del propio usuario, por lo que se requiereSHOW COLUMNSen la tabla de destino, como ya ocurre con el motorRemote. No se cubre unCREATEreproducido desde la cola DDL (ON CLUSTERo dentro de una base de datosReplicated). #113220 (groeneai). - Se corrigió un caso en el que
CREATE TABLE ... ENGINE = Buffer(...)sin una lista de columnas podía revelar la estructura de una tabla de destino que el usuario que la crea no tiene permiso para ver. En unCREATEejecutado por el propio servidor local, la estructura ahora se infiere en el contexto del usuario, por lo que se requiereSHOW COLUMNSen el destino, como ya ocurre conMergeyRemote. Esto no cubre unCREATEreproducido desde la cola DDL (ON CLUSTERo dentro de una base de datosReplicated). #113372 (groeneai). - Se limitó el tamaño del mensaje de inicio del protocolo de conexión de PostgreSQL, que se lee antes de la autenticación. #115708 (alexey-milovidov).
Correcciones de Backup y restauración
- Se corrigió un aborto del servidor durante
RESTOREde copias de seguridad que contienen tablas con dependencias cíclicas. #103824 (thevar1able). - Se corrigió el problema por el que se ignoraba la clase de almacenamiento de S3 (
s3_storage_class/s3_storage_class_name) para los objetos escritos mediante carga multiparte en discosS3y almacenamiento de objetos, lo que provocaba que los objetos grandes se crearan con la clase predeterminadaSTANDARD. El nombre de la opción ahora se acepta comos3_storage_classys3_storage_class_namepara discos, almacenamiento de objetos y copias de seguridad. #106214 (alexey-milovidov). - Se corrigió un problema por el que
SYSTEM RELOAD CONFIGdescartaba la configuración de Azure Blob Storage por endpoint (comouse_native_copy), lo que hacía que se ignorara la configuración de un disco paraBACKUP/RESTOREhasta reiniciar el servidor. #106357 (jkartseva). - Se corrigió el fallo de las copias de seguridad con FILE_DOESNT_EXIST cuando se recopila el destino de REPLACE de una vista materializada actualizable en una base de datos Replicated o Shared cuya vista materializada aún no se ha instanciado en la réplica que inicia la copia de seguridad. #106411 (jkartseva).
- Se corrigió que Azure BACKUP/RESTORE ignorara la configuración de endpoint para discos
azure_blob_storagecon formato heredado. #106784 (jkartseva). - Se corrigió
BACKUPaAzureBlobStorage: al copiar un archivo de datos dentro de una copia de seguridad, el objeto de destino se escribía fuera del directorio de la copia de seguridad. Las comprobaciones de existencia de objetos de copia de seguridad en destinosS3ahora usan solicitudesHeadObjectexactas en lugar de listar prefijos, lo que evita coincidencias falsas con claves de prefijos similares. #107153 (pamarcos). - Las copias de seguridad incrementales ya no almacenan credenciales de
S3en el localizador<base_backup>del archivo de metadatos.backup. Las copias de seguridad creadas conuse_same_s3_credentials_for_base_backup = 1, o con credenciales explícitas de copia de seguridad base que coincidan con este localizador, almacenan un marcador no secreto y se restauran sin configuración adicional durante la restauración; para las copias de seguridad creadas con credenciales explícitas distintas para la copia de seguridad base o argumentos adicionales de autenticación base, páselos aRESTOREmediante la configuraciónbase_backup. Las copias de seguridad creadas por versiones anteriores con credenciales incrustadas siguen pudiendo restaurarse. #107357 (pamarcos). - Se corrigió
RESTOREpara las tablasReplicatedMergeTree, de modo que las partes con contenido duplicado de una copia de seguridad se conserven en lugar de deduplicarse silenciosamente. #107652 (pamarcos). - Un marcador de posición
{_partition_id}en la ruta de un motor similar a un archivo (S3,AzureBlobStorage,URL, etc.) sin unapartition_strategyexplícita vuelve a implicar la estrategiawildcard, independientemente defile_like_engine_default_partition_strategy. Esto restaura la compatibilidad con versiones anteriores para DDL anteriores a la 26.6 que empezaron a fallar conBAD_ARGUMENTS(“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”). #111279 (fm4v).
Correcciones de ClickHouse Keeper
- Corrige la limpieza de snapshots de
Keepertras escrituras fallidas, de modo que los snapshots parciales se eliminen de forma segura y las escrituras fallidas puedan reintentarse sin avanzarlatest_snapshot_meta. #105779 (antonio2368). - Corrige los fallos de
Keeperdurante la sincronización de seguidores cuando la nueva cola de respuestas del despachador de solicitudes podía llenarse antes de que se iniciara el hilo de respuestas. #106049 (antonio2368). - Corrige el bloqueo ocasional de Keeper durante el inicio cuando la configuración
nuraft_max_log_gap_in_streamse establece en un valor distinto del predeterminado (el valor predeterminado es 0, es decir, desactiva la canalización de solicitudesappend_entries). #106220 (al13n321). - El TLS interno de Raft de Keeper ahora respeta la configuración
openSSL.client.verificationMode. Anteriormente, la verificación de certificados de pares siempre estaba habilitada para la comunicación Raft entre instancias de Keeper, independientemente de esta configuración, por lo quenonese ignoraba silenciosamente. Ahora,nonedesactiva explícitamente la verificación de certificados de pares de Raft, mientras que la ausencia de esta configuración mantiene el comportamiento anterior, seguro de forma predeterminada. Las configuraciones que establezcan explícitamentenonedejarán de verificar los certificados de pares de Raft tras la actualización, conforme a la configuración especificada. #106726 (antonio2368). - Corrige la recreación espuria de sesiones de ZooKeeper al recargar la configuración. #107096 (azat).
- Corrige un error en ClickHouse Keeper por el que los metadatos de snapshots informados mediante
last_snapshot(yzk_latest_snapshot_sizeenmntr) podían retroceder tras instalar un snapshot obsoleto o duplicado. Esto también podía permitir que un snapshot local con el mismo índice sobrescribiera un archivo de snapshot registrado mientras aún se transmitía a un par o se cargaba en S3. #107321 (antonio2368). - Corrige el bloqueo de una vista materializada actualizable si se pierde la conexión con ZooKeeper en un momento inoportuno. #108234 (al13n321).
- Corrige las mutaciones con un parámetro de consulta como partición (
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): el valor de partición sustituido se serializaba en la entrada de mutación de una forma que no podía analizarse de nuevo, lo que impedía cargar la tabla (en las tablas replicadas, en cada réplica). Ahora también se verifica que los comandos de mutación puedan analizarse de nuevo antes de escribirse en ZooKeeper o en disco, de modo que una discrepancia similar haga fallar la consultaALTERen lugar de inutilizar la tabla. #111518 (al13n321). - Corrige el desbordamiento numérico al analizar datos para
system.zookeeper_info. #111629 (kssenii).
Correcciones de fallos y mejoras de estabilidad
- Corrige la excepción NOT_FOUND_COLUMN_IN_BLOCK al usar LIMIT BY con columnas constantes junto con DISTINCT y ORDER BY en el nuevo analizador. #93195 (ashrithb).
- Mejora la estabilidad de la conexión con HiveCatalog mediante la incorporación de un mecanismo de reintento automático y lógica de reconexión para gestionar errores TTransportException al comunicarse con Hive Metastore. #98471 (otselnik).
- Corrige el plegado de constantes durante el análisis en funciones de cortocircuito (
if,multiIf,and,or, etc.) para que las ramas estáticamente inalcanzables ya no generen excepciones durante el análisis. Por ejemplo,WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))ahora devuelve correctamente0en lugar de fallar con un error de división por cero. #103157 (fastio). - Corrige una finalización del servidor que podía producirse al llamar a
runningAccumulateen una función de agregación que devuelve su propio estado. #105085 (antaljanosbenjamin). - Corrige
getServerSettingpara que devuelva el valor efectivo actual de las configuraciones del servidor modificables en tiempo de ejecución (comomax_server_memory_usage,mark_cache_size,max_concurrent_queries, tamaños de grupos de subprocesos, etc.), en consonancia con lo que informasystem.server_settings. #105172 (alexey-milovidov). - Corrige la excepción
NOT_FOUND_COLUMN_IN_BLOCKal combinarORDER BY ... WITH FILL INTERPOLATEyLIMIT N BYcon el analizador habilitado. #105481 (yakov-olkhovskiy). - Corrige una excepción del servidor (error lógico
Trying to execute PLACEHOLDER action) al usar como lado derecho deINuna CTEMATERIALIZEDcuyo cuerpo es una subconsulta correlacionada. Esta CTE ahora se rechaza durante el análisis, de forma coherente con el rechazo del mismo patrón cuando se hace referencia directamente a la CTE enFROM. #105518 (groeneai). - Corrige que
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=falseno capturara excepciones durante la ejecución de funciones. #105543 (Avogar). - Corrige la excepción NOT_FOUND_COLUMN_IN_BLOCK cuando una expresión TTL hace referencia a una subcolumna. #105578 (Avogar).
- Corrige un bloqueo del servidor que podía producirse al cancelar una consulta que leía de PostgreSQL —mediante la función de tabla postgresql, el motor de tabla PostgreSQL o un diccionario con una fuente PostgreSQL— (por ejemplo, con KILL QUERY), si fallaba la cancelación de la consulta remota de PostgreSQL. #105949 (rorylshanks).
- Corrige un posible bloqueo debido a un literal de cadena demasiado grande enviado en la consulta. #105996 (nickitat).
- Corrige la excepción
INVALID_WITH_FILL_EXPRESSIONal usarINTERPOLATE ()(vacío) con un prefijo de ordenación enORDER BYyuse_with_fill_by_sorting_prefixhabilitado. Las columnas del prefijo de ordenación ahora se excluyen correctamente del conjunto de interpolación implícito, en consonancia con el comportamiento deINTERPOLATE (col)especificado explícitamente. #106001 (yakov-olkhovskiy). - Los estados malformados de
AggregateFunction(uniqTheta, ...)procedentes de entradasRowBinaryo parámetros de consulta ahora se rechazan conCORRUPTED_DATAen lugar de provocar la finalización del servidor. #106260 (groeneai). - Se corrige un bloqueo y un posible error
NOT_FOUND_COLUMN_IN_BLOCKal usar la optimización basada en restricciones (optimize_using_constraints) con subconsultas correlacionadas. #106349 (Algunenano). - Se corrige la excepción
NUMBER_OF_COLUMNS_DOESNT_MATCHal consultar una tablaDistributedcon dos o más columnas ALIAS que se expanden a la misma expresión (p. ej., ambas definidas comotoString(x)), o cuando la misma expresión se escribe tanto como referencia a una columna ALIAS como directamente en la lista SELECT, con una cláusulaORDER BY. #106404 (yakov-olkhovskiy). - Se corrigió el error
LOGICAL_ERROR“Trying to get name of not a column:ExpressionList” generado por consultas que pasan un asterisco dentro demultiIfa un argumento de función de tabla, p. ej.,numbers(multiIf(*, ...), 2). Ahora la consulta rechaza el patrón no resoluble conUNSUPPORTED_METHOD. #106647 (groeneai). - Se rechazan patrones glob patológicos de
fileque provocarían una recursión ilimitada al enumerar directorios. Ahora se impone una profundidad máxima de recursión de 1000; las consultas que la superen generanTOO_DEEP_RECURSIONen lugar de abortar el servidor por desbordamiento de pila. #106676 (groeneai). - Se corrige la excepción
'Trying to read from input() twice.'generada cuando la función de tablainputse encapsula en una CTE no MATERIALIZED a la que se hace referencia desde más de un punto de la consulta. Ahora la consulta se rechaza con el error claroINVALID_USAGE_OF_INPUTdurante la planificación.inputes un flujo de cliente de un solo uso y solo puede consumirlo una única fuente del plan de consulta. #106682 (groeneai). - Se corrigen columnas incoherentes (que posteriormente provocan LOGICAL_ERROR) tras una excepción (p. ej., MEMORY_LIMIT_EXCEEDED) durante el análisis. #106802 (azat).
- Se corrige un bloqueo del servidor (SIGSEGV) al leer datos Protobuf truncados con
input_format_allow_errors_num > 0. #106905 (atsarevskiy). - Se corrige un bloqueo del servidor (desreferenciación de puntero nulo) al ejecutar
TRUNCATEoDROPen una tablaEmbeddedRocksDBcuyo identificador de RocksDB se había liberado; por ejemplo, una tablaread_onlycuyo directorio de datos se vació mediante unTRUNCATEanterior. #106940 (groeneai). - Se corrige una excepción (
std::length_errornotificada comoLOGICAL_ERROR) al leer desde una función de tabla*Cluster, comourlCluster, con una configuración demax_streams_for_files_processing_in_cluster_functionsmuy elevada. El número de flujos ahora se limita a un valor razonable. #106946 (groeneai). - Se corrigió la finalización del servidor cuando una consulta distribuida se cancelaba inmediatamente antes de enviarse a un shard. #106950 (groeneai).
- Se corrigió una excepción del servidor (error lógico
this->visited_views == right->visited_views) enINSERTcuando dos vistas materializadas de la misma tabla de origen escriben en la misma tabla de destino y una vista dependiente lee de esa tabla, conmaterialized_views_squash_parallel_insertshabilitado. #107027 (groeneai). - Se corrigió una excepción
LOGICAL_ERRORal insertar en una tabla DeltaLake con columnas que no coinciden con su esquema de escritura (por ejemplo, una columnaNestedque se aplana en subcolumnas, o una función de tabla con un subconjunto explícito de columnas). Ahora, estas inserciones fallan con un errorINCOMPATIBLE_COLUMNSorientado al usuario. #107058 (groeneai). - Se corrigió un
LOGICAL_ERROR(“Table expression … data must be initialized”) que se producía cuando un selector de asterisco calificado (por ejemplo,x.*) hacía referencia por nombre a una CTE recursiva dentro de su propio término recursivo. Estos selectores ahora expanden las columnas de la tabla recursiva, igual que ya lo hacen una columna calificada (x.a) o un selector no calificado (*) en esa posición. #107144 (groeneai). - Se corrigió un
LOGICAL_ERROR(“Unexpected exception in refresh scheduling”) que podía provocar que el servidor entrara en un ciclo de fallos al reiniciarse cuando una vista materializada actualizable tiene una dependenciaREFRESH ... DEPENDS ON <name>cuyo nombre sin calificar coincide con una tabla temporal o con el nombre de una CTE. #107156 (groeneai). - Se corrigió un
LOGICAL_ERROR(Variant N (T) has size X, but expected Y) cuando se aplica una función comotoStringoconcata una columnaVariantoDynamicque contiene una única variante no vacía junto con valores NULL, y la función devuelve sin cambios la columna de entrada. #107374 (groeneai). - Se corrigió un
LOGICAL_ERROR(block.rows() == getRows()) que se producía en unINSERTasíncrono en una tablaAliascuandouse_strict_insert_block_limitsestaba habilitado. #107400 (groeneai). - Se corrigió una excepción del servidor (
Logical error: Not-ready Set is passed as the second argument for function 'in') cuando una expresión de clave (ORDER BY,PRIMARY KEY,PARTITION BYo unINDEXde omisión) contenía un operadorINcon una tabla en el lado derecho, por ejemplo,ORDER BY (x IN some_table). Estas expresiones de clave ahora se rechazan al crear la tabla. #107424 (groeneai). - Se corrigió un fallo poco frecuente del servidor durante el procesamiento de
DISTINCTque podía ocurrir si fallaba una asignación de memoria (por ejemplo, al alcanzar un límite de memoria) mientras se inicializaba el conjunto de claves distintas. #107467 (groeneai). - Se corrigieron errores en operaciones de
DeltaLaketras la expiración de credenciales temporales de S3 actualizando las credenciales almacenadas en caché antes de la siguiente operación. Las credenciales de asunción de rol de STS también se actualizan tras fallos de autenticación. #107480 (ahmadov). - Se corrigió un
LOGICAL_ERROR(Not-ready Set is passed as the second argument for function 'in') al consultar una tabla con una clavePARTITION BYy una subconsultaIN/NOT INincluida en una expresión más amplia, por ejemplo,WHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai). - Corrige un fallo (desreferenciación de puntero nulo) que podía producirse al ejecutar localmente un plan de consulta distribuida (
make_distributed_plan+distributed_plan_execute_locally) conlog_formatted_queries = 1. #107570 (groeneai). - Corrige un fallo del servidor al leer una vista materializada cuyo destino es una tabla
Distributedcuando la consulta se ejecuta conenable_analyzer = 0. #107653 (groeneai). - Corrige un fallo del servidor (SIGSEGV) al leer datos Protobuf con
input_format_allow_errors_num > 0, cuando un mensaje válido precede a otro incorrecto (que se puede omitir) en el mismo bloque. #107739 (atsarevskiy). - Corrige el bloqueo durante varios minutos de las funciones de tabla
odbcyjdbc, que ignoraban la cancelación de consultas (KILL QUERY,max_execution_time) cuando el puente dejaba de responder durante la inferencia de la estructura de la tabla remota. #107809 (alexey-milovidov). - Corrige un posible fallo (desreferenciación de puntero nulo) cuando la sobrescritura de
database/dbde una colección con nombre pasada aremote()/remoteSecure()no es un nombre de base de datos constante; por ejemplo,remote(nc, database = (SELECT 1)). Ahora la consulta devuelve un error claro en lugar de provocar un fallo. #108271 (groeneai). - Las consultas de búsqueda vectorial que seleccionan la columna
_distanceahora devuelven un error adecuado en lugar de fallar con unLOGICAL_ERROR. #108423 (rschu1ze). - Corrige un posible fallo (desbordamiento del búfer del montón) cuando se utilizaba como clave de
GROUP BYuna columna de estado de una función de agregación de la familiaquantileTDigesty varios hilos la serializaban simultáneamente. #110263 (groeneai). - Corrige la poda incorrecta derivada del análisis del índice de clave primaria en tablas con una clave de ordenación inversa (descendente) (
ORDER BY (g, r DESC)). Un gránulo que abarcaba un cambio en una columna de clave inicial seguido de una columna de clave descendente podía podarse incorrectamente y descartar filas coincidentes. #111059 (nihalzp). - Corrige un error lógico
block.rows() == getRows()(una lectura fuera de límites y una deduplicación de inserciones defectuosa en compilaciones de producción) cuando unINSERTpasa por una vista materializada dependiente cuyo destino es unAliasy cuya consulta interna cambia el número de filas, con una tabla con deduplicación accesible tras el alias. #111103 (alexey-milovidov). - Corrige un segfault debido a un acceso a memoria fuera de límites al deserializar un estado de función de agregación malformado que contiene un valor
String. Estos estados ahora se validan y rechazan en lugar de provocar segfaults. #111606 (mstetsyuk). - Corrige un fallo al leer un archivo Parquet con metadatos de filtro de Bloom incoherentes. Estos archivos también podían devolver silenciosamente menos filas de las debidas. #112498 (tiandiwonder).
- Corrige un fallo de segmentación y una corrupción silenciosa de datos cuando un
INSERTen el motorFileo la función de tablafileagrega datos a un archivo no vacío en un formato que no admite anexarlos, comoAvro. La escritura mediante un descriptor de archivo o una ruta particionada omitía la comprobación existente, por lo que se suprimía el prefijo de formato y se escribía un segundo encabezado tras los bytes existentes, dejando el archivo ilegible. Este tipo deINSERTahora se rechaza conCANNOT_APPEND_TO_FILE, como ya sucede con una ruta simple. #112839 (groeneai). - Corrige el bloqueo de
DROP TABLEySYSTEM STOP VIEWcuando una vista materializada actualizable se bloquea durante la planificación de su consulta de actualización. #113188 (evillique). - Corrige una terminación poco frecuente del servidor cuando las entradas de la cola de inserciones asíncronas tenían plazos idénticos. #113363 (mstetsyuk).
- Corrige la corrupción de memoria del montón al leer Parquet mediante un formato de entrada que gestiona su propio búfer de lectura, por ejemplo, un diccionario con
SOURCE(FILE(... format 'Parquet')). Las tareas de prelectura y decodificación en segundo plano aún podían leer y escribir en el búfer después de que el pipeline lo liberara, lo que podía provocar la finalización del servidor. #114668 (groeneai). - Corrige un bloqueo al eliminar una tabla
TimeSeriescuyo nombre se ordena lexicográficamente antes que los nombres de sus tablas internas, por ejemplo, una tabla llamada-ts, o al eliminar una vista materializada declarada conENGINE = TimeSeries. La operación de eliminación se autobloqueaba mediante la protección DDL y no podía cancelarse conKILL QUERY. #114953 (groeneai).
Otras correcciones de errores
- Las funciones
like,ilike,notLike,notILikeymatchahora admiten un haystack constante con una aguja no constante (p. ej.,'foo' LIKE pattern_column), lo que antes generabaILLEGAL_COLUMN. #100479 (Onyx2406). - Corrige el error
NOT_FOUND_COLUMN_IN_BLOCKal seleccionar desde una VIEW sobre una tabla con una proyección normal. #101218 (amosbird). - Rechaza valores Float64 negativos (p. ej.,
-100.5) en configuraciones de workload comomax_bytes_per_second,max_cpus, etc. Antes solo se validaban los enteros negativos, lo que permitía que los valores de punto flotante negativos crearan silenciosamente nodos de scheduler defectuosos. #101842 (groeneai). - Las lecturas desde almacenamiento de objetos ahora responden con rapidez a la cancelación de consultas. #103016 (SmitaRKulkarni).
- Corrige que
input_format_max_block_size_bytesse ignorara silenciosamente durante el análisis deINSERTcuandomax_insert_block_size_byteses0(el valor predeterminado). La configuración ahora limita correctamente el tamaño de los bloques generados por los formatos de entrada basados en filas. #103068 (Fgrtue). - Corrige que ClickHouse produjera ocasionalmente tokens GSSAPI no válidos debido a la eliminación incorrecta de bytes nulos finales. #103114 (EmeraldShift).
- EXPLAIN SYNTAX expande las vistas parametrizadas. #103263 (jrdi).
- Corrige la corrupción de datos al escribir Parquet (y otros formatos con tráiler, como ORC y Arrow) en HDFS mediante
INSERT INTO FUNCTION hdfs(...). Desde la versión 26.1,WriteBufferFromHDFSno vaciaba su búfer de trabajo al ejecutarfinalize(), por lo que se perdían silenciosamente hasta los últimosDBMS_DEFAULT_BUFFER_SIZEbytes de cada archivo, incluido el piePAR1de Parquet. Al leer estos archivos se devolvíaNot a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai). - Corrige resultados incorrectos y un posible error lógico en subconsultas correlacionadas cuando se establece un límite de tamaño de join (
max_rows_in_join/max_bytes_in_join) junto conjoin_overflow_mode = 'break'. El join creado internamente para evaluar una subconsulta correlacionada ahora ignora esos límites definidos por el usuario, por lo que ya no puede detenerse prematuramente ni descartar filas. #103322 (groeneai). - Corrige resultados incorrectos o la omisión de una proyección cuando una proyección de agregación contiene varias agregaciones
sumIfcon distintas condicionesIN (...). #104765 (Ergus). - Corrige que
deltaSumTimestampdevuelva resultados incorrectos para tipos enteros con signo que cruzan el cero. #104830 (thevar1able). - Corrige el error
Logical error: 'Metadata is not initialized'generado porDELETE FROMen una tablaIceberg,DeltaLakeoHudirecién adjunta cuyo archivo de metadatos está corrupto o no se puede cargar. En su lugar, se devuelve una excepción habitual orientada al usuario y el servidor continúa en ejecución. #104917 (groeneai). - Las consultas
ATTACH TABLE name <clauses>;que incluyen cláusulas de almacenamiento (ORDER BY,PARTITION BY,PRIMARY KEY,SAMPLE BY,TTL,UNIQUE KEYoSETTINGSdel motor) sinENGINEahora generanBAD_ARGUMENTS, en lugar de volver a adjuntar silenciosamente la tabla con su definición almacenada y descartar las cláusulas especificadas por el usuario. LosSETTINGSde sesión a nivel de consulta (comolog_comment) se siguen aplicando. UseATTACH TABLE t;para volver a adjuntar la tabla con los metadatos almacenados, oALTER TABLE t MODIFY SETTING ...después deATTACHpara cambiar la configuración. #105068 (groeneai). - Se corrigieron un desbordamiento del búfer de montón al leer archivos Arrow o ArrowStream con desplazamientos intermedios corruptos en una columna binaria o de cadena, y una desreferenciación de puntero nulo al leer columnas Arrow geoetiquetadas. #105449 (Algunenano).
- Se corrigió un cierre del servidor al leer subcolumnas
Dynamicde una tablaMemorycomprimida después deALTER. #105464 (Avogar). - Se incluyó
skip_first_linesen la clave de la caché de esquemas para los formatosWithNames. #105469 (Avogar). - Se corrigió
histogram, que producía resultados incorrectos con entradas pequeñas no ordenadas. #105548 (Avogar). - Se corrigió el uso de la tabla de inserción en funciones de tabla cuando
optimize_trivial_insert_selectestá habilitado. #105555 (Avogar). - Se corrigió la pérdida de datos acumulados entre filas en la función de ventana
estimateCompressionRatio. #105581 (Avogar). - La extracción de valores de partición de Hive ahora respeta la configuración
cast_string_to_date_time_modey, de forma predeterminada, acepta timestamps ISO 8601 con sufijos de zona horaria (p. ej.,+0000,+00:00,Z) en las claves de partición. #105584 (alexey-milovidov). - Se corrigió la recuperación de errores del formato de entrada
Templatetras filas malformadas. #105735 (niyue). - Se corrigió el formato de
SYSTEM INSTRUMENT ADDpara que los argumentos del controlador estén separados por un único espacio, y se rechazan las listas no válidas de argumentos de instrumentaciónSLEEPcon más de dos valores o con un intervalo cuyo mínimo sea mayor que el máximo. #105984 (pamarcos). - Se corrigió el fallo silencioso de las operaciones de partición de ALTER TABLE con claves de partición Bool. #106004 (Avogar).
- Se corrigieron
JSONExtractRawyJSONHaspara rutas JSON tipadas con valores predeterminados. #106005 (Avogar). - Se corrigió un prefijo
/incorrecto en rutas base vacías de configuraciones de lago de datos. #106013 (thewisenerd). - Se corrigió que
system.dictionariesdevolviera 0 filas tras una revocación parcial deSHOW DICTIONARIES. #106105 (Avogar). - Corrige resultados incorrectos en consultas sobre tablas cuyo
ORDER BYcontiene una función monótonamente decreciente, como(c0 / -42)ointDiv(c0, -42). Los predicados sobre la columna subyacente (por ejemplo,c0 < 0) podían descartar erróneamente gránulos que contenían filas coincidentes, lo que provocaba resultados incompletos. #106136 (nihalzp). - Se añadió validación para estados de agregación
DDSketchmalformados durante la inserción. #106236 (yariks5s). - Se corrigió la consistencia de la caché del sistema de archivos tras degradaciones fallidas de
SLRU, evitando que las entradas quedaran bloqueadas en estado de expulsión. También se corrigieron el redimensionamiento de la caché divididaSystem/Datay la limpieza de espacio libre para que los límites se actualicen de forma atómica y se pueda recuperar espacio de ambos segmentos de caché. #106286 (kssenii). - Se corrigió una conversión incorrecta de valores
Float16subnormales aFloat32(por ejemplo, al leerlos de archivos.npyde NumPy), causada por un desplazamiento de mantisa desfasado en una posición. #106343 (jh0x). - Corrige
regexpExtract(haystack, pattern)para que los patrones sin grupo de captura devuelvan la coincidencia completa en lugar de generarINDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai). - Corrige un error lógico al crear un diccionario de polígonos a partir de datos de origen que contienen coordenadas de puntos
NaNo infinitas. Estas coordenadas ahora se rechazan con un error claro. #106423 (alexey-milovidov). - Los diccionarios HTTP ahora pueden especificar encabezados de solicitud mediante colecciones con nombre. #106459 (ZelvaMan).
- Los valores de enumeración
Avromalformados ahora se validan y rechazan con una excepción, en lugar de provocar accesos a memoria fuera de los límites y la terminación del servidor. #106476 (mstetsyuk). - Corrige que
LIMIT WITH TIESyLIMIT WITH TIESfraccionario no respetaran la intercalación deORDER BY ... COLLATEal determinar empates. Las filas iguales según la intercalación (por ejemplo,'1'y'01'con intercalación numérica) se comparaban byte a byte, por lo que algunas filas empatadas se descartaban erróneamente del resultado. #106539 (nihalzp). - Corrige que las optimizaciones
DISTINCTen orden yLIMIT BYen orden (incluidoLIMIT BYnegativo) devolvieran resultados incorrectos cuando la entrada se ordenaba con una intercalación (ORDER BY ... COLLATE). Las filas iguales según la intercalación (por ejemplo,'a'y'A'con una intercalación sin distinción entre mayúsculas y minúsculas) se ordenan por clave de intercalación y no son adyacentes por valor, por lo que la optimización en orden ahora se omite cuando se utiliza un colacionador. #106564 (nihalzp). - Se corrigió una condición de carrera durante el cierre del consumidor de NATS que podía terminar el servidor. #106692 (mstetsyuk).
- Se corrigieron varios problemas de seguridad de memoria y agotamiento de recursos en lectores de formatos accesibles desde entradas no confiables: una lectura fuera de los límites del montón en el manejo de la longitud de los niveles de definición/repetición de
DataPageV2del lector nativo de Parquet, un desbordamiento de pila en archivos Parquet con esquemas profundamente anidados y asignaciones que ignorabanmax_memory_usageal analizar geometrías GeoParquet WKB/WKT y cadenas/bytes de Avro. #106739 (Algunenano). - Se corrigió que
keeper_server.http_control.secure_portenviara respuestas HTTP en texto sin cifrar a clientes HTTPS. El puerto seguro ahora sirve HTTPS correctamente. #106822 (linjiayu1025-collab). - Se corrigió que
SHOW CREATE ROW POLICYemitierarestrictive/permissiveen minúsculas en lugar de mayúsculas, de forma incoherente con otras palabras clave. #106865 (valerypetrov). - Se corrigió que las partes se marcaran como dañadas y se desconectaran en cada recarga de partes (reinicio del servidor,
DETACHoATTACH) en tablas con una columnaLowCardinality(Nullable(...))en la clave de partición. Desde la versión 26.5, el archivo de índice minmax de cada parte no se escribía cuando el mínimo y el máximo de dicha columna eranNULL, aunque la comprobación de consistencia de la parte seguía requiriéndolo. Las partes escritas por las versiones afectadas no incluyen el archivo de índice minmax y aún deben volver a adjuntarse manualmente. #106945 (PedroTadim). - Se corrigió que
elapsed_ussiempre fuera cero y queread_rows/read_bytesse contabilizaran por debajo de su valor real ensystem.processors_profile_logysystem.query_logpara consultas de vaciado de inserciones asíncronas (AsyncInsertFlush). #106982 (cwurm). - Se corrigió un error lógico
Block structure mismatch in UnionStep stream(abortado del servidor en builds de depuración/sanitizer,Code: 49en builds de lanzamiento) que se producía cuando una rama de unUNION/INTERSECT/EXCEPTleía una columna serializada comoSparse, mientras que la rama homóloga leía la misma columna completa (por ejemplo, al insertar en una vista materializada). #107041 (groeneai). - Se corrigió el orden incorrecto de las filas en consultas
ORDER BYsobreUNION ALLconoptimize_read_in_orderyread_in_order_use_virtual_rowhabilitados. #107053 (vdimir). - Se corrigió un error de sintaxis cuando una cláusula
FORMAT,SETTINGSoINTO OUTFILEsigue aSHOW ROW POLICIESoSHOW MASKING POLICIES(p. ej.,SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai). - Se corrigió que
trimLeft,trimRightytrimBoth(y los aliasltrim,rtrim,trim) generaranTOO_LARGE_STRING_SIZEcuando el conjunto personalizado de caracteres para recortar tenía más de 16 caracteres. Los conjuntos de recorte de cualquier longitud vuelven a ser compatibles. #107071 (fm4v). - Se corrigió un desbordamiento de enteros con signo en
quantileExactExclusive,quantilesExactExclusive,quantileExactInclusiveyquantilesExactInclusiveque podía producir resultados incorrectos para entradasInt64que abarcaran un rango amplio. #107154 (groeneai). - Las recargas de configuración ya no vuelven a ejecutar los scripts de inicio, lo que evita que las acciones de inicio que solo deben ejecutarse una vez vuelvan a ejecutarse. #107187 (mstetsyuk).
- Se corrigió el orden incorrecto de los resultados de
ORDER BYsobreUNION ALLconoptimize_read_in_orderhabilitado cuando la canalización de la unión se reducía debido a la configuración demax_streams_for_union_step; ahora se omite esta reducción cuando el plan depende de flujos de salida ordenados de UNION. #107208 (vdimir). - Se corrigió una posible desreferenciación de puntero nulo al resolver la configuración del proxy durante la fase final de apagado del servidor. #107231 (PedroTadim).
- Se corrigió
ORDER BY ... WITH FILL, que producía filas adicionales cuando una columna de ORDER BY anterior a la columna de relleno usa una intercalaciónCOLLATE. Las filas ahora se agrupan por el prefijo de ordenación mediante esa intercalación, de acuerdo con el orden de clasificación. #107365 (groeneai). - Se corrigió el comportamiento indefinido al pasar un valor de coma flotante no finito (como
nanoinf) como argumento de marca de tiempo o duración a las funciones de tablaprometheusQuery/prometheusQueryRange. Ahora, dicho argumento generaBAD_ARGUMENTSen lugar de producir una marca de tiempo inválida. #107417 (groeneai). - Se corrigieron resultados incorrectos de la optimización
optimize_rewrite_aggregate_function_with_ifpara funciones de agregación que preservan valores de carga útilNULL(la familia*_respect_nulls:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls). La optimización ya no reescribef(if(cond, x, NULL))a la forma-Ifpara dichas funciones. #107430 (groeneai). - Se añadió validación para límites malformados en la entrada ORC. #107580 (al13n321).
- Se corrigió una denegación de servicio no autenticada por agotamiento de memoria en el puerto del protocolo MySQL. #107599 (tiandiwonder).
- Se corrigió un problema que impedía usar la interfaz MySQL con
MySQL Connector/J8.2.0 y versiones posteriores (incluida la serie 9.x). El campoinfodel paqueteOKahora está codificado con longitud, como en el servidor MySQL, por lo que el controlador JDBC puede conectarse. #107693 (alexey-milovidov). - Se corrigió el error lógico
Block structure mismatch in UnionStep stream(abortado del servidor en compilaciones de depuración/sanitizador,Code: 49en compilaciones de lanzamiento) que se producía cuando las ramas hermanas de unUNION/INTERSECT/EXCEPTdiferían solo en su predicadoWHEREy el predicado de una de ellas se reducía a una constante en una columnaConst. #107719 (groeneai). - La lectura de datos
ArrowyArrowStreamcon columnasStringoBinaryvacías generadas por Apache Arrow Java anterior a la versión 19.0.0 (incluido Apache Spark) ya no produceINCORRECT_DATA. #107764 (Algunenano). - Los bloques Native malformados cuyo discriminador
Varianthace referencia a una variante inexistente ahora se rechazan de forma segura. #107991 (uwezkhan). - Se corrigió una regresión de rendimiento al leer columnas
Dynamiccon varios hilos. #107997 (Avogar). - El ajuste obsoleto del lago de datos
storage_catalog_urlahora se rechaza correctamente mediante la protección del catálogo (anteriormente solo se comprobabanstorage_catalog_typeystorage_aws_access_key_id), y el mensaje de error enumera todos los ajustes obsoletos. #108040 (alexey-milovidov). - Se corrigió un problema por el que la función/motor de tabla
ArrowFlightrechazaba una colección con nombre que omitía la clave opcionaldatasetcon el errorNo such key 'dataset'. #108041 (alexey-milovidov). - Los secretos y las credenciales ahora se enmascaran en
system.query_views_log.view_queryen lugar de exponerse en el SQL registrado de las vistas. #108214 (Fidelaggio). - Se corrigió el problema por el que
type_json_allow_duplicated_key_with_literal_and_nested_objectno funcionaba con rutas tipadas en JSON. #108218 (Avogar). - Se corrigió un comportamiento indefinido (se pasaba un puntero nulo a
memcpy) en las funcionesdetectCharsetydetectLanguageUnknowncuando la cadena de entrada supera los 32768 bytes y no se puede detectar ningún juego de caracteres. #108250 (groeneai). - Se corrigió el error
NOT_FOUND_COLUMN_IN_BLOCKen consultas que usan las columnas virtuales_part_starting_offset/_part_offseten WHERE junto con la materialización diferida. #108287 (vdimir). - Se ocultan los argumentos secretos de funciones como
encrypt,decryptyHMACen la salida deEXPLAIN actions,EXPLAIN headeryEXPLAIN PIPELINEcuandoformat_display_secrets_in_show_and_selectestá deshabilitado (el valor predeterminado). #108386 (Algunenano). CREATE OR REPLACEahora se ejecuta correctamente para una vista materializada actualizable cuando su destinoTOya pertenece a esa misma vista. Los destinos que pertenecen a otra vista siguen rechazándose. #108392 (evillique).- Se restringió la ruta del modelo de
catboostEvaluateal directoriouser_files, al igual que parafile()y las fuentes de diccionario. Anteriormente, la función aceptaba una ruta arbitraria del sistema de archivos sin comprobar que estuviera contenida enuser_files, lo que permitía comprobar la existencia de archivos fuera deuser_filesy desencadenar su lectura. Ahora los modelos deben estar ubicados dentro deuser_files. #108463 (groeneai). - Se corrigió el problema por el que
CREATE OR REPLACE MATERIALIZED VIEW ... POPULATEdejaba la nueva vista sin suscripción a su tabla de origen, lo que descartaba silenciosamente todas las filas insertadas después del reemplazo. #108728 (alexey-milovidov). - Se corrigió un fallo de segmentación al combinar estados de agregación de
uniqExactconGROUPING SETS,ROLLUPoCUBEymax_threads > 1. #108928 (Algunenano). - Se corrigió un posible error lógico “Unexpected substream … for column …” al actualizar la configuración de compatibilidad. #109496 (Avogar).
- La función
getClientHTTPHeaderahora trata los nombres de encabezado sin distinguir entre mayúsculas y minúsculas, de acuerdo con la RFC 9110; en particular, el encabezadoauthorizationahora se filtra independientemente de cómo se escriba. #109791 (Felixoid). - Se corrigió la pérdida silenciosa de datos con inserciones asíncronas y deduplicación (
async_insert=1,async_insert_deduplicate=1). Cuando varias entradas de inserción asíncrona con valores distintos deinsert_deduplication_tokense combinaban en un único vaciado que escribía en particiones distintas, cada token se registraba en el registro de deduplicación de todas las particiones afectadas por el vaciado, no solo en la partición donde se insertaban sus propias filas. Posteriormente, una inserción que reutilizaba uno de esos tokens en una partición en la que nunca se habían insertado filas con ese token se deduplicaba silenciosamente. Ahora los tokens se registran únicamente en la partición donde realmente se insertaron sus filas. #111049 (groeneai). - Se corrigieron las inserciones asíncronas en formato Native para evitar que una entrada almacenada temporalmente en el búfer que se vuelve incompatible tras
ALTER ... MODIFY COLUMNprovoque el error de todo el lote. #111108 (Felixoid). - Se corrigió
CREATE OR REPLACEde un diccionario con un objeto de otro tipo: fallaba conCANNOT_DETACH_DICTIONARY_AS_TABLEdespués de confirmar el reemplazo, lo que dejaba una tabla_tmp_replace_*huérfana. #111142 (evillique). - Se corrigió una fuga de memoria de certificados de pares durante handshakes TLS con la verificación de certificados habilitada. #111425 (thevar1able).
- Se corrigió un error lógico
Block structure mismatch in IntersectOrExceptStep stream: different number of columnsque podía ocurrir cuando la optimización de división de filtros (query_plan_split_filter) se aplicaba a unWHEREcuyo nombre de columna de filtro también era el de una columna de entrada. La optimización dejaba una columna interna__split_filteren la cabecera de salida de la rama, que luego difería de la rama asociada de una operación de conjuntos comoINTERSECToUNION. #111930 (groeneai). - Se corrigieron resultados incorrectos en filtros o expresiones
ORDER BYque usantoStringcon valoresTime,Time64oDateTimeen zonas horarias con horario de verano. También se restauró la optimización de lectura en orden paraORDER BYsobre un prefijo de la clave de ordenación de la tabla y para conversiones deStringaNullable(String). #113291 (vdimir). - Se corrigió
ATTACHde una tablaKafkacuandokafka_num_consumerssupera el límite derivado del número de núcleos de CPU. #113390 (evillique). - Se deshabilitó el análisis de índices distribuido al usar proyecciones para evitar resultados de consulta incorrectos. #115132 (azat).
- Se corrigió un error en la función
formatRowNoNewlineque podía producir resultados incorrectos o un error lógico cuando una fila se formateaba como un resultado vacío. #115669 (alexey-milovidov). - Ya no se devuelve memoria sin inicializar en el resultado de un literal de cadena binaria cuya longitud no es múltiplo de ocho ni desde el descompresor LZ4 cuando un bloque comprimido no tiene cuerpo. #115704 (alexey-milovidov).
- Se incluyeron las rutas de los objetos en los hashes de deduplicación para evitar la deduplicación incorrecta de valores de objetos distintos. #115866 (Felixoid).