Query Syntax
sqry uses a structured boolean query language. Queries are composed of field predicates combined with logical operators. This page covers the full syntax and when to use each of the two query commands.
Basic Structure
A query is one or more predicates of the form field:value, combined with boolean operators:
field:value OPERATOR field:value
Examples:
sqry query "kind:function"
sqry query "kind:function AND async:true"
sqry query "lang:rust AND (kind:function OR kind:method)"
sqry provides two commands for running queries:
sqry query— searches the pre-built index. Fast (4ms with a warm cache), supports all relation fields (callers:,callees:,imports:,exports:). Requires runningsqry index .first.sqry search— parses files on demand, no index required. Slower, does not support relation queries. Useful for exploring unfamiliar codebases without setup.
Operators
| Operator | Meaning | Example |
|---|---|---|
: | Exact match or segment match (case-insensitive) | name:login matches login, MyClass.login |
~= | Regex match (PCRE syntax, anchored to value) | name~=/^test_/ |
> | Greater than (numeric fields) | line:>100 |
< | Less than (numeric fields) | line:<50 |
>= | Greater than or equal | line:>=10 |
<= | Less than or equal | line:<=200 |
AND | Both predicates must match | kind:function AND async:true |
OR | Either predicate must match | kind:class OR kind:struct |
NOT | Predicate must not match | NOT name~=/test/ |
( ) | Group predicates to control precedence | (kind:function OR kind:method) AND lang:rust |
Regex patterns use PCRE syntax and are wrapped in / delimiters: name~=/pattern/. Common patterns:
name~=/^test_/— starts withtest_name~=/Handler$/— ends withHandlername~=/auth/— containsauth
Field Overview
Fields are organized into three categories:
| Category | Fields | Description |
|---|---|---|
| Symbol fields | kind:, name:, lang:, path:, visibility:, async:, returns: | Attributes of individual symbols |
| Relation fields | callers:, callees:, imports:, exports:, impl: | Cross-symbol relationships (index required) |
| Scope fields | parent:, scope.type:, scope.name:, scope.ancestor: | Containment and nesting |
See Field Reference for the complete list with all accepted values.
Worked Examples
All functions:
sqry query "kind:function"
# Returns every function symbol in the indexed codebase.
All async functions:
sqry query "kind:function AND async:true"
# Returns only functions marked async — no false positives from comments or strings.
Functions whose name starts with test_:
sqry query "name~=/^test_/"
# Regex match anchored to the start of the symbol name.
Everything that calls authenticate:
sqry query "callers:authenticate"
# Cross-file call graph traversal — returns the exact list of callers.
All Serialize implementations:
sqry query "impl:Serialize"
# Finds every struct/enum that implements the Serialize trait.
Public Rust symbols:
sqry query "lang:rust AND visibility:public"
# Filters by both language and visibility simultaneously.
Classes in the models directory:
sqry query "kind:class AND path:src/models/**"
# Glob pattern on the file path.
Non-test functions and methods:
sqry query "(kind:function OR kind:method) AND NOT name~=/test/"
# Grouping with OR, combined with a negated regex filter.
sqry query vs sqry search
sqry query | sqry search | |
|---|---|---|
| Index required | Yes (sqry index . first) | No |
| Speed | 4ms (warm cache) | Parses files on demand |
| Relation queries | Yes (callers:, callees:, imports:, exports:) | No |
| Best for | Regular development, CI checks, relation traversal | First-time exploration, one-off lookups |
Use sqry query when you are working in a project regularly and need instant, precise results — especially for any query involving callers, callees, imports, or exports. The one-time indexing cost is recovered within the first few queries.
Use sqry search when you are exploring a codebase for the first time and do not want to build an index, or when you need results that reflect the very latest unsaved file state.