mattermost-community/focalboard · error
SearchBoardsForUser error getting teamMembersSQL: %w
Error message
SearchBoardsForUser error getting teamMembersSQL: %w
What it means
In SearchBoardsForUser, squirrel's teamMembersQ.ToSql() failed while converting the team-members query builder into SQL and args. This is a query-construction error (malformed builder, e.g. bad placeholder or empty select), not a database execution error.
Source
Thrown at server/services/store/mattermostauthlayer/mattermostauthlayer.go:744
// break search query into space separated words
// and search for all words.
// This should later be upgraded to industrial-strength
// word tokenizer, that uses much more than space
// to break words.
conditions := sq.And{}
for _, word := range strings.Split(strings.TrimSpace(term), " ") {
conditions = append(conditions, sq.Like{"lower(b.title)": "%" + strings.ToLower(word) + "%"})
}
boardMembersQ = boardMembersQ.Where(conditions)
teamMembersQ = teamMembersQ.Where(conditions)
channelMembersQ = channelMembersQ.Where(conditions)
}
}
teamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()
if err != nil {
return nil, fmt.Errorf("SearchBoardsForUser error getting teamMembersSQL: %w", err)
}
channelMembersSQL, channelMembersArgs, err := channelMembersQ.ToSql()
if err != nil {
return nil, fmt.Errorf("SearchBoardsForUser error getting channelMembersSQL: %w", err)
}
unionQ := boardMembersQ
user, err := s.GetUserByID(userID)
if err != nil {
return nil, err
}
// NOTE: theoretically, could do e.g. `isGuest := !includePublicBoards`
// but that introduces some tight coupling + fragility
if !user.IsGuest {
unionQ = unionQ.
Prefix("(").
Suffix(") UNION ("+channelMembersSQL+")", channelMembersArgs...)View on GitHub (pinned to a84bbb65e3)
Solutions
- Inspect how teamMembersQ is constructed above line 744 and ensure it always has a SELECT and FROM clause.
- Reproduce with the same userID/search term and log the builder state before ToSql().
- Upgrade/align squirrel (github.com/Masterminds/squirrel) to the version the project pins.
- Add a unit test covering the search path with and without channel-membership conditions.
Example fix
// before
teamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()
// after
teamMembersQ = teamMembersQ.Column("id", "title").From("boards")
teamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()
if err != nil {
return nil, fmt.Errorf("SearchBoardsForUser error getting teamMembersSQL: %w", err)
} Defensive patterns
Strategy: try-catch
Try / catch
boards, err := store.SearchBoardsForUser(userID, term)
if err != nil {
if strings.Contains(err.Error(), "error getting teamMembersSQL") {
logger.Error("query build failure in board search", "err", err)
return nil, ErrInternalSearch // return safe error, log details server-side
}
return nil, err
} Prevention
- Never return a SelectBuilder built conditionally without guaranteeing SELECT/FROM.
- Add unit tests covering all conditional builder branches.
- Pin squirrel version and review dependency updates.
When it happens
Trigger: teamMembersQ built in SearchBoardsForUser is invalid when ToSql() is invoked — typically an incomplete query built with SelectBuilder in an error state, or a nil/zero builder being converted.
Common situations: Code changes leaving the builder without a SELECT clause; conditional Where() branches that accidentally produce contradictory structure; squirrel version incompatibilities; passing malformed search term/conditions into the builder.
Related errors
- SearchBoardsForUser error getting channelMembersSQL: %w
- SearchBoardsForUserInTeam error getting memberBoardsSQL: %w
- SearchBoardsForUserInTeam error getting channelMemberBoardsS
- SearchBoardsForUser error getting unionSQL: %w
- SearchBoardsForUserInTeam error getting unionSQL: %w
AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30).
Data as JSON: /api/errors/523293d1e5357871.
Report an issue: GitHub.