Skip to content

Fixed Limit and Offset Support bugs when using Subqueries in where cl… #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Oct 2, 2019
Merged

Conversation

liuhuagui
Copy link
Contributor

Hi, I haved tried to fix a bug of Limit and Offset Support when using Subqueries in where clauses.
My code:

   @Override
    default List<MyMark> list(MyMark record) {
        Page page = record.getPage();
        return MyBatis3Utils.selectList(this::selectMany,
                columns,myMark,
                q->q.leftJoin(originalArticle).on(originalArticleId,equalTo(originalArticle.id))
                .where(id,isLessThanOrEqualTo(
                        select(id).from(myMark)
                        .orderBy(updateTime.descending(),createTime.descending())
                        .limit(1L)
                        .offset(page.getOffset())
              )).orderBy(sortColumn("mutime").descending(),sortColumn("mctime").descending()).limit(page.getSize())
        );
    }

Final statement as follows:

select my_mark.id as mid, my_mark.consultant_id, my_mark.original_article_id, my_mark.create_time as mctime, my_mark.update_time as mutime, original_article.id, original_article.category_id, original_article.author_id, original_article.title, original_article.summary, original_article.thumb_pic, original_article.paragraph_id, original_article.relayed_read_count, original_article.read_count, original_article.marked_count, original_article.is_readable, original_article.create_time, original_article.update_time from my_mark left join original_article on my_mark.original_article_id = original_article.id where my_mark.id <= (select id from my_mark order by update_time DESC, create_time DESC limit #{parameters._limit} offset #{parameters._offset}) order by update_time DESC, create_time DESC limit #{parameters._limit}

image

Exception as follows:

### SQL: select my_mark.id as mid, my_mark.consultant_id, my_mark.original_article_id, my_mark.create_time as mctime, my_mark.update_time as mutime, original_article.id, original_article.category_id, original_article.author_id, original_article.title, original_article.summary, original_article.thumb_pic, original_article.paragraph_id, original_article.relayed_read_count, original_article.read_count, original_article.marked_count, original_article.is_readable, original_article.create_time, original_article.update_time from my_mark left join original_article on my_mark.original_article_id = original_article.id where my_mark.id <= (select id from my_mark order by update_time DESC, create_time DESC limit ? offset ?) order by update_time DESC, create_time DESC limit ?
### Cause: java.sql.SQLException: Subquery returns more than 1 row
; bad SQL grammar []; nested exception is java.sql.SQLException: Subquery returns more than 1 row

@jeffgbutler
Copy link
Member

Thanks for reporting this issue! This PR breaks a lot of tests, so we can't merge it unless it is changed. Also, you would need to add a test for this issue.

@liuhuagui
Copy link
Contributor Author

Okay, I'll do that.

@coveralls
Copy link

coveralls commented Oct 1, 2019

Coverage Status

Coverage remained the same at 100.0% when pulling bf04ee7 on liuhuagui:master into 65f9784 on mybatis:master.


public FetchFirstPagingModelRenderer(RenderingStrategy renderingStrategy,
PagingModel pagingModel) {
PagingModel pagingModel,AtomicInteger sequence) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pleas add a space before the new parameter


public LimitAndOffsetPagingModelRenderer(RenderingStrategy renderingStrategy,
Long limit, PagingModel pagingModel) {
Long limit, PagingModel pagingModel,AtomicInteger sequence) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a space before the new parameter

return this;
}

private Optional<AtomicInteger> sequence() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this method - sequence is not optional

@@ -38,16 +41,17 @@ private PagingModelRenderer(Builder builder) {

private Optional<FragmentAndParameters> limitAndOffsetRender(Long limit) {
return new LimitAndOffsetPagingModelRenderer(renderingStrategy, limit,
pagingModel).render();
pagingModel,sequence).render();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a space before the new parameter

}

private Optional<FragmentAndParameters> fetchFirstRender() {
return new FetchFirstPagingModelRenderer(renderingStrategy, pagingModel).render();
return new FetchFirstPagingModelRenderer(renderingStrategy, pagingModel,sequence).render();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a space before the new parameter


private PagingModelRenderer(Builder builder) {
renderingStrategy = Objects.requireNonNull(builder.renderingStrategy);
pagingModel = Objects.requireNonNull(builder.pagingModel);
sequence = builder.sequence().orElseGet(() -> new AtomicInteger(1));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use the same pattern as the other parameters: sequence = Objects.requireNonNull(builder.sequence)

@jeffgbutler jeffgbutler added the bug label Oct 1, 2019
@jeffgbutler jeffgbutler added this to the 1.1.4 milestone Oct 1, 2019
@jeffgbutler jeffgbutler merged commit 79f815f into mybatis:master Oct 2, 2019
@jeffgbutler
Copy link
Member

Thanks for your contribution!

@liuhuagui
Copy link
Contributor Author

I should thank you for your project.

jeffgbutler added a commit to jeffgbutler/mybatis-dynamic-sql that referenced this pull request Oct 2, 2019
With the change for mybatis#142 it no longer makes sense to have specialized
parameter names for limit, offset, etc.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants