execsql2 2.31.1__tar.gz → 2.31.2__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 (505) hide show
  1. {execsql2-2.31.1 → execsql2-2.31.2}/CHANGELOG.md +8 -0
  2. {execsql2-2.31.1 → execsql2-2.31.2}/PKG-INFO +2 -2
  3. {execsql2-2.31.1 → execsql2-2.31.2}/README.md +1 -1
  4. {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/divergence.md +1 -0
  5. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/index.md +2 -1
  6. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/formatter.md +1 -1
  7. {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/lint.md +1 -1
  8. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/package-lock.json +2 -2
  9. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/package.json +1 -1
  10. {execsql2-2.31.1 → execsql2-2.31.2}/pyproject.toml +2 -2
  11. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/access.py +3 -1
  12. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/dsn.py +3 -0
  13. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/odbc.py +18 -1
  14. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/sqlserver.py +3 -1
  15. execsql2-2.31.2/tests/db/test_odbc_fresh_sessions.py +54 -0
  16. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlserver_inprocess.py +29 -0
  17. {execsql2-2.31.1 → execsql2-2.31.2}/uv.lock +1 -1
  18. {execsql2-2.31.1 → execsql2-2.31.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {execsql2-2.31.1 → execsql2-2.31.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  20. {execsql2-2.31.1 → execsql2-2.31.2}/.github/dependabot.yml +0 -0
  21. {execsql2-2.31.1 → execsql2-2.31.2}/.github/workflows/ci-cd.yml +0 -0
  22. {execsql2-2.31.1 → execsql2-2.31.2}/.gitignore +0 -0
  23. {execsql2-2.31.1 → execsql2-2.31.2}/.pre-commit-config.yaml +0 -0
  24. {execsql2-2.31.1 → execsql2-2.31.2}/.pre-commit-hooks.yaml +0 -0
  25. {execsql2-2.31.1 → execsql2-2.31.2}/.python-version +0 -0
  26. {execsql2-2.31.1 → execsql2-2.31.2}/.readthedocs.yaml +0 -0
  27. {execsql2-2.31.1 → execsql2-2.31.2}/CONTRIBUTING.md +0 -0
  28. {execsql2-2.31.1 → execsql2-2.31.2}/LICENSE.txt +0 -0
  29. {execsql2-2.31.1 → execsql2-2.31.2}/NOTICE +0 -0
  30. {execsql2-2.31.1 → execsql2-2.31.2}/SECURITY.md +0 -0
  31. {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/contributors.md +0 -0
  32. {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/copyright.md +0 -0
  33. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/cli.md +0 -0
  34. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/db.md +0 -0
  35. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/exporters.md +0 -0
  36. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/importers.md +0 -0
  37. {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/metacommands.md +0 -0
  38. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_db_adapters.md +0 -0
  39. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_exporters.md +0 -0
  40. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_importers.md +0 -0
  41. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_metacommands.md +0 -0
  42. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/architecture.md +0 -0
  43. {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/releasing.md +0 -0
  44. {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/installation.md +0 -0
  45. {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/requirements.md +0 -0
  46. {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/syntax.md +0 -0
  47. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/debugging.md +0 -0
  48. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/documentation.md +0 -0
  49. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/editors.md +0 -0
  50. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/encoding.md +0 -0
  51. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/examples.md +0 -0
  52. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/logging.md +0 -0
  53. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/sql_syntax.md +0 -0
  54. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/usage.md +0 -0
  55. {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/using_scripts.md +0 -0
  56. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/Compare_planets.png +0 -0
  57. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/actions.png +0 -0
  58. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/actions2.png +0 -0
  59. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/checkboxes.png +0 -0
  60. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/connect.png +0 -0
  61. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/data_error1_screenshot.jpg +0 -0
  62. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/execsql_logo_01.png +0 -0
  63. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/fatals.png +0 -0
  64. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/pause_terminal_sm.png +0 -0
  65. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/set_build_commands.jpg +0 -0
  66. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/unit_conversions_029.png +0 -0
  67. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/unmatched.png +0 -0
  68. {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/vim_execsql_highlight.png +0 -0
  69. {execsql2-2.31.1 → execsql2-2.31.2}/docs/index.md +0 -0
  70. {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/configuration.md +0 -0
  71. {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/metacommands.md +0 -0
  72. {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/security.md +0 -0
  73. {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/substitution_vars.md +0 -0
  74. {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/compare.md +0 -0
  75. {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/glossary.md +0 -0
  76. {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/index.md +0 -0
  77. {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/upsert.md +0 -0
  78. {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/README.md +0 -0
  79. {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/pyproject.toml +0 -0
  80. {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
  81. {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/tests/test_plugin.py.example +0 -0
  82. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/.vscodeignore +0 -0
  83. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/LICENSE.txt +0 -0
  84. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/README.md +0 -0
  85. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/extension.js +0 -0
  86. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/icon.png +0 -0
  87. {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
  88. {execsql2-2.31.1 → execsql2-2.31.2}/justfile +0 -0
  89. {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/README.md +0 -0
  90. {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/results/.gitignore +0 -0
  91. {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/run_benchmarks.py +0 -0
  92. {execsql2-2.31.1 → execsql2-2.31.2}/scripts/generate_vscode_grammar.py +0 -0
  93. {execsql2-2.31.1 → execsql2-2.31.2}/scripts/release_notes.py +0 -0
  94. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/__init__.py +0 -0
  95. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/__main__.py +0 -0
  96. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/api.py +0 -0
  97. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/__init__.py +0 -0
  98. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/application.py +0 -0
  99. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/__init__.py +0 -0
  100. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/config.py +0 -0
  101. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/format.py +0 -0
  102. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/init.py +0 -0
  103. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/lint.py +0 -0
  104. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/listing.py +0 -0
  105. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/lsp.py +0 -0
  106. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/run.py +0 -0
  107. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/dispatch.py +0 -0
  108. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/dsn.py +0 -0
  109. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/help.py +0 -0
  110. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/lint.py +0 -0
  111. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/options.py +0 -0
  112. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/run.py +0 -0
  113. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/config.py +0 -0
  114. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/config_validation.py +0 -0
  115. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/__init__.py +0 -0
  116. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/execsql.conf.template +0 -0
  117. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/script_header.sql +0 -0
  118. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/__init__.py +0 -0
  119. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/base.py +0 -0
  120. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/duckdb.py +0 -0
  121. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/factory.py +0 -0
  122. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/firebird.py +0 -0
  123. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/mysql.py +0 -0
  124. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/oracle.py +0 -0
  125. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/postgres.py +0 -0
  126. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/sqlite.py +0 -0
  127. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/tiers.py +0 -0
  128. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/debug/__init__.py +0 -0
  129. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/debug/repl.py +0 -0
  130. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exceptions.py +0 -0
  131. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/__init__.py +0 -0
  132. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/base.py +0 -0
  133. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/delimited.py +0 -0
  134. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/duckdb.py +0 -0
  135. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/feather.py +0 -0
  136. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/html.py +0 -0
  137. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/json.py +0 -0
  138. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/latex.py +0 -0
  139. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/markdown.py +0 -0
  140. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/ods.py +0 -0
  141. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/parquet.py +0 -0
  142. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/pretty.py +0 -0
  143. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/protocol.py +0 -0
  144. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/raw.py +0 -0
  145. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/sqlite.py +0 -0
  146. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/templates.py +0 -0
  147. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/values.py +0 -0
  148. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xls.py +0 -0
  149. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xlsx.py +0 -0
  150. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xml.py +0 -0
  151. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/yaml.py +0 -0
  152. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/zip.py +0 -0
  153. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/format.py +0 -0
  154. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/__init__.py +0 -0
  155. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/base.py +0 -0
  156. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/console.py +0 -0
  157. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/desktop.py +0 -0
  158. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/tui.py +0 -0
  159. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/__init__.py +0 -0
  160. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/base.py +0 -0
  161. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/csv.py +0 -0
  162. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/feather.py +0 -0
  163. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/json.py +0 -0
  164. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/ods.py +0 -0
  165. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/xls.py +0 -0
  166. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/interactive.py +0 -0
  167. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/__init__.py +0 -0
  168. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/_util.py +0 -0
  169. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/cache.py +0 -0
  170. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/code_actions.py +0 -0
  171. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/completion.py +0 -0
  172. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/diagnostics.py +0 -0
  173. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/document.py +0 -0
  174. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/folding.py +0 -0
  175. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/formatting.py +0 -0
  176. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/hover.py +0 -0
  177. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/navigation.py +0 -0
  178. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/rename.py +0 -0
  179. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/server.py +0 -0
  180. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/manifest.py +0 -0
  181. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/__init__.py +0 -0
  182. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/conditions.py +0 -0
  183. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/connect.py +0 -0
  184. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/control.py +0 -0
  185. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/data.py +0 -0
  186. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/debug.py +0 -0
  187. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/dispatch.py +0 -0
  188. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/effects.py +0 -0
  189. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io.py +0 -0
  190. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_export.py +0 -0
  191. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_fileops.py +0 -0
  192. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_import.py +0 -0
  193. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_write.py +0 -0
  194. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/prompt.py +0 -0
  195. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/reference.py +0 -0
  196. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/script_ext.py +0 -0
  197. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/system.py +0 -0
  198. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/upsert.py +0 -0
  199. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/models.py +0 -0
  200. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/parser.py +0 -0
  201. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/plugins.py +0 -0
  202. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/py.typed +0 -0
  203. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/__init__.py +0 -0
  204. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/ast.py +0 -0
  205. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/control.py +0 -0
  206. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/engine.py +0 -0
  207. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/executor.py +0 -0
  208. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/parser.py +0 -0
  209. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/variables.py +0 -0
  210. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/state.py +0 -0
  211. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/state.pyi +0 -0
  212. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/types.py +0 -0
  213. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/__init__.py +0 -0
  214. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/auth.py +0 -0
  215. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/color.py +0 -0
  216. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/crypto.py +0 -0
  217. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/datetime.py +0 -0
  218. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/errors.py +0 -0
  219. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/fileio.py +0 -0
  220. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/gui.py +0 -0
  221. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/mail.py +0 -0
  222. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/numeric.py +0 -0
  223. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/paths.py +0 -0
  224. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/regex.py +0 -0
  225. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/strings.py +0 -0
  226. {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/timer.py +0 -0
  227. {execsql2-2.31.1 → execsql2-2.31.2}/templates/README.md +0 -0
  228. {execsql2-2.31.1 → execsql2-2.31.2}/templates/config_settings.sqlite +0 -0
  229. {execsql2-2.31.1 → execsql2-2.31.2}/templates/example_config_prompt.sql +0 -0
  230. {execsql2-2.31.1 → execsql2-2.31.2}/templates/make_config_db.sql +0 -0
  231. {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_compare.sql +0 -0
  232. {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_glossary.sql +0 -0
  233. {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_upsert.sql +0 -0
  234. {execsql2-2.31.1 → execsql2-2.31.2}/templates/pg_compare.sql +0 -0
  235. {execsql2-2.31.1 → execsql2-2.31.2}/templates/pg_glossary.sql +0 -0
  236. {execsql2-2.31.1 → execsql2-2.31.2}/templates/script_template.sql +0 -0
  237. {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_compare.sql +0 -0
  238. {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_glossary.sql +0 -0
  239. {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_upsert.sql +0 -0
  240. {execsql2-2.31.1 → execsql2-2.31.2}/tests/__init__.py +0 -0
  241. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/__init__.py +0 -0
  242. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli.py +0 -0
  243. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_e2e.py +0 -0
  244. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_run.py +0 -0
  245. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_surface.py +0 -0
  246. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_commands.py +0 -0
  247. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_config_validate.py +0 -0
  248. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_dispatch.py +0 -0
  249. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_error_location.py +0 -0
  250. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_init.py +0 -0
  251. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_lint.py +0 -0
  252. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_lint_fixtures.py +0 -0
  253. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_log_exit_record.py +0 -0
  254. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_manifest.py +0 -0
  255. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_ping.py +0 -0
  256. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_profile.py +0 -0
  257. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_sigterm.py +0 -0
  258. {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_undeclared_imports.py +0 -0
  259. {execsql2-2.31.1 → execsql2-2.31.2}/tests/conftest.py +0 -0
  260. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/comment_anchoring.sql +0 -0
  261. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/escapes_and_literals.sql +0 -0
  262. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/substitution_and_metacommands.sql +0 -0
  263. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/unparsable_sql.sql +0 -0
  264. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/conditions_and_blocks.sql +0 -0
  265. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/does_not_parse.sql +0 -0
  266. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/every_metacommand.sql +0 -0
  267. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/invalid.sql +0 -0
  268. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/ods/libreoffice.fods +0 -0
  269. {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/ods/libreoffice.ods +0 -0
  270. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/__init__.py +0 -0
  271. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/conftest.py +0 -0
  272. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_access_windows.py +0 -0
  273. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_base.py +0 -0
  274. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_copy_new.py +0 -0
  275. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_db_adapters_mocked.py +0 -0
  276. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_db_adapters_mocked_extra.py +0 -0
  277. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_dsn.py +0 -0
  278. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_duckdb.py +0 -0
  279. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_factory.py +0 -0
  280. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_factory_postgres_encoding.py +0 -0
  281. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_atomic.py +0 -0
  282. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_replacement_quoted.py +0 -0
  283. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_short_rows.py +0 -0
  284. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_timezones.py +0 -0
  285. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_case_folding.py +0 -0
  286. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_inprocess.py +0 -0
  287. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_trailing_blank_lines.py +0 -0
  288. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_new_table_checks.py +0 -0
  289. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_oracle_driver.py +0 -0
  290. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_postgres.py +0 -0
  291. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_postgres_inprocess.py +0 -0
  292. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_quoted_substitution_roundtrip.py +0 -0
  293. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_replacement_missing_table.py +0 -0
  294. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_roundtrip_adapters.py +0 -0
  295. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlite.py +0 -0
  296. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlite_extra.py +0 -0
  297. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlserver_driver18.py +0 -0
  298. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_tiers.py +0 -0
  299. {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_transactions.py +0 -0
  300. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/__init__.py +0 -0
  301. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/conftest.py +0 -0
  302. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_base.py +0 -0
  303. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_db.py +0 -0
  304. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_delimited.py +0 -0
  305. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_duckdb_exporter.py +0 -0
  306. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_exporters.py +0 -0
  307. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_feather.py +0 -0
  308. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_html_extended.py +0 -0
  309. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_html_latex.py +0 -0
  310. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_json.py +0 -0
  311. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_json_extended.py +0 -0
  312. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_latex_extended.py +0 -0
  313. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_markdown.py +0 -0
  314. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_ods.py +0 -0
  315. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_ods_export.py +0 -0
  316. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_parquet.py +0 -0
  317. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_pretty_extended.py +0 -0
  318. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_raw_extended.py +0 -0
  319. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_columnar.py +0 -0
  320. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_dbfile.py +0 -0
  321. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_delimited.py +0 -0
  322. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_json.py +0 -0
  323. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_latex_xml.py +0 -0
  324. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_markup.py +0 -0
  325. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_ods.py +0 -0
  326. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_pretty_raw.py +0 -0
  327. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_template.py +0 -0
  328. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_values.py +0 -0
  329. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_xlsx.py +0 -0
  330. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_sqlite_exporter.py +0 -0
  331. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_templates.py +0 -0
  332. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_templates_extended.py +0 -0
  333. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_values_extended.py +0 -0
  334. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_values_roundtrip.py +0 -0
  335. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xls_xlsx.py +0 -0
  336. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xlsx.py +0 -0
  337. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xml.py +0 -0
  338. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_yaml.py +0 -0
  339. {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_zip.py +0 -0
  340. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/__init__.py +0 -0
  341. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_backends.py +0 -0
  342. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_backends_extended.py +0 -0
  343. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_compare_stats.py +0 -0
  344. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_compute_row_diffs.py +0 -0
  345. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_desktop_dialogs.py +0 -0
  346. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_format_table.py +0 -0
  347. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_tui_pilot.py +0 -0
  348. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_tui_pilot_complex.py +0 -0
  349. {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_utils_gui_extended.py +0 -0
  350. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/__init__.py +0 -0
  351. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/conftest.py +0 -0
  352. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_base_extended.py +0 -0
  353. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_blank_lines.py +0 -0
  354. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_edge_cases.py +0 -0
  355. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_importer.py +0 -0
  356. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_feather_importer.py +0 -0
  357. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_json_importer.py +0 -0
  358. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_ods_importer.py +0 -0
  359. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_ods_values.py +0 -0
  360. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_roundtrip_csv.py +0 -0
  361. {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_xls_importer.py +0 -0
  362. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/__init__.py +0 -0
  363. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/conftest.py +0 -0
  364. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_dsn.py +0 -0
  365. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_duckdb.py +0 -0
  366. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_mysql.py +0 -0
  367. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_postgres.py +0 -0
  368. {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_sqlite.py +0 -0
  369. {execsql2-2.31.1 → execsql2-2.31.2}/tests/live_db.py +0 -0
  370. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/__init__.py +0 -0
  371. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_cache.py +0 -0
  372. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_code_actions.py +0 -0
  373. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_completion.py +0 -0
  374. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_diagnostics.py +0 -0
  375. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_document.py +0 -0
  376. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_folding.py +0 -0
  377. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_formatting.py +0 -0
  378. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_hover.py +0 -0
  379. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_lsp_command.py +0 -0
  380. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_navigation.py +0 -0
  381. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_rename.py +0 -0
  382. {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_server.py +0 -0
  383. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/__init__.py +0 -0
  384. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/conftest.py +0 -0
  385. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_assert.py +0 -0
  386. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_breakpoint.py +0 -0
  387. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_conditions_extra.py +0 -0
  388. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_connect.py +0 -0
  389. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_io_export.py +0 -0
  390. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_io_import.py +0 -0
  391. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands.py +0 -0
  392. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_connect.py +0 -0
  393. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_data.py +0 -0
  394. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_extended.py +0 -0
  395. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
  396. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_io.py +0 -0
  397. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
  398. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_script_ext.py +0 -0
  399. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_system.py +0 -0
  400. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_system_extra.py +0 -0
  401. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_pg_upsert.py +0 -0
  402. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_prompt.py +0 -0
  403. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_row_count.py +0 -0
  404. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_serve_output.py +0 -0
  405. {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_show_scripts.py +0 -0
  406. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/__init__.py +0 -0
  407. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_lint_bad.sql +0 -0
  408. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke/sample.json +0 -0
  409. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke/sample.jsonl +0 -0
  410. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke.sql +0 -0
  411. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/config_runtime.sql +0 -0
  412. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/control_flow.sql +0 -0
  413. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/counters_and_locals.sql +0 -0
  414. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/error_handling.sql +0 -0
  415. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/import_options/has_comments.csv +0 -0
  416. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/import_options.sql +0 -0
  417. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/includes/helper.sql +0 -0
  418. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/includes.sql +0 -0
  419. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/io_formats.sql +0 -0
  420. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
  421. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/multi_db.sql +0 -0
  422. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/parquet_feather_roundtrip.sql +0 -0
  423. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
  424. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/predicates.sql +0 -0
  425. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/scripts.sql +0 -0
  426. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/smoke.sql +0 -0
  427. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/subroutine_loops.sql +0 -0
  428. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/subvars_advanced.sql +0 -0
  429. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/template_export/greeting.tmpl +0 -0
  430. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/template_export.sql +0 -0
  431. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/timer.sql +0 -0
  432. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/transactions.sql +0 -0
  433. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/write_create_table.sql +0 -0
  434. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/xlsx_ods_roundtrip.sql +0 -0
  435. {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/test_sql_scripts.py +0 -0
  436. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/__init__.py +0 -0
  437. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_env_detection.py +0 -0
  438. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_expansion_bomb.py +0 -0
  439. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_import_regex_hardening.py +0 -0
  440. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_log_redaction.py +0 -0
  441. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_log_secrets.py +0 -0
  442. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_network_paths.py +0 -0
  443. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_odbc_connection_strings.py +0 -0
  444. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_odbc_injection.py +0 -0
  445. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_path_containment.py +0 -0
  446. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_substitution_injection.py +0 -0
  447. {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_zip_bomb.py +0 -0
  448. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/__init__.py +0 -0
  449. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/conftest.py +0 -0
  450. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_compare.py +0 -0
  451. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_glossary.py +0 -0
  452. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_static.py +0 -0
  453. {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_upsert.py +0 -0
  454. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api.py +0 -0
  455. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_errors.py +0 -0
  456. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_extended.py +0 -0
  457. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_filewriter.py +0 -0
  458. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_isolation.py +0 -0
  459. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_subprocess.py +0 -0
  460. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_ast.py +0 -0
  461. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_ast_parser.py +0 -0
  462. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_bundled_templates.py +0 -0
  463. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config.py +0 -0
  464. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config_data.py +0 -0
  465. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config_extended.py +0 -0
  466. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_date_inference.py +0 -0
  467. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_debug_repl.py +0 -0
  468. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_engine.py +0 -0
  469. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_error_messages.py +0 -0
  470. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_exceptions.py +0 -0
  471. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_executor.py +0 -0
  472. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_executor_inprocess.py +0 -0
  473. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_format.py +0 -0
  474. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_interactive.py +0 -0
  475. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_mail.py +0 -0
  476. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_models.py +0 -0
  477. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_package.py +0 -0
  478. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_parser.py +0 -0
  479. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_parser_params.py +0 -0
  480. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_plugins.py +0 -0
  481. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_reference.py +0 -0
  482. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_registry.py +0 -0
  483. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_release_notes.py +0 -0
  484. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_script.py +0 -0
  485. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_state.py +0 -0
  486. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_tooling_versions.py +0 -0
  487. {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_types.py +0 -0
  488. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/__init__.py +0 -0
  489. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_auth.py +0 -0
  490. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_auth_extra.py +0 -0
  491. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_crypto.py +0 -0
  492. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_datetime.py +0 -0
  493. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_encodedfile_context.py +0 -0
  494. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_errors.py +0 -0
  495. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_errors_extra.py +0 -0
  496. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_fileio.py +0 -0
  497. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_fileio_extra.py +0 -0
  498. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_keyring_rules.py +0 -0
  499. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_mail_tls.py +0 -0
  500. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_numeric.py +0 -0
  501. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_regex.py +0 -0
  502. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_strings.py +0 -0
  503. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_timer.py +0 -0
  504. {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_timer_extra.py +0 -0
  505. {execsql2-2.31.1 → execsql2-2.31.2}/zensical.toml +0 -0
@@ -13,6 +13,14 @@ ______________________________________________________________________
13
13
 
14
14
  ______________________________________________________________________
15
15
 
16
+ ## [2.31.2] - 2026-10-16
17
+
18
+ ### Fixed
19
+
20
+ - **SQL Server, Access and ODBC DSN connections** start a new database session on every `CONNECT` and `execsql.run()`: temp tables and `SET` options no longer carry over from an earlier connection in the same process on macOS and Linux. execsql turns off pyodbc's connection pooling, which also applies to other pyodbc connections your program makes.
21
+
22
+ ______________________________________________________________________
23
+
16
24
  ## [2.31.1] - 2026-10-16
17
25
 
18
26
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execsql2
3
- Version: 2.31.1
3
+ Version: 2.31.2
4
4
  Summary: Runs a SQL script against a PostgreSQL, SQLite, MariaDB/MySQL, DuckDB, Firebird, MS-Access, MS-SQL-Server, or Oracle database, or an ODBC DSN. Provides metacommands to import and export data, copy data between databases, conditionally execute SQL and metacommands, and dynamically alter SQL and metacommands with substitution variables.
5
5
  Project-URL: Homepage, https://execsql2.readthedocs.io/en/stable/
6
6
  Project-URL: Repository, https://github.com/geocoug/execsql
@@ -441,7 +441,7 @@ execsql format --no-sql --in-place scripts/
441
441
  ```yaml
442
442
  repos:
443
443
  - repo: https://github.com/geocoug/execsql
444
- rev: v2.31.1
444
+ rev: v2.31.2
445
445
  hooks:
446
446
  - id: execsql-format
447
447
  - id: execsql-lint
@@ -321,7 +321,7 @@ execsql format --no-sql --in-place scripts/
321
321
  ```yaml
322
322
  repos:
323
323
  - repo: https://github.com/geocoug/execsql
324
- rev: v2.31.1
324
+ rev: v2.31.2
325
325
  hooks:
326
326
  - id: execsql-format
327
327
  - id: execsql-lint
@@ -264,6 +264,7 @@ All 33 mutable runtime globals in `state.py` have been consolidated into a `Runt
264
264
  - **PostgreSQL driver is psycopg3** — the PostgreSQL adapter uses `psycopg` (psycopg3, installed via the `psycopg[binary]` extra) instead of upstream's `psycopg2`. The connection now passes the libpq `dbname` keyword (psycopg3 rejects psycopg2's `database`), `VACUUM` toggles `conn.autocommit` instead of the removed `set_session()`, server-side `COPY` import uses psycopg3's `cursor.copy()` context manager instead of `copy_expert()`, and binary `IMPORT` sends raw `bytes` instead of `psycopg2.Binary()`. This also makes `db.conn` directly usable by the `PG_UPSERT` metacommand's pg-upsert ≥1.26.0 dependency, which itself requires a psycopg3 connection. The connection sets `prepare_threshold=None` to disable psycopg3's automatic server-side prepared statements, which psycopg2 never used; without this, re-running a query (e.g. via `EXPORT`) against an object the script drops/recreates or alters raises `FeatureNotSupported: cached plan must not change result type`.
265
265
  - **Oracle driver is python-oracledb** — the Oracle adapter imports `oracledb`, the driver the `oracle` extra installs, instead of upstream's `cx_Oracle` (which ships no wheels for Python 3.12+). The `makedsn` / `connect` calls are the same. `cx_Oracle` is still used when it is the only Oracle driver installed.
266
266
  - **SQL Server tries ODBC Driver 18 first** — upstream's driver list stopped at Driver 17, so a machine with only Microsoft's current driver could not connect. Driver 18 encrypts the connection and verifies the server's certificate; the `trust_server_certificate` setting accepts a self-signed one.
267
+ - **Each pyodbc connection is a new session** — the SQL Server, Access and ODBC DSN adapters set `pyodbc.pooling = False` before they connect. With pyodbc's default pooling, unixODBC (macOS, Linux) handed a closed connection's session unchanged to the next connection to the same server, so temp tables and `SET` options from one `CONNECT`, or one `execsql.run()`, were still there in the next. pyodbc applies the setting at the process's first pyodbc connection, so it also covers other pyodbc connections the process makes, and has no effect if the program connected with pyodbc before execsql did.
267
268
  - **`Database` is an ABC** — `open_db()` and `exec_cmd()` are abstract methods. Subclasses that omit them raise `TypeError` at instantiation instead of at call time.
268
269
  - **Connection timeouts** — PostgreSQL and SQLite adapters accept a connection timeout parameter (default 30 seconds).
269
270
  - **DuckDB temporal types** — `TIMESTAMPTZ`, `TIMESTAMP`, `DATE`, `TIME` now map to native DuckDB types instead of `TEXT`.
@@ -78,11 +78,12 @@ for t in threads:
78
78
 
79
79
  Each run has its own [file writer](#file-output), so two runs writing files at the same time both get complete files, and a run that halts on an error stops only its own output. Plugin metacommands are registered once per process, not once per call, and a `--manifest` recorder belongs to the run that started it.
80
80
 
81
- Three things are still shared by every thread in the process, so keep them apart yourself:
81
+ Four things are still shared by every thread in the process, so keep them apart yourself:
82
82
 
83
83
  - **The working directory.** `CD` calls `os.chdir()`, which moves every thread while the script runs. Use absolute paths in scripts that run concurrently, or don't use `CD` in them. When a script that ran `CD` finishes, `run()` changes back to the directory it was in before that `CD`, so the caller ends where it started; a run without `CD` leaves the directory as it finds it.
84
84
  - **The same output file.** Two runs writing one file at the same time can interleave their lines. Give each run its own output paths.
85
85
  - **Interactive prompts.** `PROMPT` and the other GUI metacommands are not meant to be driven from several threads at once.
86
+ - **pyodbc's connection pooling.** Before its first SQL Server, Access or ODBC DSN connection, execsql turns pooling off (`pyodbc.pooling = False`), so every `CONNECT` and every `run()` gets a new database session: a temp table or `SET` option from one run is gone in the next. pyodbc reads the setting at the process's first pyodbc connection, so your own pyodbc connections are not pooled either, and if your program connects with pyodbc before execsql does, pooling stays on and runs against the same server can share a session.
86
87
 
87
88
  ### File Output { #file-output }
88
89
 
@@ -272,7 +272,7 @@ select id,name,created_at from users where active = true order by name;
272
272
  ```yaml
273
273
  repos:
274
274
  - repo: https://github.com/geocoug/execsql
275
- rev: v2.31.1
275
+ rev: v2.31.2
276
276
  hooks:
277
277
  - id: execsql-format
278
278
  - id: execsql-lint # optional: fail the commit on lint errors
@@ -158,7 +158,7 @@ The `execsql-lint` [pre-commit](https://pre-commit.com/) hook runs `execsql lint
158
158
  ```yaml
159
159
  repos:
160
160
  - repo: https://github.com/geocoug/execsql
161
- rev: v2.31.1
161
+ rev: v2.31.2
162
162
  hooks:
163
163
  - id: execsql-lint
164
164
  args: [--ignore, V002] # optional: any execsql lint option
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "execsql-syntax",
3
- "version": "2.31.1",
3
+ "version": "2.31.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "execsql-syntax",
9
- "version": "2.31.1",
9
+ "version": "2.31.2",
10
10
  "license": "GPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "vscode-languageclient": "10.1.2"
@@ -2,7 +2,7 @@
2
2
  "name": "execsql-syntax",
3
3
  "displayName": "execsql",
4
4
  "description": "Syntax highlighting, lint findings, completion, hover, navigation, quick fixes and formatting for execsql scripts.",
5
- "version": "2.31.1",
5
+ "version": "2.31.2",
6
6
  "publisher": "geocoug",
7
7
  "license": "GPL-3.0-or-later",
8
8
  "icon": "icon.png",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "execsql2"
7
- version = "2.31.1"
7
+ version = "2.31.2"
8
8
  description = "Runs a SQL script against a PostgreSQL, SQLite, MariaDB/MySQL, DuckDB, Firebird, MS-Access, MS-SQL-Server, or Oracle database, or an ODBC DSN. Provides metacommands to import and export data, copy data between databases, conditionally execute SQL and metacommands, and dynamically alter SQL and metacommands with substitution variables."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = { file = "LICENSE.txt" }
@@ -188,7 +188,7 @@ line-ending = "auto"
188
188
  exclude = ["*.md"]
189
189
 
190
190
  [tool.bumpversion]
191
- current_version = "2.31.1"
191
+ current_version = "2.31.2"
192
192
  commit = true
193
193
  tag = true
194
194
  tag_name = "v{new_version}"
@@ -15,7 +15,7 @@ from pathlib import Path
15
15
  from typing import Any, cast
16
16
 
17
17
  from execsql.db.base import Database, _fetched
18
- from execsql.db.odbc import odbc_value
18
+ from execsql.db.odbc import fresh_sessions, odbc_value
19
19
  from execsql.db.tiers import SupportTier
20
20
  from execsql.exceptions import ErrInfo
21
21
  from execsql.utils.errors import exception_desc, fatal_error, install_hint
@@ -108,6 +108,8 @@ class AccessDatabase(Database):
108
108
  # Open an ODBC connection.
109
109
  import pyodbc
110
110
 
111
+ fresh_sessions(pyodbc)
112
+
111
113
  if self.conn is not None:
112
114
  self.conn.close()
113
115
  self.conn = None
@@ -10,6 +10,7 @@ the CLI.
10
10
 
11
11
 
12
12
  from execsql.db.base import Database
13
+ from execsql.db.odbc import fresh_sessions
13
14
  from execsql.db.tiers import SupportTier
14
15
  from execsql.exceptions import ErrInfo
15
16
  from execsql.utils.errors import exception_desc, fatal_error, install_hint
@@ -75,6 +76,8 @@ class DsnDatabase(Database):
75
76
  # Open an ODBC connection using a DSN.
76
77
  import pyodbc
77
78
 
79
+ fresh_sessions(pyodbc)
80
+
78
81
  if self.conn is not None:
79
82
  self.conn.close()
80
83
  self.conn = None
@@ -7,15 +7,32 @@ taken from a substitution variable) would end its attribute early and
7
7
  start another. :func:`odbc_value` brace-quotes such values;
8
8
  :func:`connection_string` joins the attributes, and :func:`loggable`
9
9
  gives the same string with the password masked for the log.
10
+ :func:`fresh_sessions` makes each pyodbc connection a new database session.
10
11
  """
11
12
 
12
13
  from __future__ import annotations
13
14
 
14
- __all__ = ["connection_string", "loggable", "odbc_value"]
15
+ from typing import Any
16
+
17
+ __all__ = ["connection_string", "fresh_sessions", "loggable", "odbc_value"]
15
18
 
16
19
  _SECRET_KEYS = frozenset({"pwd", "password"})
17
20
 
18
21
 
22
+ def fresh_sessions(pyodbc: Any) -> None:
23
+ """Turn off pyodbc's connection pooling, so each connection is a new session.
24
+
25
+ With pooling on, closing a connection hands its session back to the ODBC
26
+ driver manager, and unixODBC gives it unchanged to the next connection to
27
+ the same server: temp tables and ``SET`` options from one ``CONNECT`` or
28
+ ``execsql.run()`` were still there in the next. pyodbc applies the
29
+ setting when the process makes its first pyodbc connection, so it covers
30
+ every pyodbc connection in the process, and has no effect if one was
31
+ made before execsql's first.
32
+ """
33
+ pyodbc.pooling = False
34
+
35
+
19
36
  def odbc_value(value: object) -> str:
20
37
  """Return *value* as an ODBC attribute value, brace-quoted when it needs it.
21
38
 
@@ -8,7 +8,7 @@ Server via ``pyodbc``. Corresponds to ``-t s`` on the CLI.
8
8
  """
9
9
 
10
10
  from execsql.db.base import Database
11
- from execsql.db.odbc import connection_string, loggable
11
+ from execsql.db.odbc import connection_string, fresh_sessions, loggable
12
12
  from execsql.exceptions import ErrInfo
13
13
  from execsql.utils.errors import fatal_error, install_hint
14
14
  from execsql.utils.auth import (
@@ -98,6 +98,8 @@ class SqlServerDatabase(Database):
98
98
  """Open a connection to the SQL Server database via pyodbc."""
99
99
  import pyodbc
100
100
 
101
+ fresh_sessions(pyodbc)
102
+
101
103
  if self.conn is None:
102
104
  begin_login()
103
105
  if self.user and self.need_passwd and not self.password:
@@ -0,0 +1,54 @@
1
+ """Each pyodbc connection execsql opens is a new database session.
2
+
3
+ With pyodbc's connection pooling on, closing a connection hands its session
4
+ back to the ODBC driver manager, and unixODBC gives it unchanged to the next
5
+ connection to the same server: temp tables and ``SET`` options from one
6
+ ``CONNECT`` or ``execsql.run()`` were still there in the next. The adapters
7
+ turn pooling off before they connect.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import sys
13
+ from unittest.mock import MagicMock, patch
14
+
15
+ import pytest
16
+
17
+ from execsql.db.access import AccessDatabase
18
+ from execsql.db.dsn import DsnDatabase
19
+ from execsql.db.sqlserver import SqlServerDatabase
20
+
21
+ pytestmark = pytest.mark.usefixtures("fake_drivers")
22
+
23
+
24
+ def _pooling_at_connect() -> list[object]:
25
+ """Make pyodbc.connect record the pooling setting it was called under."""
26
+ pyodbc = sys.modules["pyodbc"]
27
+ pyodbc.pooling = True # pyodbc's default
28
+ seen: list[object] = []
29
+
30
+ def connect(*_args, **_kwargs):
31
+ seen.append(pyodbc.pooling)
32
+ return MagicMock()
33
+
34
+ pyodbc.connect = connect
35
+ return seen
36
+
37
+
38
+ def test_sql_server_connects_without_pooling():
39
+ seen = _pooling_at_connect()
40
+ SqlServerDatabase("host", "db", "sa", port=1433, password="pw")
41
+ assert seen == [False]
42
+
43
+
44
+ def test_dsn_connects_without_pooling():
45
+ seen = _pooling_at_connect()
46
+ DsnDatabase("MYDSN", None, need_passwd=False, encoding="utf-8")
47
+ assert seen == [False]
48
+
49
+
50
+ def test_access_connects_without_pooling(tmp_path):
51
+ seen = _pooling_at_connect()
52
+ with patch.object(AccessDatabase, "open_dao", return_value=None):
53
+ AccessDatabase(str(tmp_path / "data.accdb"))
54
+ assert seen == [False]
@@ -431,3 +431,32 @@ def test_to_replacement_creates_a_table_that_does_not_exist(tmp_path, monkeypatc
431
431
  "if object_id('repl_src') is not null drop table repl_src;\n",
432
432
  dsn=dsn,
433
433
  )
434
+
435
+
436
+ def test_each_run_gets_a_fresh_session():
437
+ """A temp table or SET option from one run() is gone in the next.
438
+
439
+ In a fresh interpreter: pyodbc applies its pooling setting at the
440
+ process's first connection, and this module has already connected.
441
+ """
442
+ import subprocess
443
+ import sys
444
+
445
+ dsn = f"mssql://{_MS_USER}:{_MS_PASS}@{_MS_HOST}:{_MS_PORT}/{_MS_DB}?trust_server_certificate=yes"
446
+ code = f"""
447
+ import execsql
448
+ dsn = {dsn!r}
449
+ first = execsql.run(sql="create table #probe (i int);\\nset language Deutsch;\\n", dsn=dsn)
450
+ assert first.success, first.errors
451
+ second = execsql.run(
452
+ sql="select case when object_id('tempdb..#probe') is null then 'gone' else 'kept' end as probe"
453
+ " into #seen;\\n-- !x! subdata probe #seen\\n"
454
+ "select @@LANGUAGE as lang into #lang;\\n-- !x! subdata lang #lang\\n",
455
+ dsn=dsn,
456
+ )
457
+ assert second.success, second.errors
458
+ print(second.variables["probe"], second.variables["lang"])
459
+ """
460
+ proc = subprocess.run([sys.executable, "-c", code], capture_output=True, text=True, timeout=120, check=False)
461
+ assert proc.returncode == 0, proc.stderr
462
+ assert proc.stdout.split() == ["gone", "us_english"]
@@ -912,7 +912,7 @@ wheels = [
912
912
 
913
913
  [[package]]
914
914
  name = "execsql2"
915
- version = "2.31.1"
915
+ version = "2.31.2"
916
916
  source = { editable = "." }
917
917
  dependencies = [
918
918
  { name = "python-dateutil" },
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