Queries fail on SQLServer since latest upgrade

Hello !

Version: SonarQube Developer 2026.5.1 LTA

Deployed: zip

Problem: Error messages in the overview of projects : “An unexpected error occurred. Please contact support if the problem persists.”

image

Relevant log:

2026.10.02 11:07:46 ERROR web[b087d124-b452-4b38-8c24-998b4d9b0366][o.s.s.v.c.RestResponseEntityExceptionHandler] An unexpected error occurred. Please contact support if the problem persists.
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Une erreur s’est produite lors de la commande actuelle (État terminé 0). L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
### The error may exist in org.sonarsource.history.server.db.mapper.IssueTtrHistoryMapper
### The error may involve org.sonarsource.history.server.db.mapper.IssueTtrHistoryMapper.queryResolvedIssuesUnsliced
### The error occurred while handling results
### SQL: WITH           daily (recorded_date, value) AS (       SELECT                         CAST(DATEADD(DAY, CAST((ith.recorded_at_epoch) / 86400000 AS INT), CAST('1970-01-01' AS DATETIME2)) AS DATE)             AS recorded_date,         CAST(SUM(ith.issues_resolved) AS INTEGER) AS value       FROM issue_ttr_history ith                     JOIN issue_count_dimensions icd ON ith.dimension_id = icd.id                 WHERE ith.entity_id = ?         AND ith.entity_type = ?         AND ith.recorded_at_epoch >= ?         AND ith.recorded_at_epoch <= ?                                 AND          (             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)          )                                                                  GROUP BY                 CAST(DATEADD(DAY, CAST((ith.recorded_at_epoch) / 86400000 AS INT), CAST('1970-01-01' AS DATETIME2)) AS DATE)                 ),     prior_data (has_data) AS (       SELECT CASE WHEN EXISTS (         SELECT 1         FROM issue_ttr_history ith                       JOIN issue_count_dimensions icd ON ith.dimension_id = icd.id                   WHERE ith.entity_id = ?           AND ith.entity_type = ?           AND ith.recorded_at_epoch < ?                                   AND          (             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)           OR             (      CASE ?       WHEN 'MAINTAINABILITY' THEN icd.maintainability_rating       WHEN 'SECURITY' THEN icd.security_rating       WHEN 'RELIABILITY' THEN icd.reliability_rating     END     = ?)          )                                                                  ) THEN 1 ELSE 0 END      ),           dates(recorded_date) AS (       SELECT                 CAST(DATEADD(DAY, CAST((? - (0 * 86400000.0)) / 86400000 AS INT), CAST('1970-01-01' AS DATETIME2)) AS DATE)                    UNION ALL       SELECT        DATEADD(DAY, 1, dates.recorded_date)            FROM dates       WHERE dates.recorded_date <                 CAST(DATEADD(DAY, CAST((?) / 86400000 AS INT), CAST('1970-01-01' AS DATETIME2)) AS DATE)                 )         SELECT              CAST(dates.recorded_date AS DATETIME2)      AS "date",       'all' AS dimension,       COALESCE(daily.value, 0) AS value     FROM dates     CROSS JOIN prior_data     LEFT JOIN daily ON daily.recorded_date = dates.recorded_date     WHERE prior_data.has_data = 1       OR EXISTS (         SELECT 1 FROM daily first_data         WHERE first_data.recorded_date <= dates.recorded_date       )     ORDER BY dates.recorded_date DESC, dimension
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Une erreur s’est produite lors de la commande actuelle (État terminé 0). L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	at jdk.proxy2/jdk.proxy2.$Proxy237.queryResolvedIssuesUnsliced(Unknown Source)
	at org.sonarsource.history.server.db.repository.IssueTtrHistoryRepository.queryResolvedIssues(IssueTtrHistoryRepository.java:81)
	at org.sonarsource.history.server.service.IssueTtrHistoryService.query(IssueTtrHistoryService.java:66)
	at org.sonar.server.v2.api.history.controller.DefaultIssueResolutionHistoryController.getIssueResolutionHistory(DefaultIssueResolutionHistoryController.java:107)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:252)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:184)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1000)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at org.sonar.server.platform.web.ApiV2Servlet.service(ApiV2Servlet.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:132)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:235)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:376)
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:132)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:86)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:181)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.sonar.server.v2.security.UserSessionAuthenticationFilter.doFilterInternal(UserSessionAuthenticationFilter.java:85)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:237)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:195)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:317)
	at org.sonar.server.platform.web.ConditionalSpringSecurityFilter.doFilter(ConditionalSpringSecurityFilter.java:71)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.WebPagesFilter.doFilter(WebPagesFilter.java:80)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:167)
	at org.sonar.server.platform.web.MasterServletFilter$HttpFilterChainAdapter.doFilter(MasterServletFilter.java:208)
	at org.sonar.server.platform.web.NoCacheFilter.doFilter(NoCacheFilter.java:34)
	at org.sonar.server.platform.web.MasterServletFilter$JavaxFilterAdapter.doFilter(MasterServletFilter.java:194)
	at org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:165)
	at org.sonar.server.platform.web.MasterServletFilter.doFilter(MasterServletFilter.java:126)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:83)
	at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:70)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.CspFilter.doFilter(CspFilter.java:68)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.CacheControlFilter.doFilter(CacheControlFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.SecurityServletFilter.doHttpFilter(SecurityServletFilter.java:60)
	at org.sonar.server.platform.web.SecurityServletFilter.doFilter(SecurityServletFilter.java:47)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.RedirectFilter.doFilter(RedirectFilter.java:56)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.EndpointPathFilter.doFilter(EndpointPathFilter.java:47)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.RequestIdFilter.doFilter(RequestIdFilter.java:66)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.sonar.server.platform.web.RootFilter.doFilter(RootFilter.java:100)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:141)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.springframework.web.filter.UrlHandlerFilter.doFilterInternal(UrlHandlerFilter.java:98)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:111)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:535)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:294)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:86)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:71)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:347)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:71)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1307)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:2201)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:74)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:949)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:483)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:74)
	at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Une erreur s’est produite lors de la commande actuelle (État terminé 0). L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:356)
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:333)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer$FetchBufferTokenHandler.onDone(SQLServerResultSet.java:5471)
	at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:103)
	at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:42)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:5574)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1824)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1082)
	at com.zaxxer.hikari.pool.HikariProxyResultSet.next(HikariProxyResultSet.java)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:364)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:337)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
	at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61)
	at org.sonar.server.monitoring.MyBatisMetricsInterceptor.intercept(MyBatisMetricsInterceptor.java:53)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
	at jdk.proxy2/jdk.proxy2.$Proxy128.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
	... 118 common frames omitted

We experience same problem, afer updating from 2025.1.1 to 2026.5.1

Same error, also from 2025.1.1 to 2026.5.1

Hey @Narfix, @Lenin_Vladimir and @Daniele_Cortis,

Thanks for reporting this, it’s a known issue in SonarQube 2026.5.1 LTA when using SQL Server. An error is thrown by the SQL behind an issue-resolution-history API endpoint (triggered in the project Overview). My understanding is that the functionality impact is minimal: it might affect certain visualizations of issue resolution datapoints, but the main SonarQube functionalities (analysis, integrations, project metrics…) are unaffected.

We have a fix coming in the upcoming 2026.5.2 patch, planned for Oct 5th (next Monday). At this time, there’s is no workaround other than updating to the patched version as soon as it is released.

Hey @Narfix, @Lenin_Vladimir and @Daniele_Cortis, the 2026.5.2 patch is out. This issue should be fixed there. Could you update and let me know if the issue is gone?

@andres 2026.5.2 got rid of the problem.

Thanks for your help !