Skip to content

Commit c349d36

Browse files
committed
Fix update with Alias (go-xorm#1455)
1 parent a63a26e commit c349d36

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

session_update.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,23 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
377377
return 0, errors.New("No content found to be updated")
378378
}
379379

380-
sqlStr = fmt.Sprintf("UPDATE %v%v SET %v %v",
380+
var tableAlias = session.engine.Quote(tableName)
381+
var fromSQL string
382+
if session.statement.TableAlias != "" {
383+
switch session.engine.dialect.DBType() {
384+
case core.MSSQL:
385+
fromSQL = fmt.Sprintf("FROM %s %s ", tableAlias, session.statement.TableAlias)
386+
tableAlias = session.statement.TableAlias
387+
default:
388+
tableAlias = fmt.Sprintf("%s AS %s", tableAlias, session.statement.TableAlias)
389+
}
390+
}
391+
392+
sqlStr = fmt.Sprintf("UPDATE %v%v SET %v %v%v",
381393
top,
382-
session.engine.Quote(tableName),
394+
tableAlias,
383395
strings.Join(colNames, ", "),
396+
fromSQL,
384397
condSQL)
385398

386399
res, err := session.exec(sqlStr, append(args, condArgs...)...)

session_update_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,3 +1328,34 @@ func TestUpdateExprs(t *testing.T) {
13281328
assert.EqualValues(t, 2, ue.NumIssues)
13291329
assert.EqualValues(t, "lunny xiao", ue.Name)
13301330
}
1331+
1332+
func TestUpdateAlias(t *testing.T) {
1333+
assert.NoError(t, prepareEngine())
1334+
1335+
type UpdateAlias struct {
1336+
Id int64
1337+
NumIssues int
1338+
Name string
1339+
}
1340+
1341+
assertSync(t, new(UpdateAlias))
1342+
1343+
_, err := testEngine.Insert(&UpdateAlias{
1344+
NumIssues: 1,
1345+
Name: "lunny",
1346+
})
1347+
assert.NoError(t, err)
1348+
1349+
_, err = testEngine.Alias("ua").Where("ua.id = ?", 1).Update(&UpdateAlias{
1350+
NumIssues: 2,
1351+
Name: "lunny xiao",
1352+
})
1353+
assert.NoError(t, err)
1354+
1355+
var ue UpdateAlias
1356+
has, err := testEngine.Get(&ue)
1357+
assert.NoError(t, err)
1358+
assert.True(t, has)
1359+
assert.EqualValues(t, 2, ue.NumIssues)
1360+
assert.EqualValues(t, "lunny xiao", ue.Name)
1361+
}

0 commit comments

Comments
 (0)