execsql2 2.16.6__tar.gz → 2.16.7__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.6 → execsql2-2.16.7}/CHANGELOG.md +9 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/PKG-INFO +1 -1
- {execsql2-2.16.6 → execsql2-2.16.7}/pyproject.toml +2 -2
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/executor.py +15 -1
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_executor.py +35 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/uv.lock +1 -1
- {execsql2-2.16.6 → execsql2-2.16.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.github/workflows/ci-cd.yml +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.gitignore +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.pre-commit-config.yaml +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.pre-commit-hooks.yaml +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.python-version +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/.readthedocs.yaml +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/CONTRIBUTING.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/LICENSE.txt +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/NOTICE +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/README.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/SECURITY.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/about/contributors.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/about/copyright.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/about/divergence.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/cli.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/db.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/exporters.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/importers.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/index.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/api/metacommands.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/dev/adding_db_adapters.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/dev/adding_exporters.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/dev/adding_importers.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/dev/adding_metacommands.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/dev/architecture.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/getting-started/installation.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/getting-started/requirements.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/getting-started/syntax.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/debugging.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/documentation.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/encoding.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/examples.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/formatter.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/logging.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/sql_syntax.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/usage.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/guides/using_scripts.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/Compare_planets.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/actions.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/actions2.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/checkboxes.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/connect.b64 +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/connect.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/create_conf.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/data_error1_screenshot.jpg +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/entry_form.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/execsql_console.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/execsql_logo_01.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/fatals.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/logo_small.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/pause_terminal.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/pause_terminal_sm.b64 +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/pause_terminal_sm.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/prompt_compare.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/set_build_commands.jpg +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/unit_conversions.b64 +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/unit_conversions_029.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/unmatched.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/images/vim_execsql_highlight.png +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/index.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/reference/configuration.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/reference/metacommands.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/reference/security.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/docs/reference/substitution_vars.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/plugin-template/README.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/plugin-template/pyproject.toml +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/plugin-template/tests/test_plugin.py.example +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/vscode-execsql/README.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/vscode-execsql/package.json +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/justfile +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/scripts/generate_vscode_grammar.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/__main__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/api.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/dsn.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/help.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/lint.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/lint_ast.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/cli/run.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/config.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/access.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/dsn.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/duckdb.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/factory.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/firebird.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/mysql.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/oracle.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/postgres.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/sqlite.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/db/sqlserver.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/debug/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/debug/repl.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exceptions.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/delimited.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/duckdb.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/feather.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/html.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/json.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/latex.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/markdown.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/ods.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/parquet.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/pretty.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/protocol.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/raw.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/sqlite.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/templates.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/values.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/xls.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/xlsx.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/xml.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/yaml.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/exporters/zip.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/format.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/gui/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/gui/base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/gui/console.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/gui/desktop.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/gui/tui.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/csv.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/feather.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/json.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/ods.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/importers/xls.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/conditions.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/connect.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/control.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/data.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/debug.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/dispatch.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/io.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/io_export.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/io_fileops.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/io_import.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/io_write.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/prompt.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/script_ext.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/system.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/metacommands/upsert.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/models.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/parser.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/plugins.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/py.typed +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/ast.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/control.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/engine.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/parser.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/script/variables.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/state.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/types.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/auth.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/crypto.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/datetime.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/errors.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/fileio.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/gui.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/mail.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/numeric.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/regex.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/strings.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/src/execsql/utils/timer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/README.md +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/config_settings.sqlite +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/example_config_prompt.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/execsql.conf +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/make_config_db.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/md_compare.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/md_glossary.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/md_upsert.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/pg_compare.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/pg_glossary.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/pg_upsert.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/script_template.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/ss_compare.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/ss_glossary.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/templates/ss_upsert.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_cli.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_cli_e2e.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_cli_run.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_lint.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_ping.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/cli/test_profile.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/conftest.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_db_adapters_mocked.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_dsn.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_duckdb.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_factory.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_postgres.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_sqlite.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/db/test_sqlite_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_base.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_db.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_delimited.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_duckdb_exporter.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_exporters.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_feather.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_html_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_html_latex.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_json.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_json_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_latex_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_markdown.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_ods.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_parquet.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_pretty_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_raw_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_sqlite_exporter.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_templates.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_templates_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_values_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_xls_xlsx.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_xlsx.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_xml.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_yaml.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/exporters/test_zip.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/gui/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/gui/test_backends.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/gui/test_compare_stats.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/gui/test_compute_row_diffs.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_base_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_csv_edge_cases.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_csv_importer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_feather_importer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_json_importer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_ods_importer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/importers/test_xls_importer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/conftest.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/test_dsn.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/test_duckdb.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/test_mysql.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/test_postgres.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/integration/test_sqlite.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_assert.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_breakpoint.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_connect.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_io_export.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_io_import.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_connect.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_data.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_io.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_script_ext.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_system.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_metacommands_system_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_pg_upsert.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/metacommands/test_row_count.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/fixtures/control_flow.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/fixtures/smoke.sql +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/scripts/test_sql_scripts.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_api.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_ast.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_ast_parser.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_config.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_config_data.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_config_extended.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_debug_repl.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_engine.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_error_messages.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_exceptions.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_format.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_mail.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_models.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_package.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_parser.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_plugins.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_registry.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_script.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_state.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/test_types.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/__init__.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_auth.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_auth_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_crypto.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_datetime.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_errors.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_errors_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_fileio.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_fileio_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_numeric.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_regex.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_strings.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_timer.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/tests/utils/test_timer_extra.py +0 -0
- {execsql2-2.16.6 → execsql2-2.16.7}/zensical.toml +0 -0
|
@@ -13,6 +13,15 @@ ______________________________________________________________________
|
|
|
13
13
|
|
|
14
14
|
______________________________________________________________________
|
|
15
15
|
|
|
16
|
+
## [2.16.7] - 2026-04-30
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- ANDIF/ORIF conditions now short-circuit: `IF (sub_defined(x)) ANDIF (not sub_empty(x))` no longer evaluates `sub_empty` when `sub_defined` returns false. Previously all modifiers were evaluated unconditionally, causing `sub_empty` to throw "Unrecognized substitution variable" on undefined variables.
|
|
21
|
+
- Error reports for IF, LOOP, and INCLUDE nodes now show the correct source line and metacommand text instead of the previous command's location.
|
|
22
|
+
|
|
23
|
+
______________________________________________________________________
|
|
24
|
+
|
|
16
25
|
## [2.16.6] - 2026-04-30
|
|
17
26
|
|
|
18
27
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execsql2
|
|
3
|
-
Version: 2.16.
|
|
3
|
+
Version: 2.16.7
|
|
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.7"
|
|
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.7"
|
|
169
169
|
commit = true
|
|
170
170
|
tag = true
|
|
171
171
|
tag_name = "v{new_version}"
|
|
@@ -139,13 +139,24 @@ def _eval_condition(
|
|
|
139
139
|
condition: str,
|
|
140
140
|
modifiers: list[ConditionModifier] | None = None,
|
|
141
141
|
) -> bool:
|
|
142
|
-
"""Evaluate a condition string with optional ANDIF/ORIF modifiers.
|
|
142
|
+
"""Evaluate a condition string with optional ANDIF/ORIF modifiers.
|
|
143
|
+
|
|
144
|
+
Short-circuits ANDIF (stops on first False) and ORIF (stops on first True)
|
|
145
|
+
so that patterns like ``IF (sub_defined(x)) ANDIF (not sub_empty(x))``
|
|
146
|
+
don't evaluate ``sub_empty`` when ``x`` is undefined.
|
|
147
|
+
"""
|
|
143
148
|
effective_locals = _stack_localvars(ctx)
|
|
144
149
|
expanded = substitute_vars(condition, effective_locals, ctx=ctx)
|
|
145
150
|
result = xcmd_test(expanded)
|
|
146
151
|
|
|
147
152
|
if modifiers:
|
|
148
153
|
for mod in modifiers:
|
|
154
|
+
# Short-circuit: AND with False can't become True,
|
|
155
|
+
# OR with True can't become False.
|
|
156
|
+
if mod.kind == "AND" and not result:
|
|
157
|
+
continue
|
|
158
|
+
if mod.kind == "OR" and result:
|
|
159
|
+
continue
|
|
149
160
|
mod_expanded = substitute_vars(mod.condition, effective_locals, ctx=ctx)
|
|
150
161
|
mod_result = xcmd_test(mod_expanded)
|
|
151
162
|
if mod.kind == "AND":
|
|
@@ -353,9 +364,11 @@ def _execute_node(
|
|
|
353
364
|
_exec_metacommand(ctx, command, node.span.file, node.span.start_line, localvars)
|
|
354
365
|
|
|
355
366
|
elif isinstance(node, IfBlock):
|
|
367
|
+
ctx.last_command = _FakeScriptCmd(node)
|
|
356
368
|
_execute_if(ctx, node, localvars, in_loop=in_loop)
|
|
357
369
|
|
|
358
370
|
elif isinstance(node, LoopBlock):
|
|
371
|
+
ctx.last_command = _FakeScriptCmd(node)
|
|
359
372
|
_execute_loop(ctx, node, localvars)
|
|
360
373
|
|
|
361
374
|
elif isinstance(node, BatchBlock):
|
|
@@ -368,6 +381,7 @@ def _execute_node(
|
|
|
368
381
|
_execute_sql_block(ctx, node, localvars, in_loop=in_loop)
|
|
369
382
|
|
|
370
383
|
elif isinstance(node, IncludeDirective):
|
|
384
|
+
ctx.last_command = _FakeScriptCmd(node)
|
|
371
385
|
_execute_include(ctx, node, localvars)
|
|
372
386
|
|
|
373
387
|
|
|
@@ -434,6 +434,41 @@ class TestAssert:
|
|
|
434
434
|
assert result.returncode != 0
|
|
435
435
|
|
|
436
436
|
|
|
437
|
+
# ---------------------------------------------------------------------------
|
|
438
|
+
# Short-circuit ANDIF/ORIF
|
|
439
|
+
# ---------------------------------------------------------------------------
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
class TestShortCircuit:
|
|
443
|
+
def test_andif_short_circuits(self, tmp_path):
|
|
444
|
+
"""ANDIF does not evaluate sub_empty when sub_defined is false."""
|
|
445
|
+
script = (
|
|
446
|
+
"CREATE TABLE t (x INT);\n"
|
|
447
|
+
"-- !x! IF (sub_defined(undefined_var))\n"
|
|
448
|
+
"-- !x! ANDIF (not sub_empty(undefined_var))\n"
|
|
449
|
+
"INSERT INTO t VALUES (1);\n"
|
|
450
|
+
"-- !x! ELSE\n"
|
|
451
|
+
"INSERT INTO t VALUES (2);\n"
|
|
452
|
+
"-- !x! ENDIF\n"
|
|
453
|
+
)
|
|
454
|
+
result = _run_ast(script, tmp_path)
|
|
455
|
+
assert result.returncode == 0, result.stderr
|
|
456
|
+
assert _query_db(tmp_path, "SELECT x FROM t") == [(2,)]
|
|
457
|
+
|
|
458
|
+
def test_orif_short_circuits(self, tmp_path):
|
|
459
|
+
"""ORIF does not evaluate when first condition is already true."""
|
|
460
|
+
script = (
|
|
461
|
+
"CREATE TABLE t (x INT);\n"
|
|
462
|
+
"-- !x! IF (TRUE)\n"
|
|
463
|
+
"-- !x! ORIF (not sub_empty(undefined_var))\n"
|
|
464
|
+
"INSERT INTO t VALUES (1);\n"
|
|
465
|
+
"-- !x! ENDIF\n"
|
|
466
|
+
)
|
|
467
|
+
result = _run_ast(script, tmp_path)
|
|
468
|
+
assert result.returncode == 0, result.stderr
|
|
469
|
+
assert _query_db(tmp_path, "SELECT x FROM t") == [(1,)]
|
|
470
|
+
|
|
471
|
+
|
|
437
472
|
# ---------------------------------------------------------------------------
|
|
438
473
|
# Profiling
|
|
439
474
|
# ---------------------------------------------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.6 → execsql2-2.16.7}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|