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

  1. Inspect how teamMembersQ is constructed above line 744 and ensure it always has a SELECT and FROM clause.
  2. Reproduce with the same userID/search term and log the builder state before ToSql().
  3. Upgrade/align squirrel (github.com/Masterminds/squirrel) to the version the project pins.
  4. 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

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


AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30). Data as JSON: /api/errors/523293d1e5357871. Report an issue: GitHub.