-
Couldn't load subscription status.
- Fork 46
Open
Labels
bugSomething isn't workingSomething isn't working
Description
bug案例复现:
func TestSelectListOr(t *testing.T) {
var expectSql = "SELECT * FROM `Users` WHERE username = 'afumu' OR age = 20"
sessionDb := checkSelectSql(t, expectSql)
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "afumu").Or().Eq(&u.Age, 20).Or(func(q *gplus.QueryCond[User]) {
})
gplus.SelectList[User](query, gplus.Db(sessionDb))
}期望得到的结果:
SELECT * FROM `Users` WHERE username = 'afumu' OR age = 20实际得到的结果:
SELECT * FROM `Users` WHERE username = 'afumu' OR age OR () = 20导致bug出现bug的函数:
func buildSqlAndArgs[T any](expressions []any, sqlBuilder *strings.Builder, queryArgs []any) []any {
for _, v := range expressions {
// 判断是否是columnValue类型
switch segment := v.(type) {
case *columnPointer:
sqlBuilder.WriteString(segment.getSqlSegment() + " ")
case *sqlKeyword:
sqlBuilder.WriteString(segment.getSqlSegment() + " ")
case *columnValue:
if segment.value == constants.And {
sqlBuilder.WriteString(segment.value.(string) + " ")
continue
}
if segment.value != "" {
sqlBuilder.WriteString("? ")
queryArgs = append(queryArgs, segment.value)
}
case *QueryCond[T]:
sqlBuilder.WriteString(constants.LeftBracket + " ")
// 递归处理条件
queryArgs = buildSqlAndArgs[T](segment.queryExpressions, sqlBuilder, queryArgs)
sqlBuilder.WriteString(constants.RightBracket + " ")
}
}
return queryArgs
}bug fix方案:
func buildSqlAndArgs[T any](expressions []any, sqlBuilder *strings.Builder, queryArgs []any) []any {
for _, v := range expressions {
// 判断是否是columnValue类型
switch segment := v.(type) {
case *columnPointer:
sqlBuilder.WriteString(segment.getSqlSegment() + " ")
case *sqlKeyword:
sqlBuilder.WriteString(segment.getSqlSegment() + " ")
case *columnValue:
if segment.value == constants.And {
sqlBuilder.WriteString(segment.value.(string) + " ")
continue
}
if segment.value != "" {
sqlBuilder.WriteString("? ")
queryArgs = append(queryArgs, segment.value)
}
case *QueryCond[T]:
// 当子条件不存在查询表达式时,无需进行递归处理
if len(segment.queryExpressions) == 0 {
continue
}
sqlBuilder.WriteString(constants.LeftBracket + " ")
// 递归处理条件
queryArgs = buildSqlAndArgs[T](segment.queryExpressions, sqlBuilder, queryArgs)
sqlBuilder.WriteString(constants.RightBracket + " ")
}
}
return queryArgs
}Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working