From 26b248c5691f19a62ed607dfaaca81fd15671f1b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 5 Jan 2021 10:55:36 +0800 Subject: [PATCH] Fix update bug (#1823) Fix #1821 Reviewed-on: https://gitea.com/xorm/xorm/pulls/1823 Co-authored-by: Lunny Xiao Co-committed-by: Lunny Xiao --- integrations/session_schema_test.go | 4 ++++ integrations/session_update_test.go | 14 ++++++++++++++ session_update.go | 9 ++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/integrations/session_schema_test.go b/integrations/session_schema_test.go index 72779e11..1ef653ef 100644 --- a/integrations/session_schema_test.go +++ b/integrations/session_schema_test.go @@ -399,6 +399,10 @@ func TestSync2_Default(t *testing.T) { } func TestModifyColum(t *testing.T) { + // Since SQLITE don't support modify column SQL, currrently just ignore + if testEngine.Dialect().URI().DBType == schemas.SQLITE { + return + } type TestModifyColumn struct { Id int64 UserId int64 `xorm:"default(1)"` diff --git a/integrations/session_update_test.go b/integrations/session_update_test.go index 07c722bd..f2105e2b 100644 --- a/integrations/session_update_test.go +++ b/integrations/session_update_test.go @@ -15,6 +15,7 @@ import ( "xorm.io/xorm/internal/statements" "xorm.io/xorm/internal/utils" "xorm.io/xorm/names" + "xorm.io/xorm/schemas" ) func TestUpdateMap(t *testing.T) { @@ -48,6 +49,19 @@ func TestUpdateMap(t *testing.T) { assert.Error(t, err) assert.True(t, statements.IsIDConditionWithNoTableErr(err)) assert.EqualValues(t, 0, cnt) + + cnt, err = testEngine.Table("update_table").Update(map[string]interface{}{ + "name": "test2", + "age": 36, + }, &UpdateTable{ + Id: tb.Id, + }) + assert.NoError(t, err) + if testEngine.Dialect().URI().DBType == schemas.SQLITE { + assert.EqualValues(t, 1, cnt) + } else { + assert.EqualValues(t, 0, cnt) + } } func TestUpdateLimit(t *testing.T) { diff --git a/session_update.go b/session_update.go index 7df8c752..0adac25e 100644 --- a/session_update.go +++ b/session_update.go @@ -273,8 +273,15 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 k = ct.Elem().Kind() } if k == reflect.Struct { + var refTable = session.statement.RefTable + if refTable == nil { + refTable, err = session.engine.TableInfo(condiBean[0]) + if err != nil { + return 0, err + } + } var err error - autoCond, err = session.statement.BuildConds(session.statement.RefTable, condiBean[0], true, true, false, true, false) + autoCond, err = session.statement.BuildConds(refTable, condiBean[0], true, true, false, true, false) if err != nil { return 0, err }