can1357/oh-my-pi · error · ToolError

Unsupported SQLite query parameter '${keyName}'

Error message

Unsupported SQLite query parameter '${keyName}'

What it means

The sqlite-reader tool builds a paginated table query from URL query parameters (limit, offset, order, where) on a `db.sqlite/table` selector. When any pagination parameter is present, every supplied parameter must be one of the four known keys; an unknown key means the selector string was likely mistyped or mis-encoded, so the tool throws a ToolError instead of silently ignoring it.

Source

Thrown at packages/coding-agent/src/tools/sqlite-reader.ts:605

	if (!table) {
		throw new ToolError("SQLite selectors must include a table name");
	}

	if (key !== undefined && key.length > 0) {
		if (params.size > 0) {
			throw new ToolError("SQLite row lookups cannot be combined with query parameters");
		}
		return { kind: "row", table, key };
	}

	const where = validateWhereClause(params.get("where") ?? undefined);
	const order = params.get("order")?.trim() || undefined;
	const hasQueryParams = params.has("limit") || params.has("offset") || order !== undefined || where !== undefined;
	if (hasQueryParams) {
		const knownKeys = new Set(["limit", "offset", "order", "where"]);
		for (const keyName of params.keys()) {
			if (!knownKeys.has(keyName)) {
				throw new ToolError(`Unsupported SQLite query parameter '${keyName}'`);
			}
		}
		return {
			kind: "query",
			table,
			limit: parseLimit(params.get("limit"), DEFAULT_QUERY_LIMIT),
			offset: parseOffset(params.get("offset")),
			order,
			where,
		};
	}

	if (params.size > 0) {
		for (const keyName of params.keys()) {
			throw new ToolError(`Unsupported SQLite query parameter '${keyName}'`);
		}
	}

View on GitHub (pinned to 9690622007)

Solutions

  1. Replace the unknown parameter with a supported one: limit, offset, order, or where
  2. If filtering by column values, use ?where=<sql condition> instead of filter-like params
  3. If you need arbitrary SQL, use the raw query selector `db.sqlite?q=SELECT ...` instead of table params
  4. Check the query string for stray characters, typos, or duplicated parameters (URLSearchParams will surface both keys)

Example fix

// before
sqlite://app.db?users?sort=name&limit=10
// after
sqlite://app.db?users?order=name&limit=10
Defensive patterns

Strategy: validation

Validate before calling

const ALLOWED = new Set(["limit", "offset", "order", "where"]);
const params = new URLSearchParams(queryString);
const bad = [...params.keys()].filter(k => !ALLOWED.has(k));
if (bad.length) throw new Error(`Unsupported SQLite query parameter(s): ${bad.join(", ")}`);

Try / catch

try {
  const selector = parseSqliteSelector(subPath, queryString);
} catch (err) {
  if (err instanceof ToolError && err.message.includes("Unsupported SQLite query parameter")) {
    // strip unknown params or show allowed keys to the user
  } else throw err;
}

Prevention

When it happens

Trigger: Calling parseSqliteSelector (via a sqlite:// resource like `db.sqlite:table?limit=5&foo=bar`) where at least one of limit/offset/order/where is present AND an unrecognized key such as `sort`, `filter`, `page`, or `fields` also appears in the query string.

Common situations: Developer guesses at parameter names (`sort=` instead of `order=`, `filter=` instead of `where=`); URL fragments or extra params from copy-paste; a template adds tracking-style params; case sensitivity (`Limit=` is not `limit=`).

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/7a5cafe5384fafef. Report an issue: GitHub.