dirsql 0.4.131__tar.gz → 0.4.133__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dirsql-0.4.131 → dirsql-0.4.133}/Cargo.lock +2 -2
- {dirsql-0.4.131 → dirsql-0.4.133}/PKG-INFO +1 -1
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/_async.py +6 -2
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/_dirsql.pyi +4 -2
- {dirsql-0.4.131/packages/rust → dirsql-0.4.133}/docs/reference/sdk.md +69 -3
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.133/packages/python/changelog.d/2026-11-04-query-bind-params.md +1 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/sdk.md +69 -3
- dirsql-0.4.133/packages/python/e2e-attestations/bot-1575-bind-params-1104.json +7 -0
- dirsql-0.4.133/packages/python/migrations.d/2026-11-04-query-bind-params.md +25 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/src/lib.rs +78 -5
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.131 → dirsql-0.4.133/packages/rust}/docs/reference/sdk.md +69 -3
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/db.rs +184 -15
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/lib.rs +117 -4
- dirsql-0.4.133/packages/rust/src/params.rs +200 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/Cargo.toml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/README.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/py.typed +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/read_config.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/AGENTS.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/context/recipes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/context/usage.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/explanation.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/getting-started.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/embed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/persist.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/index.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/package.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/plugins.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/cli.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/glob.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/docs/speed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/README.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-11-02-watch-dirs-created-mid-registration.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/2026-11-02-watch-live-on-return.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/conftest.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/glob.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/docs/speed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1461-chunked-read-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1461-step3-1020.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1461-wide-read-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1470-speed-page-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1471-one-level-restore-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1474-vtab-speed-1014.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1475-prefix-speed-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1475-rowpath-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1477-onelevel-speed-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1477-onelevel-speed-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1478-perdir-walk-1020.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1480-matcher-speed-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1481-gitrepo-speed-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1482-docs-fastest-bar-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1483-fm-speed-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1484-jsonl-speed-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1487-frontend-query-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1488-frontend-metadata-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1489-frontend-browse-1013.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1504-bench-names-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1514-watch-rerun-inline-1015.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1524-path-eq-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1526-main-red-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1532-gitignore-fastest-bar-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1534-fm-native-1016.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1534-fm-native-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1538-onfile-order-1019.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1540-update-in-place-1019.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1541-defer-fk-1019.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1544-perfile-update-1020.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1552-watch-gap-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1557-watch-rename-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1560-scan-insert-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1562-hook-savepoint-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-1562-watch-speed-1102.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-gap-childpath-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-parse-overlap-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-parse-pragmas-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-sql-valueref-1013.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-walk-components-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-walk-rowpath-1011.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-walk-rows-1013.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-11-02-watch-dirs-created-mid-registration.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/2026-11-02-watch-live-on-return.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/bench_report.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/bench_suite.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/README.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/glob.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/speed.json +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/docs/speed.md +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/frontend.html +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/frontend.js +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/foreign_key.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/gitignore_frame.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/matcher.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/per_thread.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/row_stream.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/scanner.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/vtab.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/vtab_scaffold.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.4.131 → dirsql-0.4.133}/pyproject.toml +0 -0
|
@@ -573,7 +573,7 @@ dependencies = [
|
|
|
573
573
|
|
|
574
574
|
[[package]]
|
|
575
575
|
name = "dirsql"
|
|
576
|
-
version = "0.4.
|
|
576
|
+
version = "0.4.133"
|
|
577
577
|
dependencies = [
|
|
578
578
|
"assert_cmd",
|
|
579
579
|
"axum",
|
|
@@ -625,7 +625,7 @@ dependencies = [
|
|
|
625
625
|
|
|
626
626
|
[[package]]
|
|
627
627
|
name = "dirsql-py-ext"
|
|
628
|
-
version = "0.4.
|
|
628
|
+
version = "0.4.133"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -207,9 +207,13 @@ class DirSQL:
|
|
|
207
207
|
if self._init_error is not None:
|
|
208
208
|
raise self._init_error
|
|
209
209
|
|
|
210
|
-
async def query(self, sql):
|
|
210
|
+
async def query(self, sql, params=None):
|
|
211
211
|
"""Execute a SQL query asynchronously.
|
|
212
212
|
|
|
213
|
+
``params`` binds values to the statement's placeholders through
|
|
214
|
+
SQLite, never into the SQL text: a sequence fills ``?`` placeholders
|
|
215
|
+
in order, a mapping fills ``:name`` placeholders by name.
|
|
216
|
+
|
|
213
217
|
Awaits :meth:`ready` first, so calling ``query`` before an explicit
|
|
214
218
|
``await db.ready()`` waits for the background scan (and re-raises any
|
|
215
219
|
initialization error) instead of failing on a still-``None`` ``_db``.
|
|
@@ -217,7 +221,7 @@ class DirSQL:
|
|
|
217
221
|
await self.ready()
|
|
218
222
|
db = self._db
|
|
219
223
|
assert db is not None # ready() returned, so _init_bg set _db
|
|
220
|
-
return await asyncio.to_thread(db.query, sql)
|
|
224
|
+
return await asyncio.to_thread(db.query, sql, params)
|
|
221
225
|
|
|
222
226
|
async def scan_failures(self):
|
|
223
227
|
"""The files the initial scan could not index.
|
|
@@ -9,7 +9,7 @@ Whenever ``src/lib.rs`` adds, renames, or removes a ``#[pyclass]``,
|
|
|
9
9
|
same PR -- and ``PARITY.md`` is the canonical reminder.
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
|
-
from collections.abc import Callable
|
|
12
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
13
13
|
from os import PathLike
|
|
14
14
|
from typing import Any, TypedDict
|
|
15
15
|
|
|
@@ -84,7 +84,9 @@ class DirSQL:
|
|
|
84
84
|
extensions: list[ExtensionSpec] | None = None,
|
|
85
85
|
suppress_config_extensions: bool = False,
|
|
86
86
|
) -> None: ...
|
|
87
|
-
def query(
|
|
87
|
+
def query(
|
|
88
|
+
self, sql: str, params: Sequence[Any] | Mapping[str, Any] | None = None
|
|
89
|
+
) -> list[Row]: ...
|
|
88
90
|
def scan_failures(self) -> list[ScanFailure]: ...
|
|
89
91
|
def _start_watcher(self) -> None: ...
|
|
90
92
|
def _poll_events(self, timeout_ms: int) -> list[RowEvent]: ...
|
|
@@ -208,22 +208,87 @@ observe construction errors before issuing a query.
|
|
|
208
208
|
::: code-group
|
|
209
209
|
|
|
210
210
|
```python [Python]
|
|
211
|
-
await db.query(sql: str) -> list[dict]
|
|
211
|
+
await db.query(sql: str, params: Sequence | Mapping | None = None) -> list[dict]
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
```typescript [TypeScript]
|
|
215
|
-
await db.query(sql: string) -> Record<string, unknown>[]
|
|
215
|
+
await db.query(sql: string, params?: unknown[] | Record<string, unknown> | null) -> Record<string, unknown>[]
|
|
216
216
|
// Runs on the libuv threadpool; the JS event loop stays responsive.
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
```rust [Rust]
|
|
220
220
|
db.query(sql: &str) -> Result<Vec<Row>> // Row = HashMap<String, Value>
|
|
221
|
+
db.query_with(sql: &str, params: &Params) -> Result<Vec<Row>>
|
|
221
222
|
```
|
|
222
223
|
|
|
223
224
|
:::
|
|
224
225
|
|
|
225
226
|
Executes a SQL query and returns rows keyed by column name.
|
|
226
227
|
|
|
228
|
+
**Bind parameters.** `params` reaches SQLite's own parameter binding; the
|
|
229
|
+
values never enter the SQL text, so text holding quotes needs no escaping.
|
|
230
|
+
A sequence (a TypeScript array) fills `?` placeholders in order; a mapping
|
|
231
|
+
(a TypeScript plain object) fills `:name`, `@name` and `$name` placeholders,
|
|
232
|
+
keyed by the name without its prefix. It works for path-tables
|
|
233
|
+
and declared tables alike:
|
|
234
|
+
|
|
235
|
+
::: code-group
|
|
236
|
+
|
|
237
|
+
```python [Python]
|
|
238
|
+
await db.query(
|
|
239
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
240
|
+
{"advice": text},
|
|
241
|
+
)
|
|
242
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ("ann", 2024))
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
```typescript [TypeScript]
|
|
246
|
+
await db.query(
|
|
247
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
248
|
+
{ advice: text },
|
|
249
|
+
);
|
|
250
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ["ann", 2024]);
|
|
251
|
+
// queryOrdered takes params the same way.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```rust [Rust]
|
|
255
|
+
use dirsql::{Params, Value};
|
|
256
|
+
use std::collections::HashMap;
|
|
257
|
+
|
|
258
|
+
db.query_with(
|
|
259
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
260
|
+
&Params::Named(HashMap::from([("advice".into(), Value::Text(text))])),
|
|
261
|
+
)?;
|
|
262
|
+
db.query_with(
|
|
263
|
+
"SELECT * FROM notes WHERE author = ?",
|
|
264
|
+
&Params::Positional(vec![Value::Text("ann".into())]),
|
|
265
|
+
)?;
|
|
266
|
+
// query_ordered_with and query_each_with bind the same way;
|
|
267
|
+
// AsyncDirSQL::query_with is the async twin.
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
:::
|
|
271
|
+
|
|
272
|
+
- Values bind as SQLite's native types. Python accepts `None`, `int`
|
|
273
|
+
(`bool` binds as `0`/`1`), `float`, `str`, `bytes` and `bytearray`;
|
|
274
|
+
anything else raises `TypeError` rather than being stringified, and an
|
|
275
|
+
`int` outside the signed 64-bit range raises `OverflowError`. TypeScript
|
|
276
|
+
accepts `null`, `number` (an integral value binds as an INTEGER, any other
|
|
277
|
+
as a REAL, so `1.0` binds as `1`), `bigint`, `boolean` (`0`/`1`), `string`,
|
|
278
|
+
and `Buffer` / `Uint8Array`; anything else, `undefined` included, rejects
|
|
279
|
+
with a `TypeError`, and a `bigint` outside the signed 64-bit range with a
|
|
280
|
+
`RangeError`. Rust binds a `Value`.
|
|
281
|
+
- The params must fit the placeholders exactly, or the query fails with an
|
|
282
|
+
error naming the problem: a wrong count for a sequence, a placeholder name
|
|
283
|
+
the mapping lacks, a mapping key no placeholder uses, or a sequence for
|
|
284
|
+
named placeholders (and a mapping for `?`). Python raises a
|
|
285
|
+
`RuntimeError` for these, and a `TypeError` when `params` is neither a
|
|
286
|
+
sequence nor a mapping (a `str` counts as neither). TypeScript rejects
|
|
287
|
+
with an `Error` for these, and a `TypeError` when `params` is neither an
|
|
288
|
+
array nor a plain object. Rust returns `DbError::Params`.
|
|
289
|
+
- Without `params`, a statement with placeholders fails the same way: a
|
|
290
|
+
placeholder is never left unbound.
|
|
291
|
+
|
|
227
292
|
- **Read-only.** Each statement is classified by SQLite itself
|
|
228
293
|
(`sqlite3_stmt_readonly`); anything classified as a write — `INSERT`,
|
|
229
294
|
`UPDATE`, `DELETE`, `DROP`, `CREATE`, `ALTER`, `VACUUM`, … — is rejected
|
|
@@ -259,11 +324,12 @@ round-trips.
|
|
|
259
324
|
::: code-group
|
|
260
325
|
|
|
261
326
|
```typescript [TypeScript]
|
|
262
|
-
await db.queryOrdered(sql: string) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
327
|
+
await db.queryOrdered(sql: string, params?: unknown[] | Record<string, unknown> | null) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
263
328
|
```
|
|
264
329
|
|
|
265
330
|
```rust [Rust]
|
|
266
331
|
db.query_ordered(sql: &str) -> Result<QueryResult> // QueryResult { columns, rows }
|
|
332
|
+
db.query_ordered_with(sql: &str, params: &Params) -> Result<QueryResult>
|
|
267
333
|
```
|
|
268
334
|
|
|
269
335
|
:::
|
|
@@ -4,7 +4,7 @@ name = "dirsql-py-ext"
|
|
|
4
4
|
# pypi/maturin handler can rewrite it via `write-version` before
|
|
5
5
|
# `maturin build`. `pyproject.toml` declares `dynamic = ["version"]`
|
|
6
6
|
# and maturin reads this field. Mirrors `packages/rust/Cargo.toml`.
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.133"
|
|
8
8
|
# abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
|
|
9
9
|
# `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
|
|
10
10
|
# (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
**Added** `await db.query(sql, params)` binds `params` to the statement's placeholders through SQLite: a sequence fills `?` placeholders in order, a mapping fills `:name` placeholders by name. Values never enter the SQL text, so text holding quotes needs no escaping. Works for path-tables and declared tables alike. Values bind as SQLite's native types (`None`, `int`, `bool`, `float`, `str`, `bytes`, `bytearray`); any other type raises `TypeError`. A wrong parameter count, a missing or unused name, or the wrong container raises an error naming the problem.
|
|
@@ -208,22 +208,87 @@ observe construction errors before issuing a query.
|
|
|
208
208
|
::: code-group
|
|
209
209
|
|
|
210
210
|
```python [Python]
|
|
211
|
-
await db.query(sql: str) -> list[dict]
|
|
211
|
+
await db.query(sql: str, params: Sequence | Mapping | None = None) -> list[dict]
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
```typescript [TypeScript]
|
|
215
|
-
await db.query(sql: string) -> Record<string, unknown>[]
|
|
215
|
+
await db.query(sql: string, params?: unknown[] | Record<string, unknown> | null) -> Record<string, unknown>[]
|
|
216
216
|
// Runs on the libuv threadpool; the JS event loop stays responsive.
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
```rust [Rust]
|
|
220
220
|
db.query(sql: &str) -> Result<Vec<Row>> // Row = HashMap<String, Value>
|
|
221
|
+
db.query_with(sql: &str, params: &Params) -> Result<Vec<Row>>
|
|
221
222
|
```
|
|
222
223
|
|
|
223
224
|
:::
|
|
224
225
|
|
|
225
226
|
Executes a SQL query and returns rows keyed by column name.
|
|
226
227
|
|
|
228
|
+
**Bind parameters.** `params` reaches SQLite's own parameter binding; the
|
|
229
|
+
values never enter the SQL text, so text holding quotes needs no escaping.
|
|
230
|
+
A sequence (a TypeScript array) fills `?` placeholders in order; a mapping
|
|
231
|
+
(a TypeScript plain object) fills `:name`, `@name` and `$name` placeholders,
|
|
232
|
+
keyed by the name without its prefix. It works for path-tables
|
|
233
|
+
and declared tables alike:
|
|
234
|
+
|
|
235
|
+
::: code-group
|
|
236
|
+
|
|
237
|
+
```python [Python]
|
|
238
|
+
await db.query(
|
|
239
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
240
|
+
{"advice": text},
|
|
241
|
+
)
|
|
242
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ("ann", 2024))
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
```typescript [TypeScript]
|
|
246
|
+
await db.query(
|
|
247
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
248
|
+
{ advice: text },
|
|
249
|
+
);
|
|
250
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ["ann", 2024]);
|
|
251
|
+
// queryOrdered takes params the same way.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```rust [Rust]
|
|
255
|
+
use dirsql::{Params, Value};
|
|
256
|
+
use std::collections::HashMap;
|
|
257
|
+
|
|
258
|
+
db.query_with(
|
|
259
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
260
|
+
&Params::Named(HashMap::from([("advice".into(), Value::Text(text))])),
|
|
261
|
+
)?;
|
|
262
|
+
db.query_with(
|
|
263
|
+
"SELECT * FROM notes WHERE author = ?",
|
|
264
|
+
&Params::Positional(vec![Value::Text("ann".into())]),
|
|
265
|
+
)?;
|
|
266
|
+
// query_ordered_with and query_each_with bind the same way;
|
|
267
|
+
// AsyncDirSQL::query_with is the async twin.
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
:::
|
|
271
|
+
|
|
272
|
+
- Values bind as SQLite's native types. Python accepts `None`, `int`
|
|
273
|
+
(`bool` binds as `0`/`1`), `float`, `str`, `bytes` and `bytearray`;
|
|
274
|
+
anything else raises `TypeError` rather than being stringified, and an
|
|
275
|
+
`int` outside the signed 64-bit range raises `OverflowError`. TypeScript
|
|
276
|
+
accepts `null`, `number` (an integral value binds as an INTEGER, any other
|
|
277
|
+
as a REAL, so `1.0` binds as `1`), `bigint`, `boolean` (`0`/`1`), `string`,
|
|
278
|
+
and `Buffer` / `Uint8Array`; anything else, `undefined` included, rejects
|
|
279
|
+
with a `TypeError`, and a `bigint` outside the signed 64-bit range with a
|
|
280
|
+
`RangeError`. Rust binds a `Value`.
|
|
281
|
+
- The params must fit the placeholders exactly, or the query fails with an
|
|
282
|
+
error naming the problem: a wrong count for a sequence, a placeholder name
|
|
283
|
+
the mapping lacks, a mapping key no placeholder uses, or a sequence for
|
|
284
|
+
named placeholders (and a mapping for `?`). Python raises a
|
|
285
|
+
`RuntimeError` for these, and a `TypeError` when `params` is neither a
|
|
286
|
+
sequence nor a mapping (a `str` counts as neither). TypeScript rejects
|
|
287
|
+
with an `Error` for these, and a `TypeError` when `params` is neither an
|
|
288
|
+
array nor a plain object. Rust returns `DbError::Params`.
|
|
289
|
+
- Without `params`, a statement with placeholders fails the same way: a
|
|
290
|
+
placeholder is never left unbound.
|
|
291
|
+
|
|
227
292
|
- **Read-only.** Each statement is classified by SQLite itself
|
|
228
293
|
(`sqlite3_stmt_readonly`); anything classified as a write — `INSERT`,
|
|
229
294
|
`UPDATE`, `DELETE`, `DROP`, `CREATE`, `ALTER`, `VACUUM`, … — is rejected
|
|
@@ -259,11 +324,12 @@ round-trips.
|
|
|
259
324
|
::: code-group
|
|
260
325
|
|
|
261
326
|
```typescript [TypeScript]
|
|
262
|
-
await db.queryOrdered(sql: string) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
327
|
+
await db.queryOrdered(sql: string, params?: unknown[] | Record<string, unknown> | null) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
263
328
|
```
|
|
264
329
|
|
|
265
330
|
```rust [Rust]
|
|
266
331
|
db.query_ordered(sql: &str) -> Result<QueryResult> // QueryResult { columns, rows }
|
|
332
|
+
db.query_ordered_with(sql: &str, params: &Params) -> Result<QueryResult>
|
|
267
333
|
```
|
|
268
334
|
|
|
269
335
|
:::
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/query_contract_test.py tests/e2e/on_file_query_test.py tests/e2e/declared_table_name_test.py tests/e2e/use_case_join_test.py tests/e2e/stat_speed_test.py -x -q",
|
|
3
|
+
"ran_at": 1793806695,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "7fec72fd59d31d22b5aa0d2331e545eddc5eee0e",
|
|
6
|
+
"branch": "bot/1575-bind-params-1104"
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
### Bind parameters in `query`
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
`await db.query(sql, params)` binds values to the statement's placeholders through SQLite rather than the SQL text. Existing calls without params keep working. Nothing breaks.
|
|
6
|
+
|
|
7
|
+
#### Required changes
|
|
8
|
+
|
|
9
|
+
_None._ Hand-quoted SQL keeps working; to bind instead:
|
|
10
|
+
|
|
11
|
+
| Before | After |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `await db.query(f"... WHERE a = {quote(text)}")` | `await db.query("... WHERE a = :a", {"a": text})` |
|
|
14
|
+
|
|
15
|
+
#### Deprecations removed
|
|
16
|
+
|
|
17
|
+
_None._
|
|
18
|
+
|
|
19
|
+
#### Behavior changes without code changes
|
|
20
|
+
|
|
21
|
+
A query whose placeholders get no values still fails, but with dirsql's message (`the query has 1 parameter(s), but 0 value(s) were given`) instead of SQLite's `Wrong number of parameters passed to query`.
|
|
22
|
+
|
|
23
|
+
#### Verification
|
|
24
|
+
|
|
25
|
+
`await DirSQL(".").query("SELECT :x AS x", {"x": "it's"})` returns `[{"x": "it's"}]`.
|
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
#[cfg(feature = "extension-module")]
|
|
14
14
|
mod python {
|
|
15
15
|
use ::dirsql::extension_resolution::{self, ConfigSource, PlanEntry};
|
|
16
|
-
use ::dirsql::{DirSQL, Extension, Row, RowEvent, Table, Value, flatten_row_event};
|
|
17
|
-
use pyo3::exceptions::{PyOverflowError, PyRuntimeError, PyValueError};
|
|
16
|
+
use ::dirsql::{DirSQL, Extension, Params, Row, RowEvent, Table, Value, flatten_row_event};
|
|
17
|
+
use pyo3::exceptions::{PyOverflowError, PyRuntimeError, PyTypeError, PyValueError};
|
|
18
18
|
use pyo3::prelude::*;
|
|
19
|
-
use pyo3::types::{
|
|
19
|
+
use pyo3::types::{
|
|
20
|
+
PyBool, PyByteArray, PyBytes, PyDict, PyFloat, PyInt, PyList, PyMapping, PySequence,
|
|
21
|
+
PyString,
|
|
22
|
+
};
|
|
20
23
|
use std::collections::HashMap;
|
|
21
24
|
use std::path::{Path, PathBuf};
|
|
22
25
|
use std::time::Duration;
|
|
@@ -191,10 +194,17 @@ mod python {
|
|
|
191
194
|
Ok(Self { inner })
|
|
192
195
|
}
|
|
193
196
|
|
|
194
|
-
|
|
197
|
+
#[pyo3(signature = (sql, params=None))]
|
|
198
|
+
fn query(
|
|
199
|
+
&self,
|
|
200
|
+
py: Python<'_>,
|
|
201
|
+
sql: String,
|
|
202
|
+
params: Option<Bound<'_, PyAny>>,
|
|
203
|
+
) -> PyResult<Py<PyList>> {
|
|
204
|
+
let params = py_to_params(params.as_ref())?;
|
|
195
205
|
let db = self.inner.clone();
|
|
196
206
|
let result = py
|
|
197
|
-
.detach(move || db.
|
|
207
|
+
.detach(move || db.query_ordered_with(&sql, ¶ms))
|
|
198
208
|
.map_err(to_py_err)?;
|
|
199
209
|
|
|
200
210
|
let list = PyList::empty(py);
|
|
@@ -371,6 +381,69 @@ mod python {
|
|
|
371
381
|
}
|
|
372
382
|
|
|
373
383
|
/// The range-error message for a Python int that does not fit `i64`.
|
|
384
|
+
fn py_to_params(params: Option<&Bound<'_, PyAny>>) -> PyResult<Params> {
|
|
385
|
+
let Some(params) = params.filter(|p| !p.is_none()) else {
|
|
386
|
+
return Ok(Params::default());
|
|
387
|
+
};
|
|
388
|
+
// A str or bytes is a sequence too; binding it character by
|
|
389
|
+
// character is never what the caller meant.
|
|
390
|
+
let textual = params.is_instance_of::<PyString>()
|
|
391
|
+
|| params.is_instance_of::<PyBytes>()
|
|
392
|
+
|| params.is_instance_of::<PyByteArray>();
|
|
393
|
+
if !textual {
|
|
394
|
+
if let Ok(mapping) = params.cast::<PyMapping>() {
|
|
395
|
+
let mut named = HashMap::new();
|
|
396
|
+
for item in mapping.items()?.iter() {
|
|
397
|
+
let (key, value): (Bound<'_, PyAny>, Bound<'_, PyAny>) = item.extract()?;
|
|
398
|
+
let key: String = key
|
|
399
|
+
.extract()
|
|
400
|
+
.map_err(|_| PyTypeError::new_err("params mapping keys must be str"))?;
|
|
401
|
+
named.insert(key, param_to_value(&value)?);
|
|
402
|
+
}
|
|
403
|
+
return Ok(Params::Named(named));
|
|
404
|
+
}
|
|
405
|
+
if let Ok(sequence) = params.cast::<PySequence>() {
|
|
406
|
+
let values = sequence
|
|
407
|
+
.try_iter()?
|
|
408
|
+
.map(|value| param_to_value(&value?))
|
|
409
|
+
.collect::<PyResult<Vec<_>>>()?;
|
|
410
|
+
return Ok(Params::Positional(values));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
Err(PyTypeError::new_err(format!(
|
|
414
|
+
"params must be a sequence or a mapping, not {}",
|
|
415
|
+
params.get_type().name()?
|
|
416
|
+
)))
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
fn param_to_value(value: &Bound<'_, PyAny>) -> PyResult<Value> {
|
|
420
|
+
if value.is_none() {
|
|
421
|
+
return Ok(Value::Null);
|
|
422
|
+
}
|
|
423
|
+
if value.is_instance_of::<PyBool>() {
|
|
424
|
+
return Ok(Value::Integer(i64::from(value.extract::<bool>()?)));
|
|
425
|
+
}
|
|
426
|
+
if value.is_instance_of::<PyInt>() {
|
|
427
|
+
return value
|
|
428
|
+
.extract::<i64>()
|
|
429
|
+
.map(Value::Integer)
|
|
430
|
+
.map_err(|_| PyOverflowError::new_err(int_overflow_message(&value.to_string())));
|
|
431
|
+
}
|
|
432
|
+
if value.is_instance_of::<PyFloat>() {
|
|
433
|
+
return Ok(Value::Real(value.extract()?));
|
|
434
|
+
}
|
|
435
|
+
if value.is_instance_of::<PyString>() {
|
|
436
|
+
return Ok(Value::Text(value.extract()?));
|
|
437
|
+
}
|
|
438
|
+
if value.is_instance_of::<PyBytes>() || value.is_instance_of::<PyByteArray>() {
|
|
439
|
+
return Ok(Value::Blob(value.extract()?));
|
|
440
|
+
}
|
|
441
|
+
Err(PyTypeError::new_err(format!(
|
|
442
|
+
"unsupported parameter type: {}",
|
|
443
|
+
value.get_type().name()?
|
|
444
|
+
)))
|
|
445
|
+
}
|
|
446
|
+
|
|
374
447
|
fn int_overflow_message(repr: &str) -> String {
|
|
375
448
|
format!("integer {repr} exceeds the 64-bit signed range dirsql can store")
|
|
376
449
|
}
|
|
@@ -6,7 +6,7 @@ description = "Ephemeral SQL index over a local directory"
|
|
|
6
6
|
# version stays for the binding crates (publish = false). The literal
|
|
7
7
|
# intentionally lags the published version: putitoutthere rewrites it to
|
|
8
8
|
# the planned release version at build time and never commits it back.
|
|
9
|
-
version = "0.4.
|
|
9
|
+
version = "0.4.133"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
|
@@ -208,22 +208,87 @@ observe construction errors before issuing a query.
|
|
|
208
208
|
::: code-group
|
|
209
209
|
|
|
210
210
|
```python [Python]
|
|
211
|
-
await db.query(sql: str) -> list[dict]
|
|
211
|
+
await db.query(sql: str, params: Sequence | Mapping | None = None) -> list[dict]
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
```typescript [TypeScript]
|
|
215
|
-
await db.query(sql: string) -> Record<string, unknown>[]
|
|
215
|
+
await db.query(sql: string, params?: unknown[] | Record<string, unknown> | null) -> Record<string, unknown>[]
|
|
216
216
|
// Runs on the libuv threadpool; the JS event loop stays responsive.
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
```rust [Rust]
|
|
220
220
|
db.query(sql: &str) -> Result<Vec<Row>> // Row = HashMap<String, Value>
|
|
221
|
+
db.query_with(sql: &str, params: &Params) -> Result<Vec<Row>>
|
|
221
222
|
```
|
|
222
223
|
|
|
223
224
|
:::
|
|
224
225
|
|
|
225
226
|
Executes a SQL query and returns rows keyed by column name.
|
|
226
227
|
|
|
228
|
+
**Bind parameters.** `params` reaches SQLite's own parameter binding; the
|
|
229
|
+
values never enter the SQL text, so text holding quotes needs no escaping.
|
|
230
|
+
A sequence (a TypeScript array) fills `?` placeholders in order; a mapping
|
|
231
|
+
(a TypeScript plain object) fills `:name`, `@name` and `$name` placeholders,
|
|
232
|
+
keyed by the name without its prefix. It works for path-tables
|
|
233
|
+
and declared tables alike:
|
|
234
|
+
|
|
235
|
+
::: code-group
|
|
236
|
+
|
|
237
|
+
```python [Python]
|
|
238
|
+
await db.query(
|
|
239
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
240
|
+
{"advice": text},
|
|
241
|
+
)
|
|
242
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ("ann", 2024))
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
```typescript [TypeScript]
|
|
246
|
+
await db.query(
|
|
247
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
248
|
+
{ advice: text },
|
|
249
|
+
);
|
|
250
|
+
await db.query("SELECT * FROM notes WHERE author = ? AND year = ?", ["ann", 2024]);
|
|
251
|
+
// queryOrdered takes params the same way.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```rust [Rust]
|
|
255
|
+
use dirsql::{Params, Value};
|
|
256
|
+
use std::collections::HashMap;
|
|
257
|
+
|
|
258
|
+
db.query_with(
|
|
259
|
+
"SELECT path FROM './*.json' WHERE content ->> 'advice' = :advice",
|
|
260
|
+
&Params::Named(HashMap::from([("advice".into(), Value::Text(text))])),
|
|
261
|
+
)?;
|
|
262
|
+
db.query_with(
|
|
263
|
+
"SELECT * FROM notes WHERE author = ?",
|
|
264
|
+
&Params::Positional(vec![Value::Text("ann".into())]),
|
|
265
|
+
)?;
|
|
266
|
+
// query_ordered_with and query_each_with bind the same way;
|
|
267
|
+
// AsyncDirSQL::query_with is the async twin.
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
:::
|
|
271
|
+
|
|
272
|
+
- Values bind as SQLite's native types. Python accepts `None`, `int`
|
|
273
|
+
(`bool` binds as `0`/`1`), `float`, `str`, `bytes` and `bytearray`;
|
|
274
|
+
anything else raises `TypeError` rather than being stringified, and an
|
|
275
|
+
`int` outside the signed 64-bit range raises `OverflowError`. TypeScript
|
|
276
|
+
accepts `null`, `number` (an integral value binds as an INTEGER, any other
|
|
277
|
+
as a REAL, so `1.0` binds as `1`), `bigint`, `boolean` (`0`/`1`), `string`,
|
|
278
|
+
and `Buffer` / `Uint8Array`; anything else, `undefined` included, rejects
|
|
279
|
+
with a `TypeError`, and a `bigint` outside the signed 64-bit range with a
|
|
280
|
+
`RangeError`. Rust binds a `Value`.
|
|
281
|
+
- The params must fit the placeholders exactly, or the query fails with an
|
|
282
|
+
error naming the problem: a wrong count for a sequence, a placeholder name
|
|
283
|
+
the mapping lacks, a mapping key no placeholder uses, or a sequence for
|
|
284
|
+
named placeholders (and a mapping for `?`). Python raises a
|
|
285
|
+
`RuntimeError` for these, and a `TypeError` when `params` is neither a
|
|
286
|
+
sequence nor a mapping (a `str` counts as neither). TypeScript rejects
|
|
287
|
+
with an `Error` for these, and a `TypeError` when `params` is neither an
|
|
288
|
+
array nor a plain object. Rust returns `DbError::Params`.
|
|
289
|
+
- Without `params`, a statement with placeholders fails the same way: a
|
|
290
|
+
placeholder is never left unbound.
|
|
291
|
+
|
|
227
292
|
- **Read-only.** Each statement is classified by SQLite itself
|
|
228
293
|
(`sqlite3_stmt_readonly`); anything classified as a write — `INSERT`,
|
|
229
294
|
`UPDATE`, `DELETE`, `DROP`, `CREATE`, `ALTER`, `VACUUM`, … — is rejected
|
|
@@ -259,11 +324,12 @@ round-trips.
|
|
|
259
324
|
::: code-group
|
|
260
325
|
|
|
261
326
|
```typescript [TypeScript]
|
|
262
|
-
await db.queryOrdered(sql: string) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
327
|
+
await db.queryOrdered(sql: string, params?: unknown[] | Record<string, unknown> | null) -> { columns: string[]; rows: Record<string, unknown>[] }
|
|
263
328
|
```
|
|
264
329
|
|
|
265
330
|
```rust [Rust]
|
|
266
331
|
db.query_ordered(sql: &str) -> Result<QueryResult> // QueryResult { columns, rows }
|
|
332
|
+
db.query_ordered_with(sql: &str, params: &Params) -> Result<QueryResult>
|
|
267
333
|
```
|
|
268
334
|
|
|
269
335
|
:::
|