{"record":{"id":"5f5b116189ebf6d0","repo":"cayleygraph/cayley","slug":"invalid-syntax","errorCode":null,"errorMessage":"invalid syntax","messagePattern":"invalid syntax","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"query/sexp/session.go","lineNumber":72,"sourceCode":"\t\t}\n\t\tif x == ')' {\n\t\t\tparenDepth--\n\t\t\tif parenDepth < 0 {\n\t\t\t\tmin := 0\n\t\t\t\tif (i - 10) > min {\n\t\t\t\t\tmin = i - 10\n\t\t\t\t}\n\t\t\t\treturn fmt.Errorf(\"too many close parentheses at char %d: %s\", i, input[min:i])\n\t\t\t}\n\t\t}\n\t}\n\tif parenDepth > 0 {\n\t\treturn query.ErrParseMore\n\t}\n\tif len(ParseString(input)) > 0 {\n\t\treturn nil\n\t}\n\treturn errors.New(\"invalid syntax\")\n}\n\nfunc (s *Session) Execute(ctx context.Context, input string, opt query.Options) (query.Iterator, error) {\n\tswitch opt.Collation {\n\tcase query.Raw, query.REPL:\n\tdefault:\n\t\treturn nil, &query.ErrUnsupportedCollation{Collation: opt.Collation}\n\t}\n\tit := BuildIteratorTreeForQuery(ctx, s.qs, input).Iterate()\n\tif err := it.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\tif opt.Limit > 0 {\n\t\tit = iterator.NewLimitNext(it, int64(opt.Limit))\n\t}\n\treturn &results{\n\t\ts:   s,\n\t\tcol: opt.Collation,","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/cayleygraph/cayley/blob/81dcd7d73e45136bc0d01802a8ba4685d8a533eb/query/sexp/session.go#L54-L90","documentation":"The sexp session's Parse validates input by attempting to parse it as an s-expression. If the parentheses are balanced (not more input required) but the input still parses to zero expressions, the session reports 'invalid syntax', meaning the input is complete but not a valid query expression.","triggerScenarios":"Calling sexp.Session.Parse with complete but malformed input, e.g. an unmatched ')' ('g.V)'), an empty string, or only whitespace/comments that yield no parsed expressions.","commonSituations":"Typos in hand-written s-expression queries; sending garbage lines to a Cayley REPL; clients pre-validating queries before Execute.","solutions":["Fix the s-expression syntax (balance parentheses, remove stray tokens) and resubmit.","Validate the query shape with ParseString locally before calling Parse.","Use a supported higher-level query language (Gizmo/GQL) if s-expression syntax is unfamiliar."],"exampleFix":"// before\n_, err := ses.Parse(ctx, \"g.V))\")\n// after\n_, err := ses.Parse(ctx, \"(g.V)\")","handlingStrategy":"validation","validationCode":"if len(query.ParseString(input)) == 0 && strings.Count(input, \"(\") == strings.Count(input, \")\") {\n    return errors.New(\"input is not a valid sexp query\")\n}","typeGuard":"func isValidSexp(input string) bool {\n    return len(query.ParseString(input)) > 0 || strings.Count(input, \"(\") > strings.Count(input, \")\")\n}","tryCatchPattern":"_, err := ses.Parse(ctx, input)\nif err != nil && err != query.ErrParseMore {\n    return fmt.Errorf(\"invalid sexp query %q: %w\", input, err)\n}","preventionTips":["Use query.ParseString to pre-validate","Keep parentheses balanced; lint multi-line queries","Prefer the higher-level query language when unsure of sexp syntax"],"tags":["go","sexp","parser","syntax-error"],"backgroundTag":"invalid-argument-format","analyzedSha":"81dcd7d73e45136bc0d01802a8ba4685d8a533eb","analyzedAt":"2026-09-06T06:14:12.358Z","contentChangedAt":"2026-09-06T06:14:12.358Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}