dblift 2.3.0__tar.gz → 2.4.1__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 (470) hide show
  1. {dblift-2.3.0 → dblift-2.4.1}/PKG-INFO +15 -1
  2. {dblift-2.3.0 → dblift-2.4.1}/cli/_command_handlers.py +5 -0
  3. {dblift-2.3.0 → dblift-2.4.1}/cli/_config_helpers.py +12 -2
  4. {dblift-2.3.0 → dblift-2.4.1}/cli/main.py +98 -12
  5. dblift-2.4.1/db/plugins/alloydb/__init__.py +12 -0
  6. dblift-2.4.1/db/plugins/alloydb/plugin.py +28 -0
  7. dblift-2.4.1/db/plugins/alloydb/provider.py +14 -0
  8. dblift-2.4.1/db/plugins/alloydb/quirks.py +32 -0
  9. dblift-2.4.1/db/plugins/aurora_postgresql/__init__.py +12 -0
  10. dblift-2.4.1/db/plugins/aurora_postgresql/plugin.py +28 -0
  11. dblift-2.4.1/db/plugins/aurora_postgresql/provider.py +14 -0
  12. dblift-2.4.1/db/plugins/aurora_postgresql/quirks.py +32 -0
  13. dblift-2.4.1/db/plugins/citus/__init__.py +12 -0
  14. dblift-2.4.1/db/plugins/citus/plugin.py +28 -0
  15. dblift-2.4.1/db/plugins/citus/provider.py +14 -0
  16. dblift-2.4.1/db/plugins/citus/quirks.py +32 -0
  17. dblift-2.4.1/db/plugins/neon/__init__.py +12 -0
  18. dblift-2.4.1/db/plugins/neon/plugin.py +28 -0
  19. dblift-2.4.1/db/plugins/neon/provider.py +14 -0
  20. dblift-2.4.1/db/plugins/neon/quirks.py +32 -0
  21. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/config.py +20 -1
  22. dblift-2.4.1/db/plugins/supabase/__init__.py +12 -0
  23. dblift-2.4.1/db/plugins/supabase/plugin.py +28 -0
  24. dblift-2.4.1/db/plugins/supabase/provider.py +14 -0
  25. dblift-2.4.1/db/plugins/supabase/quirks.py +32 -0
  26. dblift-2.4.1/db/plugins/timescaledb/__init__.py +12 -0
  27. dblift-2.4.1/db/plugins/timescaledb/plugin.py +28 -0
  28. dblift-2.4.1/db/plugins/timescaledb/provider.py +14 -0
  29. dblift-2.4.1/db/plugins/timescaledb/quirks.py +32 -0
  30. dblift-2.4.1/db/plugins/yugabytedb/__init__.py +12 -0
  31. dblift-2.4.1/db/plugins/yugabytedb/plugin.py +28 -0
  32. dblift-2.4.1/db/plugins/yugabytedb/provider.py +14 -0
  33. dblift-2.4.1/db/plugins/yugabytedb/quirks.py +32 -0
  34. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/PKG-INFO +15 -1
  35. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/SOURCES.txt +28 -0
  36. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/entry_points.txt +7 -0
  37. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/requires.txt +21 -0
  38. {dblift-2.3.0 → dblift-2.4.1}/pyproject.toml +64 -1
  39. {dblift-2.3.0 → dblift-2.4.1}/LICENSE +0 -0
  40. {dblift-2.3.0 → dblift-2.4.1}/README.md +0 -0
  41. {dblift-2.3.0 → dblift-2.4.1}/api/__init__.py +0 -0
  42. {dblift-2.3.0 → dblift-2.4.1}/api/_cli_support.py +0 -0
  43. {dblift-2.3.0 → dblift-2.4.1}/api/_client_factory.py +0 -0
  44. {dblift-2.3.0 → dblift-2.4.1}/api/_client_operations.py +0 -0
  45. {dblift-2.3.0 → dblift-2.4.1}/api/_engine_config.py +0 -0
  46. {dblift-2.3.0 → dblift-2.4.1}/api/async_client.py +0 -0
  47. {dblift-2.3.0 → dblift-2.4.1}/api/client.py +0 -0
  48. {dblift-2.3.0 → dblift-2.4.1}/api/events.py +0 -0
  49. {dblift-2.3.0 → dblift-2.4.1}/api/migrations.py +0 -0
  50. {dblift-2.3.0 → dblift-2.4.1}/api/py.typed +0 -0
  51. {dblift-2.3.0 → dblift-2.4.1}/cli/__init__.py +0 -0
  52. {dblift-2.3.0 → dblift-2.4.1}/cli/_constants.py +0 -0
  53. {dblift-2.3.0 → dblift-2.4.1}/cli/_output.py +0 -0
  54. {dblift-2.3.0 → dblift-2.4.1}/cli/_parser_setup.py +0 -0
  55. {dblift-2.3.0 → dblift-2.4.1}/cli/commands/__init__.py +0 -0
  56. {dblift-2.3.0 → dblift-2.4.1}/cli/commands/config_command.py +0 -0
  57. {dblift-2.3.0 → dblift-2.4.1}/cli/db_utils.py +0 -0
  58. {dblift-2.3.0 → dblift-2.4.1}/cli/extensions.py +0 -0
  59. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/__init__.py +0 -0
  60. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/_shared.py +0 -0
  61. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/baseline.py +0 -0
  62. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/clean.py +0 -0
  63. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/import_flyway.py +0 -0
  64. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/info.py +0 -0
  65. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/migrate.py +0 -0
  66. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/repair.py +0 -0
  67. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/undo.py +0 -0
  68. {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/validate.py +0 -0
  69. {dblift-2.3.0 → dblift-2.4.1}/config/__init__.py +0 -0
  70. {dblift-2.3.0 → dblift-2.4.1}/config/_credential_masking.py +0 -0
  71. {dblift-2.3.0 → dblift-2.4.1}/config/_subclasses/__init__.py +0 -0
  72. {dblift-2.3.0 → dblift-2.4.1}/config/_subclasses/dummy_config.py +0 -0
  73. {dblift-2.3.0 → dblift-2.4.1}/config/_url_builder_mixin.py +0 -0
  74. {dblift-2.3.0 → dblift-2.4.1}/config/config_builder.py +0 -0
  75. {dblift-2.3.0 → dblift-2.4.1}/config/database_config.py +0 -0
  76. {dblift-2.3.0 → dblift-2.4.1}/config/dblift_config.py +0 -0
  77. {dblift-2.3.0 → dblift-2.4.1}/config/errors.py +0 -0
  78. {dblift-2.3.0 → dblift-2.4.1}/config/property_registry.py +0 -0
  79. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/__init__.py +0 -0
  80. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_cache.py +0 -0
  81. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_provider_base.py +0 -0
  82. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_registry.py +0 -0
  83. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_resolver.py +0 -0
  84. {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_secrets_config.py +0 -0
  85. {dblift-2.3.0 → dblift-2.4.1}/core/__init__.py +0 -0
  86. {dblift-2.3.0 → dblift-2.4.1}/core/constants.py +0 -0
  87. {dblift-2.3.0 → dblift-2.4.1}/core/dialect_boundary.py +0 -0
  88. {dblift-2.3.0 → dblift-2.4.1}/core/exceptions.py +0 -0
  89. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/__init__.py +0 -0
  90. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_column_enricher.py +0 -0
  91. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_partition_enricher.py +0 -0
  92. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_schema_orchestrator.py +0 -0
  93. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_utils.py +0 -0
  94. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_vendor_property_applier.py +0 -0
  95. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/base_introspector.py +0 -0
  96. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/__init__.py +0 -0
  97. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/base_extractor.py +0 -0
  98. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/column_extractor.py +0 -0
  99. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/constraint_extractor.py +0 -0
  100. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/index_extractor.py +0 -0
  101. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/misc_extractor.py +0 -0
  102. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/procedure_extractor.py +0 -0
  103. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/sequence_extractor.py +0 -0
  104. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/table_extractor.py +0 -0
  105. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/trigger_extractor.py +0 -0
  106. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/view_extractor.py +0 -0
  107. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/introspector_factory.py +0 -0
  108. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/result.py +0 -0
  109. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/schema_introspector.py +0 -0
  110. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_base.py +0 -0
  111. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_factory.py +0 -0
  112. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_protocols.py +0 -0
  113. {dblift-2.3.0 → dblift-2.4.1}/core/introspection/version_detector.py +0 -0
  114. {dblift-2.3.0 → dblift-2.4.1}/core/logger/__init__.py +0 -0
  115. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_base.py +0 -0
  116. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_factory.py +0 -0
  117. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_formatters.py +0 -0
  118. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_levels.py +0 -0
  119. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_multi.py +0 -0
  120. {dblift-2.3.0 → dblift-2.4.1}/core/logger/_null.py +0 -0
  121. {dblift-2.3.0 → dblift-2.4.1}/core/logger/console.py +0 -0
  122. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/__init__.py +0 -0
  123. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/_formatter_impl.py +0 -0
  124. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/factory.py +0 -0
  125. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/formatter.py +0 -0
  126. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/htmlformatter.py +0 -0
  127. {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/jsonformatter.py +0 -0
  128. {dblift-2.3.0 → dblift-2.4.1}/core/logger/log.py +0 -0
  129. {dblift-2.3.0 → dblift-2.4.1}/core/logger/results.py +0 -0
  130. {dblift-2.3.0 → dblift-2.4.1}/core/logger/templates/oldreport.html +0 -0
  131. {dblift-2.3.0 → dblift-2.4.1}/core/logger/templates/report.html +0 -0
  132. {dblift-2.3.0 → dblift-2.4.1}/core/migration/__init__.py +0 -0
  133. {dblift-2.3.0 → dblift-2.4.1}/core/migration/_type_match.py +0 -0
  134. {dblift-2.3.0 → dblift-2.4.1}/core/migration/clean_summary.py +0 -0
  135. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/__init__.py +0 -0
  136. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/_script_events.py +0 -0
  137. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/base_command.py +0 -0
  138. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/baseline_command.py +0 -0
  139. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/clean_command.py +0 -0
  140. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/import_flyway_command.py +0 -0
  141. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/info_command.py +0 -0
  142. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/migrate_command.py +0 -0
  143. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/repair_command.py +0 -0
  144. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/undo_command.py +0 -0
  145. {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/validate_command.py +0 -0
  146. {dblift-2.3.0 → dblift-2.4.1}/core/migration/encoding.py +0 -0
  147. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/__init__.py +0 -0
  148. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/execution_engine.py +0 -0
  149. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/migration_executor.py +0 -0
  150. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/migration_helpers.py +0 -0
  151. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/placeholder_manager.py +0 -0
  152. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/transaction_policy.py +0 -0
  153. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/__init__.py +0 -0
  154. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/base_executor.py +0 -0
  155. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/executor_factory.py +0 -0
  156. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/python_executor.py +0 -0
  157. {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/sql_executor.py +0 -0
  158. {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/__init__.py +0 -0
  159. {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/format_detector.py +0 -0
  160. {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/migration_format.py +0 -0
  161. {dblift-2.3.0 → dblift-2.4.1}/core/migration/history/__init__.py +0 -0
  162. {dblift-2.3.0 → dblift-2.4.1}/core/migration/history/migration_history_manager.py +0 -0
  163. {dblift-2.3.0 → dblift-2.4.1}/core/migration/journals/__init__.py +0 -0
  164. {dblift-2.3.0 → dblift-2.4.1}/core/migration/journals/migration_journal.py +0 -0
  165. {dblift-2.3.0 → dblift-2.4.1}/core/migration/migration.py +0 -0
  166. {dblift-2.3.0 → dblift-2.4.1}/core/migration/placeholders/__init__.py +0 -0
  167. {dblift-2.3.0 → dblift-2.4.1}/core/migration/placeholders/placeholder_service.py +0 -0
  168. {dblift-2.3.0 → dblift-2.4.1}/core/migration/rules/__init__.py +0 -0
  169. {dblift-2.3.0 → dblift-2.4.1}/core/migration/rules/migration_rules.py +0 -0
  170. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/__init__.py +0 -0
  171. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/migration_script_manager.py +0 -0
  172. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
  173. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
  174. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
  175. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
  176. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
  177. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
  178. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_models.py +0 -0
  179. {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
  180. {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/__init__.py +0 -0
  181. {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/execution_statement.py +0 -0
  182. {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/sql_analyzer.py +0 -0
  183. {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/sql_execution_service.py +0 -0
  184. {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/statement_splitter.py +0 -0
  185. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/__init__.py +0 -0
  186. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_data_service.py +0 -0
  187. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_display_state.py +0 -0
  188. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_formatter.py +0 -0
  189. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state.py +0 -0
  190. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state_manager.py +0 -0
  191. {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state_service.py +0 -0
  192. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/__init__.py +0 -0
  193. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/data_collector.py +0 -0
  194. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/display_formatters.py +0 -0
  195. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/migration_analyzer.py +0 -0
  196. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/migration_ui.py +0 -0
  197. {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/table_renderer.py +0 -0
  198. {dblift-2.3.0 → dblift-2.4.1}/core/migration/version_utils.py +0 -0
  199. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/__init__.py +0 -0
  200. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/dependency_resolver.py +0 -0
  201. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/identifier_normalizer.py +0 -0
  202. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/object_orderer.py +0 -0
  203. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_constants.py +0 -0
  204. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_mapper.py +0 -0
  205. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_mappings.py +0 -0
  206. {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_normalizer.py +0 -0
  207. {dblift-2.3.0 → dblift-2.4.1}/core/seams/__init__.py +0 -0
  208. {dblift-2.3.0 → dblift-2.4.1}/core/seams/capabilities.py +0 -0
  209. {dblift-2.3.0 → dblift-2.4.1}/core/seams/event_listeners.py +0 -0
  210. {dblift-2.3.0 → dblift-2.4.1}/core/seams/feature_loading.py +0 -0
  211. {dblift-2.3.0 → dblift-2.4.1}/core/seams/introspection.py +0 -0
  212. {dblift-2.3.0 → dblift-2.4.1}/core/seams/license_info.py +0 -0
  213. {dblift-2.3.0 → dblift-2.4.1}/core/seams/runtime_checks.py +0 -0
  214. {dblift-2.3.0 → dblift-2.4.1}/core/seams/sql_generators.py +0 -0
  215. {dblift-2.3.0 → dblift-2.4.1}/core/seams/tier_resolver.py +0 -0
  216. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/__init__.py +0 -0
  217. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/__init__.py +0 -0
  218. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/alter_generator_factory.py +0 -0
  219. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/base_alter_generator.py +0 -0
  220. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter_generator.py +0 -0
  221. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/base_generator.py +0 -0
  222. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/basic_table_ddl_generator.py +0 -0
  223. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/dependency_analyzer.py +0 -0
  224. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/diff_converters/__init__.py +0 -0
  225. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/diff_converters/base_converter.py +0 -0
  226. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/formatter.py +0 -0
  227. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/generator_factory.py +0 -0
  228. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/options.py +0 -0
  229. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/script_organizer.py +0 -0
  230. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/sql_generator.py +0 -0
  231. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/sql_statement.py +0 -0
  232. {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/table_ddl_render.py +0 -0
  233. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/__init__.py +0 -0
  234. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_parse_result.py +0 -0
  235. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_column.py +0 -0
  236. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_constraint.py +0 -0
  237. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_object.py +0 -0
  238. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_statement.py +0 -0
  239. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/base.py +0 -0
  240. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/constraint_validator.py +0 -0
  241. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/database_link.py +0 -0
  242. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/dialect.py +0 -0
  243. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/event.py +0 -0
  244. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/extension.py +0 -0
  245. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/foreign_data_wrapper.py +0 -0
  246. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/foreign_server.py +0 -0
  247. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/index.py +0 -0
  248. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/linked_server.py +0 -0
  249. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/module.py +0 -0
  250. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/package.py +0 -0
  251. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/partition.py +0 -0
  252. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/procedure.py +0 -0
  253. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/sequence.py +0 -0
  254. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/synonym.py +0 -0
  255. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table.py +0 -0
  256. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table_canonicalizer.py +0 -0
  257. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table_options.py +0 -0
  258. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/trigger.py +0 -0
  259. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/user_defined_type.py +0 -0
  260. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/view.py +0 -0
  261. {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/view_options.py +0 -0
  262. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/__init__.py +0 -0
  263. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/_partition_handler.py +0 -0
  264. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/_sqlglot_builders.py +0 -0
  265. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/base_statement_parser.py +0 -0
  266. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/base_tokenizer.py +0 -0
  267. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/common/__init__.py +0 -0
  268. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/common/base_parser.py +0 -0
  269. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/dialects/__init__.py +0 -0
  270. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/dialects/base_config.py +0 -0
  271. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/enhanced_regex_parser.py +0 -0
  272. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/hybrid_parser.py +0 -0
  273. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_context.py +0 -0
  274. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_factory.py +0 -0
  275. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_interface.py +0 -0
  276. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/sqlglot_parser.py +0 -0
  277. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/tokens.py +0 -0
  278. {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/unified_regex_parser.py +0 -0
  279. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/__init__.py +0 -0
  280. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_checksum_validator.py +0 -0
  281. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_flyway_compatibility.py +0 -0
  282. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_migration_filter.py +0 -0
  283. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_sql_syntax_validator.py +0 -0
  284. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_strict_mode_validator.py +0 -0
  285. {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/migration_validator.py +0 -0
  286. {dblift-2.3.0 → dblift-2.4.1}/core/state/sql_script_formatter.py +0 -0
  287. {dblift-2.3.0 → dblift-2.4.1}/core/state/sql_statement.py +0 -0
  288. {dblift-2.3.0 → dblift-2.4.1}/core/utils/__init__.py +0 -0
  289. {dblift-2.3.0 → dblift-2.4.1}/core/utils/database_url_parser.py +0 -0
  290. {dblift-2.3.0 → dblift-2.4.1}/core/utils/metadata_helpers.py +0 -0
  291. {dblift-2.3.0 → dblift-2.4.1}/core/utils/row_access.py +0 -0
  292. {dblift-2.3.0 → dblift-2.4.1}/core/utils/string_utils.py +0 -0
  293. {dblift-2.3.0 → dblift-2.4.1}/core/utils/url_masking.py +0 -0
  294. {dblift-2.3.0 → dblift-2.4.1}/db/__init__.py +0 -0
  295. {dblift-2.3.0 → dblift-2.4.1}/db/base_provider.py +0 -0
  296. {dblift-2.3.0 → dblift-2.4.1}/db/base_quirks.py +0 -0
  297. {dblift-2.3.0 → dblift-2.4.1}/db/constants.py +0 -0
  298. {dblift-2.3.0 → dblift-2.4.1}/db/dml_analysis.py +0 -0
  299. {dblift-2.3.0 → dblift-2.4.1}/db/error.py +0 -0
  300. {dblift-2.3.0 → dblift-2.4.1}/db/error_handler.py +0 -0
  301. {dblift-2.3.0 → dblift-2.4.1}/db/exceptions.py +0 -0
  302. {dblift-2.3.0 → dblift-2.4.1}/db/native_connection_manager.py +0 -0
  303. {dblift-2.3.0 → dblift-2.4.1}/db/object_naming.py +0 -0
  304. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/__init__.py +0 -0
  305. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_history_manager.py +0 -0
  306. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_locking_manager.py +0 -0
  307. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_query_executor.py +0 -0
  308. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_schema_operations.py +0 -0
  309. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_snapshot_manager.py +0 -0
  310. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_undo_manager.py +0 -0
  311. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/__init__.py +0 -0
  312. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/config.py +0 -0
  313. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
  314. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
  315. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
  316. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
  317. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
  318. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
  319. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
  320. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
  321. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/parser/__init__.py +0 -0
  322. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
  323. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/plugin.py +0 -0
  324. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/provider.py +0 -0
  325. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/quirks.py +0 -0
  326. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
  327. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
  328. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
  329. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
  330. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
  331. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
  332. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
  333. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/__init__.py +0 -0
  334. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/config.py +0 -0
  335. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/__init__.py +0 -0
  336. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/history_manager.py +0 -0
  337. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/locking_manager.py +0 -0
  338. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/schema_operations.py +0 -0
  339. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/introspection/__init__.py +0 -0
  340. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/__init__.py +0 -0
  341. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
  342. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/parser_config.py +0 -0
  343. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/plugin.py +0 -0
  344. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/provider.py +0 -0
  345. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/quirks.py +0 -0
  346. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/sqlalchemy_url.py +0 -0
  347. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/__init__.py +0 -0
  348. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/config.py +0 -0
  349. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/__init__.py +0 -0
  350. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/duckdb_regex_parser.py +0 -0
  351. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/parser_config.py +0 -0
  352. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/plugin.py +0 -0
  353. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/provider.py +0 -0
  354. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/quirks.py +0 -0
  355. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/sqlalchemy_url.py +0 -0
  356. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/__init__.py +0 -0
  357. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/plugin.py +0 -0
  358. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/provider.py +0 -0
  359. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/quirks.py +0 -0
  360. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/__init__.py +0 -0
  361. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/config.py +0 -0
  362. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/introspection/__init__.py +0 -0
  363. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/__init__.py +0 -0
  364. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/history_manager.py +0 -0
  365. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/locking_manager.py +0 -0
  366. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/schema_operations.py +0 -0
  367. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/__init__.py +0 -0
  368. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
  369. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
  370. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
  371. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/parser_config.py +0 -0
  372. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/plugin.py +0 -0
  373. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/provider.py +0 -0
  374. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/quirks.py +0 -0
  375. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/sqlalchemy_url.py +0 -0
  376. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/__init__.py +0 -0
  377. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/config.py +0 -0
  378. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/introspection/__init__.py +0 -0
  379. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
  380. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/__init__.py +0 -0
  381. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/dbms_output.py +0 -0
  382. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/history_manager.py +0 -0
  383. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/locking_manager.py +0 -0
  384. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/schema_operations.py +0 -0
  385. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/__init__.py +0 -0
  386. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_comments.py +0 -0
  387. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_object_extractor.py +0 -0
  388. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_plsql_block.py +0 -0
  389. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_sqlplus.py +0 -0
  390. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
  391. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_parser.py +0 -0
  392. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
  393. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
  394. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/parser_config.py +0 -0
  395. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
  396. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/plugin.py +0 -0
  397. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/provider.py +0 -0
  398. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/quirks.py +0 -0
  399. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/sqlalchemy_url.py +0 -0
  400. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/__init__.py +0 -0
  401. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/_provider_query_executor.py +0 -0
  402. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/introspection/__init__.py +0 -0
  403. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/__init__.py +0 -0
  404. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/parser_config.py +0 -0
  405. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
  406. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
  407. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
  408. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/plugin.py +0 -0
  409. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/__init__.py +0 -0
  410. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
  411. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
  412. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
  413. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/provider.py +0 -0
  414. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/quirks.py +0 -0
  415. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
  416. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/__init__.py +0 -0
  417. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/config.py +0 -0
  418. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/introspection/__init__.py +0 -0
  419. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/__init__.py +0 -0
  420. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/parser_config.py +0 -0
  421. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
  422. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/plugin.py +0 -0
  423. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/provider.py +0 -0
  424. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/quirks.py +0 -0
  425. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
  426. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/__init__.py +0 -0
  427. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
  428. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
  429. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
  430. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
  431. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
  432. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/__init__.py +0 -0
  433. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/config.py +0 -0
  434. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/introspection/__init__.py +0 -0
  435. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/__init__.py +0 -0
  436. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/parser_config.py +0 -0
  437. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
  438. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
  439. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
  440. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
  441. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/plugin.py +0 -0
  442. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/provider.py +0 -0
  443. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/quirks.py +0 -0
  444. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
  445. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
  446. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
  447. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
  448. {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
  449. {dblift-2.3.0 → dblift-2.4.1}/db/provider_capabilities.py +0 -0
  450. {dblift-2.3.0 → dblift-2.4.1}/db/provider_interfaces.py +0 -0
  451. {dblift-2.3.0 → dblift-2.4.1}/db/provider_registry.py +0 -0
  452. {dblift-2.3.0 → dblift-2.4.1}/db/sqlalchemy_provider.py +0 -0
  453. {dblift-2.3.0 → dblift-2.4.1}/db/value_utils.py +0 -0
  454. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/dependency_links.txt +0 -0
  455. {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/top_level.txt +0 -0
  456. {dblift-2.3.0 → dblift-2.4.1}/integrations/__init__.py +0 -0
  457. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/__init__.py +0 -0
  458. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/_client.py +0 -0
  459. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/_engine.py +0 -0
  460. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/apps.py +0 -0
  461. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/checks.py +0 -0
  462. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/__init__.py +0 -0
  463. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/__init__.py +0 -0
  464. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_info.py +0 -0
  465. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_migrate.py +0 -0
  466. {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_validate.py +0 -0
  467. {dblift-2.3.0 → dblift-2.4.1}/integrations/fastapi.py +0 -0
  468. {dblift-2.3.0 → dblift-2.4.1}/integrations/flask.py +0 -0
  469. {dblift-2.3.0 → dblift-2.4.1}/integrations/opentelemetry.py +0 -0
  470. {dblift-2.3.0 → dblift-2.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dblift
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: A database migration tool that supports multiple databases with native Python drivers
5
5
  Classifier: Development Status :: 5 - Production/Stable
6
6
  Classifier: Intended Audience :: Developers
@@ -69,6 +69,20 @@ Requires-Dist: ibm_db_sa>=0.4; extra == "db2"
69
69
  Provides-Extra: duckdb
70
70
  Requires-Dist: duckdb>=1.0; extra == "duckdb"
71
71
  Requires-Dist: duckdb_engine>=0.13; extra == "duckdb"
72
+ Provides-Extra: neon
73
+ Requires-Dist: psycopg[binary]>=3.1; extra == "neon"
74
+ Provides-Extra: supabase
75
+ Requires-Dist: psycopg[binary]>=3.1; extra == "supabase"
76
+ Provides-Extra: aurora-postgresql
77
+ Requires-Dist: psycopg[binary]>=3.1; extra == "aurora-postgresql"
78
+ Provides-Extra: alloydb
79
+ Requires-Dist: psycopg[binary]>=3.1; extra == "alloydb"
80
+ Provides-Extra: yugabytedb
81
+ Requires-Dist: psycopg[binary]>=3.1; extra == "yugabytedb"
82
+ Provides-Extra: timescaledb
83
+ Requires-Dist: psycopg[binary]>=3.1; extra == "timescaledb"
84
+ Provides-Extra: citus
85
+ Requires-Dist: psycopg[binary]>=3.1; extra == "citus"
72
86
  Provides-Extra: fastapi
73
87
  Requires-Dist: fastapi>=0.100; extra == "fastapi"
74
88
  Provides-Extra: flask
@@ -22,6 +22,7 @@ from cli.handlers.migrate import _handle_migrate
22
22
  from cli.handlers.repair import _handle_repair
23
23
  from cli.handlers.undo import _handle_undo
24
24
  from cli.handlers.validate import _handle_validate
25
+ from core.seams.tier_resolver import resolve_tier
25
26
 
26
27
  _COMMAND_HANDLERS: Dict[str, Callable[[CliCommandContext], Tuple[bool, Any]]] = {
27
28
  "migrate": _handle_migrate,
@@ -72,6 +73,10 @@ def execute_single_command(
72
73
  recursive=recursive,
73
74
  placeholders=placeholders,
74
75
  dir_recursive_map=dir_recursive_map,
76
+ # Resolve the license tier through the seam so paid-feature gates
77
+ # (``require_tier(FEATURE, ctx.license_tier)``) see the real tier. In a
78
+ # pure-OSS install no resolver is registered and this is ``None``.
79
+ license_tier=resolve_tier(args),
75
80
  )
76
81
  return handler(ctx)
77
82
 
@@ -3,7 +3,7 @@
3
3
  import argparse
4
4
  import sys
5
5
  from pathlib import Path
6
- from typing import Any, Dict, List, Optional, Tuple
6
+ from typing import Any, Dict, Iterable, List, Optional, Tuple
7
7
 
8
8
  from api._cli_support import ConnectionProvider
9
9
  from cli._parser_setup import create_parser, parse_with_selective_errors
@@ -70,12 +70,22 @@ def _extract_commands_from_argv(
70
70
  argv_list: List[str],
71
71
  available_commands: List[str],
72
72
  global_only_args: List[str],
73
+ global_boolean_flags: Optional[Iterable[str]] = None,
73
74
  ) -> Tuple[List[str], List[str], List[str]]:
74
75
  """Extract commands, global arguments, and subcommand arguments from argv.
75
76
 
77
+ ``global_boolean_flags`` names the global flags that take no value (so the
78
+ lookahead must not swallow the next token — usually a command name). It
79
+ defaults to the static :data:`_GLOBAL_BOOLEAN_FLAGS`; callers pass a
80
+ superset when dynamically-derived global flags (e.g. paid-extension
81
+ root-only flags) include boolean ones the static set can't see.
82
+
76
83
  Returns:
77
84
  Tuple of (commands, global_arguments, subcommand_args)
78
85
  """
86
+ boolean_flags = (
87
+ _GLOBAL_BOOLEAN_FLAGS if global_boolean_flags is None else frozenset(global_boolean_flags)
88
+ )
79
89
  commands = []
80
90
  global_arguments = []
81
91
  subcommand_args = []
@@ -103,7 +113,7 @@ def _extract_commands_from_argv(
103
113
 
104
114
  arg_name = safe_split_first(arg, "=", default=arg)
105
115
  is_global_only = arg_name in global_only_args
106
- is_boolean_flag = arg_name in _GLOBAL_BOOLEAN_FLAGS
116
+ is_boolean_flag = arg_name in boolean_flags
107
117
 
108
118
  if is_global_only:
109
119
  global_arguments.append(arg)
@@ -1,9 +1,10 @@
1
1
  """Main CLI module for dblift."""
2
2
 
3
+ import argparse
3
4
  import sys
4
5
  from dataclasses import dataclass
5
6
  from pathlib import Path
6
- from typing import Any, List, Optional
7
+ from typing import Any, List, Optional, Set
7
8
 
8
9
  # Add project root to Python path when running as a script
9
10
  # This allows imports to work when running: python3 cli/main.py
@@ -38,6 +39,7 @@ from cli._command_handlers import ( # noqa: F401
38
39
  execute_single_command,
39
40
  )
40
41
  from cli._config_helpers import ( # noqa: F401
42
+ _GLOBAL_BOOLEAN_FLAGS,
41
43
  _build_args_namespace,
42
44
  _close_logs,
43
45
  _collect_placeholders,
@@ -108,6 +110,49 @@ _GLOBAL_ONLY_ARGS: List[str] = [
108
110
  "--max-snapshots",
109
111
  ]
110
112
 
113
+
114
+ def _root_only_long_flags(parser: argparse.ArgumentParser) -> Set[str]:
115
+ """Long flags defined only on the root parser, not on any subparser.
116
+
117
+ Paid extensions register their own root-only value flags on the parser
118
+ (``load_feature_extensions`` runs before the parser is built). Those flags
119
+ live only on the root parser, so — exactly like the static root-only flags
120
+ in ``_GLOBAL_ONLY_ARGS`` — the argv preprocessor must classify them as
121
+ global, or it relocates them past the subcommand token and the subparser
122
+ rejects them as "unrecognized arguments". Deriving them from the built
123
+ parser keeps the classification correct without the OSS core having to name
124
+ each extension flag. Mirrors the invariant asserted by
125
+ tests/unit/cli/test_global_only_args_completeness.py.
126
+ """
127
+ root = {o for a in parser._actions for o in a.option_strings if o.startswith("--")}
128
+ sub: Set[str] = set()
129
+ for action in parser._actions:
130
+ choices = getattr(action, "choices", None)
131
+ if isinstance(choices, dict):
132
+ for sub_parser in choices.values():
133
+ if isinstance(sub_parser, argparse.ArgumentParser):
134
+ sub.update(
135
+ o
136
+ for a in sub_parser._actions
137
+ for o in a.option_strings
138
+ if o.startswith("--")
139
+ )
140
+ return root - sub - {"--help"}
141
+
142
+
143
+ def _root_only_boolean_flags(parser: argparse.ArgumentParser) -> Set[str]:
144
+ """Root-only long flags that take no value (``store_true``/``store_const``).
145
+
146
+ The argv preprocessor must know these so it does NOT run its value-lookahead
147
+ on them — otherwise the token after a boolean flag (typically a command
148
+ name) gets swallowed into the global bucket and the command is lost. The
149
+ static ``_GLOBAL_BOOLEAN_FLAGS`` covers OSS flags; this derives the same for
150
+ dynamically-discovered paid-extension boolean root flags.
151
+ """
152
+ root_only = _root_only_long_flags(parser)
153
+ return {o for a in parser._actions if a.nargs == 0 for o in a.option_strings if o in root_only}
154
+
155
+
111
156
  # Tool-level flag aliases for subcommands that take their own version-like
112
157
  # argument. Used by the B10-BUG-04 footgun guard in phase 1 to redirect
113
158
  # `dblift baseline --version 1.0.0` to the correct flag instead of
@@ -145,6 +190,44 @@ class _CliContext:
145
190
  license_info: Optional[Any] = None
146
191
 
147
192
 
193
+ def _format_version() -> str:
194
+ """Render the ``--version`` output.
195
+
196
+ The published ``dblift`` wheel is the OSS *core*. The paid tiers ship as
197
+ separate distributions (``dblift-pro`` / ``dblift-enterprise``) bundled into
198
+ the compiled binary, each on its own release lifecycle — so their versions
199
+ need not match the core's. Report the most-derived installed tier as the
200
+ headline (that is the product the user actually runs) and, when a paid tier
201
+ is present, list every component so a bare number is never ambiguous. In a
202
+ plain OSS install only the core is present, so the output stays a single
203
+ ``dblift version X`` line — unchanged from before.
204
+ """
205
+ from importlib.metadata import PackageNotFoundError
206
+ from importlib.metadata import version as _version
207
+
208
+ def _get(dist: str) -> Optional[str]:
209
+ try:
210
+ return _version(dist)
211
+ except PackageNotFoundError:
212
+ return None
213
+
214
+ core = _get("dblift")
215
+ pro = _get("dblift-pro")
216
+ enterprise = _get("dblift-enterprise")
217
+
218
+ # Headline = most-derived installed tier (the product actually running).
219
+ product = enterprise or pro or core
220
+ lines = [f"dblift version {product}"]
221
+ # Component manifest only when a paid tier is present; OSS stays one line.
222
+ if pro or enterprise:
223
+ lines.append(f" core (OSS): {core}")
224
+ if pro:
225
+ lines.append(f" pro: {pro}")
226
+ if enterprise:
227
+ lines.append(f" enterprise: {enterprise}")
228
+ return "\n".join(lines)
229
+
230
+
148
231
  def main() -> None:
149
232
  """Main entry point for DBLift CLI application.
150
233
 
@@ -187,8 +270,19 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
187
270
  """
188
271
  terminal_commands = load_terminal_commands()
189
272
  available_commands = list(dict.fromkeys(_AVAILABLE_COMMANDS + list(terminal_commands)))
273
+ # Union the static root-only classification with root-only flags derived
274
+ # from the built parser, so paid-extension root flags (e.g. an
275
+ # override-the-license-file flag) are classified as global without the OSS
276
+ # core naming them. Boolean extension flags must also feed the splitter's
277
+ # boolean set, or its value-lookahead swallows the following command token.
278
+ # See _root_only_long_flags / _root_only_boolean_flags.
279
+ _parser = create_parser()
280
+ global_only_args = list(_GLOBAL_ONLY_ARGS) + sorted(
281
+ _root_only_long_flags(_parser) - set(_GLOBAL_ONLY_ARGS)
282
+ )
283
+ global_boolean_flags = set(_GLOBAL_BOOLEAN_FLAGS) | _root_only_boolean_flags(_parser)
190
284
  commands, global_arguments, subcommand_args = _extract_commands_from_argv(
191
- argv, available_commands, _GLOBAL_ONLY_ARGS
285
+ argv, available_commands, global_only_args, global_boolean_flags
192
286
  )
193
287
 
194
288
  # B10-BUG-04: Flyway users type ``dblift baseline --version 1.0.0``
@@ -211,22 +305,14 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
211
305
  if commands and commands[0] in terminal_commands:
212
306
  args = _build_terminal_args(commands[0], global_arguments, subcommand_args)
213
307
  if hasattr(args, "version") and args.version:
214
- from importlib.metadata import version as _version
215
-
216
- __version__ = _version("dblift")
217
-
218
- print(f"dblift version {__version__}") # lint: allow-print --version terminal action
308
+ print(_format_version()) # lint: allow-print --version terminal action
219
309
  sys.exit(0)
220
310
  sys.exit(terminal_commands[commands[0]](args))
221
311
 
222
312
  args, _unknown_args = _build_args_namespace(commands, global_arguments, subcommand_args)
223
313
 
224
314
  if hasattr(args, "version") and args.version:
225
- from importlib.metadata import version as _version
226
-
227
- __version__ = _version("dblift")
228
-
229
- print(f"dblift version {__version__}") # lint: allow-print --version terminal action
315
+ print(_format_version()) # lint: allow-print --version terminal action
230
316
  sys.exit(0)
231
317
 
232
318
  if not commands and (not hasattr(args, "command") or not args.command):
@@ -0,0 +1,12 @@
1
+ """Google AlloyDB for PostgreSQL database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "alloydb"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Google AlloyDB for PostgreSQL database provider"
6
+ __plugin_dialects__ = ["alloydb"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "AlloydbProvider"
9
+
10
+ from .provider import AlloydbProvider
11
+
12
+ __all__ = ["AlloydbProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Google AlloyDB for PostgreSQL plugin.
2
+
3
+ Google AlloyDB for PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: alloydb``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.alloydb.provider import AlloydbProvider
13
+ from db.plugins.alloydb.quirks import AlloydbQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="alloydb",
19
+ version="1.0.0",
20
+ description="Google AlloyDB for PostgreSQL database provider",
21
+ dialects=["alloydb"],
22
+ provider_class=AlloydbProvider,
23
+ transport="native",
24
+ quirks_class=AlloydbQuirks,
25
+ config_dialect="postgresql", # Google AlloyDB for PostgreSQL shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Google AlloyDB for PostgreSQL native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class AlloydbProvider(PostgreSqlProvider):
9
+ """Google AlloyDB for PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "alloydb"
12
+
13
+
14
+ __all__ = ["AlloydbProvider"]
@@ -0,0 +1,32 @@
1
+ """Google AlloyDB for PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class AlloydbQuirks(PostgresqlQuirks):
9
+ """Google AlloyDB for PostgreSQL quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Google AlloyDB for PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "alloydb") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["AlloydbQuirks"]
@@ -0,0 +1,12 @@
1
+ """Amazon Aurora PostgreSQL database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "aurora-postgresql"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Amazon Aurora PostgreSQL database provider"
6
+ __plugin_dialects__ = ["aurora-postgresql"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "AuroraPostgresqlProvider"
9
+
10
+ from .provider import AuroraPostgresqlProvider
11
+
12
+ __all__ = ["AuroraPostgresqlProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Amazon Aurora PostgreSQL plugin.
2
+
3
+ Amazon Aurora PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: aurora-postgresql``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.aurora_postgresql.provider import AuroraPostgresqlProvider
13
+ from db.plugins.aurora_postgresql.quirks import AuroraPostgresqlQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="aurora-postgresql",
19
+ version="1.0.0",
20
+ description="Amazon Aurora PostgreSQL database provider",
21
+ dialects=["aurora-postgresql"],
22
+ provider_class=AuroraPostgresqlProvider,
23
+ transport="native",
24
+ quirks_class=AuroraPostgresqlQuirks,
25
+ config_dialect="postgresql", # Amazon Aurora PostgreSQL shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Amazon Aurora PostgreSQL native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class AuroraPostgresqlProvider(PostgreSqlProvider):
9
+ """Amazon Aurora PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "aurora-postgresql"
12
+
13
+
14
+ __all__ = ["AuroraPostgresqlProvider"]
@@ -0,0 +1,32 @@
1
+ """Amazon Aurora PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class AuroraPostgresqlQuirks(PostgresqlQuirks):
9
+ """Amazon Aurora PostgreSQL quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Amazon Aurora PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "aurora-postgresql") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["AuroraPostgresqlQuirks"]
@@ -0,0 +1,12 @@
1
+ """Citus (distributed PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "citus"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Citus (distributed PostgreSQL) database provider"
6
+ __plugin_dialects__ = ["citus"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "CitusProvider"
9
+
10
+ from .provider import CitusProvider
11
+
12
+ __all__ = ["CitusProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Citus (distributed PostgreSQL) plugin.
2
+
3
+ Citus (distributed PostgreSQL) is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: citus``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.citus.provider import CitusProvider
13
+ from db.plugins.citus.quirks import CitusQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="citus",
19
+ version="1.0.0",
20
+ description="Citus (distributed PostgreSQL) database provider",
21
+ dialects=["citus"],
22
+ provider_class=CitusProvider,
23
+ transport="native",
24
+ quirks_class=CitusQuirks,
25
+ config_dialect="postgresql", # Citus (distributed PostgreSQL) shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Citus (distributed PostgreSQL) native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class CitusProvider(PostgreSqlProvider):
9
+ """Citus (distributed PostgreSQL) — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "citus"
12
+
13
+
14
+ __all__ = ["CitusProvider"]
@@ -0,0 +1,32 @@
1
+ """Citus (distributed PostgreSQL) :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class CitusQuirks(PostgresqlQuirks):
9
+ """Citus (distributed PostgreSQL) quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Citus (distributed PostgreSQL) speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "citus") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["CitusQuirks"]
@@ -0,0 +1,12 @@
1
+ """Neon (serverless PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "neon"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Neon (serverless PostgreSQL) database provider"
6
+ __plugin_dialects__ = ["neon"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "NeonProvider"
9
+
10
+ from .provider import NeonProvider
11
+
12
+ __all__ = ["NeonProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Neon (serverless PostgreSQL) plugin.
2
+
3
+ Neon (serverless PostgreSQL) is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: neon``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.neon.provider import NeonProvider
13
+ from db.plugins.neon.quirks import NeonQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="neon",
19
+ version="1.0.0",
20
+ description="Neon (serverless PostgreSQL) database provider",
21
+ dialects=["neon"],
22
+ provider_class=NeonProvider,
23
+ transport="native",
24
+ quirks_class=NeonQuirks,
25
+ config_dialect="postgresql", # Neon (serverless PostgreSQL) shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Neon (serverless PostgreSQL) native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class NeonProvider(PostgreSqlProvider):
9
+ """Neon (serverless PostgreSQL) — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "neon"
12
+
13
+
14
+ __all__ = ["NeonProvider"]
@@ -0,0 +1,32 @@
1
+ """Neon (serverless PostgreSQL) :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class NeonQuirks(PostgresqlQuirks):
9
+ """Neon (serverless PostgreSQL) quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Neon (serverless PostgreSQL) speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "neon") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["NeonQuirks"]
@@ -15,9 +15,28 @@ class PostgreSqlConfig(BaseDatabaseConfig):
15
15
  # PostgreSQL specific attributes
16
16
  ssl_mode: Optional[str] = None
17
17
 
18
+ # PostgreSQL-compatible distributions share this config class via
19
+ # ``PluginInfo.config_dialect="postgresql"``. Membership here preserves their
20
+ # own ``type`` identity (mirrors MySQL/MariaDB's ``_MYSQL_FAMILY``); anything
21
+ # else — including the ``postgres`` alias — normalises to ``postgresql``.
22
+ # lint: allow-dialect-string: config family membership
23
+ _POSTGRESQL_FAMILY = frozenset(
24
+ {
25
+ "postgresql",
26
+ "neon",
27
+ "supabase",
28
+ "aurora-postgresql",
29
+ "alloydb",
30
+ "yugabytedb",
31
+ "timescaledb",
32
+ "citus",
33
+ }
34
+ )
35
+
18
36
  def __post_init__(self) -> None:
19
37
  super().__post_init__()
20
- self.type = "postgresql" # lint: allow-dialect-string: config type identity
38
+ if self.type not in self._POSTGRESQL_FAMILY:
39
+ self.type = "postgresql" # lint: allow-dialect-string: config type identity
21
40
 
22
41
  def to_dict(self) -> Dict[str, Any]:
23
42
  """Convert to dictionary with PostgreSQL specific parameters."""
@@ -0,0 +1,12 @@
1
+ """Supabase (PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "supabase"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Supabase (PostgreSQL) database provider"
6
+ __plugin_dialects__ = ["supabase"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "SupabaseProvider"
9
+
10
+ from .provider import SupabaseProvider
11
+
12
+ __all__ = ["SupabaseProvider"]