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:

Operators

OperatorMeaningExample
: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 equalline:>=10
<=Less than or equalline:<=200
ANDBoth predicates must matchkind:function AND async:true
OREither predicate must matchkind:class OR kind:struct
NOTPredicate must not matchNOT 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:

Field Overview

Fields are organized into three categories:

CategoryFieldsDescription
Symbol fieldskind:, name:, lang:, path:, visibility:, async:, returns:Attributes of individual symbols
Relation fieldscallers:, callees:, imports:, exports:, impl:Cross-symbol relationships (index required)
Scope fieldsparent:, 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.

Structural Query Planner (sqry plan-query)

In addition to the boolean sqry query syntax above, sqry ships a structural query planner exposed as sqry plan-query (CLI) and sqry_query (MCP tool). The planner uses a flat, whitespace-separated chain of predicate steps, with subqueries nested in parentheses. Each step is compiled into a logical plan, fused across batches for shared scans, and executed against the derived analysis cache — so repeated queries are sub-millisecond.

sqry plan-query "kind:function has:caller"
sqry plan-query "kind:function callers:main"
sqry plan-query "kind:function traverse:reverse(calls,3)"
sqry plan-query "kind:function in:src/api/**"
sqry plan-query "kind:function references ~= /handle_.*/i"
sqry plan-query "kind:struct implements:Visitor"
sqry plan-query "kind:function callees:(kind:method name:visit_*)"

Predicate steps

PredicateEffect
kind:<NodeKind>Scan all nodes of a given kind (function, method, class, struct, trait, enum, module, …)
visibility:public / visibility:privateFilter by visibility
name:<pattern>Filter by symbol name (literal, glob, or regex via ~=)
returns:<type>Filter functions/methods by return type
in:<glob>Filter by file path glob
scope:<scopekind>Filter by lexical scope kind
has:caller / has:calleeSet membership — symbol has at least one caller / callee
callers:<value>Symbols that are callers of the given target (literal, glob, or subquery)
callees:<value>Symbols that are callees of the given target
imports:<value>Symbols that import the target
exports:<value>Symbols exported under the target name
implements:<trait>Types implementing the named trait/interface
references ~= /regex/[ims]Symbols whose references match a regex
unusedSet membership — symbol has zero callers (dead-code candidate)
traverse:<dir>(<edge>,<depth>)Multi-hop traversal (forward, reverse, both) up to a fixed depth

Subqueries

Wrap a nested query in parentheses to use it as the right-hand value of any relation predicate:

sqry plan-query "kind:function callees:(kind:method name:visit_*)"
sqry plan-query "kind:struct implements:(kind:trait name:Display)"

When to use the planner

sqry querysqry search
Index requiredYes (sqry index . first)No
Speed4ms (warm cache)Parses files on demand
Relation queriesYes (callers:, callees:, imports:, exports:)No
Best forRegular development, CI checks, relation traversalFirst-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.

Query Variables

Use --var to inject values into queries at runtime. Reference variables with $name:

sqry query "callers:$fn AND lang:$lang" --var fn=authenticate --var lang=rust

Multiple variables can be passed. This is useful for scripting and batch workflows where the same query template runs against different targets:

for fn in authenticate authorize logout; do
  sqry query "callers:$fn" --var fn=$fn --json
done

Fuzzy matching finds symbols even when the query contains typos or partial names. It requires an index.

# Enable fuzzy matching
sqry query "authentcate" --fuzzy

# Control similarity threshold (0.0–1.0, default 0.6)
sqry query "authentcate" --fuzzy --fuzzy-threshold 0.8

# Choose algorithm
sqry query "authentcate" --fuzzy --fuzzy-algorithm levenshtein

Algorithms

AlgorithmBehaviorBest for
jaro-winkler (default)Favors strings that share a common prefixSymbol names with shared conventions
levenshteinCounts minimum edits (insert, delete, replace)Short names, exact typo correction

Additional options

FlagDefaultDescription
--fuzzy-max-candidates1000Max candidates evaluated (higher = slower, more thorough)
--json-streamNewline-delimited JSON output for streaming
--fuzzy-fieldsEnable typo correction for field names (e.g., knd:functionkind:function)
--fuzzy-field-distance2Max edit distance for field name correction

Output Formats

By default, sqry prints human-readable tabular output. Use flags to switch formats:

# JSON (full symbol details)
sqry query "kind:function" --json

# CSV with headers
sqry query "kind:function" --csv --headers

# TSV for Unix pipelines
sqry query "kind:function" --tsv

# Select specific columns
sqry query "kind:function" --csv --columns name,file,line,kind

# Count only (no results)
sqry query "kind:function" --count

Available columns

name, qualified_name, kind, file, line, column, end_line, end_column, language, preview

CSV safety

CSV output has formula injection protection enabled by default — cell values starting with =, +, -, or @ are prefixed with a single quote. Use --raw-csv to disable this if you’re processing output programmatically and don’t need the protection.

Code preview

Add --preview to include source code context with each result:

# Show 3 lines of context (default)
sqry query "kind:function AND name:main" --preview

# Show 5 lines of context
sqry query "kind:function AND name:main" --preview 5

# Show match line only (no surrounding context)
sqry query "kind:function AND name:main" --preview 0