Fix findCount()/exists() wrapping a raw CTE (WITH clause) for SQL Server#3850
Merged
Conversation
SQL Server does not support a WITH clause (CTE) nested inside a subquery or derived table - only at the start of a statement. buildRowCountQuery() and buildExistsQuery() wrap raw sql as `select count(*) from (<sql>)` / `select case when exists(<sql>) then ...`, which breaks when <sql> starts with a CTE header (e.g. RawSqlBuilder.withPlaceholders() queries), causing "Incorrect syntax near the keyword 'with'" on SQL Server. Add CQueryBuilder.topLevelSelectStart()/splitCteHeader() to detect and hoist a leading WITH clause in front of the wrapping SELECT rather than wrapping it along with the rest of the query. This is a no-op for the common case (no leading CTE) and is portable across platforms. - ebean-core: CQueryBuilder - hoist leading CTE header in wrapSelectCount()/wrapSelectExists() - Add unit tests in CQueryBuilderTest reproducing the exact failing SQL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
SQL Server does not support a WITH clause (CTE) nested inside a subquery or derived table - only at the start of a statement. buildRowCountQuery() and buildExistsQuery() wrap raw sql as
select count(*) from (<sql>)/select case when exists(<sql>) then ..., which breaks when starts with a CTE header (e.g. RawSqlBuilder.withPlaceholders() queries), causing "Incorrect syntax near the keyword 'with'" on SQL Server.Add CQueryBuilder.topLevelSelectStart()/splitCteHeader() to detect and hoist a leading WITH clause in front of the wrapping SELECT rather than wrapping it along with the rest of the query. This is a no-op for the common case (no leading CTE) and is portable across platforms.