This commit is contained in:
Lunny Xiao 2023-07-12 13:35:30 +08:00
parent f4e29f7b97
commit 0fdecc7777
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
1 changed files with 43 additions and 42 deletions

View File

@ -269,7 +269,11 @@ func (statement *Statement) writeForUpdate(w io.Writer) error {
} }
func (statement *Statement) writeMssqlPaginationCond(w *builder.BytesWriter) error { func (statement *Statement) writeMssqlPaginationCond(w *builder.BytesWriter) error {
if statement.dialect.URI().DBType != schemas.MSSQL || statement.LimitN == nil { if statement.RefTable == nil {
return errors.New("unsupported query limit without reference table")
}
if statement.dialect.URI().DBType != schemas.MSSQL || statement.Start <= 0 {
return nil return nil
} }
@ -277,51 +281,48 @@ func (statement *Statement) writeMssqlPaginationCond(w *builder.BytesWriter) err
if err := statement.writeTop(mssqlCondi); err != nil { if err := statement.writeTop(mssqlCondi); err != nil {
return err return err
} }
if statement.Start > 0 {
if statement.RefTable == nil { var column string
return errors.New("unsupported query limit without reference table") if len(statement.RefTable.PKColumns()) == 0 {
for _, index := range statement.RefTable.Indexes {
if len(index.Cols) == 1 {
column = index.Cols[0]
break
}
} }
var column string if len(column) == 0 {
if len(statement.RefTable.PKColumns()) == 0 { column = statement.RefTable.ColumnsSeq()[0]
for _, index := range statement.RefTable.Indexes { }
if len(index.Cols) == 1 { } else {
column = index.Cols[0] column = statement.RefTable.PKColumns()[0].Name
break }
} if statement.NeedTableName() {
} if len(statement.TableAlias) > 0 {
if len(column) == 0 { column = fmt.Sprintf("%s.%s", statement.TableAlias, column)
column = statement.RefTable.ColumnsSeq()[0]
}
} else { } else {
column = statement.RefTable.PKColumns()[0].Name column = fmt.Sprintf("%s.%s", statement.TableName(), column)
}
if statement.NeedTableName() {
if len(statement.TableAlias) > 0 {
column = fmt.Sprintf("%s.%s", statement.TableAlias, column)
} else {
column = fmt.Sprintf("%s.%s", statement.TableName(), column)
}
}
if _, err := fmt.Fprintf(mssqlCondi, "(%s NOT IN (SELECT TOP %d %s",
column, statement.Start, column); err != nil {
return err
}
if err := statement.writeFrom(mssqlCondi); err != nil {
return err
}
if err := statement.writeWhere(mssqlCondi); err != nil {
return err
}
if err := statement.WriteOrderBy(mssqlCondi); err != nil {
return err
}
if err := statement.writeGroupBy(mssqlCondi); err != nil {
return err
}
if _, err := fmt.Fprint(mssqlCondi, "))"); err != nil {
return err
} }
} }
if _, err := fmt.Fprintf(mssqlCondi, "(%s NOT IN (SELECT TOP %d %s",
column, statement.Start, column); err != nil {
return err
}
if err := statement.writeFrom(mssqlCondi); err != nil {
return err
}
if err := statement.writeWhere(mssqlCondi); err != nil {
return err
}
if err := statement.WriteOrderBy(mssqlCondi); err != nil {
return err
}
if err := statement.writeGroupBy(mssqlCondi); err != nil {
return err
}
if _, err := fmt.Fprint(mssqlCondi, "))"); err != nil {
return err
}
if statement.cond.IsValid() { if statement.cond.IsValid() {
if _, err := fmt.Fprint(w, " AND "); err != nil { if _, err := fmt.Fprint(w, " AND "); err != nil {
return err return err