{"record":{"id":"523293d1e5357871","repo":"mattermost-community/focalboard","slug":"searchboardsforuser-error-getting-teammemberssql","errorCode":null,"errorMessage":"SearchBoardsForUser error getting teamMembersSQL: %w","messagePattern":"SearchBoardsForUser error getting teamMembersSQL: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/services/store/mattermostauthlayer/mattermostauthlayer.go","lineNumber":744,"sourceCode":"\t\t\t// break search query into space separated words\n\t\t\t// and search for all words.\n\t\t\t// This should later be upgraded to industrial-strength\n\t\t\t// word tokenizer, that uses much more than space\n\t\t\t// to break words.\n\t\t\tconditions := sq.And{}\n\t\t\tfor _, word := range strings.Split(strings.TrimSpace(term), \" \") {\n\t\t\t\tconditions = append(conditions, sq.Like{\"lower(b.title)\": \"%\" + strings.ToLower(word) + \"%\"})\n\t\t\t}\n\n\t\t\tboardMembersQ = boardMembersQ.Where(conditions)\n\t\t\tteamMembersQ = teamMembersQ.Where(conditions)\n\t\t\tchannelMembersQ = channelMembersQ.Where(conditions)\n\t\t}\n\t}\n\n\tteamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"SearchBoardsForUser error getting teamMembersSQL: %w\", err)\n\t}\n\n\tchannelMembersSQL, channelMembersArgs, err := channelMembersQ.ToSql()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"SearchBoardsForUser error getting channelMembersSQL: %w\", err)\n\t}\n\n\tunionQ := boardMembersQ\n\tuser, err := s.GetUserByID(userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// NOTE: theoretically, could do e.g. `isGuest := !includePublicBoards`\n\t// but that introduces some tight coupling + fragility\n\tif !user.IsGuest {\n\t\tunionQ = unionQ.\n\t\t\tPrefix(\"(\").\n\t\t\tSuffix(\") UNION (\"+channelMembersSQL+\")\", channelMembersArgs...)","sourceCodeStart":726,"sourceCodeEnd":762,"githubUrl":"https://github.com/mattermost-community/focalboard/blob/a84bbb65e32edf972856b329417096ac413518e9/server/services/store/mattermostauthlayer/mattermostauthlayer.go#L726-L762","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nteamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()\n// after\nteamMembersQ = teamMembersQ.Column(\"id\", \"title\").From(\"boards\")\nteamMembersSQL, teamMembersArgs, err := teamMembersQ.ToSql()\nif err != nil {\n\treturn nil, fmt.Errorf(\"SearchBoardsForUser error getting teamMembersSQL: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"boards, err := store.SearchBoardsForUser(userID, term)\nif err != nil {\n\tif strings.Contains(err.Error(), \"error getting teamMembersSQL\") {\n\t\tlogger.Error(\"query build failure in board search\", \"err\", err)\n\t\treturn nil, ErrInternalSearch // return safe error, log details server-side\n\t}\n\treturn nil, err\n}","preventionTips":["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."],"tags":["sql","squirrel","query-builder","store"],"backgroundTag":"sql-build-failed","analyzedSha":"a84bbb65e32edf972856b329417096ac413518e9","analyzedAt":"2026-08-30T09:22:20.720Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}