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.
- {execsql2-2.31.1 → execsql2-2.31.2}/CHANGELOG.md +8 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/PKG-INFO +2 -2
- {execsql2-2.31.1 → execsql2-2.31.2}/README.md +1 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/divergence.md +1 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/index.md +2 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/formatter.md +1 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/lint.md +1 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/package-lock.json +2 -2
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/package.json +1 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/pyproject.toml +2 -2
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/access.py +3 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/dsn.py +3 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/odbc.py +18 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/sqlserver.py +3 -1
- execsql2-2.31.2/tests/db/test_odbc_fresh_sessions.py +54 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlserver_inprocess.py +29 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/uv.lock +1 -1
- {execsql2-2.31.1 → execsql2-2.31.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.github/dependabot.yml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.github/workflows/ci-cd.yml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.gitignore +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.pre-commit-config.yaml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.pre-commit-hooks.yaml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.python-version +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/.readthedocs.yaml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/CONTRIBUTING.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/LICENSE.txt +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/NOTICE +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/SECURITY.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/contributors.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/about/copyright.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/cli.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/db.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/exporters.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/importers.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/api/metacommands.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_db_adapters.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_exporters.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_importers.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/adding_metacommands.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/architecture.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/dev/releasing.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/installation.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/requirements.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/getting-started/syntax.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/debugging.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/documentation.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/editors.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/encoding.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/examples.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/logging.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/sql_syntax.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/usage.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/guides/using_scripts.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/Compare_planets.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/actions.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/actions2.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/checkboxes.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/connect.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/data_error1_screenshot.jpg +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/execsql_logo_01.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/fatals.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/pause_terminal_sm.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/set_build_commands.jpg +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/unit_conversions_029.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/unmatched.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/images/vim_execsql_highlight.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/index.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/configuration.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/metacommands.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/security.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/reference/substitution_vars.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/compare.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/glossary.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/index.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/docs/templates/upsert.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/README.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/pyproject.toml +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/tests/test_plugin.py.example +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/.vscodeignore +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/LICENSE.txt +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/README.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/extension.js +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/icon.png +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/justfile +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/README.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/results/.gitignore +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/scripts/benchmarks/run_benchmarks.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/scripts/generate_vscode_grammar.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/scripts/release_notes.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/__main__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/api.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/application.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/config.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/format.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/init.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/lint.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/listing.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/lsp.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/commands/run.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/dispatch.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/dsn.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/help.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/lint.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/options.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/cli/run.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/config.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/config_validation.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/execsql.conf.template +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/data/script_header.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/duckdb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/factory.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/firebird.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/mysql.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/oracle.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/postgres.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/sqlite.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/db/tiers.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/debug/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/debug/repl.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exceptions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/delimited.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/duckdb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/feather.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/html.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/json.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/latex.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/markdown.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/ods.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/parquet.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/pretty.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/protocol.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/raw.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/sqlite.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/templates.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/values.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xls.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xlsx.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/xml.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/yaml.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/exporters/zip.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/format.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/console.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/desktop.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/gui/tui.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/csv.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/feather.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/json.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/ods.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/importers/xls.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/interactive.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/_util.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/cache.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/code_actions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/completion.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/diagnostics.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/document.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/folding.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/formatting.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/hover.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/navigation.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/rename.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/lsp/server.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/manifest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/conditions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/connect.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/control.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/data.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/debug.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/dispatch.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/effects.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_export.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_fileops.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_import.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/io_write.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/prompt.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/reference.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/script_ext.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/system.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/metacommands/upsert.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/models.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/parser.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/plugins.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/py.typed +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/ast.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/control.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/engine.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/executor.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/parser.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/script/variables.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/state.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/state.pyi +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/types.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/auth.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/color.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/crypto.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/datetime.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/errors.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/fileio.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/gui.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/mail.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/numeric.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/paths.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/regex.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/strings.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/src/execsql/utils/timer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/README.md +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/config_settings.sqlite +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/example_config_prompt.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/make_config_db.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_compare.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_glossary.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/md_upsert.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/pg_compare.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/pg_glossary.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/script_template.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_compare.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_glossary.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/templates/ss_upsert.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_e2e.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_run.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_cli_surface.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_commands.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_config_validate.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_dispatch.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_error_location.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_init.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_lint.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_lint_fixtures.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_log_exit_record.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_manifest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_ping.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_profile.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_sigterm.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/cli/test_undeclared_imports.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/comment_anchoring.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/escapes_and_literals.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/substitution_and_metacommands.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/formatter_shapes/unparsable_sql.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/conditions_and_blocks.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/does_not_parse.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/every_metacommand.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/lint/invalid.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/ods/libreoffice.fods +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/data/ods/libreoffice.ods +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_access_windows.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_copy_new.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_db_adapters_mocked.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_db_adapters_mocked_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_dsn.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_duckdb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_factory.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_factory_postgres_encoding.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_atomic.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_replacement_quoted.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_short_rows.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_import_timezones.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_case_folding.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_inprocess.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_mysql_trailing_blank_lines.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_new_table_checks.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_oracle_driver.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_postgres.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_postgres_inprocess.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_quoted_substitution_roundtrip.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_replacement_missing_table.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_roundtrip_adapters.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlite.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlite_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_sqlserver_driver18.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_tiers.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/db/test_transactions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_base.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_db.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_delimited.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_duckdb_exporter.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_exporters.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_feather.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_html_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_html_latex.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_json.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_json_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_latex_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_markdown.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_ods.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_ods_export.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_parquet.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_pretty_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_raw_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_columnar.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_dbfile.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_delimited.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_json.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_latex_xml.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_markup.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_ods.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_pretty_raw.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_template.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_values.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_roundtrip_xlsx.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_sqlite_exporter.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_templates.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_templates_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_values_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_values_roundtrip.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xls_xlsx.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xlsx.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_xml.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_yaml.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/exporters/test_zip.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_backends.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_backends_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_compare_stats.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_compute_row_diffs.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_desktop_dialogs.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_format_table.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_tui_pilot.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_tui_pilot_complex.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/gui/test_utils_gui_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_base_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_blank_lines.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_edge_cases.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_csv_importer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_feather_importer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_json_importer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_ods_importer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_ods_values.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_roundtrip_csv.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/importers/test_xls_importer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_dsn.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_duckdb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_mysql.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_postgres.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/integration/test_sqlite.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/live_db.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_cache.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_code_actions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_completion.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_diagnostics.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_document.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_folding.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_formatting.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_hover.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_lsp_command.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_navigation.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_rename.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/lsp/test_server.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_assert.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_breakpoint.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_conditions_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_connect.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_io_export.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_io_import.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_connect.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_data.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_io.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_script_ext.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_system.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_metacommands_system_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_pg_upsert.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_prompt.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_row_count.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_serve_output.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/metacommands/test_show_scripts.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_lint_bad.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke/sample.json +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke/sample.jsonl +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/audit_smoke.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/config_runtime.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/control_flow.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/counters_and_locals.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/error_handling.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/import_options/has_comments.csv +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/import_options.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/includes/helper.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/includes.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/io_formats.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/multi_db.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/parquet_feather_roundtrip.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/predicates.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/scripts.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/smoke.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/subroutine_loops.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/subvars_advanced.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/template_export/greeting.tmpl +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/template_export.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/timer.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/transactions.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/write_create_table.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/fixtures/xlsx_ods_roundtrip.sql +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/scripts/test_sql_scripts.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_env_detection.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_expansion_bomb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_import_regex_hardening.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_log_redaction.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_log_secrets.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_network_paths.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_odbc_connection_strings.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_odbc_injection.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_path_containment.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_substitution_injection.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/security/test_zip_bomb.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/conftest.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_compare.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_glossary.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_static.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/templates/test_upsert.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_errors.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_filewriter.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_isolation.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_api_subprocess.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_ast.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_ast_parser.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_bundled_templates.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config_data.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_config_extended.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_date_inference.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_debug_repl.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_engine.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_error_messages.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_exceptions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_executor.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_executor_inprocess.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_format.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_interactive.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_mail.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_models.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_package.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_parser.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_parser_params.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_plugins.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_reference.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_registry.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_release_notes.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_script.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_state.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_tooling_versions.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/test_types.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/__init__.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_auth.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_auth_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_crypto.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_datetime.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_encodedfile_context.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_errors.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_errors_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_fileio.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_fileio_extra.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_keyring_rules.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_mail_tls.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_numeric.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_regex.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_strings.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_timer.py +0 -0
- {execsql2-2.31.1 → execsql2-2.31.2}/tests/utils/test_timer_extra.py +0 -0
- {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.
|
|
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.
|
|
444
|
+
rev: v2.31.2
|
|
445
445
|
hooks:
|
|
446
446
|
- id: execsql-format
|
|
447
447
|
- 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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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"]
|
|
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
|
|
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
|
|
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
|
{execsql2-2.31.1 → execsql2-2.31.2}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|