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.
Files changed (322) hide show
  1. {execsql2-2.16.16 → execsql2-2.16.17}/CHANGELOG.md +9 -0
  2. {execsql2-2.16.16 → execsql2-2.16.17}/PKG-INFO +1 -1
  3. {execsql2-2.16.16 → execsql2-2.16.17}/pyproject.toml +2 -2
  4. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/format.py +22 -4
  5. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_format.py +101 -0
  6. {execsql2-2.16.16 → execsql2-2.16.17}/uv.lock +1 -1
  7. {execsql2-2.16.16 → execsql2-2.16.17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  8. {execsql2-2.16.16 → execsql2-2.16.17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  9. {execsql2-2.16.16 → execsql2-2.16.17}/.github/workflows/ci-cd.yml +0 -0
  10. {execsql2-2.16.16 → execsql2-2.16.17}/.gitignore +0 -0
  11. {execsql2-2.16.16 → execsql2-2.16.17}/.pre-commit-config.yaml +0 -0
  12. {execsql2-2.16.16 → execsql2-2.16.17}/.pre-commit-hooks.yaml +0 -0
  13. {execsql2-2.16.16 → execsql2-2.16.17}/.python-version +0 -0
  14. {execsql2-2.16.16 → execsql2-2.16.17}/.readthedocs.yaml +0 -0
  15. {execsql2-2.16.16 → execsql2-2.16.17}/CONTRIBUTING.md +0 -0
  16. {execsql2-2.16.16 → execsql2-2.16.17}/LICENSE.txt +0 -0
  17. {execsql2-2.16.16 → execsql2-2.16.17}/NOTICE +0 -0
  18. {execsql2-2.16.16 → execsql2-2.16.17}/README.md +0 -0
  19. {execsql2-2.16.16 → execsql2-2.16.17}/SECURITY.md +0 -0
  20. {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/contributors.md +0 -0
  21. {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/copyright.md +0 -0
  22. {execsql2-2.16.16 → execsql2-2.16.17}/docs/about/divergence.md +0 -0
  23. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/cli.md +0 -0
  24. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/db.md +0 -0
  25. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/exporters.md +0 -0
  26. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/importers.md +0 -0
  27. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/index.md +0 -0
  28. {execsql2-2.16.16 → execsql2-2.16.17}/docs/api/metacommands.md +0 -0
  29. {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_db_adapters.md +0 -0
  30. {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_exporters.md +0 -0
  31. {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_importers.md +0 -0
  32. {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/adding_metacommands.md +0 -0
  33. {execsql2-2.16.16 → execsql2-2.16.17}/docs/dev/architecture.md +0 -0
  34. {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/installation.md +0 -0
  35. {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/requirements.md +0 -0
  36. {execsql2-2.16.16 → execsql2-2.16.17}/docs/getting-started/syntax.md +0 -0
  37. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/debugging.md +0 -0
  38. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/documentation.md +0 -0
  39. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/encoding.md +0 -0
  40. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/examples.md +0 -0
  41. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/formatter.md +0 -0
  42. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/logging.md +0 -0
  43. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/sql_syntax.md +0 -0
  44. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/usage.md +0 -0
  45. {execsql2-2.16.16 → execsql2-2.16.17}/docs/guides/using_scripts.md +0 -0
  46. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/Compare_planets.png +0 -0
  47. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/actions.png +0 -0
  48. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/actions2.png +0 -0
  49. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/checkboxes.png +0 -0
  50. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/connect.b64 +0 -0
  51. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/connect.png +0 -0
  52. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/create_conf.png +0 -0
  53. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/data_error1_screenshot.jpg +0 -0
  54. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/entry_form.png +0 -0
  55. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/execsql_console.png +0 -0
  56. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/execsql_logo_01.png +0 -0
  57. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/fatals.png +0 -0
  58. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/logo_small.png +0 -0
  59. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal.png +0 -0
  60. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal_sm.b64 +0 -0
  61. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/pause_terminal_sm.png +0 -0
  62. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/prompt_compare.png +0 -0
  63. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/set_build_commands.jpg +0 -0
  64. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unit_conversions.b64 +0 -0
  65. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unit_conversions_029.png +0 -0
  66. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/unmatched.png +0 -0
  67. {execsql2-2.16.16 → execsql2-2.16.17}/docs/images/vim_execsql_highlight.png +0 -0
  68. {execsql2-2.16.16 → execsql2-2.16.17}/docs/index.md +0 -0
  69. {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/configuration.md +0 -0
  70. {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/metacommands.md +0 -0
  71. {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/security.md +0 -0
  72. {execsql2-2.16.16 → execsql2-2.16.17}/docs/reference/substitution_vars.md +0 -0
  73. {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/README.md +0 -0
  74. {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/pyproject.toml +0 -0
  75. {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
  76. {execsql2-2.16.16 → execsql2-2.16.17}/extras/plugin-template/tests/test_plugin.py.example +0 -0
  77. {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/README.md +0 -0
  78. {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/package.json +0 -0
  79. {execsql2-2.16.16 → execsql2-2.16.17}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +0 -0
  80. {execsql2-2.16.16 → execsql2-2.16.17}/justfile +0 -0
  81. {execsql2-2.16.16 → execsql2-2.16.17}/scripts/generate_vscode_grammar.py +0 -0
  82. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/__init__.py +0 -0
  83. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/__main__.py +0 -0
  84. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/api.py +0 -0
  85. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/__init__.py +0 -0
  86. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/dsn.py +0 -0
  87. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/help.py +0 -0
  88. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/lint.py +0 -0
  89. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/lint_ast.py +0 -0
  90. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/cli/run.py +0 -0
  91. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/config.py +0 -0
  92. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/data/__init__.py +0 -0
  93. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/data/execsql.conf.template +0 -0
  94. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/__init__.py +0 -0
  95. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/access.py +0 -0
  96. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/base.py +0 -0
  97. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/dsn.py +0 -0
  98. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/duckdb.py +0 -0
  99. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/factory.py +0 -0
  100. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/firebird.py +0 -0
  101. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/mysql.py +0 -0
  102. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/oracle.py +0 -0
  103. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/postgres.py +0 -0
  104. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/sqlite.py +0 -0
  105. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/db/sqlserver.py +0 -0
  106. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/debug/__init__.py +0 -0
  107. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/debug/repl.py +0 -0
  108. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exceptions.py +0 -0
  109. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/__init__.py +0 -0
  110. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/base.py +0 -0
  111. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/delimited.py +0 -0
  112. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/duckdb.py +0 -0
  113. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/feather.py +0 -0
  114. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/html.py +0 -0
  115. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/json.py +0 -0
  116. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/latex.py +0 -0
  117. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/markdown.py +0 -0
  118. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/ods.py +0 -0
  119. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/parquet.py +0 -0
  120. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/pretty.py +0 -0
  121. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/protocol.py +0 -0
  122. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/raw.py +0 -0
  123. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/sqlite.py +0 -0
  124. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/templates.py +0 -0
  125. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/values.py +0 -0
  126. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xls.py +0 -0
  127. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xlsx.py +0 -0
  128. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/xml.py +0 -0
  129. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/yaml.py +0 -0
  130. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/exporters/zip.py +0 -0
  131. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/__init__.py +0 -0
  132. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/base.py +0 -0
  133. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/console.py +0 -0
  134. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/desktop.py +0 -0
  135. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/gui/tui.py +0 -0
  136. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/__init__.py +0 -0
  137. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/base.py +0 -0
  138. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/csv.py +0 -0
  139. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/feather.py +0 -0
  140. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/json.py +0 -0
  141. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/ods.py +0 -0
  142. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/importers/xls.py +0 -0
  143. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/__init__.py +0 -0
  144. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/conditions.py +0 -0
  145. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/connect.py +0 -0
  146. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/control.py +0 -0
  147. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/data.py +0 -0
  148. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/debug.py +0 -0
  149. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/dispatch.py +0 -0
  150. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io.py +0 -0
  151. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_export.py +0 -0
  152. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_fileops.py +0 -0
  153. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_import.py +0 -0
  154. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/io_write.py +0 -0
  155. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/prompt.py +0 -0
  156. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/script_ext.py +0 -0
  157. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/system.py +0 -0
  158. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/metacommands/upsert.py +0 -0
  159. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/models.py +0 -0
  160. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/parser.py +0 -0
  161. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/plugins.py +0 -0
  162. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/py.typed +0 -0
  163. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/__init__.py +0 -0
  164. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/ast.py +0 -0
  165. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/control.py +0 -0
  166. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/engine.py +0 -0
  167. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/executor.py +0 -0
  168. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/parser.py +0 -0
  169. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/script/variables.py +0 -0
  170. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/state.py +0 -0
  171. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/types.py +0 -0
  172. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/__init__.py +0 -0
  173. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/auth.py +0 -0
  174. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/crypto.py +0 -0
  175. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/datetime.py +0 -0
  176. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/errors.py +0 -0
  177. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/fileio.py +0 -0
  178. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/gui.py +0 -0
  179. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/mail.py +0 -0
  180. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/numeric.py +0 -0
  181. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/regex.py +0 -0
  182. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/strings.py +0 -0
  183. {execsql2-2.16.16 → execsql2-2.16.17}/src/execsql/utils/timer.py +0 -0
  184. {execsql2-2.16.16 → execsql2-2.16.17}/templates/README.md +0 -0
  185. {execsql2-2.16.16 → execsql2-2.16.17}/templates/config_settings.sqlite +0 -0
  186. {execsql2-2.16.16 → execsql2-2.16.17}/templates/example_config_prompt.sql +0 -0
  187. {execsql2-2.16.16 → execsql2-2.16.17}/templates/execsql.conf +0 -0
  188. {execsql2-2.16.16 → execsql2-2.16.17}/templates/make_config_db.sql +0 -0
  189. {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_compare.sql +0 -0
  190. {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_glossary.sql +0 -0
  191. {execsql2-2.16.16 → execsql2-2.16.17}/templates/md_upsert.sql +0 -0
  192. {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_compare.sql +0 -0
  193. {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_glossary.sql +0 -0
  194. {execsql2-2.16.16 → execsql2-2.16.17}/templates/pg_upsert.sql +0 -0
  195. {execsql2-2.16.16 → execsql2-2.16.17}/templates/script_template.sql +0 -0
  196. {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_compare.sql +0 -0
  197. {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_glossary.sql +0 -0
  198. {execsql2-2.16.16 → execsql2-2.16.17}/templates/ss_upsert.sql +0 -0
  199. {execsql2-2.16.16 → execsql2-2.16.17}/tests/__init__.py +0 -0
  200. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/__init__.py +0 -0
  201. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli.py +0 -0
  202. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli_e2e.py +0 -0
  203. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_cli_run.py +0 -0
  204. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_lint.py +0 -0
  205. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_ping.py +0 -0
  206. {execsql2-2.16.16 → execsql2-2.16.17}/tests/cli/test_profile.py +0 -0
  207. {execsql2-2.16.16 → execsql2-2.16.17}/tests/conftest.py +0 -0
  208. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/__init__.py +0 -0
  209. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_base.py +0 -0
  210. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_db_adapters_mocked.py +0 -0
  211. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_dsn.py +0 -0
  212. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_duckdb.py +0 -0
  213. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_factory.py +0 -0
  214. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_postgres.py +0 -0
  215. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_sqlite.py +0 -0
  216. {execsql2-2.16.16 → execsql2-2.16.17}/tests/db/test_sqlite_extra.py +0 -0
  217. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/__init__.py +0 -0
  218. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_base.py +0 -0
  219. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_db.py +0 -0
  220. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_delimited.py +0 -0
  221. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_duckdb_exporter.py +0 -0
  222. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_exporters.py +0 -0
  223. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_feather.py +0 -0
  224. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_html_extended.py +0 -0
  225. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_html_latex.py +0 -0
  226. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_json.py +0 -0
  227. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_json_extended.py +0 -0
  228. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_latex_extended.py +0 -0
  229. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_markdown.py +0 -0
  230. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_ods.py +0 -0
  231. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_parquet.py +0 -0
  232. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_pretty_extended.py +0 -0
  233. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_raw_extended.py +0 -0
  234. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_sqlite_exporter.py +0 -0
  235. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_templates.py +0 -0
  236. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_templates_extended.py +0 -0
  237. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_values_extended.py +0 -0
  238. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xls_xlsx.py +0 -0
  239. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xlsx.py +0 -0
  240. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_xml.py +0 -0
  241. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_yaml.py +0 -0
  242. {execsql2-2.16.16 → execsql2-2.16.17}/tests/exporters/test_zip.py +0 -0
  243. {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/__init__.py +0 -0
  244. {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_backends.py +0 -0
  245. {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_compare_stats.py +0 -0
  246. {execsql2-2.16.16 → execsql2-2.16.17}/tests/gui/test_compute_row_diffs.py +0 -0
  247. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/__init__.py +0 -0
  248. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_base_extended.py +0 -0
  249. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_csv_edge_cases.py +0 -0
  250. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_csv_importer.py +0 -0
  251. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_feather_importer.py +0 -0
  252. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_json_importer.py +0 -0
  253. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_ods_importer.py +0 -0
  254. {execsql2-2.16.16 → execsql2-2.16.17}/tests/importers/test_xls_importer.py +0 -0
  255. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/__init__.py +0 -0
  256. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/conftest.py +0 -0
  257. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_dsn.py +0 -0
  258. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_duckdb.py +0 -0
  259. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_mysql.py +0 -0
  260. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_postgres.py +0 -0
  261. {execsql2-2.16.16 → execsql2-2.16.17}/tests/integration/test_sqlite.py +0 -0
  262. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/__init__.py +0 -0
  263. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_assert.py +0 -0
  264. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_breakpoint.py +0 -0
  265. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_connect.py +0 -0
  266. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_io_export.py +0 -0
  267. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_io_import.py +0 -0
  268. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands.py +0 -0
  269. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_connect.py +0 -0
  270. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_data.py +0 -0
  271. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_extended.py +0 -0
  272. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
  273. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_io.py +0 -0
  274. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_io_write_extra.py +0 -0
  275. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_script_ext.py +0 -0
  276. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_system.py +0 -0
  277. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_metacommands_system_extra.py +0 -0
  278. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_pg_upsert.py +0 -0
  279. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_row_count.py +0 -0
  280. {execsql2-2.16.16 → execsql2-2.16.17}/tests/metacommands/test_show_scripts.py +0 -0
  281. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/__init__.py +0 -0
  282. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/control_flow.sql +0 -0
  283. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
  284. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
  285. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/fixtures/smoke.sql +0 -0
  286. {execsql2-2.16.16 → execsql2-2.16.17}/tests/scripts/test_sql_scripts.py +0 -0
  287. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_api.py +0 -0
  288. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_ast.py +0 -0
  289. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_ast_parser.py +0 -0
  290. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config.py +0 -0
  291. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config_data.py +0 -0
  292. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_config_extended.py +0 -0
  293. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_debug_repl.py +0 -0
  294. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_engine.py +0 -0
  295. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_error_messages.py +0 -0
  296. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_exceptions.py +0 -0
  297. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_executor.py +0 -0
  298. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_mail.py +0 -0
  299. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_models.py +0 -0
  300. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_package.py +0 -0
  301. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_parser.py +0 -0
  302. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_parser_params.py +0 -0
  303. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_plugins.py +0 -0
  304. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_registry.py +0 -0
  305. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_script.py +0 -0
  306. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_state.py +0 -0
  307. {execsql2-2.16.16 → execsql2-2.16.17}/tests/test_types.py +0 -0
  308. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/__init__.py +0 -0
  309. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_auth.py +0 -0
  310. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_auth_extra.py +0 -0
  311. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_crypto.py +0 -0
  312. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_datetime.py +0 -0
  313. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_errors.py +0 -0
  314. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_errors_extra.py +0 -0
  315. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_fileio.py +0 -0
  316. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_fileio_extra.py +0 -0
  317. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_numeric.py +0 -0
  318. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_regex.py +0 -0
  319. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_strings.py +0 -0
  320. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_timer.py +0 -0
  321. {execsql2-2.16.16 → execsql2-2.16.17}/tests/utils/test_timer_extra.py +0 -0
  322. {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.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.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.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 the accumulator and
528
- # will appear in the output when the block is formatted.
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
- depth += 1
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)
@@ -648,7 +648,7 @@ wheels = [
648
648
 
649
649
  [[package]]
650
650
  name = "execsql2"
651
- version = "2.16.16"
651
+ version = "2.16.17"
652
652
  source = { editable = "." }
653
653
  dependencies = [
654
654
  { name = "python-dateutil" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes