Skip to content

Commit

Permalink
fix statement.LimitN(0) will delete or update all data (go-xorm#1119)
Browse files Browse the repository at this point in the history
fix test

fix nil pointer

fix statement.Limit(0) will update or delete all data

fix bug when buffersize with iterate (go-xorm#941)

Merge branch 'master' into lunny/fix_buffer_iterate

Exclude schema from index name (#1505)

Merge branch 'master' into fix-schema-idx

SetExpr support more go types (#1499)

Improve tests

SetExpr support more go types

fix vet

fix drone lint

remove go1.10 test on drone

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499

fix vet

fix drone lint

remove go1.10 test on drone

Exclude schema from the index name

Co-authored-by: Guillermo Prandi <guillep2k@users.noreply.github.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/1505

fix test

fix bug

fix bug when buffersize with iterate

SetExpr support more go types (#1499)

Improve tests

SetExpr support more go types

fix vet

fix drone lint

remove go1.10 test on drone

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499

fix vet

fix drone lint

remove go1.10 test on drone

Fix update with Alias (go-xorm#1455)

Co-authored-by: Guillermo Prandi <guillep2k@noreply.gitea.io>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/941

fix update map with version (go-xorm#1448)

fix test

fix update map with version

SetExpr support more go types (#1499)

Improve tests

SetExpr support more go types

fix vet

fix drone lint

remove go1.10 test on drone

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499

fix vet

fix drone lint

remove go1.10 test on drone

Fix update with Alias (go-xorm#1455)

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1448

Exclude schema from index name (#1505)

Merge branch 'master' into fix-schema-idx

SetExpr support more go types (#1499)

Improve tests

SetExpr support more go types

fix vet

fix drone lint

remove go1.10 test on drone

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499

fix vet

fix drone lint

remove go1.10 test on drone

Exclude schema from the index name

Co-authored-by: Guillermo Prandi <guillep2k@users.noreply.github.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/1505

SetExpr support more go types (#1499)

Improve tests

SetExpr support more go types

fix vet

fix drone lint

remove go1.10 test on drone

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499

fix vet

fix drone lint

remove go1.10 test on drone

Fix update with Alias (go-xorm#1455)

Improve ci tests (#1477)

Rewrite Engine.QuoteTo() to accept multi-part identifiers (#1476)

Support local sql log (go-xorm#1338)

Fix go mod and update version (go-xorm#1460)

Move github.com/go-xorm/xorm to xorm.io/xorm (go-xorm#1459)

add support custom type Nullfloat64 (go-xorm#1450)

fix bug when query map condtion with no quote (go-xorm#1449)

Don't warn when bool column default is 1 but not true (go-xorm#1447)

* don't warn when bool column default is 1 but not true

* fix default case sensitive

Fix sync2 with custom table name (go-xorm#1445)

* fix sync2 with custom table name

* fix bug on postgres

* fix bug on postgres

fix bug when update with setexpr (go-xorm#1446)

add tidb tests on drone ci (go-xorm#1444)

improve sync2 (go-xorm#1443)

Fix wrong dbmetas (go-xorm#1442)

* add tests for db metas

* add more tests

* fix bug on mssql

Fix default value parse bugs (go-xorm#1437)

* fix default value

* fix default value tags

* fix postgres default

* fix default on postgres

* fix default on postgres

* fix mssql default

fix arg conversion (go-xorm#1441)

* fix arg conversion

* fix bugs

* fix bug on postgres

* use traditional positional parameters on insert into select

* remove unnecessary tests

upgrade core (go-xorm#1440)

add tests (go-xorm#1439)

add go1.13 tests on drone (go-xorm#1416)

Fix bug on insert where (go-xorm#1436)

* fix bug on insert where

* fix bug

* fix lint

fix bug when insert multiple slices with customize table name (go-xorm#1433)

* fix bug when insert multiple slices with customize table name

* fix tests on mssql

* fix tests

fix insert where with bool bug on mssql (go-xorm#1432)

fix setexpr missing big quotes (go-xorm#1431)

* fix setexpr missing big quotes

* fix tests

* fix tests

Add support subquery on SetExpr (go-xorm#1428)

* add support subquery on SetExpr

* fix tests

fix go mod (go-xorm#1427)

fix tests (go-xorm#1429)

Use strings.Builder instead of builder.StringBuilder (go-xorm#1417)

* use strings.Builder instead of builder.StringBuilder

* fix dependency

* fix dependency

Remove unuse get cols code (go-xorm#1413)

Add mssql ci test (go-xorm#1410)

* add mssql ci test

* fix drone test

Add insert select where support (go-xorm#1401)

Use drone new format (go-xorm#1388)

* use drone new format
fix get customize type bug (go-xorm#1382)

fix bugs (go-xorm#1375)

update drone (go-xorm#1374)

Add tests for get var (go-xorm#1305)

* add test for SQL get
* fix tests

fix error when get null var (go-xorm#890)

* fix error when get null var
* add support get for null var
* fix bug

Remove quotestr totally (go-xorm#1366)

* remove QuoteStr() totally

* update xorm.core -> v0.7.0

* update dialect Quote

remove QuoteStr() usage in dialects (go-xorm#1364)

document of FindAndCount() (go-xorm#1365)

remove QuoteStr() usage (go-xorm#1360)

Co-authored-by: yifhao <yifhao@tencent.com>
Co-authored-by: yifhao <1124210681@qq.com>
Co-authored-by: Guillermo Prandi <guillep2k@noreply.gitea.io>
Co-authored-by: Guillermo Prandi <guillep2k@noreply@gitea.io>
Co-authored-by: yudppp <yu.d.ppp@gmail.com>
Co-authored-by: BetaCat <outman99@hotmail.com>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/1119
  • Loading branch information
7 people committed Jan 20, 2020
1 parent 14a0c19 commit 6dfe337
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 30 deletions.
12 changes: 7 additions & 5 deletions session_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
if err != nil {
return 0, err
}
if len(condSQL) == 0 && session.statement.LimitN == 0 {
pLimitN := session.statement.LimitN
if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) {
return 0, ErrNeedDeletedCond
}

Expand All @@ -119,8 +120,9 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
if len(session.statement.OrderStr) > 0 {
orderSQL += fmt.Sprintf(" ORDER BY %s", session.statement.OrderStr)
}
if session.statement.LimitN > 0 {
orderSQL += fmt.Sprintf(" LIMIT %d", session.statement.LimitN)
if pLimitN != nil && *pLimitN > 0 {
limitNValue := *pLimitN
orderSQL += fmt.Sprintf(" LIMIT %d", limitNValue)
}

if len(orderSQL) > 0 {
Expand All @@ -139,7 +141,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
} else {
deleteSQL += " WHERE " + inSQL
}
// TODO: how to handle delete limit on mssql?
// TODO: how to handle delete limit on mssql?
case core.MSSQL:
return 0, ErrNotImplemented
default:
Expand Down Expand Up @@ -180,7 +182,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
} else {
realSQL += " WHERE " + inSQL
}
// TODO: how to handle delete limit on mssql?
// TODO: how to handle delete limit on mssql?
case core.MSSQL:
return 0, ErrNotImplemented
default:
Expand Down
10 changes: 5 additions & 5 deletions session_iterate.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ func (session *Session) BufferSize(size int) *Session {

func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
var bufferSize = session.statement.bufferSize
var limit = session.statement.LimitN
if limit > 0 && bufferSize > limit {
bufferSize = limit
var pLimitN = session.statement.LimitN
if pLimitN != nil && bufferSize > *pLimitN {
bufferSize = *pLimitN
}
var start = session.statement.Start
v := rValue(bean)
Expand Down Expand Up @@ -94,8 +94,8 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
}

start = start + slice.Elem().Len()
if limit > 0 && start+bufferSize > limit {
bufferSize = limit - start
if pLimitN != nil && start+bufferSize > *pLimitN {
bufferSize = *pLimitN - start
}
}

Expand Down
13 changes: 7 additions & 6 deletions session_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -337,11 +337,12 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
var tableName = session.statement.TableName()
// TODO: Oracle support needed
var top string
if st.LimitN > 0 {
if st.LimitN != nil {
limitValue := *st.LimitN
if st.Engine.dialect.DBType() == core.MYSQL {
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
} else if st.Engine.dialect.DBType() == core.SQLITE {
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)",
session.engine.Quote(tableName), tempCondSQL), condArgs...))
condSQL, condArgs, err = builder.ToSQL(cond)
Expand All @@ -352,7 +353,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
condSQL = "WHERE " + condSQL
}
} else if st.Engine.dialect.DBType() == core.POSTGRES {
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
cond = cond.And(builder.Expr(fmt.Sprintf("CTID IN (SELECT CTID FROM %v %v)",
session.engine.Quote(tableName), tempCondSQL), condArgs...))
condSQL, condArgs, err = builder.ToSQL(cond)
Expand All @@ -367,7 +368,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
if st.OrderStr != "" && st.Engine.dialect.DBType() == core.MSSQL &&
table != nil && len(table.PrimaryKeys) == 1 {
cond = builder.Expr(fmt.Sprintf("%s IN (SELECT TOP (%d) %s FROM %v%v)",
table.PrimaryKeys[0], st.LimitN, table.PrimaryKeys[0],
table.PrimaryKeys[0], limitValue, table.PrimaryKeys[0],
session.engine.Quote(tableName), condSQL), condArgs...)

condSQL, condArgs, err = builder.ToSQL(cond)
Expand All @@ -378,7 +379,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
condSQL = "WHERE " + condSQL
}
} else {
top = fmt.Sprintf("TOP (%d) ", st.LimitN)
top = fmt.Sprintf("TOP (%d) ", limitValue)
}
}
}
Expand Down
31 changes: 19 additions & 12 deletions statement.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type Statement struct {
RefTable *core.Table
Engine *Engine
Start int
LimitN int
LimitN *int
idParam *core.PK
OrderStr string
JoinStr string
Expand Down Expand Up @@ -65,7 +65,7 @@ type Statement struct {
func (statement *Statement) Init() {
statement.RefTable = nil
statement.Start = 0
statement.LimitN = 0
statement.LimitN = nil
statement.OrderStr = ""
statement.UseCascade = true
statement.JoinStr = ""
Expand Down Expand Up @@ -671,7 +671,7 @@ func (statement *Statement) Top(limit int) *Statement {

// Limit generate LIMIT start, limit statement
func (statement *Statement) Limit(limit int, start ...int) *Statement {
statement.LimitN = limit
statement.LimitN = &limit
if len(start) > 0 {
statement.Start = start[0]
}
Expand Down Expand Up @@ -1071,9 +1071,11 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, n
fromStr = fmt.Sprintf("%v %v", fromStr, statement.JoinStr)
}

pLimitN := statement.LimitN
if dialect.DBType() == core.MSSQL {
if statement.LimitN > 0 {
top = fmt.Sprintf("TOP %d ", statement.LimitN)
if pLimitN != nil {
LimitNValue := *pLimitN
top = fmt.Sprintf("TOP %d ", LimitNValue)
}
if statement.Start > 0 {
var column string
Expand Down Expand Up @@ -1134,20 +1136,24 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, n
if needLimit {
if dialect.DBType() != core.MSSQL && dialect.DBType() != core.ORACLE {
if statement.Start > 0 {
fmt.Fprintf(&buf, " LIMIT %v OFFSET %v", statement.LimitN, statement.Start)
} else if statement.LimitN > 0 {
fmt.Fprint(&buf, " LIMIT ", statement.LimitN)
if pLimitN != nil {
fmt.Fprintf(&buf, " LIMIT %v OFFSET %v", *pLimitN, statement.Start)
} else {
fmt.Fprintf(&buf, "LIMIT 0 OFFSET %v", statement.Start)
}
} else if pLimitN != nil {
fmt.Fprint(&buf, " LIMIT ", *pLimitN)
}
} else if dialect.DBType() == core.ORACLE {
if statement.Start != 0 || statement.LimitN != 0 {
if statement.Start != 0 || pLimitN != nil {
oldString := buf.String()
buf.Reset()
rawColStr := columnStr
if rawColStr == "*" {
rawColStr = "at.*"
}
fmt.Fprintf(&buf, "SELECT %v FROM (SELECT %v,ROWNUM RN FROM (%v) at WHERE ROWNUM <= %d) aat WHERE RN > %d",
columnStr, rawColStr, oldString, statement.Start+statement.LimitN, statement.Start)
columnStr, rawColStr, oldString, statement.Start+*pLimitN, statement.Start)
}
}
}
Expand Down Expand Up @@ -1204,8 +1210,9 @@ func (statement *Statement) convertIDSQL(sqlStr string) string {
}

var top string
if statement.LimitN > 0 && statement.Engine.dialect.DBType() == core.MSSQL {
top = fmt.Sprintf("TOP %d ", statement.LimitN)
pLimitN := statement.LimitN
if pLimitN != nil && statement.Engine.dialect.DBType() == core.MSSQL {
top = fmt.Sprintf("TOP %d ", *pLimitN)
}

newsql := fmt.Sprintf("SELECT %s%s FROM %v", top, colstrs, sqls[1])
Expand Down
4 changes: 2 additions & 2 deletions tag_id_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ package xorm
import (
"testing"

"xorm.io/core"
"github.com/stretchr/testify/assert"
"xorm.io/core"
)

type IDGonicMapper struct {
Expand Down Expand Up @@ -76,7 +76,7 @@ func TestSameMapperID(t *testing.T) {
for _, tb := range tables {
if tb.Name == "IDSameMapper" {
if len(tb.PKColumns()) != 1 || tb.PKColumns()[0].Name != "ID" {
t.Fatal(tb)
t.Fatalf("tb %s tb.PKColumns() is %d not 1, tb.PKColumns()[0].Name is %s not ID", tb.Name, len(tb.PKColumns()), tb.PKColumns()[0].Name)
}
return
}
Expand Down

0 comments on commit 6dfe337

Please sign in to comment.