execsql2 2.16.4__tar.gz → 2.16.6__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.16.4 → execsql2-2.16.6}/CHANGELOG.md +17 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/PKG-INFO +1 -1
- {execsql2-2.16.4 → execsql2-2.16.6}/pyproject.toml +2 -2
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/debug/repl.py +23 -3
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/format.py +16 -2
- {execsql2-2.16.4 → execsql2-2.16.6}/uv.lock +1 -1
- {execsql2-2.16.4 → execsql2-2.16.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.github/workflows/ci-cd.yml +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.gitignore +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.pre-commit-config.yaml +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.pre-commit-hooks.yaml +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.python-version +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/.readthedocs.yaml +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/CONTRIBUTING.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/LICENSE.txt +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/NOTICE +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/README.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/SECURITY.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/about/contributors.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/about/copyright.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/about/divergence.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/cli.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/db.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/exporters.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/importers.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/index.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/api/metacommands.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/dev/adding_db_adapters.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/dev/adding_exporters.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/dev/adding_importers.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/dev/adding_metacommands.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/dev/architecture.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/getting-started/installation.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/getting-started/requirements.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/getting-started/syntax.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/debugging.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/documentation.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/encoding.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/examples.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/formatter.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/logging.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/sql_syntax.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/usage.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/guides/using_scripts.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/Compare_planets.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/actions.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/actions2.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/checkboxes.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/connect.b64 +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/connect.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/create_conf.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/data_error1_screenshot.jpg +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/entry_form.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/execsql_console.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/execsql_logo_01.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/fatals.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/logo_small.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/pause_terminal.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/pause_terminal_sm.b64 +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/pause_terminal_sm.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/prompt_compare.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/set_build_commands.jpg +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/unit_conversions.b64 +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/unit_conversions_029.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/unmatched.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/images/vim_execsql_highlight.png +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/index.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/reference/configuration.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/reference/metacommands.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/reference/security.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/docs/reference/substitution_vars.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/plugin-template/README.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/plugin-template/pyproject.toml +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/plugin-template/tests/test_plugin.py.example +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/vscode-execsql/README.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/vscode-execsql/package.json +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/justfile +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/scripts/generate_vscode_grammar.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/__main__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/api.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/dsn.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/help.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/lint.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/lint_ast.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/cli/run.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/config.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/access.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/dsn.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/duckdb.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/factory.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/firebird.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/mysql.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/oracle.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/postgres.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/sqlite.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/db/sqlserver.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/debug/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exceptions.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/delimited.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/duckdb.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/feather.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/html.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/json.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/latex.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/markdown.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/ods.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/parquet.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/pretty.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/protocol.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/raw.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/sqlite.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/templates.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/values.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/xls.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/xlsx.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/xml.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/yaml.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/exporters/zip.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/gui/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/gui/base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/gui/console.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/gui/desktop.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/gui/tui.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/csv.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/feather.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/json.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/ods.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/importers/xls.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/conditions.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/connect.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/control.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/data.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/debug.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/dispatch.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/io.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/io_export.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/io_fileops.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/io_import.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/io_write.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/prompt.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/script_ext.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/system.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/metacommands/upsert.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/models.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/parser.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/plugins.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/py.typed +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/ast.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/control.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/engine.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/executor.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/parser.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/script/variables.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/state.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/types.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/auth.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/crypto.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/datetime.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/errors.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/fileio.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/gui.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/mail.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/numeric.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/regex.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/strings.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/src/execsql/utils/timer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/README.md +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/config_settings.sqlite +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/example_config_prompt.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/execsql.conf +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/make_config_db.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/md_compare.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/md_glossary.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/md_upsert.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/pg_compare.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/pg_glossary.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/pg_upsert.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/script_template.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/ss_compare.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/ss_glossary.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/templates/ss_upsert.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_cli.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_cli_e2e.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_cli_run.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_lint.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_ping.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/cli/test_profile.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/conftest.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_db_adapters_mocked.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_dsn.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_duckdb.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_factory.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_postgres.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_sqlite.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/db/test_sqlite_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_base.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_db.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_delimited.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_duckdb_exporter.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_exporters.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_feather.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_html_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_html_latex.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_json.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_json_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_latex_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_markdown.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_ods.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_parquet.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_pretty_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_raw_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_sqlite_exporter.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_templates.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_templates_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_values_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_xls_xlsx.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_xlsx.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_xml.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_yaml.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/exporters/test_zip.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/gui/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/gui/test_backends.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/gui/test_compare_stats.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/gui/test_compute_row_diffs.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_base_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_csv_edge_cases.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_csv_importer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_feather_importer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_json_importer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_ods_importer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/importers/test_xls_importer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/conftest.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/test_dsn.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/test_duckdb.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/test_mysql.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/test_postgres.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/integration/test_sqlite.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_assert.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_breakpoint.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_connect.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_io_export.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_io_import.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_connect.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_data.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_io.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_script_ext.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_system.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_metacommands_system_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_pg_upsert.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/metacommands/test_row_count.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/fixtures/control_flow.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/fixtures/smoke.sql +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/scripts/test_sql_scripts.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_api.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_ast.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_ast_parser.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_config.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_config_data.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_config_extended.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_debug_repl.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_engine.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_error_messages.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_exceptions.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_executor.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_format.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_mail.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_models.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_package.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_parser.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_plugins.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_registry.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_script.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_state.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/test_types.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/__init__.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_auth.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_auth_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_crypto.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_datetime.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_errors.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_errors_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_fileio.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_fileio_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_numeric.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_regex.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_strings.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_timer.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/tests/utils/test_timer_extra.py +0 -0
- {execsql2-2.16.4 → execsql2-2.16.6}/zensical.toml +0 -0
|
@@ -13,6 +13,23 @@ ______________________________________________________________________
|
|
|
13
13
|
|
|
14
14
|
______________________________________________________________________
|
|
15
15
|
|
|
16
|
+
## [2.16.6] - 2026-04-30
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- `execsql-format` no longer corrupts PL/pgSQL function bodies inside `$$`-delimited blocks. sqlglot does not understand PL/pgSQL and was rewriting `IF NOT EXISTS ... END IF`, `IF ... THEN RETURN ... END IF`, and similar constructs as `COMMIT;`. The formatter now tracks `$$` boundaries and skips sqlglot formatting for any SQL block containing dollar-quoted content.
|
|
21
|
+
- Debug REPL `.vars` now shows `~` local and `#` param variables from the current stack frame, not just global variables. `.vars ~myvar` and `.set ~myvar value` also correctly read/write the stack frame's local scope instead of the global pool.
|
|
22
|
+
|
|
23
|
+
______________________________________________________________________
|
|
24
|
+
|
|
25
|
+
## [2.16.5] - 2026-04-30
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- Debug REPL `.vars` now shows `~` local and `#` param variables from the current stack frame, not just global variables. `.vars ~myvar` and `.set ~myvar value` also correctly read/write the stack frame's local scope instead of the global pool.
|
|
30
|
+
|
|
31
|
+
______________________________________________________________________
|
|
32
|
+
|
|
16
33
|
## [2.16.4] - 2026-04-30
|
|
17
34
|
|
|
18
35
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execsql2
|
|
3
|
-
Version: 2.16.
|
|
3
|
+
Version: 2.16.6
|
|
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
|
|
6
6
|
Project-URL: Repository, https://github.com/geocoug/execsql
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "execsql2"
|
|
7
|
-
version = "2.16.
|
|
7
|
+
version = "2.16.6"
|
|
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" }
|
|
@@ -165,7 +165,7 @@ skip-magic-trailing-comma = false
|
|
|
165
165
|
line-ending = "auto"
|
|
166
166
|
|
|
167
167
|
[tool.bumpversion]
|
|
168
|
-
current_version = "2.16.
|
|
168
|
+
current_version = "2.16.6"
|
|
169
169
|
commit = true
|
|
170
170
|
tag = true
|
|
171
171
|
tag_name = "v{new_version}"
|
|
@@ -336,7 +336,13 @@ def _print_all_vars(*, include_env: bool = False) -> None:
|
|
|
336
336
|
if subvars is None:
|
|
337
337
|
_write(" (no substitution variables defined)\n\n")
|
|
338
338
|
return
|
|
339
|
-
items = subvars.substitutions # list of (name, value) tuples
|
|
339
|
+
items = list(subvars.substitutions) # list of (name, value) tuples
|
|
340
|
+
# Include ~local and #param variables from the current stack frame.
|
|
341
|
+
if _state.commandliststack:
|
|
342
|
+
frame = _state.commandliststack[-1]
|
|
343
|
+
items.extend(frame.localvars.substitutions)
|
|
344
|
+
if frame.paramvals is not None:
|
|
345
|
+
items.extend(frame.paramvals.substitutions)
|
|
340
346
|
if not items:
|
|
341
347
|
_write(" (no substitution variables defined)\n\n")
|
|
342
348
|
return
|
|
@@ -389,6 +395,7 @@ def _print_var(varname: str) -> None:
|
|
|
389
395
|
"""Print the value of a single substitution variable.
|
|
390
396
|
|
|
391
397
|
Tries the name as typed, then with the sigil prefix stripped.
|
|
398
|
+
Checks both global subvars and the current stack frame's local/param vars.
|
|
392
399
|
"""
|
|
393
400
|
subvars = _state.subvars
|
|
394
401
|
if subvars is None:
|
|
@@ -400,6 +407,12 @@ def _print_var(varname: str) -> None:
|
|
|
400
407
|
value = subvars.varvalue(varname)
|
|
401
408
|
if value is None and len(varname) > 1 and varname[0] in "$&@#~":
|
|
402
409
|
value = subvars.varvalue(varname[1:])
|
|
410
|
+
# Check stack frame for ~local and #param variables.
|
|
411
|
+
if value is None and _state.commandliststack:
|
|
412
|
+
frame = _state.commandliststack[-1]
|
|
413
|
+
value = frame.localvars.varvalue(varname)
|
|
414
|
+
if value is None and frame.paramvals is not None:
|
|
415
|
+
value = frame.paramvals.varvalue(varname)
|
|
403
416
|
if value is None:
|
|
404
417
|
_write(f" {_c(_CYAN, varname)}: {_c(_DIM, '(undefined)')}\n")
|
|
405
418
|
else:
|
|
@@ -477,13 +490,20 @@ def _enable_step_mode() -> None:
|
|
|
477
490
|
def _set_var(varname: str, value: str) -> None:
|
|
478
491
|
"""Set or update a substitution variable in the current session.
|
|
479
492
|
|
|
493
|
+
Routes ~local variables to the current stack frame's localvars (matching
|
|
494
|
+
the behavior of ``x_sub`` / ``get_subvarset``). All other variables go
|
|
495
|
+
to the global subvars pool.
|
|
496
|
+
|
|
480
497
|
Args:
|
|
481
|
-
varname: The variable name (
|
|
498
|
+
varname: The variable name (with optional sigil prefix).
|
|
482
499
|
value: The value to assign to the variable.
|
|
483
500
|
"""
|
|
484
501
|
subvars = _state.subvars
|
|
485
502
|
if subvars is None:
|
|
486
503
|
_write(" Error: substitution variables are not initialised.\n")
|
|
487
504
|
return
|
|
488
|
-
|
|
505
|
+
if varname.startswith("~") and _state.commandliststack:
|
|
506
|
+
_state.commandliststack[-1].localvars.add_substitution(varname, value)
|
|
507
|
+
else:
|
|
508
|
+
subvars.add_substitution(varname, value)
|
|
489
509
|
_write(f" {_c(_CYAN, varname)} {_c(_DIM, '=')} {value}\n")
|
|
@@ -242,16 +242,27 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True) -> str:
|
|
|
242
242
|
sql_acc: list[str] = []
|
|
243
243
|
output: list[str] = []
|
|
244
244
|
|
|
245
|
+
in_dollar_quote = False
|
|
246
|
+
|
|
245
247
|
def flush_sql() -> None:
|
|
248
|
+
nonlocal in_dollar_quote
|
|
246
249
|
if sql_acc:
|
|
247
|
-
|
|
250
|
+
# If any line in the accumulated block is inside a $$-delimited
|
|
251
|
+
# region, skip sqlglot formatting entirely. PL/pgSQL function
|
|
252
|
+
# bodies contain IF/END IF, LOOP, RETURN, etc. that sqlglot does
|
|
253
|
+
# not understand and will corrupt (e.g., rewriting to COMMIT).
|
|
254
|
+
safe_for_sqlglot = use_sql and not in_dollar_quote
|
|
255
|
+
output.extend(format_sql_block(sql_acc, depth, indent, safe_for_sqlglot))
|
|
248
256
|
sql_acc.clear()
|
|
249
257
|
|
|
250
258
|
for raw_line in source.expandtabs(4).splitlines():
|
|
251
259
|
m = METACOMMAND_RE.match(raw_line)
|
|
252
260
|
|
|
253
261
|
if not raw_line.strip():
|
|
254
|
-
|
|
262
|
+
if not in_dollar_quote:
|
|
263
|
+
flush_sql()
|
|
264
|
+
else:
|
|
265
|
+
sql_acc.append(raw_line)
|
|
255
266
|
output.append("")
|
|
256
267
|
|
|
257
268
|
elif m:
|
|
@@ -279,6 +290,9 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True) -> str:
|
|
|
279
290
|
output.append(format_metacommand(payload, depth, indent))
|
|
280
291
|
|
|
281
292
|
else:
|
|
293
|
+
# Track $$ boundaries to prevent sqlglot from mangling PL/pgSQL
|
|
294
|
+
if "$$" in raw_line and raw_line.count("$$") % 2 == 1:
|
|
295
|
+
in_dollar_quote = not in_dollar_quote
|
|
282
296
|
sql_acc.append(raw_line)
|
|
283
297
|
|
|
284
298
|
flush_sql()
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{execsql2-2.16.4 → execsql2-2.16.6}/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
|
|
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
|