diff --git a/integrations/session_query_test.go b/integrations/session_query_test.go index ed03ff3e..ef2ccdd6 100644 --- a/integrations/session_query_test.go +++ b/integrations/session_query_test.go @@ -396,3 +396,25 @@ func TestJoinWithSubQuery(t *testing.T) { assert.EqualValues(t, 1, len(querys)) assert.EqualValues(t, q, querys[0]) } + +func TestQueryStringWithLimit(t *testing.T) { + assert.NoError(t, PrepareEngine()) + + if testEngine.Dialect().URI().DBType == schemas.MSSQL { + t.SkipNow() + return + } + + type QueryWithLimit struct { + Id int64 `xorm:"autoincr pk"` + Msg string `xorm:"varchar(255)"` + DepartId int64 + Money float32 + } + + assert.NoError(t, testEngine.Sync2(new(QueryWithLimit))) + + data, err := testEngine.Table("query_with_limit").Limit(20, 20).QueryString() + assert.NoError(t, err) + assert.EqualValues(t, 0, len(data)) +} diff --git a/internal/statements/query.go b/internal/statements/query.go index 69f48e73..76946cbd 100644 --- a/internal/statements/query.go +++ b/internal/statements/query.go @@ -247,6 +247,9 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB top = fmt.Sprintf("TOP %d ", LimitNValue) } if statement.Start > 0 { + if statement.RefTable == nil { + return "", nil, errors.New("Unsupported query limit without reference table") + } var column string if len(statement.RefTable.PKColumns()) == 0 { for _, index := range statement.RefTable.Indexes {