Cambios incompatibles con versiones anteriores
Cambios en JSON y en los formatos de datos
- Se desactiva de forma predeterminada el uso de comillas para enteros de 64 bits en los formatos JSON. #74079 (Pavel Kruglov).
- Se infiere
Array(Dynamic)en lugar deTuplesin nombre para arrays de valores con distintos tipos en JSON. Para usar el comportamiento anterior, desactive la configuracióninput_format_json_infer_array_of_dynamic_from_array_of_different_types. #80859 (Pavel Kruglov). - De forma predeterminada, los valores del tipo
Enumse escriben comoBYTE_ARRAYcon el tipo lógicoENUMen el formato de salida Parquet. #84169 (Pavel Kruglov).
Almacenamiento y particionamiento
- Se añadió compatibilidad con escrituras con estilo de particiones de Hive y se refactorizó la implementación de lectura (las columnas de partición de Hive ya no son virtuales). #76802 (Arthur Passos).
- Se habilitó de forma predeterminada la configuración de MergeTree
write_marks_for_substreams_in_compact_parts. Mejora significativamente el rendimiento de lectura de subcolumnas desde partes Compact recién creadas. Los servidores con una versión inferior a 25.5 no podrán leer las nuevas partes Compact. #84171 (Pavel Kruglov). - No se permite usar
RENAME COLUMNniDROP COLUMNcon columnas listadas explícitamente para sumar en SummingMergeTree. Cierra #81836. #82821 (Alexey Milovidov).
Mejoras de funciones
- Se introduce un nuevo argumento
unexpected_quoting_character_strategyen la funciónextractKeyValuePairs, que controla qué ocurre cuando se encuentra unquoting_characterde forma inesperada. Para más detalles, consulte la documentación deextractKeyValuePairs. #80657 (Arthur Passos). - Anteriormente, la función
countMatchesdejaba de contar al encontrar la primera coincidencia vacía, incluso si el patrón la aceptaba. Para solucionar este problema,countMatchesahora continúa ejecutándose y avanza un solo carácter cuando se produce una coincidencia vacía. Los usuarios que deseen conservar el comportamiento anterior pueden habilitar la opcióncount_matches_stop_at_empty_match. #81676 (Elmi Ahmadov).
Mejoras en los tipos de datos
- Mejora la precisión de la conversión de
DecimalaFloat32. Se implementa la conversión deDecimalaBFloat16. Cierra #82660. #82823 (Alexey Milovidov).
Rendimiento y gestión de recursos
- Anteriormente, las consultas
BACKUP, las fusiones y las mutaciones no utilizaban los limitadores globales del servidor para el tráfico local (max_local_read_bandwidth_for_serverymax_local_write_bandwidth_for_server) y remoto (max_remote_read_network_bandwidth_for_serverymax_remote_write_network_bandwidth_for_server); en su lugar, solo se limitaban mediante configuraciones específicas del servidor (max_backup_bandwidth_for_server,max_mutations_bandwidth_for_serverymax_merges_bandwidth_for_server). Ahora utilizan ambos tipos de limitadores simultáneamente. #81753 (Sergei Trifonov). - Se añadió una nueva configuración
cluster_function_process_archive_on_multiple_nodesque mejora el rendimiento del procesamiento de archivos en funciones de clúster cuando se establece en true (de forma predeterminada). Debe establecerse enfalsepor compatibilidad y para evitar errores durante la actualización a 25.7+ si se utilizan funciones de clúster con archivos en versiones anteriores. #82355 (Kseniia Sumarokova). - El valor predeterminado anterior de
concurrent_threads_schedulereraround_robin, que demostró ser injusto cuando había un gran número de consultas de un solo hilo (por ejemplo,INSERTs). Con este cambio,fair_round_robin, una alternativa más segura, pasa a ser el scheduler predeterminado. #84747 (Sergei Trifonov). - La materialización diferida solo está habilitada con el analizador para evitar mantenerla sin el analizador, ya que esto puede causar algunos problemas (por ejemplo, al usar
indexHint()en condiciones). #83791 (Igor Nikonov).
Esquema y sintaxis SQL
- Prohibir la creación de una tabla sin columnas insertables. #81835 (Pervakov Grigorii).
- Exigir backticks alrededor de los identificadores con puntos en las expresiones predeterminadas para evitar que se interpreten como identificadores compuestos. #83162 (Pervakov Grigorii).
- Admitir la sintaxis heredoc al estilo de PostgreSQL:
$tag$ string contents... $tag$, también conocida como literales de cadena delimitados por signos de dólar. En versiones anteriores, había menos restricciones para las etiquetas: podían contener caracteres arbitrarios, incluidos signos de puntuación y espacios en blanco. Esto introduce ambigüedad al analizar identificadores que también pueden comenzar con el carácter dólar. Al mismo tiempo, PostgreSQL solo permite caracteres de palabra en las etiquetas. Para resolver este problema, ahora restringimos las etiquetas heredoc para que solo contengan caracteres de palabra. Cierra #84731. #84846 (Alexey Milovidov).
Seguridad y permisos
SYSTEM RESTART REPLICASsolo reiniciará las réplicas en las bases de datos donde tengas permiso paraSHOW TABLES. Anteriormente, la consulta provocaba la reactivación de tablas en la base de datos Lazy, incluso sin acceso a esa base de datos, mientras esas tablas se eliminaban de forma concurrente. #83321 (Alexey Milovidov).- Las funciones
azureBlobStorage,deltaLakeAzureeicebergAzurese han actualizado para validar correctamente los permisosAZURE. Todas las funciones en variante de clúster (funciones-Cluster) ahora verifican los permisos con respecto a sus equivalentes sin clúster. Para evitar errores de permisos, asegúrate de que los usuarios que invocan las funciones-Clustertengan los privilegios adecuados (por ejemplo,GRANT S3 ON *.* TO user). Además, las funcionesicebergLocalydeltaLakeLocalahora exigen comprobaciones del permisoFILE. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov
Nuevas características
Tipos de datos
- Se añaden nuevos tipos de datos:
Time([H]HH:MM:SS)yTime64([H]HH:MM:SS[.fractional]), así como algunas funciones básicas de conversión de tipos y funciones para interactuar con otros tipos de datos. Se añadieron opciones de configuración para la compatibilidad con la función heredadaToTime. #81217 (Yarik Briukhovetskyi).
Funciones
- Se añade
NumericIndexedVector, una nueva estructura de datos vectorial basada en compresiónroaring-bitmapsegmentada por bits, junto con más de 20 funciones para construirla, analizarla y realizar aritmética elemento a elemento. Puede reducir el almacenamiento y acelerar joins, filtros y agregaciones en datos dispersos. Implementa #70582 y el artículo “Large-Scale Metric Computation in Online Controlled Experiment Platform” de T. Xiong y Y. Wang, de VLDB 2024. #74193 (FriendLey). - Se agregan funciones financieras:
financialInternalRateOfReturnExtended(XIRR),financialInternalRateOfReturn(IRR),financialNetPresentValueExtended(XNPV),financialNetPresentValue(NPV). #81599 (Joanna Hulboj). - Se añaden las funciones geoespaciales
polygonIntersectsCartesianypolygonIntersectsSphericalpara comprobar si dos polígonos se intersecan. #81882 (Paul Lamb). - Compatibilidad con las funciones de ventana
lagylead. Cierra #9887. #82108 (Dmitry Novik). - Se añaden las funciones
colorSRGBToOkLCHycolorOkLCHToSRGBpara convertir colores entre los espacios de color sRGB y OkLCH. #83679 (Fgrtue). - Ahora puede hacer búsquedas de claves JSON sin distinguir entre mayúsculas y minúsculas con
JSONExtractCaseInsensitive(y otras variantes deJSONExtract). #83770 (Alistair Evans). - Se añade una nueva función
nowInBlock64. #84178 (Halersson Paris). - Se agrega la función
dateTimeToUUIDv7para convertir un valor de DateTime en un UUIDv7. Ejemplo de uso:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))devuelve0198af18-8320-7a7d-abd3-358db23b9d5c. #84319 (samradovich). - Se agregan las funciones de agregación
timeSeriesDerivToGridytimeSeriesPredictLinearToGridpara remuestrear datos en una rejilla temporal definida por la marca de tiempo de inicio, la marca de tiempo de fin y el paso especificados; calculanderivypredict_linear, respectivamente, de forma similar a PromQL. #84328 (Stephen Chi). - Se añaden las funciones
timeSeriesRangeytimeSeriesFromGrid. #85435 (Vitaly Baranov).
Tablas del sistema
- Se añadió una tabla
system.dead_letter_queuepara conservar los mensajes entrantes erróneos de motores como Kafka. #68873 (Ilya Golshtein). - Se añadió la tabla del sistema
system.zookeeper_connection_logpara almacenar información histórica sobre las conexiones a ZooKeeper. #79494 (János Benjamin Antal). - Se añadió una nueva tabla del sistema
system.codecspara inspeccionar los códec disponibles. (issue #81525). #81600 (Jimmy Aguilar Mena). - Se introdujo la tabla
system.completions. Cierra #81889. #83833 (|2ustam).
Iceberg y DeltaLake
- Soporte para tipos complejos en la evolución del esquema de Iceberg. #73714 (scanhex12).
- Se introducen escrituras en Iceberg para consultas
insert. #82692 (scanhex12). - Soporte para borrados posicionales en el motor de tabla Iceberg. #83094 (Daniil Ivanik).
- Lectura de archivos de datos de Iceberg por ID de campo. Cierra #83065. #83653 (scanhex12).
- Escrituras en Iceberg para
CREATE. Cierra #83927. #83983 (scanhex12). - Escrituras para catálogos de Glue. #84136 (scanhex12).
- Escrituras para catálogos REST de Iceberg. #84684 (scanhex12).
- Fusiona todos los archivos de borrado por posición de Iceberg en archivos de datos. Esto reducirá la cantidad y el tamaño de los archivos Parquet en el almacenamiento de Iceberg. Sintaxis:
OPTIMIZE TABLE table_name. #85250 (scanhex12). - Soporte para
DROP TABLEen Iceberg (eliminación de catálogos REST/Glue + eliminación de los metadatos de la tabla). #85395 (scanhex12). - Soporte para mutaciones
ALTER DELETEen Iceberg con formato merge-on-read. #85549 (scanhex12). - Soporte para escrituras en DeltaLake. Cierra #79603. #85564 (Kseniia Sumarokova).
- Escribe más estadísticas de Iceberg (tamaños de columna, límites inferior y superior) en los metadatos (entradas del manifiesto) para la poda min-max. #85746 (scanhex12).
- Soporte para añadir/eliminar/modificar columnas en Iceberg para tipos simples. #85769 (scanhex12).
MergeTree y almacenamiento
- Todas las tablas ahora admiten la columna virtual
_table, no solo las tablas de tipo Merge. #63665 (Xiaozhe Yu). - Se añade SZ3 como códec de compresión con pérdida, pero con error acotado, para columnas de tipo
Float32yFloat64. #67161 (scanhex12). - Se añadió compatibilidad con actualizaciones ligeras para tablas de la familia
MergeTree. Las actualizaciones ligeras pueden usarse con una nueva sintaxis:UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. También se añadió la implementación de eliminaciones ligeras mediante actualizaciones ligeras, que puede habilitarse estableciendolightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov). - Se añadió compatibilidad con la columna virtual
_part_granule_offseten tablas de la familia MergeTree. Esta columna indica el índice de base cero del gránulo/marca al que pertenece cada fila dentro de su parte de datos. Esto resuelve #79572. #82341 (Amos Bird).
Compatibilidad con protocolos y client
- Implementar compatibilidad con el protocolo ArrowFlight RPC mediante la adición del motor de tabla
arrowflight. #74184 (zakr600). - Añadir compatibilidad con el comando
COPYdel protocolo PostgreSQL. #74344 (scanhex12). - Añadir compatibilidad con el client de C# para el protocolo MySQL. Esto cierra #83992. #84397 (scanhex12).
- Forzar conexiones seguras para
mysql_portypostgresql_port. #82962 (Shaohua Wang).
Funcionalidades de SQL y consultas
- Se admite
DESCRIBE SELECT, además deDESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi). - Se admite el uso de
USE DATABASE {name}. #81307 (Yarik Briukhovetskyi). - Se ha implementado la lectura desde projections para parallel replicas. Se ha añadido una nueva opción de configuración
parallel_replicas_support_projectionpara controlar si la compatibilidad con projections está habilitada. Para simplificar la implementación, la compatibilidad con projections solo se habilita cuandoparallel_replicas_local_planestá activo. #82807 (zoomxi).
Formatos
- Se agregó la configuración
format_schema_source, que define la fuente deformat_schema. #80874 (Tuan Pham Anh). - Se agregó
Hashcomo nuevo formato de salida. Calcula un único valor hash para todas las columnas y filas del resultado. Esto resulta útil para calcular una “huella digital” del resultado, por ejemplo, en casos de uso donde la transferencia de datos es un cuello de botella. Ejemplo:SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hashdevuelvee5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze).
Configuración del servidor y gestión de cargas de trabajo
- El ajuste del servidor
cpu_slot_preemptionhabilita la planificación preventiva de CPU para las cargas de trabajo y garantiza una asignación max-min justa del tiempo de CPU entre ellas. Se añaden nuevos ajustes de carga de trabajo para la limitación de CPU:max_cpus,max_cpu_shareymax_burst_cpu_seconds. #80879 (Sergei Trifonov). - Ahora se admite el ajuste de carga de trabajo
max_waiting_queries. Puede usarse para limitar el tamaño de la cola de consultas. Si se alcanza el límite, todas las consultas posteriores finalizarán con el errorSERVER_OVERLOADED. #81250 (Oleg Doronin). - Cierra la conexión TCP tras el número configurado de consultas o al alcanzar el umbral de tiempo configurado. Resuelve #68000. #81472 (Kenny Sun).
Almacenamiento en la Cloud
- Añade
extra_credentialsaAzureBlobStoragepara autenticarse medianteclient_idytenant_id. #84235 (Pablo Marcos).
Keeper
- Se añade la capacidad de configurar watches arbitrarios en consultas Multi de Keeper. #84964 (Mikhail Artemenko).
- Se admiten métricas parcialmente agregadas. #85328 (Mikhail Artemenko).
Funcionalidades experimentales
Motores de tabla y funciones de tabla
- Se añadieron el motor de tabla y la función de tabla de Ytsaurus. #77606 (MikhailBurdukov).
Mejoras en los índices de texto
- Se agregan las funciones
searchAnyysearchAll, que son herramientas de propósito general para buscar en índices de texto. #80641 (Elmi Ahmadov). - El índice de texto ahora admite el tokenizador
string. #81752 (Elmi Ahmadov). - Se cambió a 64 el valor predeterminado de la granularidad de los índices
text. Esto mejora el rendimiento esperado de la consulta de prueba promedio en benchmarks internos. #82162 (Jimmy Aguilar Mena). - El bitmap de 256 bits almacena ordenadas las etiquetas salientes de un estado, pero los estados salientes se guardan en disco en el orden en que aparecen en la tabla hash. Por lo tanto, una etiqueta apuntaría a un estado siguiente incorrecto al leer desde disco. #82783 (Elmi Ahmadov).
- Actualmente, el árbol FST se guarda en disco sin comprimir. Esto podría provocar un rendimiento deficiente o un mayor consumo de ancho de banda de E/S tanto al escribir como al leer en disco. #83093 (Elmi Ahmadov).
Actualizaciones de madurez de las funcionalidades
- catálogo pasó a beta. #85848 (Melvyn Peignon).
- Las actualizaciones ligeras pasaron de experimental a beta. #85952 (Anton Popov).
Mejoras de rendimiento
Ejecución de consultas y agregación
- Optimización trivial para el combinador de funciones de agregación
-If. #78454 (李扬). - Se añadió una nueva lógica (controlada por la configuración
enable_producing_buckets_out_of_order_in_aggregation, habilitada de forma predeterminada) que permite enviar algunos buckets fuera de orden durante la agregación con uso eficiente de memoria. Cuando algunos buckets de agregación tardan bastante más en fusionarse que otros, esto mejora el rendimiento al permitir que el iniciador vaya fusionando mientras tanto buckets con ID más altos. La desventaja es un uso de memoria potencialmente mayor (aunque no debería ser significativo). #80179 (Nikita Taranov). - El pipeline posterior al paso
TOTALSahora es multihilo. #80331 (UnamedRus). - Cuando la consulta de agregación contiene solo una única función
COUNT()sobre una columnaNOT NULL, la lógica de agregación se integra por completo durante el sondeo de la tabla hash. Esto evita asignar y mantener cualquier estado de agregación, lo que reduce significativamente el uso de memoria y la sobrecarga de CPU. Esto aborda parcialmente #81982. #82104 (Amos Bird). - Calcular la clave serializada de forma columnar al agrupar por varias columnas de cadena o numéricas. #83884 (李扬).
- Se implementó
addManyDefaultspara los combinadores-If. #83870 (Raúl Marín).
Optimizaciones de JOIN
- Se añade el nuevo ajuste
min_joined_block_size_rows(análogo amin_joined_block_size_bytes; valor predeterminado: 65409) para controlar el tamaño mínimo del bloque (en filas) de los bloques de entrada y salida de JOIN (si el algoritmo de join lo admite). Los bloques pequeños se compactarán. #81886 (Nikita Taranov). - Se optimizó el rendimiento de
HashJoinal eliminar el bucle adicional sobre las tablas hash en el caso típico de una sola columna clave; además, se eliminan las comprobaciones denull_mapyjoin_maskcuando siempre sontrue/false. #82308 (Nikita Taranov). - Las optimizaciones para
null_mapyJoinMaskde #82308 se aplicaron al caso de JOIN con múltiples disyunciones. Además, se optimizó la estructura de datosKnownRowsHolder. #83041 (Nikita Taranov). - Se usa un
std::vector<std::atomic_bool>simple para las banderas de join, a fin de evitar calcular un hash en cada acceso a ellas. #83043 (Nikita Taranov). - Se procesa
max_joined_block_rowsfuera del bucle principal de hash JOIN. Rendimiento ligeramente mejor en ALL JOIN. #83216 (Nikolai Kochetov). - No se preasigna memoria a las columnas de resultado cuando
HashJoinusa el modo de salidalazy. Esto es subóptimo, especialmente cuando el número de coincidencias es bajo. Además, conocemos la cantidad exacta de coincidencias una vez completado el join, por lo que podemos preasignar con mayor precisión. #83304 (Nikita Taranov). - Todos los JOIN
LEFT/INNERse convertirán automáticamente aRightAnysi el lado derecho está determinado funcionalmente por las columnas clave del join (todas las filas tienen valores únicos de clave de join). #84010 (Nikita Taranov). - Se mejoró el rendimiento de la aplicación de patch parts en modo
Join. #85040 (Anton Popov).
Mejoras en las consultas distribuidas
- Se introdujo una opción para trasladar la (des)compresión y la (des)serialización de bloques a los hilos del pipeline, en lugar de usar un único hilo asociado a una conexión de red. Se controla mediante el ajuste
enable_parallel_blocks_marshalling. Debería acelerar las consultas distribuidas que transfieren cantidades significativas de datos entre el iniciador y los nodos remotos. #78694 (Nikita Taranov). INSERT SELECTdistribuido en paralelo está habilitado de forma predeterminada en el modo en el queINSERT SELECTse ejecuta de forma independiente en cada segmento; consulte el ajusteparallel_distributed_insert_select. #80425 (Igor Nikonov).- Se comprimen los logs y los profile events en el protocolo nativo. En clústeres con más de 100 réplicas, los profile events sin comprimir ocupan entre 1 y 10 MB/s, y la barra de progreso responde con lentitud en conexiones lentas a Internet. Esto cierra #82533. #82535 (Alexey Milovidov).
INSERT SELECTdistribuido en paralelo está habilitado de forma predeterminada en el modo en el que INSERT SELECT se ejecuta de forma independiente en cada segmento; consulte el ajusteparallel_distributed_insert_select. #83040 (Igor Nikonov).- Se corrigió el cálculo del tamaño mínimo de tarea para las réplicas paralelas. #84752 (Nikita Taranov).
Mejoras en los índices
- Las consultas de búsqueda vectorial que usan un índice de similitud vectorial se completan con menor latencia gracias a la reducción de las lecturas de almacenamiento y del uso de CPU. #79103 (Shankar Iyer).
- Se respeta
merge_tree_min_{rows,bytes}_for_seekenfilterPartsByQueryConditionCachepara alinearlo con otros métodos que filtran por índices. #80312 (李扬). - Procesa primero los índices min-max de mayor granularidad. Cierra #75381. #83798 (Maruth Goyal).
- El índice de filtro bloom ahora se usa para condiciones como
has([c1, c2, ...], column), dondecolumnno es de tipoArray. Esto mejora el rendimiento de estas consultas, haciéndolas tan eficientes como el operadorIN. #83945 (Doron David). - Procesa los índices en orden ascendente de tamaño de archivo. El orden final de los índices prioriza los índices min-max y vectoriales (por simplicidad y selectividad, respectivamente), y después los índices pequeños. Dentro de los índices min-max/vectoriales también se prefieren los índices más pequeños. #84094 (Maruth Goyal).
- Anteriormente, los datos del índice de texto se dividían en varios segmentos (de forma predeterminada, cada segmento tenía un tamaño de 256 MiB). Esto podía reducir el consumo de memoria al construir el índice de texto; sin embargo, aumenta el espacio necesario en disco y el tiempo de respuesta de las consultas. #84590 (Elmi Ahmadov).
Optimizaciones de subconsultas
- Optimiza el plan generado para las subconsultas correlacionadas eliminando las operaciones
JOINredundantes mediante clases de equivalencia. Si existen expresiones equivalentes para todas las columnas correlacionadas, no se generaCROSS JOINcuando está habilitada la configuraciónquery_plan_correlated_subqueries_use_substitution. #82435 (Dmitry Novik). - Lee solo las columnas necesarias en una subconsulta correlacionada cuando actúa como argumento de la función
EXISTS. #82443 (Dmitry Novik).
Mejoras en Azure Blob Storage
- El motor de tabla
azureBlobStorageahora almacena en caché y reutiliza, cuando es posible, los tokens de autenticación de identidad administrada para evitar el throttling. #79860 (Nick Blakely). - Se reemplazó el client HTTP curl por el client HTTP poco para Azure Blob Storage. Se introdujeron varios ajustes para estos clients que reflejan los de S3. También se introdujeron tiempos de espera de conexión agresivos tanto para Azure como para S3. Se mejoró la introspección de los profile events y las métricas de Azure. El nuevo client está habilitado de forma predeterminada y ofrece latencias mucho mejores para consultas en frío sobre Azure Blob Storage. Se puede volver al client
Curlanterior estableciendoazure_sdk_use_native_client=false. #83294 (alesapin).
Mejoras del motor de almacenamiento
- Se corrige el filtrado por clave para los almacenamientos Redis y KeeperMap. #81833 (Pervakov Grigorii).
ATTACH PARTITIONya no provoca la invalidación de todas las cachés. #82377 (Alexey Milovidov).- Se evita mantener el bloqueo mientras se crean los datos de la instantánea de almacenamiento, para reducir la contención de bloqueos con una carga concurrente elevada. #83510 (Duc Canh Le).
- Eliminar partes temporales puede llevar tiempo (especialmente con S3), y actualmente se hace mientras se mantiene un bloqueo global en
MergeTreeBackgroundExecutor. Cuando necesitamos reiniciar todas las tablas debido a una pérdida de conexión y esperamos a que finalicen las tareas en segundo plano, las tablas pueden incluso quedarse atascadas en modo readonly durante una hora. Pero parece que no necesitamos este bloqueo para llamar acancel. #84311 (Alexander Tokmakov).
Mejoras de formato
- Nueva implementación del lector de Parquet. Suele ser más rápida y admite pushdown de filtros a nivel de página y
PREWHERE. Actualmente es experimental. Use la configuracióninput_format_parquet_use_native_reader_v3para habilitarla. #82789 (Michael Kolupaev). - Se mejoró el rendimiento del formato de entrada ProtobufSingle reutilizando el serializador cuando no se producen errores de análisis. #83613 (Eduard Karacharov).
Optimizaciones de tipos de datos y de serialización
- Mejora significativamente el rendimiento de lectura de subcolumnas
JSONdesde datos compartidos en MergeTree al implementar nuevas serializaciones para los datos compartidos deJSONen MergeTree. #83777 (Pavel Kruglov). - Optimiza la deserialización de cadenas al simplificar el código. Cierra #38564. #84561 (Alexey Milovidov).
Mejoras en el pipeline y la ejecución
- Minimiza las copias de memoria en los encabezados de los puertos durante la construcción del pipeline. PR original #70105 por heymind. #83381 (Raúl Marín).
- Mejora el rendimiento de la construcción del pipeline. #83631 (Raúl Marín).
- Optimiza MergeTreeReadersChain::getSampleBlock. #83875 (Raúl Marín).
- Optimiza la materialización de constantes en los casos en los que esta solo se realiza para devolver una sola fila. #85071 (Alexey Milovidov).
Optimizaciones de memoria y recursos
- Ajustar algunas configuraciones de jemalloc para mejorar el rendimiento. #81807 (Antonio Andelic).
- Añadir alineación al Counter de ProfileEvents para reducir el
false sharing. #82697 (Jiebin Sun). - Reducir las llamadas innecesarias a memcpy en CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).
Planificación y análisis de consultas
- Mejora del rendimiento de QueryTreeHash. #82617 (Nikolai Kochetov).
Mejoras de logging
- Se incorpora logging asíncrono. #82516 (Raúl Marín).
Optimizaciones de funciones
- Se optimizó
largestTriangleThreeBucketseliminando datos temporales. #84479 (Alexey Milovidov). - Se optimizó y simplificó la implementación de muchas funciones de procesamiento de cadenas. Se corrigió la documentación incorrecta de varias funciones. Nota: El resultado de
byteSizepara columnas String y tipos complejos que contienen columnas String ha cambiado de 9 bytes por cadena vacía a 8 bytes por cadena vacía, lo cual es el comportamiento esperado. #85063 (Alexey Milovidov).
Mejoras de Keeper
- Mejora de Keeper con la carga inicial de RocksDB. #83390 (Antonio Andelic).
Mejoras en el lago de datos
- Mejora del procesamiento paralelo de archivos con el backend de delta-kernel-rs. #85642 (Azat Khuzhin).
Mejoras
Control de acceso y seguridad
- Se introducen dos nuevos tipos de acceso:
READyWRITEpara las fuentes, y se deprecian todos los tipos de acceso anteriores relacionados con las fuentes. Antes,GRANT S3 ON *.* TO user; ahora:GRANT READ, WRITE ON S3 TO user. Esto también permite separar los permisosREADyWRITEpara las fuentes; por ejemplo:GRANT READ ON * TO user,GRANT WRITE ON S3 TO user. Esta funcionalidad se controla mediante la configuraciónaccess_control_improvements.enable_read_write_grantsy está deshabilitada de forma predeterminada. #73659 (pufit). - Se permiten parámetros en las consultas
CREATE USERpara nombres de usuario. #81387 (Diskein). - Se excluyen los datos sensibles de los volcados de memoria. Se añaden dos asignadores:
AwsNodumpMemoryManager, compatible con la biblioteca de AWS, yJemallocNodumpSTLAllocator, compatible con STL. Ambos son envoltorios del asignador jemalloc. Usan los extent hooks de jemalloc ymadvisepara marcar las páginas de memoria como “don’t dump”. Se usan para credenciales de S3, credenciales de usuario y algunos datos de consultas. #82441 (Miсhael Stetsyuk). - Las vistas creadas por usuarios efímeros ahora almacenarán una copia del usuario real y ya no se invalidarán después de que se elimine el usuario efímero. #84763 (pufit).
forward_headersde la autenticación externa ahora se compara sin distinguir entre mayúsculas y minúsculas. #84737 (ingodwerust).- Se añade una columna
parameterasystem.grantspara determinar el tipo de fuente paraGRANT READ/WRITEy el motor de tabla paraGRANT TABLE ENGINE. #85643 (MikhailBurdukov).
Copia de seguridad y restauración
- Se permiten copias de seguridad de bases de datos PostgreSQL, MySQL y DataLake. Una copia de seguridad de una base de datos de este tipo solo guarda la definición, no los datos que contiene. #79982 (Nikolay Degterinsky).
- Se establece TRACE para todos los mensajes de registro relacionados con la escritura de archivos de copia de seguridad. #82907 (Hans Krutzer).
- Se introducen
backup_restore_s3_retry_initial_backoff_ms,backup_restore_s3_retry_max_backoff_ms,backup_restore_s3_retry_jitter_factorpara configurar la estrategia de backoff de reintentos de S3 utilizada durante las operaciones de copia de seguridad y restauración. #84421 (Julia Kartseva). - Se introduce un nuevo ajuste
backup_slow_all_threads_after_retryable_s3_errorpara reducir la presión sobre S3 durante ráfagas de reintentos causadas por errores comoSlowDown, ralentizando todos los hilos en cuanto se detecta un único error reintentable. #84854 (Julia Kartseva).
Integridad y validación de datos
- Verifique que la parte tenga un archivo
checksum.txtcoherente justo antes de hacer commit. #76625 (Sema Checherinda). - Se prohíbe iniciar una mutación ALTER
RENAME COLUMNsi va a renombrar alguna columna que en ese momento esté afectada por una mutación de datos incompleta. #81823 (Mikhail Artemenko). - Ahora la instantánea de mutaciones se construirá a partir de la instantánea de las partes visibles. Los contadores de mutación usados en la instantánea también se recalcularán a partir de las mutaciones incluidas. #82945 (Mikhail Artemenko).
- Se añade la capacidad de analizar el prefijo y el sufijo de la parte, y también de comprobar la cobertura de las columnas no constantes. #83377 (Mikhail Artemenko).
Motor de tabla Iceberg
- Admite eliminaciones posicionales para el motor de tabla Iceberg. #80237 (YanghongZhong).
- Ahora ClickHouse admite archivos
metadata.jsoncomprimidos para Iceberg. Corrige #70874. #81451 (alesapin). - Corrige la lectura de Iceberg por identificadores de campo para tipos complejos. #84821 (scanhex12).
- Admite escrituras en Iceberg que pueden leerse desde pyiceberg. #84466 (scanhex12).
- Añade la versión de instantánea a los motores de tabla de lago de datos. #84659 (Pete Hampton).
- Admite la escritura de un archivo version-hint con Iceberg. Esto cierra #85097. #85130 (scanhex12).
- Admite el archivo
.metadata.jsoncomprimido mediante la configuracióniceberg_metadata_compression_method. Admite todos los métodos de compresión de ClickHouse. Esto cierra #84895. #85196 (scanhex12). - Se optimizó el uso de memoria para los archivos de eliminación posicional de Iceberg. En lugar de cargar en memoria todos los datos del archivo de eliminación, solo se mantiene en RAM el grupo de filas actual de los archivos de eliminación Parquet. Esto reduce significativamente el consumo de memoria al trabajar con archivos de eliminación posicional grandes. #85329 (scanhex12).
- Permite iterar de forma asíncrona los objetos de una tabla Iceberg sin almacenar explícitamente objetos para cada archivo de datos. #85369 (Daniil Ivanik).
- Admite eliminaciones por igualdad de Iceberg. #85843 (Han Fei).
Motor de tabla DeltaLake
- Mejora del motor de tabla
DeltaLake: delta-kernel-rs tiene la APIExpressionVisitor, que se implementa en este PR y se aplica a la transformación de expresiones de columnas de partición (reemplazará el método obsoleto de delta-kernel-rs que se usaba antes en nuestro código). En el futuro, esteExpressionVisitortambién permitirá implementar pruning basado en estadísticas y algunas funcionalidades propietarias de delta-lake. Además, este cambio tiene como objetivo dar soporte a la poda de particiones en el motor de tablaDeltaLakeCluster(el resultado de una expresión analizada,ActionsDAG, se serializará y se enviará desde el iniciador junto con la ruta de datos, porque este tipo de información, necesaria para el pruning, solo está disponible como metainformación en el listado de archivos de datos, que solo realiza el iniciador, pero debe aplicarse a los datos en cada servidor de lectura). #81136 (Kseniia Sumarokova). - Corrección de la poda de particiones con funciones de clúster de lago de datos. #82131 (Kseniia Sumarokova).
- Corrección de la lectura de datos particionados en la función de tabla DeltaLakeCluster. En este PR se incrementa la versión del protocolo de las funciones de clúster, lo que permite enviar información adicional desde el iniciador a las réplicas. Esta información adicional contiene la expresión de transformación de delta-kernel, necesaria para analizar las columnas de partición (y, en el futuro, algunas otras cosas, como las columnas generadas, etc.). #82132 (Kseniia Sumarokova).
- Ahora la base de datos Datalake lanza una excepción más clara. Corrige #81211. #82304 (alesapin).
- Implementación del filtrado interno de
delta-kernel-rs(estadísticas y poda de particiones) en el almacenamientoDeltaLake. #84006 (Kseniia Sumarokova). - Se añade la configuración
delta_lake_enable_expression_visitor_loggingpara desactivar los logs de expression visitor, ya que pueden ser demasiado verbosos incluso para el nivel de logs de prueba al depurar algo. #84315 (Kseniia Sumarokova). - Se añade la configuración
delta_lake_snapshot_versionpara permitir leer una versión específica de instantánea en el motor de tablaDeltaLake. #85295 (Kseniia Sumarokova).
Integración con lago de datos
- Acelera el listado de tablas en los catálogos de datos mediante solicitudes asíncronas. #81084 (alesapin).
- Se admite
TimestampTZen el catálogo de Glue. Cierra #81654. #83132 (scanhex12). - Divide FormatParserGroup en dos structs independientes: el primero se encarga de los recursos compartidos de cómputo e IO, y el segundo, de los recursos compartidos de filtrado (filter ActionDag, KeyCondition). Esto se hace para permitir un uso compartido más flexible de estas estructuras entre distintos hilos. #83997 (Daniil Ivanik).
- Añade
partition_columns_in_data_file, que faltaba, a la configuración de Azure. #85373 (Arthur Passos). - Añade el indicador show_data_lake_catalogs_in_system_tables para controlar la incorporación de tablas de lago de datos en system.tables; resuelve #85384. #85411 (Smita Kulkarni).
S3 y almacenamiento de objetos
- Implementa los métodos
moveFileyreplaceFileens3_plain_rewritablepara que pueda usarse como disco de base de datos. #79424 (Tuan Pham Anh). - Las solicitudes de lectura y escritura de S3 se limitan a nivel del socket HTTP (en lugar de a nivel de solicitudes S3 completas) para evitar problemas con la limitación de
max_remote_read_network_bandwidth_for_serverymax_remote_write_network_bandwidth_for_server. #81837 (Sergei Trifonov). - Este PR introduce jitter en el mecanismo de reintento de S3 cuando la configuración
s3_slow_all_threads_after_network_errorestá habilitada. #81849 (zoomxi). - Implementa la autenticación de AWS S3 con un rol de IAM proporcionado explícitamente. Implementa OAuth para GCS. Estas funcionalidades hasta hace poco solo estaban disponibles en ClickHouse Cloud y ahora se han liberado como código abierto. Sincroniza algunas interfaces, como la serialización de los parámetros de conexión para almacenamientos de objetos. #84011 (Alexey Milovidov).
- Permite usar cualquier política de almacenamiento (es decir, almacenamiento de objetos, como S3) para la agregación/ordenación externas. #84734 (Azat Khuzhin).
- Agrupa todos los objetos eliminados para ejecutar una sola operación de eliminación en el almacenamiento de objetos. #85316 (Mikhail Artemenko).
Motor de tabla S3Queue
- Ahora se pueden usar macros como
{uuid}en la configuraciónkeeper_pathdel motor de tabla S3Queue. #82463 (Nikolay Degterinsky). - Se añade una nueva configuración del servidor,
s3queue_disable_streaming, que deshabilita el streaming en tablas con el motor de tabla S3Queue. Esta configuración se puede cambiar sin reiniciar el servidor. #82515 (Kseniia Sumarokova). - Se añaden las columnas
commit_time,commit_idasystem.s3queue_log. #83016 (Kseniia Sumarokova). - Se añaden registros para el proceso de apagado de S3Queue. #83163 (Kseniia Sumarokova).
- Se detiene el streaming de S3(Azure/etc)Queue antes de detener cualquier tabla durante el apagado del servidor. #83530 (Kseniia Sumarokova).
- Se admite cambiar la configuración de inserción de MV en el nivel de tabla
S3Queue. Se añaden nuevas configuraciones de nivelS3Queue:min_insert_block_size_rows_for_materialized_viewsymin_insert_block_size_bytes_for_materialized_views. De forma predeterminada, se usarán las configuraciones de nivel de perfil, y las configuraciones de nivelS3Queuelas sobrescribirán. #83971 (Kseniia Sumarokova). - Corrección del modo ordenado de S3Queue: salir antes si se solicitó el apagado. #84463 (Kseniia Sumarokova).
Integración de Kafka
- Contar manualmente los mensajes consumidos para evitar depender del offset previamente confirmado en StorageKafka2. #81662 (János Benjamin Antal).
- Integrar
StorageKafka2consystem.kafka_consumers. #82652 (János Benjamin Antal).
Mejoras de ClickHouse Keeper
- Mejora de Keeper: mover archivos changelog entre discos en un hilo en segundo plano. Anteriormente, mover el changelog a un disco distinto bloqueaba Keeper de forma global hasta que finalizara el traslado. Esto provocaba una degradación del rendimiento si el traslado era una operación larga (por ejemplo, a un disco S3). #82485 (Antonio Andelic).
- Mejora de Keeper: añadir una nueva configuración
keeper_server.cleanup_old_and_ignore_new_acl. Si está habilitada, se borrarán las ACL de todos los nodos, mientras que se ignorarán las ACL de las solicitudes nuevas. Si el objetivo es eliminar por completo las ACL de los nodos, es importante dejar esta configuración habilitada hasta que se cree un nuevo snapshot. #82496 (Antonio Andelic). - Mejora de Keeper: admitir permisos específicos para la ACL
world:anyone. #82755 (Antonio Andelic). - Añade compatibilidad para especificar ACL adicionales de Keeper para paths en la configuración. Si desea añadir ACL adicionales para un path específico, defínalas en la configuración, en
zookeeper.path_acls. #82898 (Antonio Andelic). - Añade un ProfileEvent cuando Keeper rechaza una escritura debido al límite flexible de memoria. #82963 (Xander Garbett).
- Habilita de forma predeterminada los feature flags
create_if_not_exists,check_not_existsyremove_recursiveen Keeper, lo que permite nuevos tipos de solicitudes. #83488 (Antonio Andelic). - Añade compatibilidad para aplicar ACL adicionales en nodos específicos de Keeper mediante la configuración
apply_to_children. #84137 (Antonio Andelic). - Añade el comando
get_acla KeeperClient. #84641 (Antonio Andelic). - Añade 4LW en Keeper,
lgrq, para activar o desactivar el registro de solicitudes recibidas. #84719 (Antonio Andelic). - Reduce la contención del bloqueo de almacenamiento en Keeper. #84732 (Antonio Andelic).
- La herramienta
encrypt_decryptahora admite conexiones a ZooKeeper cifradas. #84764 (Roman Vasin). - Limita el tamaño de la caché de entradas de log de Keeper por número de entradas mediante
keeper_server.coordination_settings.latest_logs_cache_entry_count_thresholdykeeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic).
Tipos JSON y Dynamic
- Se añade el archivo
columns_substreams.txta la parte Wide para hacer un seguimiento de todos los subflujos almacenados en ella. Esto facilita el seguimiento de los flujos dinámicos en los tipos JSON y Dynamic y evita tener que leer una muestra de estas columnas para obtener la lista de flujos dinámicos (por ejemplo, para calcular el tamaño de las columnas). Además, ahora todos los flujos dinámicos se reflejan ensystem.parts_columns. #81091 (Pavel Kruglov). - Se permite
ALTER UPDATEen columnas JSON y Dynamic. #82419 (Pavel Kruglov). - Ahora se pueden usar los tipos
TimeyTime64dentro del tipo JSON. #83784 (Yarik Briukhovetskyi). - Se añade la configuración
json_type_escape_dots_in_keyspara escapar los puntos en las claves JSON durante el análisis del tipo JSON. Esta configuración está deshabilitada de forma predeterminada. #84207 (Pavel Kruglov).
Formatos Parquet y ORC
- Se introducen opciones de configuración para establecer el tamaño del bloque de compresión de ORC, y se actualiza su valor predeterminado de 64KB a 256KB para mantener la coherencia con Spark o Hive. #80602 (李扬).
- Se admite escribir
enumde Parquet como matriz de bytes, tal como lo dicta la especificación. Más adelante escribiré más información. #81090 (Arthur Passos). - Se admite escribir geoparquets como formato de salida. #81784 (scanhex12).
Consultas distribuidas y réplicas paralelas
- Se ha introducido un nuevo ajuste, enable_add_distinct_to_in_subqueries. Cuando está habilitado, ClickHouse añadirá automáticamente DISTINCT a las subconsultas en cláusulas IN para consultas distribuidas. Esto puede reducir significativamente el tamaño de las tablas temporales transferidas entre segmentos y mejorar la eficiencia de la red. Nota: esto implica una compensación: aunque se reduce la transferencia por red, cada nodo requiere trabajo adicional de fusión (deduplicación). Habilita este SETTING cuando la transferencia por red sea un cuello de botella y el coste de fusión sea aceptable. #81908 (fhw12345).
- Se añade compatibilidad con las funciones de tabla
remote-()y las réplicas paralelas si se proporciona un clúster en el argumentoaddress_expression. Además, corrige #73295. #82904 (Igor Nikonov). - Las consultas JOIN con réplicas paralelas ahora usan el paso lógico de join. Si surge algún problema con consultas JOIN que usen réplicas paralelas, prueba
SET query_plan_use_new_logical_join_step=0y notifícalo. #83801 (Vladimir Cherkasov).
Ajustes y configuración
- Marcar como obsoleto el ajuste
allow_experimental_join_condition. #80566 (Vladimir Cherkasov). - Los limitadores de red globales y por usuario nunca se restablecen, lo que garantiza que nunca se superen los límites
max_network_bandwidth_for_all_usersymax_network_bandwidth_for_all_users. #81729 (Sergei Trifonov). - Introducir el ajuste
optimize_rewrite_regexp_functions(habilitado de forma predeterminada), que permite al optimizador reescribir determinadas llamadas areplaceRegexpAll,replaceRegexpOneyextracten formas más simples y eficientes cuando detecta patrones específicos de expresiones regulares. (issue #81981). #81992 (Amos Bird). - Ajustar la cola de los servidores TCP (64 de forma predeterminada) en función de
listen_backlog(4096 de forma predeterminada). #82045 (Azat Khuzhin). - Añadir la capacidad de recargar
max_local_read_bandwidth_for_serverymax_local_write_bandwidth_for_serveren caliente, sin reiniciar el servidor. #82083 (Kai Zhu). - Introducir el ajuste
enable_vector_similarity_index, que debe estar habilitado para usar el índice de similitud vectorial. El ajuste existenteallow_experimental_vector_similarity_indexahora es obsoleto. Sigue funcionando en caso de que alguien lo necesite. #83459 (Robert Schulze). - Añadir
max_joined_block_size_bytes, además demax_joined_block_size_rows, para limitar el uso de memoria de los JOIN con columnas pesadas. #83869 (Nikolai Kochetov). - Corregir la compatibilidad de
cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova). - Habilitar por defecto la compatibilidad con subconsultas correlacionadas. #85107 (Dmitry Novik).
- Añadir ajustes
database_replicatedque definen los valores predeterminados de DatabaseReplicatedSettings. Si el ajuste no está presente en la consulta CREATE de la DB Replicated, se utiliza el valor de este SETTING. #85127 (Tuan Pham Anh). - Permitir argumentos clave-valor en el motor o función de tabla
s3os3Cluster, por ejemplos3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova). - Ejecutar
EXISTSno correlacionado como una subconsulta escalar. Esto permite usar una caché de subconsultas escalares y aplicar plegado de constantes al resultado, lo que resulta útil para los índices. Por compatibilidad, se añade el nuevo ajusteexecute_exists_as_scalar_subquery=1. #85481 (Nikolai Kochetov). - Admitir la resolución de más casos de identificadores compuestos. En particular, mejora la compatibilidad de
ARRAY JOINcon el analizador antiguo. Introducir un nuevo ajusteanalyzer_compatibility_allow_compound_identifiers_in_unflatten_nestedpara mantener el comportamiento anterior. #85492 (Nikolai Kochetov).
Tablas del sistema y observabilidad
- Se añaden métricas de presión a las métricas asíncronas de ClickHouse. #80779 (Xander Garbett).
- Se añaden las métricas
MarkCacheEvictedBytes,MarkCacheEvictedMarksyMarkCacheEvictedFilespara rastrear las expulsiones de la mark cache. (issue #60989). #80799 (Shivji Kumar Jha). - La tabla
system.formatsahora contiene información ampliada sobre los formatos, como el tipo de contenido HTTP, las capacidades de inferencia de esquemas, etc. #81505 (Alexey Milovidov). - Se añade compatibilidad para borrar todas las advertencias de la tabla
system.warningsmedianteTRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov). - Se listan las licencias de los crates de Rust en
system.licenses. #82440 (Raúl Marín). - Se estiman CNF/DNF complejas, por ejemplo,
(a < 1 and a > 0) or b = 3, mediante estadísticas. #82663 (Han Fei). - En algunos casos, necesitamos varias dimensiones en nuestras métricas. Por ejemplo, contar merges o mutations fallidos por códigos de error en lugar de usar un único contador. #83030 (Miсhael Stetsyuk).
- Se añaden métricas de recurso del proceso (como
UserTimeMicroseconds,SystemTimeMicrosecondsyRealTimeMicroseconds) a los profile events de part_log para las entradasMergeParts. #83460 (Vladimir Cherkasov). - Las métricas a nivel de Cgroup y las métricas de todo el sistema ahora se informan conjuntamente. Las métricas a nivel de Cgroup tienen nombres
CGroup<Metric>y las métricas a nivel del SO (recopiladas desde procfs) tienen nombresOS<Metric>. #84317 (Nikita Taranov). - Se añaden métricas dimensionales para supervisar el tamaño de las colas acotadas concurrentes, etiquetadas por tipo de cola e ID de instancia para una mejor observabilidad. #84675 (Miсhael Stetsyuk).
- La tabla
system.columnsahora proporcionacolumncomo alias de la columnanameexistente. #84695 (Yunchi Pang). - Se añade una columna de format string a
system.errors. Esta columna es necesaria para agrupar por el mismo tipo de error en las reglas de alert. #84776 (Miсhael Stetsyuk). - Los límites de Async Log ahora pueden ajustarse y se añade introspección. #85105 (Raúl Marín).
- Se ignora
UNKNOWN_DATABASEal obtener el tamaño de las columnas de tabla para system.columns. #85632 (Azat Khuzhin).
Motores de base de datos
Mejoras del sistema e internas
- Corrige el adjuntado de bases de datos con discos remotos de solo lectura añadiendo manualmente los UUID de las tablas a DatabaseCatalog. #82670 (Tuan Pham Anh).
- Mejora la gestión de tareas DDL cuando
distributed_ddl_output_mode='*_only_active'al no esperar a réplicas nuevas o recuperadas cuyo retraso de replicación superemax_replication_lag_to_enqueue. Esto ayuda a evitar erroresDDL task is not finished on some hostscuando una nueva réplica pasa a estar activa tras la inicialización o la recuperación, pero ha acumulado un registro de replicación extenso. También se implementó la consultaSYSTEM SYNC DATABASE REPLICA STRICT, que espera a que el registro de replicación descienda por debajo demax_replication_lag_to_enqueue. #83302 (Alexander Tokmakov). - Cambia el orden de apagado de SystemLogs para que se produzca después de las tablas normales (y antes de las tablas del sistema, en lugar de antes de las tablas normales). #83134 (Kseniia Sumarokova).
- Añade la configuración del servidor
logs_to_keepa la configuración de bases de datos Replicated, lo que permite establecer el parámetro predeterminadologs_to_keeppara las bases de datos Replicated. Los valores más bajos reducen el número de nodos de ZooKeeper (especialmente beneficioso cuando hay muchas bases de datos), mientras que los valores más altos permiten que las réplicas ausentes se pongan al día tras períodos más largos de inactividad. #84183 (Alexey Khatskevich). - Cambia el valor predeterminado de la configuración de la base de datos Replicated
max_retries_before_automatic_recoverya 10, lo que permite una recuperación más rápida en algunos casos. #84369 (Alexander Tokmakov). - Optimiza las operaciones DDL de vistas materializadas actualizables no append en bases de datos Replicated al omitir la creación y el cambio de nombre de tablas temporales antiguas. #84858 (Tuan Pham Anh).
Replicación y sincronización
Mejoras del sistema e internas
- Mejorar
SYSTEM RESTART REPLICApara reintentar la creación de tablas cuando se produzcan problemas de conexión con ZooKeeper, evitando que las tablas se pierdan. #82616 (Nikolay Degterinsky). - Añadir validación de UUID en
ReplicatedMergeTree::executeMetadataAlterpara evitar definiciones de tablas incorrectas cuando se intercambian tablas entre la obtención delStorageIDy la llamada aIDatabase::alterTable. #82666 (Nikolay Degterinsky). - Eliminar la lógica experimental
send_metadatarelacionada con la replicación experimental zero-copy. Este código nunca se usó, no era compatible y probablemente estaba roto, sin pruebas para verificar su funcionamiento. #82508 (alesapin). - Añadir compatibilidad con la expansión de macros en
remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin).
Funciones y expresiones
- La función
addressToSymboly la tablasystem.symbolsusarán desplazamientos dentro del archivo en lugar de direcciones de memoria virtual. #81896 (Alexey Milovidov). - Intenta preservar los nombres de los elementos al derivar supertipos para tuplas con nombre. #81345 (lgbo).
- Se permite mezclar diferentes reglas de ordenación para la misma columna en distintas ventanas. #82877 (Yakov Olkhovskiy).
- Se añade una función para escribir tipos en formato wkb. #82935 (scanhex12).
- Se añade la capacidad de interpretar
TimeyTime64en formato MM:SS, M:SS, SS o S. #83299 (Yarik Briukhovetskyi). - La función
reinterpret()ahora admite la conversión aArray(T), dondeTes un tipo de datos de tamaño fijo (incidencia #82621). #83399 (Shankar Iyer). - Se corrigen las funciones
structureToProtobufSchemaystructureToCapnProtoSchemapara que añadan correctamente un byte nulo de terminación en lugar de usar un salto de línea, lo que evita la falta de saltos de línea en la salida y posibles desbordamientos de búfer en las funciones que dependen del byte nulo (comologTrace,demangle,extractURLParameter,toStringCutToZeroyencrypt/decrypt). Cierra #85062. #85063 (Alexey Milovidov). - Corrige la estructura del diccionario
regexp_treepara admitir el procesamiento de cadenas con bytes nulos. #85063 (Alexey Milovidov). - Se corrigió la función
formatRowNoNewline, que por error truncaba el último carácter de la salida cuando se llamaba con el formatoValueso con cualquier formato sin un salto de línea al final de las filas. #85063 (Alexey Milovidov). - Se corrige un error de seguridad ante excepciones en la función
stemque, en casos poco frecuentes, podía provocar fugas de memoria. #85063 (Alexey Milovidov). - Se corrigió la función
initcappara argumentosFixedStringpara que reconozca correctamente el inicio de las palabras al comienzo de las cadenas cuando la cadena anterior de un bloque terminaba con un carácter de palabra. #85063 (Alexey Milovidov). - Se solucionó una vulnerabilidad de seguridad en el formato Apache
ORCque podía provocar la exposición de memoria no inicializada. #85063 (Alexey Milovidov). - Se cambió el comportamiento de
replaceRegexpAlly su aliasREGEXP_REPLACEpara permitir coincidencias vacías al final de las cadenas, incluso cuando la coincidencia anterior procesó toda la cadena (p. ej.,^a*|a*$o^|.*), en consonancia con la semántica de JavaScript, Perl, Python, PHP y Ruby, pero a diferencia de PostgreSQL. #85063 (Alexey Milovidov). - Se optimizó y simplificó la implementación de muchas funciones de manejo de cadenas. Se corrigió la documentación incorrecta de varias funciones. Nota: La salida de
byteSizepara columnas String y tipos complejos que contienen columnas String ha cambiado de 9 bytes por cadena vacía a 8 bytes por cadena vacía, que es el comportamiento esperado. #85063 (Alexey Milovidov). - Permitir un paso de cero en las funciones
timeSeries*ToGrid(). Esta es la parte#3de https://github.com/ClickHouse/ClickHouse/pull/75036. #85390 (Vitaly Baranov). - Se admiten arrays internos para la función
nested. #85719 (Nikolai Kochetov).
Mejoras de MergeTree
- Deshabilita de forma más precisa los índices de omisión que dependen de columnas actualizadas sobre la marcha o mediante partes de parche. Ahora, los índices de omisión solo dejan de usarse en las partes afectadas por mutaciones sobre la marcha o partes de parche; antes, se deshabilitaban para todas las partes. #84241 (Anton Popov).
- Añade la configuración de MergeTree
search_orphaned_parts_drivespara limitar el alcance de la búsqueda de partes, por ejemplo, por discos con metadatos locales. #84710 (Ilya Golshtein). - Añade la compatibilidad que faltaba de
read_in_order_use_virtual_rowparaWHERE. Esto permite omitir la lectura de más partes en consultas con filtros que no se habían transferido por completo aPREWHERE. #84835 (Nikolai Kochetov). - Corrige el uso de la serialización de discriminadores Variant “compact” en MergeTree. Antes no se usaba en algunos casos en los que sí podía utilizarse. #84141 (Pavel Kruglov).
- Añade un límite (configuración de tabla
max_uncompressed_bytes_in_patches) para el total de bytes sin comprimir en partes de parche. Esto evita ralentizaciones significativas de las consultasSELECTdespués de actualizaciones ligeras y previene un posible uso indebido de esta función. #85641 (Anton Popov).
Gestión de la caché y la memoria
- Se corrige un error lógico en la caché del sistema de archivos: “Tiene cero bytes, pero el rango no ha terminado”. #81868 (Kseniia Sumarokova).
- Se añade hash de rendezvous para mejorar la localidad de la caché. #82511 (Anton Ivashkin).
- Se refactoriza la funcionalidad de cambio de tamaño dinámico de la caché del sistema de archivos. Se añaden más logs para la introspección. #82556 (Kseniia Sumarokova).
- Se reduce la sobrecarga del seguimiento de memoria de las consultas para las funciones ejecutables definidas por el usuario. #83929 (Eduard Karacharov).
- Todas las asignaciones de memoria realizadas por bibliotecas externas ahora son visibles para el memory tracker de ClickHouse y se contabilizan correctamente. Esto puede dar lugar a un “aumento” del uso de memoria notificado para determinadas consultas o a fallos con
MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov). - Se asigna la cantidad mínima de memoria necesaria para encrypted_buffer en las colecciones con nombre cifradas. #84432 (Pablo Marcos).
Índice de similitud vectorial
- Se impide que el usuario use
naneinfconNumericIndexedVector. Corrige #82239 y algo más. #82681 (Raufs Dunamalijevs). - El índice de similitud vectorial ahora admite cuantización binaria. La cuantización binaria reduce significativamente el consumo de memoria y acelera el proceso de creación de un índice vectorial (gracias a un cálculo de distancias más rápido). Además, la configuración existente
vector_search_postfilter_multiplierquedó obsoleta y se sustituyó por una configuración más general:vector_search_index_fetch_multiplier. #85024 (Shankar Iyer). - La búsqueda vectorial aproximada con índices de similitud vectorial ya es GA. #85888 (Robert Schulze).
Manejo de errores y mensajes
- La cabecera Connection se envía al final de las cabeceras, cuando se sabe que la conexión debe mantenerse. #81951 (Sema Checherinda).
- En versiones anteriores, la multiplicación del estado de una función de agregación con IPv4 producía un error lógico en lugar de un código de error adecuado. Cierra #82817. #82818 (Alexey Milovidov).
- Se mejoró el manejo de errores en
AsynchronousMetrics. Si el directorio/sys/blockexiste pero no es accesible, el servidor se iniciará sin monitorizar los dispositivos de bloque. Cierra #79229. #83115 (Alexey Milovidov). - Había una comprobación incorrecta de dependencias para
INSERTcon vistas materializadas que tienenSELECTmal formados, y el usuario podía recibir unastd::exceptioncríptica en lugar de un error significativo con una explicación clara. Esto ya se ha corregido. Esto corrige: #82889. #83190 (Nikita Mikhaylov). - No mostrar descripciones demasiado largas de las acciones de expresiones en los mensajes de excepción. Cierra #83164. #83350 (Alexey Milovidov).
- Cuando el almacenamiento se está cerrando,
getStatuslanza una excepciónErrorCodes::ABORTED. Antes, esto hacía fallar la consultaSELECT. Ahora capturamos las excepcionesErrorCodes::ABORTEDy las ignoramos intencionadamente. #83435 (Miсhael Stetsyuk). - Los mensajes de excepción para determinadas situaciones al cargar y añadir proyecciones ahora son más fáciles de leer. #83728 (Robert Schulze).
- Comprobar si la conexión se ha cancelado antes de comprobar EOF para evitar leer de una conexión cerrada. Corrige #83893. #84227 (Raufs Dunamalijevs).
- Se mejoró el manejo del apagado del servidor para las conexiones del client al simplificar las comprobaciones internas. #84312 (Raufs Dunamalijevs).
- Los errores de bajo nivel durante la ejecución de UDF ahora fallan con el código de error
UDF_EXECUTION_FAILED, mientras que antes podían devolverse distintos códigos de error. #84547 (Xu Jia).
Mejoras en el formato de SQL
- Se corrige el formato inconsistente de
CREATE DICTIONARY. Cierra #82105. #82829 (Alexey Milovidov). - Se corrige el formato inconsistente de
TTLcuando contiene una funciónmaterialize. Cierra #82828. #82831 (Alexey Milovidov). - Se corrige el formato inconsistente de
EXPLAIN ASTen una subconsulta cuando contiene opciones de salida como INTO OUTFILE. Cierra #82826. #82840 (Alexey Milovidov). - Se corrige el formato inconsistente de expresiones entre paréntesis con alias en contextos donde no se permiten alias. Cierra #82836. Cierra #82837. #82867 (Alexey Milovidov).
- Se corrige el formato de CREATE USER con parámetros de consulta (es decir,
CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin). - Se corrige el análisis sintáctico de una coma final en las columnas de la consulta CREATE DICTIONARY después de una columna con parámetros, por ejemplo, Decimal(8). Cierra #85586. #85653 (Nikolay Degterinsky).
Integraciones externas
- Unificar los nombres de los parámetros en ODBC y JDBC al usar colecciones con nombre. #83410 (Andrey Zvonov).
- MongoDB: Conversión implícita de cadenas a tipos numéricos. Anteriormente, si se recibía un valor de cadena desde un origen de MongoDB para una columna numérica en una tabla de ClickHouse, se generaba una excepción. Ahora, el motor intenta analizar automáticamente el valor numérico de la cadena. Cierra #81167. #84069 (Kirill Nikiforov).
- Permitir
simdjsonen arquitecturas no compatibles (anteriormente provocaba erroresCANNOT_ALLOCATE_MEMORY). #84966 (Azat Khuzhin).
Mejoras varias
- Se añade el motor de tabla Ytsaurus y la función de tabla. #77606 (MikhailBurdukov).
- Se mejora HashJoin::needUsedFlagsForPerRightTableRow; devuelve false para cross join. #82379 (lgbo).
- Se permite escribir/leer columnas Map como un Array de Tuples. #82408 (MikhailBurdukov).
- Se revirtió este PR. #82884 (Mithun p).
- Async logs: se limita el número máximo de entradas que se mantienen en la cola. #83214 (Raúl Marín).
- Se habilita el uso de Date/Date32 como enteros en formatos de entrada JSON. #83597 (MikhailBurdukov).
- Se mejora la compatibilidad con índices bloom filter (regular, ngram y token) para que se utilicen cuando el primer argumento es un Array constante (el conjunto) y el segundo es la columna indexada (el subconjunto), lo que permite una ejecución de consultas más eficiente. #84700 (Doron David).
- Se permite la conversión de tipo de los valores Set al hacer pushdown de filtros
IN/GLOBAL INsobre las claves primarias del almacenamiento KeyValue (p. ej., EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov). - Se eliminan las exploraciones completas en los casos en que el análisis de índices da como resultado rangos vacíos para la lectura con réplicas paralelas. #84971 (Eduard Karacharov).
- Se corrige una lista de problemas que pueden producirse al intentar ejecutar pruebas de integración en un host local. #82135 (Oleg Doronin).
- Se habilita trace_log.symbolize de forma predeterminada para despliegues antiguos. #85456 (Azat Khuzhin).
Correcciones de errores (mal funcionamiento perceptible para el usuario en una versión estable oficial)
Optimizaciones de rendimiento
- Corrige la degradación del rendimiento en SummingMergeTree introducida en la versión 25.5 en https://github.com/ClickHouse/ClickHouse/pull/79051. #82130 (Pavel Kruglov).
- Corrige la degradación del rendimiento con el analyzer habilitado, cuando las consultas secundarias siempre leen todas las columnas de las VIEWs. Corrige #81718. #83036 (Dmitry Novik).
- No comprueba dependencias cíclicas al crear una tabla sin dependencias. Esto corrige la degradación del rendimiento en casos de uso con la creación de miles de tablas, introducida en https://github.com/ClickHouse/ClickHouse/pull/65405. #83077 (Pavel Kruglov).
- Hace que los agregados de ventana
DISTINCTse ejecuten en tiempo lineal y corrige un error ensumDistinct. Cierra #79792. Cierra #52253. #79859 (Nihal Z. Miaji).
Correcciones en la ejecución de consultas
- Para las consultas con la combinación
ORDER BY ... LIMIT BY ... LIMIT N, cuando ORDER BY se ejecuta como un PartialSorting, el contadorrows_before_limit_at_leastahora refleja el número de filas consumidas por la cláusula LIMIT en lugar del número de filas consumidas por la operación de ordenación. #78999 (Eduard Karacharov). - Se corrigió un error lógico con el operador
<=>y el almacenamiento Join; ahora la consulta devuelve el código de error adecuado. #80165 (Vladimir Cherkasov). - Se corrige un cierre inesperado en la función
loopcuando se usa con la familia de funcionesremote. Se garantiza que se respete la cláusula LIMIT enloop(remote(...)). #80299 (Julia Kartseva). - Corrige el comportamiento incorrecto de las funciones
to_utc_timestampyfrom_utc_timestampal manejar fechas anteriores a la época Unix (1970-01-01) y posteriores a la fecha máxima (2106-02-07 06:28:15). Ahora estas funciones acotan correctamente los valores al inicio de la época y a la fecha máxima, respectivamente. #80498 (Surya Kant Ranjan). - Corrige la ejecución de
INcontransform_null_in=1cuando hay NULL en el argumento izquierdo y el resultado de la subconsulta no es anulable. #81584 (Pavel Kruglov). - Se corrige el problema por el cual no se leen las columnas necesarias durante el procesamiento de subconsultas escalares correlacionadas. Corrige #81716. #81805 (Dmitry Novik).
- Corrige el análisis de filtros cuando en la consulta solo se utiliza una columna de alias constante. Corrige #79448. #82037 (Dmitry Novik).
- Corrige el error
Not found columnen consultas conarrayJoinen la condiciónWHEREeIndexSet. #82113 (Nikolai Kochetov). - Se corrige la excepción
TOO_DEEP_SUBQUERIEScuando la definición de una CTE hace referencia a otra expresión de tabla con el mismo nombre. #83413 (Dmitry Novik). - Corrige los resultados incorrectos de las consultas con la cláusula
WHERE ... IN (<subquery>)y la caché de condiciones de consulta activada (configuraciónuse_query_condition_cache). #83445 (LB7666). INSERT SELECTconUNION ALLpodía provocar la desreferenciación de un puntero nulo en un caso excepcional. Con esto se cierra #83618. #83643 (Alexey Milovidov).- Se corrigió
LOGICAL_ERRORdurante el análisis de expresiones de la política de filas para columnas correlacionadas. #82618 (Dmitry Novik). - Se corrigieron resultados erróneos cuando la caché de condiciones de consulta se utiliza junto con CTE recursivos (problema #81506). #84026 (zhongyuankai).
- Corrige el análisis recursivo infinito de definiciones no válidas de
WINDOW. Corrige #83131. #84242 (Dmitry Novik). - Se corrigió
Not-ready SetparaIN (subquery)dentro de la configuraciónadditional_table_filters expression. #85210 (Nikolai Kochetov). - Corrige un error lógico con subconsultas duplicadas cuando
optimize_syntax_fuse_functionsestá habilitado; cierra #75511. #83300 (Vladimir Cherkasov).
Correcciones de Iceberg y DataLake
- Se corrige la resolución de metadatos al consultar tablas Iceberg a través de REST catalog. … #80562 (Saurabh Kumar Ojha).
- Se corrigen las condiciones de carrera en Iceberg. #82088 (Azat Khuzhin).
- Se corrige “Context has expired” en Iceberg. #82146 (Azat Khuzhin).
- Ahora ClickHouse puede leer tablas Iceberg desde Glue catalog después de la evolución del esquema. Corrige #81272. #82301 (alesapin).
- Se corrigen las condiciones de carrera en Iceberg. #82841 (Azat Khuzhin).
- Se desactiva la poda de archivos basada en límites para elementos de Array de Iceberg y valores de map de Iceberg, incluidos todos sus subcampos anidados. #83520 (Daniil Ivanik).
- Se corrige la escritura en Iceberg para tipos complejos. #85330 (scanhex12).
- La escritura de límites inferiores y superiores no es compatible con tipos complejos. #85332 (scanhex12).
- Se corrige la nulabilidad de los campos en Iceberg. #85977 (scanhex12).
- Ya no se crea un archivo de eliminación de Iceberg vacío. #86061 (scanhex12).
- Se actualiza el timestamp de los metadatos en las escrituras de Iceberg. #85711 (scanhex12).
- Spark no puede leer archivos de eliminación por posición. #85762 (scanhex12).
- Deja de tomar el esquema de los manifest files, pero almacena de forma independiente los esquemas relevantes para cada snapshot. Infiere el esquema relevante para cada archivo de datos a partir de su snapshot correspondiente. El comportamiento anterior violaba la especificación de Iceberg para las entries de manifest files con estado existing. #84588 (Daniil Ivanik).
- Ahora Iceberg ya no intenta almacenar en caché la snapshot version relevante entre consultas SELECT y siempre intenta resolver el snapshot correctamente. El intento anterior de almacenar en caché el snapshot de Iceberg provocaba problemas al usar una tabla Iceberg con time travel. #85038 (Daniil Ivanik).
- Se corrige la resolución de metadatos al consultar tablas Iceberg a través de REST catalog. … #85531 (Saurabh Kumar Ojha).
- Se corrige el enmascaramiento de secretos en las table functions icebergS3Cluster e icebergAzureCluster. #85658 (MikhailBurdukov).
Correcciones de DeltaLake
- Corrige la poda de columnas con delta-kernel en el almacenamiento
DeltaLake. Cierra #84543. #84745 (Kseniia Sumarokova). - Actualiza las credenciales en delta-kernel en el almacenamiento DeltaLake. #84751 (Kseniia Sumarokova).
- Corrige un segfault en la implementación de delta-kernel. #85160 (Kseniia Sumarokova).
- Corrige una condición de carrera en la implementación de delta-kernel del motor
DeltaLake. #85221 (Kseniia Sumarokova). - Corrige la lectura de datos particionados con delta-kernel deshabilitado en el motor
DeltaLake. Se había roto en la versión 25.7 (https://github.com/ClickHouse/ClickHouse/pull/81136). #85223 (Kseniia Sumarokova). - Cambia a
falseel valor anterior a 25.5 deallow_experimental_delta_kernel_rspor compatibilidad. #84587 (Kseniia Sumarokova). - Corrige la lectura del recuento desde la caché para Delta Lake. #85704 (Kseniia Sumarokova).
Correcciones de TTL y MergeTree
- Recalcula el índice min-max cuando TTL reduce las filas para garantizar la corrección de los algoritmos que dependen de él, como
minmax_count_projection. Esto resuelve #77091. #77166 (Amos Bird). - Corrige el recálculo incorrecto de TTL en TTL GROUP BY al actualizar TTL. #81222 (Evgeniy Ulasik).
- Corrige el error “Context has expired” durante las fusiones cuando se usa un diccionario en la expresión TTL. #81690 (Azat Khuzhin).
- Corrige LOGICAL_ERROR y el fallo posterior al usar la misma columna en TTL para GROUP BY y SET. #82054 (Pablo Marcos).
- MergeTree ya no hace nada relacionado con TTL si se eliminan todos los TTL de la tabla. #84441 (alesapin).
- Corrige que
ALTER MODIFY ORDER BYno validara las columnas TTL en las claves de ordenación. Las columnas TTL ahora se rechazan correctamente cuando se usan en cláusulasORDER BYdurante operacionesALTER, lo que evita una posible corrupción de la tabla. #84536 (xiaohuanlin).
Correcciones de proyecciones
- Se corrige un error lógico al materializar una proyección cuando el tipo de la columna se cambiaba a Nullable. #80741 (Pavel Kruglov).
- Se corrige el uso incorrecto de los metadatos del padre en la función de tabla
mergeTreeProjectioncuandoenable_shared_storage_snapshot_in_query = 1. Esto corresponde a #82634. #82638 (Amos Bird). - Se corrige un bloqueo poco frecuente de ClickHouse cuando una tabla tiene una proyección,
lightweight_mutation_projection_mode = 'rebuild'y el usuario ejecuta un lightweight delete que elimina TODAS las filas de cualquier bloque de la tabla. #84158 (alesapin). - Se corrige la copia de seguridad de partes con proyecciones dañadas. #85362 (Antonio Andelic).
- Se prohíbe usar la columna
_part_offseten proyecciones en las versiones hasta que se estabilice. #85372 (Sema Checherinda).
Correcciones de réplicas paralelas
- En algunas consultas ejecutadas con réplicas paralelas, las optimizaciones de lectura en orden podían aplicarse en el iniciador, pero no en los nodos remotos. Esto hacía que el coordinador de réplicas paralelas (en el iniciador) y los nodos remotos usaran modos de lectura distintos, lo cual es un error lógico. #80652 (Igor Nikonov).
- Se deshabilitan las réplicas paralelas cuando una subconsulta contiene
FINAL#81401 por . #83455 (zoomxi). - Se corrige
LOGICAL_ERRORen consultas con réplicas paralelas y múltiples JOIN INNER seguidos de un JOIN RIGHT. No se usan réplicas paralelas para esas consultas. #84299 (Vladimir Cherkasov). - Las consultas con réplicas paralelas que usan la optimización de lectura inversa en orden pueden producir resultados incorrectos. #85406 (Igor Nikonov).
Autenticación y seguridad
- Se corrige la ocultación de los valores de las named collections en logs/query_log. Cierra #82405. #82510 (Kseniia Sumarokova).
- Se establece la sal para los datos de autenticación al analizarlos desde el AST con el tipo SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
- Se ocultan los detalles de autenticación del schema registry de Avro para que no sean visibles para el usuario ni en los logs. #83713 (János Benjamin Antal).
- Se corrige el comportamiento incorrecto por el que, al ejecutar
REVOKE S3 ON system.*, se revocan los permisos de S3 para*.*. Esto corrige #83417. #83420 (pufit). - Se corrige un fallo del servidor cuando un usuario creado con
no_passwordintenta iniciar sesión después de que la configuración del servidorallow_no_passwordse cambiara a 0. #84426 (Shankar Iyer). - Se mejora el mensaje de error al intentar crear un usuario identificado con JWT. #85072 (Konstantin Bogdanov).
- Se ocultan las credenciales de
deltaLakeAzure,deltaLakeCluster,icebergS3ClustereicebergAzureCluster. #85889 (Julian Maicher). - Se corrige un error introducido en #79963. Al insertar en una vista materializada con un definidor, la comprobación de permisos debe usar los privilegios del definidor. Corrige #79951. #83502 (pufit).
Correcciones en copias de seguridad y restauración
- Se corrige la copia de seguridad de una tabla
Memoryvacía, que provocaba que fallara la restauración de la copia de seguridad con el errorBACKUP_ENTRY_NOT_FOUND. #82791 (Julia Kartseva). - Se corrige un mensaje de error engañoso al restaurar una copia de seguridad en un disco de solo lectura. #83051 (Julia Kartseva).
- Se corrige el inicio innecesario de copias de seguridad internas tras problemas de conexión. #84755 (Vitaly Baranov).
Funciones de ventana y funciones de agregación
- Se corrige un posible fallo en
Aggregatoren caso de excepción durante la fusión. #81450 (Nikita Taranov). - Se corrige un posible fallo en
Aggregatoren caso de excepción durante la fusión. #82022 (Nikita Taranov). - Se corrige un error de copiar y pegar en arraySimilarity, impidiendo el uso de pesos UInt32 e Int32. Se actualizan las pruebas y la documentación. #82103 (Mikhail f. Shiryaev).
- Se corrige el desbordamiento en las funciones
numericIndexedVectorPointwiseAdd,numericIndexedVectorPointwiseSubtract,numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDivide, que se producía al aplicarlas a números grandes. #82165 (Raufs Dunamalijevs).
Correcciones de Parquet y del formato de archivo
- Corrige el filtro bloom de Parquet, que aplicaba incorrectamente una condición como
WHERE function(key) IN (...)como si fueraWHERE key IN (...). #81255 (Michael Kolupaev). - Corrige la escritura en Parquet, que generaba estadísticas incorrectas (mín./máx.) para tipos Decimal. #83754 (Michael Kolupaev).
- Corrige la deserialización de
groupArraySample/groupArrayLasten caso de elementos vacíos (la deserialización podía omitir parte del binario si la entrada estaba vacía; esto puede provocar corrupción durante la lectura de datos y UNKNOWN_PACKET_FROM_SERVER en el protocolo TCP). Esto no afecta a números ni a tipos de fecha y hora. #82763 (Pedro Ferreira). - Corrige la escritura de rutas JSON con valores NULL en formato RowBinary. #83923 (Pavel Kruglov).
Correcciones de JOIN
- Corrige la modificación de filtros en consultas con una expresión JOIN sobre una tabla con motor
Merge. Corrige #82092. #82950 (Dmitry Novik). - Corrige el fallo al hacer JOIN con un almacenamiento key-value usando una clave con conversión de tipo. #82497 (Pervakov Grigorii).
- Corrige un error lógico al resolver el matcher en una consulta con múltiples JOINs; cierra #81969. #82421 (Vladimir Cherkasov).
- Corrige la fusión del filtro en la condición de JOIN en los casos en que los operandos de igualdad tienen tipos distintos o hacen referencia a constantes. Corrige #83432. #84145 (Dmitry Novik).
- Corrige el error lógico
Expected single dictionary argument for functional hacer JOIN con una condición de desigualdad cuando una de las columnas esLowCardinalityy la otra es una constante. Cierra #81779. #84019 (Alexey Milovidov).
Correcciones de la base de datos Replicated
- Se corrigió
markReplicasActiveenDDLWorkeryDatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh). - Se corrigió
DatabaseReplicated::getClusterImpl. Si el primer elemento (o elementos) dehoststieneid == DROPPED_MARKy no hay otros elementos para el mismo segmento, el primer elemento deshardsserá un vector vacío, lo que provocastd::out_of_range. #82093 (Miсhael Stetsyuk). - Ahora se realiza un seguimiento del número de jobs asíncronos de carga de tablas. Si hay jobs en ejecución, no se actualiza
tail_ptrenTransactionLog::removeOldEntries. #82824 (Tuan Pham Anh). - Se corrigió el problema por el que, si una tabla MergeTree se crea con
add_minmax_index_for_numeric_columns=1oadd_minmax_index_for_string_columns=1, el índice se materializa posteriormente durante una operación ALTER, lo que impide que la base de datos Replicated se inicialice correctamente en una nueva réplica. #83751 (Nikolay Degterinsky). - Se corrigió la creación de RMV en una nueva réplica de la base de datos Replicated si se elimina DEFINER. #85327 (Nikolay Degterinsky).
- Se corrigió la recuperación de bases de datos replicadas cuando el movimiento del archivo de metadatos tarda mucho tiempo. #85177 (Tuan Pham Anh).
- Se forzó la recuperación de la base de datos Replicated después de restaurar los metadatos de la base de datos en Keeper. #85960 (Tuan Pham Anh).
- Se corrigió un error en la recuperación de la base de datos
Replicated: si el nombre de una tabla contiene el símbolo%, durante la recuperación podía volver a crearse con un nombre distinto. #85987 (Alexander Tokmakov). - Ahora el worker de DDL limpia los hosts obsoletos del conjunto de réplicas. Esto reducirá la cantidad de metadatos almacenados en ZooKeeper. #88154 (alesapin).
Correcciones de las actualizaciones ligeras
- Se corrigen las actualizaciones ligeras en tablas con motores
ReplacingMergeTreeyCollapsingMergeTree. #84851 (Anton Popov). - Se corrige un error lógico en las actualizaciones ligeras que actualizan todas las columnas de la tabla. #84380 (Anton Popov).
- Se corrigen las actualizaciones ligeras en tablas con el motor
ReplicatedMergeTreecreadas en servidores con una versión inferior a la 25.7. #84933 (Anton Popov). - Se corrigen las actualizaciones ligeras en tablas con el motor
MergeTreeno replicado después de ejecutar una consultaALTER TABLE ... REPLACE PARTITION. #84941 (Anton Popov). - Se corrige la limpieza de las partes de parche en
ReplicatedMergeTree. Anteriormente, el resultado de una actualización ligera podía no ser visible temporalmente en la réplica hasta que la parte fusionada o mutada que materializa las partes de parche se descargara desde otra réplica. #85121 (Anton Popov).
Correcciones de S3 y almacenamiento de objetos
- Se corrige la validación de argumentos de la función de tabla S3 en el enmascaramiento de secretos, lo que evita un posible
LOGICAL_ERROR; cierra #80620. #82056 (Vladimir Cherkasov). - Se corrige un posible interbloqueo en consultas remotas cuando el servidor está bajo presión de memoria. #82160 (Kirill).
- Se añade caducidad al token de AWS ECS para que pueda recargarse. #82422 (Konstantin Bogdanov).
- Se corrige la desactivación de la alineación de límites para el búfer en caché en motores de tablas externas. Esto se había roto en https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
- Se corrige
no_sign_requestpara el client de S3. Puede usarse para evitar explícitamente la firma de solicitudes a S3. También puede definirse para endpoints específicos mediante configuración basada en endpoints. #83379 (Antonio Andelic). - Se omiten los nodos no disponibles durante INSERT SELECT desde s3Cluster() a MergeTree replicado. #83676 (Igor Nikonov).
- Se corrige la condición de retorno anticipado para la ralentización de la tasa de solicitudes de S3: ahora basta con que
s3_slow_all_threads_after_network_errorobackup_slow_all_threads_after_retryable_s3_errorsea true para habilitar este comportamiento cuando todos los hilos estén pausados debido a un error reintentable, en lugar de requerir ambos. #85505 (Julia Kartseva). - Se corrige un error lógico al leer desde funciones de almacenamiento de objetos a través de una tabla Distributed o la función de tabla remote. Corrige: #84658, Corrige #85173, Corrige #52022. #85359 (alesapin).
- Se corrige el error lógico de S3Queue “Table is already registered”. Cierra #84433. Se rompió tras https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
- Se corrige que valores de configuración grandes rompan las tablas S3Queue y el reinicio de réplicas. #86074 (Nikolay Degterinsky).
DynamicAndVariantTypeFixes
- Se corrige la reversión de una columna Dynamic cuando falla el análisis sintáctico. #82169 (Pavel Kruglov).
- Se corrige un posible fallo en el tipo Variant en UNION. #83295 (Pavel Kruglov).
- Se corrige la lectura de una columna Variant con materialización diferida. #84400 (Pavel Kruglov).
- No se validan tipos experimentales o sospechosos durante la ejecución de expresiones
default/materializeal leer desde una tabla existente. #81618 (Pavel Kruglov).
Correcciones de Keeper
- Corrección en Keeper: actualiza correctamente el recuento total de watches cuando se eliminan nodos efímeros al cerrar la sesión. #83583 (Antonio Andelic).
- Se corrigen escrituras desordenadas en el registro de cambios de Keeper. Anteriormente, podíamos tener escrituras en curso en el registro de cambios, pero una reversión podía provocar un cambio concurrente del archivo de destino. Esto podía dar lugar a registros incoherentes y a una posible pérdida de datos. #84434 (Antonio Andelic).
- Se corrigen fugas de memoria en Keeper con almacenamiento RocksDB (los iteradores no se destruían). #84523 (Azat Khuzhin).
- Se corrige un problema por el que la configuración de Keeper
rotate_log_storage_interval = 0hacía que ClickHouse se cerrara inesperadamente. (problema #83975). #84637 (George Larionov). - Se corrige el recuento total de watches devuelto por Keeper. #84890 (Antonio Andelic).
- Se bloquea ‘mutex’ al obtener ZooKeeper desde ‘view’ en RefreshTask. #84699 (Tuan Pham Anh).
Correcciones de indexación
- Se corrige el descarte excesivo de gránulos al filtrar sobre índices de token/ngram con
regexpque contiene alternancia y una primera alternativa no literal. #79373 (Eduard Karacharov). - La implementación de la configuración
use_skip_indexes_if_final_exact_mode(introducida en 25.6) podía no seleccionar un rango candidato relevante en función de la configuración del motorMergeTreeo de la distribución de los datos. Esto ya se ha resuelto. #82667 (Shankar Iyer). - La optimización de la configuración
use_skip_indexes_if_final_exact_mode(introducida en 25.6) podía no seleccionar un rango candidato relevante en función de la configuración del motorMergeTreeo de la distribución de los datos. Esto ya se ha resuelto. #82879 (Shankar Iyer). - Anteriormente, los índices
setno tenían en cuenta las columnasNullableal comprobar si los gránulos cumplían el filtro (incidencia #75485). #84305 (Elmi Ahmadov). - La comparación con el valor NaN no usaba los rangos correctos durante la evaluación del índice
MinMax. #84386 (Elmi Ahmadov). - Los tokenizadores
ngramyno_opya no provocan fallos en el índice de texto (experimental) cuando los tokens de entrada están vacíos. #84849 (Robert Schulze).
Correcciones de vistas materializadas
- Se corrige un error en las dependencias entre tablas que provocaba que las vistas materializadas no captaran las consultas INSERT. #82222 (Nikolay Degterinsky).
- Después de https://github.com/ClickHouse/ClickHouse/pull/79963, se rompió el uso de subcolumnas en las vistas materializadas y es posible que el usuario recibiera el error
Not found column X in block. Este comportamiento ya se ha corregido. Corrige: #82784. #83221 (Nikita Mikhaylov). - Se corrige
illegal_type_of_argumenten mv cuando los tipos son distintos. #85135 (Sema Checherinda).
Correcciones de Azure y del almacenamiento en la nube
- En AzureBlobStorage, en la copia nativa se comparan los métodos de autenticación y, si durante ese proceso se produce una excepción, el código ahora recurre a la lectura y copia (es decir, a una copia no nativa). #82693 (Smita Kulkarni).
- Se corrigió una doble liberación de memoria en
AzureIteratorAsync. #85064 (Nikita Taranov).
Correcciones de fallos y estabilidad
- Corrige un posible fallo en logging al terminar una sesión, ya que
user_ida veces puede estar vacío. #82513 (Bharat Nallan). - Corrige un fallo en el client debido a que la conexión quedaba en estado desconectado después de un
INSERTerróneo. #83253 (Azat Khuzhin). - Corrige un fallo al calcular el tamaño de un bloque con columnas vacías. #83271 (Raúl Marín).
- Corrige un fallo que puede producirse en una consulta con la configuración ‘max_threads=1’ cuando se ejecuta bajo carga con la planificación de CPU habilitada. #83387 (Fan Ziqi).
- Convierte
zoutofmemoryen un error de hardware; de lo contrario, lanzará un error lógico. Véase https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei). - Corrige un posible aborto (debido al join de threads de la task) y, con suerte, cuelgues (en pruebas unitarias) durante el apagado de
BackgroundSchedulePool. #83769 (Azat Khuzhin). - Corrige un interbloqueo provocado por el thread de comprobación de cancelación en segundo plano. #84203 (Antonio Andelic).
- Corrige un interbloqueo durante el apagado debido al bloqueo recursivo del contexto durante la limpieza del bridge de bibliotecas. #83824 (Azat Khuzhin).
- Corrige un fallo en el client debido a que la conexión quedaba en estado desconectado después de un
INSERTerróneo. #83842 (Azat Khuzhin). - Corrige un posible comportamiento indefinido (fallos) en caso de
MEMORY_LIMIT_EXCEEDEDdurante la deserialización de String. #85440 (Azat Khuzhin). - Corrige un fallo poco frecuente en las inserciones asíncronas que modifican
log_commentoinsert_deduplication_token. #85540 (Anton Popov).
Correcciones de Glue y Catalog
- Se corrigió un error en la integración con Glue Catalog. Ahora ClickHouse puede leer tablas con tipos de datos anidados en las que algunas subcolumnas contienen decimales, por ejemplo:
map<string, decimal(9, 2)>. Corrige #81301. #82114 (alesapin). - ClickHouse ahora lee tablas de Glue Catalog cuando el tipo de tabla está especificado en minúsculas. #84316 (alesapin).
- Unity Catalog ahora ignora esquemas con tipos de datos extraños en el caso de tablas no delta. Corrige #85699. #85950 (alesapin).
Correcciones de funciones
- Las funciones
trim{Left,Right,Both}ahora admiten cadenas de entrada del tipo “FixedString(N)”. Por ejemplo,SELECT trimBoth(toFixedString('abc', 3), 'ac')ahora funciona. #82691 (Robert Schulze). - La función
trim, cuando se llama con entradas todas constantes, ahora produce una cadena de salida constante. (Error #78796). #82900 (Robert Schulze). - Se corrige la salida incorrecta de la función
formatDateTimecuando el formateador%fse usa junto con formateadores de tamaño variable (p. ej.,%M). #83020 (Robert Schulze). - Se corrige un error con argumentos
NULLen la funciónCASE. #82436 (Yarik Briukhovetskyi). - Se evita usar partes no relacionadas de un diccionario compartido en la función
lowCardinalityKeys. #83118 (Alexey Milovidov). - Se corrige
colorSRGBToOKLCH/colorOKLCHToSRGBpara una mezcla de argumentos constantes y no constantes. #83906 (Azat Khuzhin). - Se corrige la construcción incorrecta de tuplas vacías en la función
array(). Esto corrige #84202. #84297 (Amos Bird). - Se corrige un error que provocaba una codificación y decodificación Bech32 incorrectas. El error no se detectó originalmente porque una implementación en línea del algoritmo usada para las pruebas tenía el mismo problema. #84257 (George Larionov).
Correcciones de consultas distribuidas
- Se permitía
INSERT SELECTdistribuido en paralelo conLIMIT, lo cual no es correcto, ya que provoca duplicación de datos en la tabla de destino. #84477 (Igor Nikonov). - No intente sustituir las funciones de tabla por su alternativa de clúster en presencia de un
JOINo una subconsulta. #84335 (Konstantin Bogdanov). - Se añade una comprobación para detectar si se usa una subconsulta correlacionada en un contexto distribuido y así evitar un bloqueo. Corrige #82205. #85030 (Dmitry Novik).
- El uso de
distributed_depthcomo indicador de la función*Clusterera incorrecto y podía provocar duplicación de datos; utiliceclient_info.collaborate_with_initiatoren su lugar. #85734 (Konstantin Bogdanov). - Se admiten constantes globales de la instrucción
WITHparaINSERT SELECTdistribuido en paralelo con la tabla de destinoDistributed. Antes, la consulta podía producir un errorUnknown expression identifier. #85811 (Nikolai Kochetov). - Se corrige un error lógico al intentar
CREATE ... AS (SELECT * FROM s3Cluster(...))conDatabaseReplicated. #85904 (Konstantin Bogdanov). - Se añaden comprobaciones para
sharding_keydurante ALTER de la tablaDistributed. Anteriormente, un ALTER incorrecto rompía la definición de la tabla y el reinicio del servidor. #86015 (Nikolay Degterinsky).
Correcciones de métricas y monitorización
- Se corrige la validación de los ajustes de métricas asíncronas
asynchronous_metrics_update_period_syasynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan). - Se corrigen las métricas
IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles(antes se incluían en la métrica sin el prefijoCache). #83730 (Azat Khuzhin). - Se corrige
LOGICAL_ERRORen QueryMetricLog: Mutex no puede serNULL. #82979 (Pablo Marcos). - Se corrigen las métricas incorrectas KafkaAssignedPartitions y KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
- Se corrige que la estadística de bytes procesados quede subestimada cuando se usa
PREWHERE(explícita o automática). #85495 (Michael Kolupaev). - Se corrige el desajuste en el seguimiento de memoria del pool de programación en segundo plano y del executor. #84946 (Azat Khuzhin).
Correcciones de tipos de datos y conversiones
- Se corrigen casos en los que el parsing de Time podía causar problemas con msan. Esto corrige: #82477. #82514 (Yarik Briukhovetskyi).
- Se corrige la ordenación de valores NaN en el tipo
LowCardinality(Float32|Float64|BFloat16). #83786 (Pervakov Grigorii). - Se corrige el overflow de valores grandes (>2106-02-07) al convertir de
DateaDateTime64. #83982 (Yarik Briukhovetskyi). - Se corrige un problema con la lectura implícita de valores Time negativos en la table y se aclara la documentación. #83091 (Yarik Briukhovetskyi).
- El códec
DoubleDeltaahora solo puede aplicarse a columnas de tipo numérico. En particular, las columnasFixedStringya no pueden comprimirse conDoubleDelta. (corrige #80220). #84383 (Jimmy Aguilar Mena). - Se corrige la pérdida de precision en
JSONExtractal convertir números JSON a Decimal types. Ahora, los valores numéricos JSON conservan su representación decimal exacta, lo que evita errores de rounding de coma flotante. #85665 (ssive7b).
Gestión de memoria y recursos
- Se corrige el uso incorrecto de memoria relacionado con
max_untracked_memory. #83607 (Azat Khuzhin). - No compartir
async_read_countersentre consultas. #83423 (Azat Khuzhin). - Se corrigen posibles errores de caché del sistema de archivos sin inicializar cuando se usa como almacenamiento temporal de datos. #83539 (Bharat Nallan).
- Aplicar siempre
filesystem_prefetches_limit(no solo desdeMergeTreePrefetchedReadPool). #83999 (Azat Khuzhin).
Correcciones de configuración y ajustes
- Al pasar ajustes a través de la URI, se tiene en cuenta el último valor. #82137 (Sema Checherinda).
- Se corrigen las condiciones de carrera en client (al no usar un contexto global) y las sobrescrituras de
session_timezone(antes, sisession_timezonese establecía, por ejemplo, enusers.xml/las opciones de client con un valor no vacío y en el contexto de la consulta con un valor vacío, se usaba el valor deusers.xml, lo cual era incorrecto; ahora el contexto de la consulta siempre tendrá prioridad sobre el contexto global). #82444 (Azat Khuzhin). - Ya no se permite establecer
threadpool_writer_pool_sizeen cero para garantizar que las operaciones del server no se queden bloqueadas. #82532 (Bharat Nallan). - Se resuelve un pequeño desbordamiento de enteros en la configuración del ajuste
role_cache_expiration_time_seconds(problema #83374). #83461 (wushap). - Ya no se permite el valor cero para max_insert_block_size, ya que podría provocar un error lógico. #83688 (Bharat Nallan).
- Se corrige un bucle infinito en
estimateCompressionRatio()con block_size_bytes=0. #83704 (Azat Khuzhin). - Parámetros como
date_time_input_formatsimplemente se ignoraban al usar HTTP con multipart. #85570 (Sema Checherinda).
Correcciones de MongoDB
- Anteriormente, las definiciones del motor de tabla
MongoDBpodían incluir un componente de ruta en el argumentohost:port, que se ignoraba silenciosamente. La integración de MongoDB se niega a cargar esas tablas. Con esta corrección, permitimos cargar esas tablas e ignorar el componente de ruta si el motorMongoDBtiene cinco argumentos, usando el nombre de la base de datos indicado en los argumentos. Nota: La corrección no se aplica a tablas recién creadas ni a consultas con la función de tablamongo, ni tampoco a fuentes de diccionario ni a colecciones con nombre. #81942 (Vladimir Cherkasov).
Correcciones varias
- En versiones anteriores, el servidor devolvía contenido excesivo en las solicitudes a
/js. Esto resuelve #61890. #81895 (Alexey Milovidov). - Se corrige
InterpreterInsertQuery::extendQueryLogElemImplpara volver a añadir comillas invertidas a los nombres de la base de datos y la tabla cuando sea necesario (p. ej., cuando los nombres contienen caracteres especiales como-). #81528 (Ilia Shvyrialkin). - Se corrigió una posible condición de carrera entre el hilo de sugerencias y el hilo principal del client. #82233 (Azat Khuzhin).
- Se corrigió la seguridad frente a excepciones en la reescritura de union/intersect/except_default_mode. Cierra #82664. #82820 (Alexey Milovidov).
- Al usar una implementación de Database sin caché, los metadatos de la tabla correspondiente se eliminan tras devolver las columnas y la referencia se invalida. #82939 (buyval01).
- La llamada a Onprogress en JSONEachRowWithProgress está sincronizada con la finalización. #83879 (Sema Checherinda).
- Se corrigió un error poco frecuente por el que la consulta
MATERIALIZE COLUMNpodía generar archivos inesperados enchecksums.txty, con el tiempo, partes de datos en estadodetached. #84007 (alesapin). - Manejo correcto de excepciones en la actualización periódica de partes. #84083 (Azat Khuzhin).
- Se corrigió la generación de nombres de columnas para literales booleanos para que use “true”/“false” en lugar de “1”/“0”, lo que evita conflictos de nombres de columnas entre literales booleanos y enteros en las consultas. #84945 (xiaohuanlin).
- Se solucionan posibles problemas de ordenación incorrecta en el motor de tabla Merge. #85025 (Xiaozhe Yu).
- Se implementaron las API faltantes para DiskEncrypted. #85028 (Azat Khuzhin).
- Se introduce una configuración de compatibilidad con versiones anteriores para permitir que el nuevo analizador pueda hacer referencia a un alias externo en la cláusula
WITHen caso de conflictos de nombres. Corrige #82700. #83797 (Dmitry Novik). - Permite hacer referencia a cualquier tabla en el argumento
view(...)de la función de tablaremotecuando el analizador está habilitado. Corrige #78717. Corrige #79377. #83844 (Dmitry Novik). - Se corrige la escritura en modo append en MergeTree utilizado para transacciones experimentales con tipos de metadatos
plain_rewritable/plain; antes simplemente se ignoraban. #83695 (Tuan Pham Anh). - Se corrigió el uso del logger en
IAccessStorage. #84365 (Konstantin Bogdanov). - Se corrige la poda de archivos mediante una columna virtual en lagos de datos. #84520 (Kseniia Sumarokova).
- Se corrige un problema por el que una consulta a una fuente remota con retraso podía provocar un acceso a un vector fuera de límites. #84820 (George Larionov).
- Almacena correctamente toda la configuración en los metadatos de la tabla para el motor de cola de objetos. #84860 (Antonio Andelic).
- Se corrige el error
CORRUPTED_DATAcuando se usan columnas diferidas con ordenación externa. #84738 (János Benjamin Antal). - Elimina las llamadas innecesarias a
getStatus()en las consultasSYSTEM DROP REPLICA. Corrige el caso en el que una tabla se elimina en segundo plano y se lanza la excepciónShutdown for storage is called. #85220 (Nikolay Degterinsky). - Se añaden las comprobaciones que faltaban de la longitud del nombre de la tabla en las consultas
CREATE OR REPLACEyRENAME. #85326 (Michael Kolupaev). - Se corrigen los cierres inesperados y la corrupción de datos durante
ALTER UPDATEen JSON. #85383 (Pavel Kruglov). - Corrige el segfault de CoalescingMergeTree con cadenas grandes. Esto cierra #84582. #85709 (scanhex12).
- Se corrige send_logs_source_regexp (tras la refactorización del logging asíncrono en #85105). #85797 (Azat Khuzhin).
- Corregida una posible inconsistencia en los diccionarios con update_field en errores
MEMORY_LIMIT_EXCEEDED. #85807 (Azat Khuzhin). - Corrige las solicitudes HTTP realizadas por la función de tabla
url()para que incluyan correctamente los números de puerto en el encabezado Host al acceder a puertos no estándar. Esto resuelve fallos de autenticación al usar URL prefirmadas con servicios compatibles con S3, como MinIO, que se ejecutan en puertos personalizados, algo habitual en entornos de desarrollo. (Corrige #85898). #85921 (Tom Quist).