dirsql 0.4.22__tar.gz → 0.4.23__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.
Files changed (244) hide show
  1. {dirsql-0.4.22 → dirsql-0.4.23}/Cargo.lock +1 -1
  2. {dirsql-0.4.22 → dirsql-0.4.23}/PKG-INFO +1 -1
  3. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/path-tables.md +11 -0
  4. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/Cargo.toml +1 -1
  5. {dirsql-0.4.22/packages/rust → dirsql-0.4.23/packages/python}/docs/reference/path-tables.md +11 -0
  6. dirsql-0.4.23/packages/python/e2e-attestations/claude-issue-951-0eease.json +7 -0
  7. dirsql-0.4.23/packages/rust/changelog.d/2026-08-20-unquoted-path-table-hint.md +3 -0
  8. {dirsql-0.4.22/packages/python → dirsql-0.4.23/packages/rust}/docs/reference/path-tables.md +11 -0
  9. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/db.rs +146 -1
  10. {dirsql-0.4.22 → dirsql-0.4.23}/Cargo.toml +0 -0
  11. {dirsql-0.4.22 → dirsql-0.4.23}/README.md +0 -0
  12. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/__init__.py +0 -0
  13. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/_async.py +0 -0
  14. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/_dirsql.pyi +0 -0
  15. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/__init__.py +0 -0
  16. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/__init__.py +0 -0
  17. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  18. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  19. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  20. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  21. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  22. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/main.py +0 -0
  23. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/cli/resolve_config_extensions.py +0 -0
  24. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/py.typed +0 -0
  25. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/resolve_config_extensions.py +0 -0
  26. {dirsql-0.4.22 → dirsql-0.4.23}/dirsql/resolve_extension.py +0 -0
  27. {dirsql-0.4.22 → dirsql-0.4.23}/docs/.claude/CLAUDE.md +0 -0
  28. {dirsql-0.4.22 → dirsql-0.4.23}/docs/.vitepress/config.ts +0 -0
  29. {dirsql-0.4.22 → dirsql-0.4.23}/docs/.vitepress/theme/index.ts +0 -0
  30. {dirsql-0.4.22 → dirsql-0.4.23}/docs/.vitepress/theme/lang.ts +0 -0
  31. {dirsql-0.4.22 → dirsql-0.4.23}/docs/AGENTS.md +0 -0
  32. {dirsql-0.4.22 → dirsql-0.4.23}/docs/explanation.md +0 -0
  33. {dirsql-0.4.22 → dirsql-0.4.23}/docs/getting-started.md +0 -0
  34. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/columns-from-paths.md +0 -0
  35. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/define-tables.md +0 -0
  36. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/embed.md +0 -0
  37. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/extract-from-contents.md +0 -0
  38. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/load-extension.md +0 -0
  39. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/parse-files-into-columns.md +0 -0
  40. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/persist.md +0 -0
  41. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/query-without-config.md +0 -0
  42. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/react-to-changes.md +0 -0
  43. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/search-by-meaning.md +0 -0
  44. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/skip-files.md +0 -0
  45. {dirsql-0.4.22 → dirsql-0.4.23}/docs/howto/write-a-plugin.md +0 -0
  46. {dirsql-0.4.22 → dirsql-0.4.23}/docs/index.md +0 -0
  47. {dirsql-0.4.22 → dirsql-0.4.23}/docs/package.json +0 -0
  48. {dirsql-0.4.22 → dirsql-0.4.23}/docs/plugins.md +0 -0
  49. {dirsql-0.4.22 → dirsql-0.4.23}/docs/pnpm-lock.yaml +0 -0
  50. {dirsql-0.4.22 → dirsql-0.4.23}/docs/pnpm-workspace.yaml +0 -0
  51. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/cli.md +0 -0
  52. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/columns.md +0 -0
  53. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/config.md +0 -0
  54. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/hooks.md +0 -0
  55. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/http-api.md +0 -0
  56. {dirsql-0.4.22 → dirsql-0.4.23}/docs/reference/sdk.md +0 -0
  57. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/CHANGELOG.md +0 -0
  58. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/MIGRATIONS.md +0 -0
  59. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/README.md +0 -0
  60. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  61. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  62. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  63. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  64. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  65. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  66. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  67. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  68. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  69. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  70. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  71. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  72. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  73. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  74. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  75. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  76. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  77. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/changelog.d/README.md +0 -0
  78. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/conftest.py +0 -0
  79. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/.claude/CLAUDE.md +0 -0
  80. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/.vitepress/config.ts +0 -0
  81. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  82. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  83. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/AGENTS.md +0 -0
  84. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/explanation.md +0 -0
  85. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/getting-started.md +0 -0
  86. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/columns-from-paths.md +0 -0
  87. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/define-tables.md +0 -0
  88. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/embed.md +0 -0
  89. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/extract-from-contents.md +0 -0
  90. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/load-extension.md +0 -0
  91. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  92. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/persist.md +0 -0
  93. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/query-without-config.md +0 -0
  94. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/react-to-changes.md +0 -0
  95. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/search-by-meaning.md +0 -0
  96. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/skip-files.md +0 -0
  97. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/howto/write-a-plugin.md +0 -0
  98. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/index.md +0 -0
  99. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/package.json +0 -0
  100. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/plugins.md +0 -0
  101. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/pnpm-lock.yaml +0 -0
  102. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/pnpm-workspace.yaml +0 -0
  103. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/cli.md +0 -0
  104. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/columns.md +0 -0
  105. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/config.md +0 -0
  106. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/hooks.md +0 -0
  107. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/http-api.md +0 -0
  108. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/docs/reference/sdk.md +0 -0
  109. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  110. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  111. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  112. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  113. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  114. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  115. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  116. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  117. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  118. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  119. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  120. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  121. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/migrations.d/README.md +0 -0
  122. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/src/lib.rs +0 -0
  123. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/testing-conventions.toml +0 -0
  124. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/__init__.py +0 -0
  125. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/conftest.py +0 -0
  126. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/e2e/__init__.py +0 -0
  127. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  128. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  129. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/integration/__init__.py +0 -0
  130. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/integration/binding/__init__.py +0 -0
  131. {dirsql-0.4.22 → dirsql-0.4.23}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  132. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/CHANGELOG.md +0 -0
  133. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/Cargo.toml +0 -0
  134. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/MIGRATIONS.md +0 -0
  135. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/README.md +0 -0
  136. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/benches/db_bench.rs +0 -0
  137. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/benches/differ_bench.rs +0 -0
  138. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/benches/matcher_bench.rs +0 -0
  139. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/benches/scanner_bench.rs +0 -0
  140. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-batch-ingest-transaction.md +0 -0
  141. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-chained-pre-post-query-hooks.md +0 -0
  142. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  143. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  144. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-persist-wal.md +0 -0
  145. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  146. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-repeatable-builder-config.md +0 -0
  147. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-repeatable-cli-config.md +0 -0
  148. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  149. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  150. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-19-path-table-query-fallback.md +0 -0
  151. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-19-path-table-vtab.md +0 -0
  152. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  153. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-20-path-table-glob-semantics.md +0 -0
  154. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-20-schema-inference.md +0 -0
  155. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-21-on-file-flag.md +0 -0
  156. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  157. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-23-init-escalation-example.md +0 -0
  158. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-23-query-default-cli.md +0 -0
  159. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  160. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  161. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-07-29-on-file-failures-accumulate.md +0 -0
  162. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-02-drop-regex.md +0 -0
  163. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-02-per-file-scan-failures.md +0 -0
  164. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-02-release-profile.md +0 -0
  165. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-03-gitignore-by-default.md +0 -0
  166. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-03-nested-default-ignores.md +0 -0
  167. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-04-cast-lints.md +0 -0
  168. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-04-cli-run-shim.md +0 -0
  169. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-04-configless-extension.md +0 -0
  170. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-10-dirsql-function.md +0 -0
  171. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-10-remove-query-hooks.md +0 -0
  172. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-11-oneshot-query-no-timeout.md +0 -0
  173. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-11-persist-parsed-path-tables.md +0 -0
  174. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-11-retire-hook-timeout.md +0 -0
  175. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/2026-08-12-unquote-inverts-quote-literal.md +0 -0
  176. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/changelog.d/README.md +0 -0
  177. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/explanation.md +0 -0
  178. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/getting-started.md +0 -0
  179. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  180. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/define-tables.md +0 -0
  181. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/embed.md +0 -0
  182. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  183. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/load-extension.md +0 -0
  184. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  185. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/persist.md +0 -0
  186. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/query-without-config.md +0 -0
  187. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/react-to-changes.md +0 -0
  188. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  189. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/skip-files.md +0 -0
  190. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  191. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/index.md +0 -0
  192. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/plugins.md +0 -0
  193. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/cli.md +0 -0
  194. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/columns.md +0 -0
  195. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/config.md +0 -0
  196. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/hooks.md +0 -0
  197. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/http-api.md +0 -0
  198. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/docs/reference/sdk.md +0 -0
  199. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  200. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  201. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-persist-wal.md +0 -0
  202. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  203. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  204. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  205. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  206. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-20-path-table-glob-semantics.md +0 -0
  207. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  208. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-23-init-escalation-example.md +0 -0
  209. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-23-query-default-cli.md +0 -0
  210. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  211. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  212. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-02-per-file-scan-failures.md +0 -0
  213. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-03-gitignore-by-default.md +0 -0
  214. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-03-nested-default-ignores.md +0 -0
  215. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-10-remove-query-hooks.md +0 -0
  216. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-11-oneshot-query-no-timeout.md +0 -0
  217. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-11-persist-parsed-path-tables.md +0 -0
  218. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/2026-08-11-retire-hook-timeout.md +0 -0
  219. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/migrations.d/README.md +0 -0
  220. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/bin/dirsql.rs +0 -0
  221. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/execute.rs +0 -0
  222. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/init.rs +0 -0
  223. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/mod.rs +0 -0
  224. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/router.rs +0 -0
  225. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/run.rs +0 -0
  226. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/serialize.rs +0 -0
  227. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/cli/server.rs +0 -0
  228. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/command.rs +0 -0
  229. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/config.rs +0 -0
  230. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/default_config.toml +0 -0
  231. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/differ.rs +0 -0
  232. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/functions.rs +0 -0
  233. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/infer.rs +0 -0
  234. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/lib.rs +0 -0
  235. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/matcher.rs +0 -0
  236. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/parsed_cache.rs +0 -0
  237. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/parsed_vtab.rs +0 -0
  238. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/path_table.rs +0 -0
  239. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/persist.rs +0 -0
  240. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/scanner.rs +0 -0
  241. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/sql_literal.rs +0 -0
  242. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/vtab.rs +0 -0
  243. {dirsql-0.4.22 → dirsql-0.4.23}/packages/rust/src/watcher.rs +0 -0
  244. {dirsql-0.4.22 → dirsql-0.4.23}/pyproject.toml +0 -0
@@ -499,7 +499,7 @@ dependencies = [
499
499
 
500
500
  [[package]]
501
501
  name = "dirsql-py-ext"
502
- version = "0.4.22"
502
+ version = "0.4.23"
503
503
  dependencies = [
504
504
  "dirsql",
505
505
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.22
3
+ Version: 0.4.23
4
4
  Requires-Dist: tomli>=2 ; python_full_version < '3.11'
5
5
  Requires-Dist: bin-shim>=0.1
6
6
  Summary: Ephemeral SQL index over a local directory
@@ -61,6 +61,17 @@ SELECT * FROM '**/*.md';
61
61
  -- no such table: **/*.md; did you mean './**/*.md'?
62
62
  ```
63
63
 
64
+ **The quotes are required too.** A path is not a bare SQL identifier — `./` is
65
+ punctuation to SQLite's parser, so an unquoted path fails at parse time, before
66
+ dirsql ever sees a table name to resolve. Single or double quotes both work;
67
+ the error names the quoted form:
68
+
69
+ ```
70
+ SELECT * FROM ./;
71
+ -- near ".": syntax error in SELECT * FROM ./ at offset 14
72
+ -- hint: paths used as table names must be quoted; did you mean "./"?
73
+ ```
74
+
64
75
  ### Paths outside the index root
65
76
 
66
77
  Three other prefixes resolve, with their usual shell meanings:
@@ -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.22"
7
+ version = "0.4.23"
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
@@ -61,6 +61,17 @@ SELECT * FROM '**/*.md';
61
61
  -- no such table: **/*.md; did you mean './**/*.md'?
62
62
  ```
63
63
 
64
+ **The quotes are required too.** A path is not a bare SQL identifier — `./` is
65
+ punctuation to SQLite's parser, so an unquoted path fails at parse time, before
66
+ dirsql ever sees a table name to resolve. Single or double quotes both work;
67
+ the error names the quoted form:
68
+
69
+ ```
70
+ SELECT * FROM ./;
71
+ -- near ".": syntax error in SELECT * FROM ./ at offset 14
72
+ -- hint: paths used as table names must be quoted; did you mean "./"?
73
+ ```
74
+
64
75
  ### Paths outside the index root
65
76
 
66
77
  Three other prefixes resolve, with their usual shell meanings:
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/ -x -q",
3
+ "ran_at": 1787248002,
4
+ "exit_code": 0,
5
+ "commit": "a4c7c1da17d99d040f01b9bab77cd12014b76320",
6
+ "branch": "claude/issue-951-0eease"
7
+ }
@@ -0,0 +1,3 @@
1
+ **Fixed**
2
+
3
+ - **A path written unquoted where a table name goes now says so.** `dirsql "SELECT * FROM ./"` died on SQLite's raw `near ".": syntax error` with no indication that the fix was quoting the path. `./` is punctuation to SQLite's parser, so the statement never reached the `no such table` fallback the rest of path-table resolution rides on — the hints for a bare glob or a missing `files` table could not fire either. `query()` now widens SQLite's reported error offset over the surrounding path characters and, when the recovered token contains a `/`, appends `hint: paths used as table names must be quoted; did you mean "./"?` beneath the original error. Detection is conservative: a syntax error whose offending token holds no `/` (and any error SQLite reports without a token offset) is left exactly as it was. (#951)
@@ -61,6 +61,17 @@ SELECT * FROM '**/*.md';
61
61
  -- no such table: **/*.md; did you mean './**/*.md'?
62
62
  ```
63
63
 
64
+ **The quotes are required too.** A path is not a bare SQL identifier — `./` is
65
+ punctuation to SQLite's parser, so an unquoted path fails at parse time, before
66
+ dirsql ever sees a table name to resolve. Single or double quotes both work;
67
+ the error names the quoted form:
68
+
69
+ ```
70
+ SELECT * FROM ./;
71
+ -- near ".": syntax error in SELECT * FROM ./ at offset 14
72
+ -- hint: paths used as table names must be quoted; did you mean "./"?
73
+ ```
74
+
64
75
  ### Paths outside the index root
65
76
 
66
77
  Three other prefixes resolve, with their usual shell meanings:
@@ -87,6 +87,43 @@ fn legacy_files_table_hint() -> String {
87
87
  format!("{NO_SUCH_TABLE}{LEGACY_DEFAULT_TABLE}; did you mean FROM './'?")
88
88
  }
89
89
 
90
+ /// The characters a bare filesystem path can be spelled with where a table
91
+ /// name goes. Widening SQLite's error offset over these recovers the whole
92
+ /// path from whichever character its tokenizer happened to reject.
93
+ fn is_path_char(c: char) -> bool {
94
+ c.is_alphanumeric() || matches!(c, '.' | '/' | '_' | '-' | '~' | '*' | '?')
95
+ }
96
+
97
+ /// The bare path around `offset` in `sql`, if there is one.
98
+ ///
99
+ /// SQLite reports the offset of the character it choked on, which is not where
100
+ /// the path starts: `FROM ./` rejects the leading `.`, while `FROM src/main.rs`
101
+ /// rejects the `/` in the middle. Widening in both directions recovers the same
102
+ /// token either way. A `/` is required, which keeps an ordinary syntax error
103
+ /// over an identifier or a number out of the hint.
104
+ fn path_token_at(sql: &str, offset: usize) -> Option<&str> {
105
+ if !sql.is_char_boundary(offset) {
106
+ return None;
107
+ }
108
+ let start = sql[..offset]
109
+ .char_indices()
110
+ .rev()
111
+ .take_while(|(_, c)| is_path_char(*c))
112
+ .last()
113
+ .map_or(offset, |(i, _)| i);
114
+ let end = offset
115
+ + sql[offset..]
116
+ .find(|c: char| !is_path_char(c))
117
+ .unwrap_or(sql.len() - offset);
118
+
119
+ let token = &sql[start..end];
120
+ token.contains('/').then_some(token)
121
+ }
122
+
123
+ fn unquoted_path_hint(token: &str) -> String {
124
+ format!("hint: paths used as table names must be quoted; did you mean {token:?}?")
125
+ }
126
+
90
127
  fn no_home_path_table(name: &str) -> String {
91
128
  format!(
92
129
  "path-table {name:?} cannot be resolved: no home directory for '~' \
@@ -678,7 +715,7 @@ impl Db {
678
715
  Err(e) => e,
679
716
  };
680
717
  let Some((name, table)) = self.path_table_for(&error)? else {
681
- return Err(error);
718
+ return Err(self.hint_unquoted_path(error));
682
719
  };
683
720
  if !attempted.insert(name.clone()) {
684
721
  return Err(error);
@@ -787,6 +824,29 @@ impl Db {
787
824
  }
788
825
  }
789
826
 
827
+ /// Append the quoting hint when `error` is a syntax error over a bare
828
+ /// filesystem path. SQLite parses `./` as punctuation, so `FROM ./` dies in
829
+ /// the parser and never reaches the `no such table` fallback the rest of
830
+ /// this module rides on -- quoting the path is what gets it there.
831
+ fn hint_unquoted_path(&self, error: DbError) -> DbError {
832
+ match self.unquoted_path_hint_for(&error) {
833
+ Some(hint) => DbError::PathTable(format!("{error}\n{hint}")),
834
+ None => error,
835
+ }
836
+ }
837
+
838
+ /// The hint `error` earns, or `None` when it is not a syntax error over a
839
+ /// path. Without a root the fallback is off, so a quoted path would fail
840
+ /// too and the hint would be a dead end.
841
+ fn unquoted_path_hint_for(&self, error: &DbError) -> Option<String> {
842
+ self.path_table_root.as_ref()?;
843
+ let DbError::Sqlite(rusqlite::Error::SqlInputError { sql, offset, .. }) = error else {
844
+ return None;
845
+ };
846
+ let offset = usize::try_from(*offset).ok()?;
847
+ path_token_at(sql, offset).map(unquoted_path_hint)
848
+ }
849
+
790
850
  fn hints_legacy_files_table(&self, name: &str) -> bool {
791
851
  self.hint_legacy_files_table && name == LEGACY_DEFAULT_TABLE
792
852
  }
@@ -2140,6 +2200,91 @@ mod tests {
2140
2200
  assert_eq!(missing_table_name("no such table: "), None);
2141
2201
  }
2142
2202
 
2203
+ #[test]
2204
+ fn path_token_at_recovers_a_path_from_its_first_character() {
2205
+ assert_eq!(
2206
+ path_token_at("SELECT * FROM ./docs/a.md", 14),
2207
+ Some("./docs/a.md")
2208
+ );
2209
+ }
2210
+
2211
+ #[test]
2212
+ fn path_token_at_widens_left_when_sqlite_points_mid_path() {
2213
+ assert_eq!(
2214
+ path_token_at("SELECT * FROM src/main.rs", 17),
2215
+ Some("src/main.rs")
2216
+ );
2217
+ }
2218
+
2219
+ #[test]
2220
+ fn path_token_at_stops_at_the_first_non_path_character() {
2221
+ assert_eq!(path_token_at("SELECT * FROM a/b, c", 15), Some("a/b"));
2222
+ }
2223
+
2224
+ #[test]
2225
+ fn path_token_at_ignores_a_token_with_no_slash() {
2226
+ assert_eq!(path_token_at("SELECT * FROM 1nvalid", 14), None);
2227
+ }
2228
+
2229
+ #[test]
2230
+ fn path_token_at_ignores_an_offset_inside_a_character() {
2231
+ // `é` is two bytes, so offset 15 splits it; slicing there would panic.
2232
+ assert_eq!(path_token_at("SELECT * FROM é/x", 15), None);
2233
+ }
2234
+
2235
+ #[test]
2236
+ fn unquoted_path_hint_names_the_quoted_form() {
2237
+ assert_eq!(
2238
+ unquoted_path_hint("./"),
2239
+ r#"hint: paths used as table names must be quoted; did you mean "./"?"#
2240
+ );
2241
+ }
2242
+
2243
+ #[test]
2244
+ fn query_hints_at_quoting_for_an_unquoted_path() {
2245
+ let mut db = Db::new().unwrap();
2246
+ db.set_path_table_root(PathBuf::from("/nonexistent-dirsql-root"));
2247
+
2248
+ let err = db.query("SELECT * FROM ./").unwrap_err().to_string();
2249
+
2250
+ assert!(err.contains("syntax error"), "got: {err}");
2251
+ assert!(err.contains(r#"did you mean "./"?"#), "got: {err}");
2252
+ }
2253
+
2254
+ #[test]
2255
+ fn query_leaves_an_unquoted_path_unhinted_without_a_root() {
2256
+ let db = Db::new().unwrap();
2257
+
2258
+ let err = db.query("SELECT * FROM ./").unwrap_err().to_string();
2259
+
2260
+ assert!(err.contains("syntax error"), "got: {err}");
2261
+ assert!(
2262
+ !err.contains("did you mean"),
2263
+ "quoting leads nowhere without a root, got: {err}"
2264
+ );
2265
+ }
2266
+
2267
+ #[test]
2268
+ fn query_leaves_a_pathless_syntax_error_unhinted() {
2269
+ let mut db = Db::new().unwrap();
2270
+ db.set_path_table_root(PathBuf::from("/nonexistent-dirsql-root"));
2271
+
2272
+ let err = db.query("SELECT * FROM 1nvalid").unwrap_err().to_string();
2273
+
2274
+ assert!(!err.contains("did you mean"), "got: {err}");
2275
+ }
2276
+
2277
+ #[test]
2278
+ fn query_leaves_an_offsetless_syntax_error_unhinted() {
2279
+ let mut db = Db::new().unwrap();
2280
+ db.set_path_table_root(PathBuf::from("/nonexistent-dirsql-root"));
2281
+
2282
+ // "incomplete input" names no token, so there is no offset to widen from.
2283
+ let err = db.query("SELECT * FROM").unwrap_err().to_string();
2284
+
2285
+ assert!(!err.contains("did you mean"), "got: {err}");
2286
+ }
2287
+
2143
2288
  #[test]
2144
2289
  fn bare_glob_hint_names_the_dot_slash_form() {
2145
2290
  assert_eq!(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes