execsql2 2.16.16__tar.gz → 2.16.17__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.16 → execsql2-2.16.17}/CHANGELOG.md +9 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/PKG-INFO +1 -1
- {execsql2-2.16.16 → execsql2-2.16.17}/pyproject.toml +2 -2
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/format.py +22 -4
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_format.py +101 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/uv.lock +1 -1
- {execsql2-2.16.16 → execsql2-2.16.17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.github/workflows/ci-cd.yml +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.gitignore +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.pre-commit-config.yaml +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.pre-commit-hooks.yaml +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.python-version +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/.readthedocs.yaml +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/CONTRIBUTING.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/LICENSE.txt +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/NOTICE +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/README.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/SECURITY.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/contributors.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/copyright.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/divergence.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/cli.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/db.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/exporters.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/importers.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/index.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/metacommands.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_db_adapters.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_exporters.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_importers.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_metacommands.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/architecture.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/installation.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/requirements.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/syntax.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/debugging.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/documentation.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/encoding.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/examples.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/formatter.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/logging.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/sql_syntax.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/usage.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/using_scripts.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/Compare_planets.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/actions.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/actions2.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/checkboxes.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/connect.b64 +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/connect.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/create_conf.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/data_error1_screenshot.jpg +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/entry_form.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/execsql_console.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/execsql_logo_01.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/fatals.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/logo_small.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal_sm.b64 +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal_sm.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/prompt_compare.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/set_build_commands.jpg +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unit_conversions.b64 +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unit_conversions_029.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unmatched.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/vim_execsql_highlight.png +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/index.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/configuration.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/metacommands.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/security.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/substitution_vars.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/README.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/pyproject.toml +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/tests/test_plugin.py.example +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/README.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/package.json +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/justfile +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/scripts/generate_vscode_grammar.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/__main__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/api.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/dsn.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/help.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/lint.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/lint_ast.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/run.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/config.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/data/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/data/execsql.conf.template +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/access.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/dsn.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/duckdb.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/factory.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/firebird.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/mysql.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/oracle.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/postgres.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/sqlite.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/sqlserver.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/debug/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/debug/repl.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exceptions.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/delimited.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/duckdb.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/feather.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/html.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/json.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/latex.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/markdown.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/ods.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/parquet.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/pretty.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/protocol.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/raw.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/sqlite.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/templates.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/values.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xls.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xlsx.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xml.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/yaml.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/zip.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/console.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/desktop.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/tui.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/csv.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/feather.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/json.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/ods.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/xls.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/conditions.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/connect.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/control.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/data.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/debug.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/dispatch.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_export.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_fileops.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_import.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_write.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/prompt.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/script_ext.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/system.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/upsert.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/models.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/parser.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/plugins.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/py.typed +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/ast.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/control.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/engine.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/executor.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/parser.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/variables.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/state.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/types.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/auth.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/crypto.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/datetime.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/errors.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/fileio.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/gui.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/mail.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/numeric.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/regex.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/strings.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/timer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/README.md +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/config_settings.sqlite +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/example_config_prompt.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/execsql.conf +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/make_config_db.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_compare.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_glossary.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_upsert.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_compare.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_glossary.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_upsert.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/script_template.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_compare.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_glossary.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_upsert.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli_e2e.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli_run.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_lint.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_ping.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_profile.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/conftest.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_db_adapters_mocked.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_dsn.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_duckdb.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_factory.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_postgres.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_sqlite.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_sqlite_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_base.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_db.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_delimited.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_duckdb_exporter.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_exporters.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_feather.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_html_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_html_latex.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_json.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_json_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_latex_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_markdown.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_ods.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_parquet.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_pretty_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_raw_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_sqlite_exporter.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_templates.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_templates_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_values_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xls_xlsx.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xlsx.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xml.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_yaml.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_zip.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_backends.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_compare_stats.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_compute_row_diffs.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_base_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_csv_edge_cases.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_csv_importer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_feather_importer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_json_importer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_ods_importer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_xls_importer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/conftest.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_dsn.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_duckdb.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_mysql.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_postgres.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_sqlite.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_assert.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_breakpoint.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_connect.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_io_export.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_io_import.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_connect.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_data.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_io.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_script_ext.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_system.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_system_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_pg_upsert.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_row_count.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_show_scripts.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/control_flow.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/smoke.sql +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/test_sql_scripts.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_api.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_ast.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_ast_parser.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config_data.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config_extended.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_debug_repl.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_engine.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_error_messages.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_exceptions.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_executor.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_mail.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_models.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_package.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_parser.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_parser_params.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_plugins.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_registry.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_script.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_state.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_types.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/__init__.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_auth.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_auth_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_crypto.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_datetime.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_errors.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_errors_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_fileio.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_fileio_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_numeric.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_regex.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_strings.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_timer.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_timer_extra.py +0 -0
- {execsql2-2.16.16 → execsql2-2.16.17}/zensical.toml +0 -0
|
@@ -13,6 +13,15 @@ ______________________________________________________________________
|
|
|
13
13
|
|
|
14
14
|
______________________________________________________________________
|
|
15
15
|
|
|
16
|
+
## [2.16.17] - 2026-05-04
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Formatter no longer treats inline `IF (cond) { command }` metacommands as block openers. Previously every line below an inline `IF` was indented one extra level forever, since the formatter incremented its block depth as if the inline form required an `ENDIF`.
|
|
21
|
+
- Formatter no longer escapes blank lines that appear inside `-- !x! BEGIN SQL` / `-- !x! BEGIN BATCH` blocks. Blanks immediately after `BEGIN SQL` (and between SQL statements inside the block) were emitted flush-left, visually severing the block; they are now held with the SQL accumulator and consumed by the SQL pretty-printer.
|
|
22
|
+
|
|
23
|
+
______________________________________________________________________
|
|
24
|
+
|
|
16
25
|
## [2.16.16] - 2026-05-02
|
|
17
26
|
|
|
18
27
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execsql2
|
|
3
|
-
Version: 2.16.
|
|
3
|
+
Version: 2.16.17
|
|
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.17"
|
|
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.17"
|
|
169
169
|
commit = true
|
|
170
170
|
tag = true
|
|
171
171
|
tag_name = "v{new_version}"
|
|
@@ -82,6 +82,14 @@ BLOCK_CLOSE = frozenset({"ENDIF", "END LOOP", "ENDLOOP", "END SCRIPT", "END BATC
|
|
|
82
82
|
PIVOT = frozenset({"ELSE", "ELSEIF"}) # decrease depth before emit, increase after
|
|
83
83
|
CONTINUATION = frozenset({"ANDIF", "ORIF"}) # emit at depth-1, no depth change
|
|
84
84
|
|
|
85
|
+
# Inline IF: "IF (cond) { command }" — self-contained, no ENDIF, no depth change.
|
|
86
|
+
# Mirrors src/execsql/cli/lint.py:_RX_IF_INLINE so formatter and linter agree.
|
|
87
|
+
_IF_INLINE_RE = re.compile(r"^\s*IF\s*\(\s*.+\s*\)\s*\{.+\}\s*$", re.I)
|
|
88
|
+
# BLOCK_OPEN keywords whose bodies are guaranteed-SQL (not metacommand-driven).
|
|
89
|
+
# Blank lines inside these belong to the SQL accumulator, not the output stream.
|
|
90
|
+
_SQL_BODY_BLOCKS = frozenset({"BEGIN SQL", "BEGIN BATCH"})
|
|
91
|
+
_SQL_BODY_BLOCK_CLOSES = frozenset({"END SQL", "END BATCH"})
|
|
92
|
+
|
|
85
93
|
|
|
86
94
|
# ---------------------------------------------------------------------------
|
|
87
95
|
# Keyword parsing
|
|
@@ -488,6 +496,10 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True, leading_comm
|
|
|
488
496
|
# the accumulator — doing so would split a single statement into
|
|
489
497
|
# fragments that sqlglot cannot parse.
|
|
490
498
|
in_sql_statement = False
|
|
499
|
+
# True between BEGIN SQL/BATCH and END SQL/BATCH. Blank lines inside
|
|
500
|
+
# these blocks belong to the SQL accumulator so they re-emit at the
|
|
501
|
+
# block's indent depth, not flush-left in the output stream.
|
|
502
|
+
in_explicit_sql_block = False
|
|
491
503
|
|
|
492
504
|
def flush_sql() -> None:
|
|
493
505
|
nonlocal in_dollar_quote, in_sql_statement
|
|
@@ -520,12 +532,13 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True, leading_comm
|
|
|
520
532
|
m = METACOMMAND_RE.match(raw_line)
|
|
521
533
|
|
|
522
534
|
if not stripped_line:
|
|
523
|
-
if not in_dollar_quote and not in_sql_statement:
|
|
535
|
+
if not in_dollar_quote and not in_sql_statement and not in_explicit_sql_block:
|
|
524
536
|
flush_sql()
|
|
525
537
|
output.append("")
|
|
526
538
|
else:
|
|
527
|
-
# Mid-statement blank line stays in
|
|
528
|
-
# will appear in the output
|
|
539
|
+
# Mid-statement OR mid-explicit-SQL-block blank line stays in
|
|
540
|
+
# the accumulator and will appear in the output at the block's
|
|
541
|
+
# indent depth when the SQL is formatted.
|
|
529
542
|
sql_acc.append(raw_line)
|
|
530
543
|
|
|
531
544
|
elif m:
|
|
@@ -536,6 +549,8 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True, leading_comm
|
|
|
536
549
|
if keyword in BLOCK_CLOSE:
|
|
537
550
|
depth = max(0, depth - 1)
|
|
538
551
|
output.append(format_metacommand(payload, depth, indent))
|
|
552
|
+
if keyword in _SQL_BODY_BLOCK_CLOSES:
|
|
553
|
+
in_explicit_sql_block = False
|
|
539
554
|
|
|
540
555
|
elif keyword in PIVOT:
|
|
541
556
|
depth = max(0, depth - 1)
|
|
@@ -547,7 +562,10 @@ def format_file(source: str, indent: int = 4, use_sql: bool = True, leading_comm
|
|
|
547
562
|
|
|
548
563
|
elif keyword in BLOCK_OPEN:
|
|
549
564
|
output.append(format_metacommand(payload, depth, indent))
|
|
550
|
-
|
|
565
|
+
if not (keyword == "IF" and _IF_INLINE_RE.match(payload)):
|
|
566
|
+
depth += 1
|
|
567
|
+
if keyword in _SQL_BODY_BLOCKS:
|
|
568
|
+
in_explicit_sql_block = True
|
|
551
569
|
|
|
552
570
|
else:
|
|
553
571
|
output.append(format_metacommand(payload, depth, indent))
|
|
@@ -688,6 +688,107 @@ class TestFormatFileEdgeCases:
|
|
|
688
688
|
assert lines[1] == " -- !x! WRITE 'inside'"
|
|
689
689
|
assert lines[2] == "-- !x! END SCRIPT"
|
|
690
690
|
|
|
691
|
+
# ---- Inline IF (no ENDIF) — must not increment depth ---------------
|
|
692
|
+
|
|
693
|
+
def test_inline_if_does_not_indent_following_lines(self):
|
|
694
|
+
"""Inline `IF (cond) { cmd }` is self-contained; subsequent lines stay at the same depth."""
|
|
695
|
+
source = "-- !x! IF (1=1) { halt message \"stop\" }\n-- !x! WRITE 'after'\n"
|
|
696
|
+
result = format_file(source, use_sql=False)
|
|
697
|
+
lines = result.splitlines()
|
|
698
|
+
assert lines[0].startswith("-- !x! IF (1=1)")
|
|
699
|
+
assert lines[1] == "-- !x! WRITE 'after'"
|
|
700
|
+
|
|
701
|
+
def test_inline_if_with_substitution_vars(self):
|
|
702
|
+
"""Reproduces the user-reported case with substitution variables in the inline body."""
|
|
703
|
+
source = (
|
|
704
|
+
"-- !x! IF (not hasrows(cmp_primary_key_columns)) { "
|
|
705
|
+
'halt message "Table !!#table!! has no primary key columns." }\n'
|
|
706
|
+
"-- !x! WRITE 'after'\n"
|
|
707
|
+
)
|
|
708
|
+
result = format_file(source, use_sql=False)
|
|
709
|
+
lines = result.splitlines()
|
|
710
|
+
assert "IF (not hasrows" in lines[0]
|
|
711
|
+
assert "!!#table!!" in lines[0]
|
|
712
|
+
assert lines[1] == "-- !x! WRITE 'after'"
|
|
713
|
+
|
|
714
|
+
def test_inline_if_inside_block(self):
|
|
715
|
+
"""An inline IF nested inside a block-form IF emits at the current depth and does not push deeper."""
|
|
716
|
+
source = "-- !x! IF 1=1\n-- !x! IF (cond) { halt message \"x\" }\n-- !x! WRITE 'still inside'\n-- !x! ENDIF\n"
|
|
717
|
+
result = format_file(source, use_sql=False)
|
|
718
|
+
lines = result.splitlines()
|
|
719
|
+
assert lines[0] == "-- !x! IF 1=1"
|
|
720
|
+
assert lines[1].startswith(" -- !x! IF (cond)")
|
|
721
|
+
assert lines[2] == " -- !x! WRITE 'still inside'"
|
|
722
|
+
assert lines[3] == "-- !x! ENDIF"
|
|
723
|
+
|
|
724
|
+
def test_block_if_paren_form_still_indents(self):
|
|
725
|
+
"""Block-form `IF (cond)` (parens, no brace) still opens an indented block."""
|
|
726
|
+
source = "-- !x! IF (1=1)\n-- !x! WRITE 'yes'\n-- !x! ENDIF\n"
|
|
727
|
+
result = format_file(source, use_sql=False)
|
|
728
|
+
lines = result.splitlines()
|
|
729
|
+
assert lines[0] == "-- !x! IF (1=1)"
|
|
730
|
+
assert lines[1] == " -- !x! WRITE 'yes'"
|
|
731
|
+
assert lines[2] == "-- !x! ENDIF"
|
|
732
|
+
|
|
733
|
+
# ---- BEGIN SQL / BEGIN BATCH — blank lines must not escape ---------
|
|
734
|
+
|
|
735
|
+
def test_begin_sql_blank_line_after_does_not_escape(self):
|
|
736
|
+
"""A blank line right after `-- !x! BEGIN SQL` must not be emitted flush-left."""
|
|
737
|
+
source = "-- !x! BEGIN SQL\n\nSELECT 1;\n-- !x! END SQL\n"
|
|
738
|
+
result = format_file(source) # default use_sql=True; sqlglot collapses leading blank
|
|
739
|
+
lines = result.splitlines()
|
|
740
|
+
assert lines[0] == "-- !x! BEGIN SQL"
|
|
741
|
+
assert lines[-1] == "-- !x! END SQL"
|
|
742
|
+
middle = lines[1:-1]
|
|
743
|
+
assert "" not in middle, f"Flush-left blank inside BEGIN SQL block: {middle!r}"
|
|
744
|
+
select_lines = [line for line in middle if "SELECT" in line.upper()]
|
|
745
|
+
assert len(select_lines) == 1
|
|
746
|
+
assert select_lines[0].startswith(" ")
|
|
747
|
+
|
|
748
|
+
def test_begin_batch_blank_line_after_does_not_escape(self):
|
|
749
|
+
"""Same fix applies to BEGIN BATCH (also a guaranteed-SQL body)."""
|
|
750
|
+
source = "-- !x! BEGIN BATCH\n\nINSERT INTO t VALUES (1);\n-- !x! END BATCH\n"
|
|
751
|
+
result = format_file(source)
|
|
752
|
+
lines = result.splitlines()
|
|
753
|
+
assert lines[0] == "-- !x! BEGIN BATCH"
|
|
754
|
+
assert lines[-1] == "-- !x! END BATCH"
|
|
755
|
+
middle = lines[1:-1]
|
|
756
|
+
assert "" not in middle, f"Flush-left blank inside BEGIN BATCH block: {middle!r}"
|
|
757
|
+
|
|
758
|
+
def test_begin_sql_blank_line_between_statements_collapsed(self):
|
|
759
|
+
"""With sqlglot enabled, blanks between SQL statements inside BEGIN SQL are consumed
|
|
760
|
+
by pretty-print rather than escaping as flush-left blanks that split the block."""
|
|
761
|
+
source = "-- !x! BEGIN SQL\nSELECT 1;\n\nSELECT 2;\n-- !x! END SQL\n"
|
|
762
|
+
result = format_file(source)
|
|
763
|
+
lines = result.splitlines()
|
|
764
|
+
middle = lines[1:-1]
|
|
765
|
+
assert "" not in middle, f"Flush-left blank inside BEGIN SQL block: {middle!r}"
|
|
766
|
+
# sqlglot may pretty-print `SELECT 1` across multiple lines; check the
|
|
767
|
+
# body as a whole rather than per-line.
|
|
768
|
+
body = "\n".join(middle)
|
|
769
|
+
assert "SELECT" in body.upper()
|
|
770
|
+
assert "1;" in body and "2;" in body
|
|
771
|
+
|
|
772
|
+
def test_blank_lines_outside_explicit_sql_block_unchanged(self):
|
|
773
|
+
"""Regression guard: blanks outside BEGIN SQL/BATCH (top-level, or inside IF) still emit flush-left."""
|
|
774
|
+
# Top-level blank between metacommands
|
|
775
|
+
source = "-- !x! WRITE 'a'\n\n-- !x! WRITE 'b'\n"
|
|
776
|
+
result = format_file(source, use_sql=False)
|
|
777
|
+
lines = result.splitlines()
|
|
778
|
+
assert lines[0] == "-- !x! WRITE 'a'"
|
|
779
|
+
assert lines[1] == ""
|
|
780
|
+
assert lines[2] == "-- !x! WRITE 'b'"
|
|
781
|
+
|
|
782
|
+
# Blank between metacommands inside an IF block — still flush-left
|
|
783
|
+
source = "-- !x! IF 1=1\n-- !x! WRITE 'a'\n\n-- !x! WRITE 'b'\n-- !x! ENDIF\n"
|
|
784
|
+
result = format_file(source, use_sql=False)
|
|
785
|
+
lines = result.splitlines()
|
|
786
|
+
assert lines[0] == "-- !x! IF 1=1"
|
|
787
|
+
assert lines[1] == " -- !x! WRITE 'a'"
|
|
788
|
+
assert lines[2] == ""
|
|
789
|
+
assert lines[3] == " -- !x! WRITE 'b'"
|
|
790
|
+
assert lines[4] == "-- !x! ENDIF"
|
|
791
|
+
|
|
691
792
|
def test_only_sql_no_metacommands(self):
|
|
692
793
|
source = "SELECT 1;\nSELECT 2;\n"
|
|
693
794
|
result = format_file(source, use_sql=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.16 → execsql2-2.16.17}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json
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
|