snowflake-data-validation 1.24.0__tar.gz → 1.24.2__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 (523) hide show
  1. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/PKG-INFO +35 -1
  2. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/README.md +34 -0
  3. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_datatypes_normalization_templates.yaml +10 -10
  4. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/query/query_generator_azure_synapse.py +10 -2
  5. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/extractor/sql_queries_template_generator.py +3 -0
  6. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_datatypes_normalization_templates.yaml +4 -4
  7. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/query/query_generator_oracle.py +28 -2
  8. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/view_preprocessor.py +2 -0
  9. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_datatypes_normalization_templates.yaml +3 -3
  10. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/query/query_generator_postgresql.py +38 -5
  11. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_generation/metadata_queries.py +5 -3
  12. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/__init__.py +9 -1
  13. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/query/charset_normalization.py +159 -0
  14. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_datatypes_normalization_templates.yaml +1 -1
  15. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/query_generator_base.py +172 -8
  16. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_datatypes_normalization_templates.yaml +5 -5
  17. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/redshift/query/charset_normalization.py +48 -0
  18. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/query/query_generator_redshift.py +75 -25
  19. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_datatypes_normalization_templates.yaml +2 -2
  20. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/script_writer/script_writer_base.py +5 -9
  21. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_datatypes_normalization_templates.yaml +2 -2
  22. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/snowflake/query/charset_normalization.py +23 -0
  23. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/query/query_generator_snowflake.py +4 -1
  24. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_datatypes_normalization_templates.yaml +10 -10
  25. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_temporary_table_from_view_template.sql.j2 +4 -0
  26. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/sqlserver/query/charset_normalization.py +56 -0
  27. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/query/query_generator_sqlserver.py +28 -2
  28. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_datatypes_normalization_templates.yaml +3 -3
  29. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_get_columns_metadata.sql.j2 +1 -1
  30. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_md5_select.sql.j2 +60 -0
  31. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_table_metadata_query.sql.j2 +1 -1
  32. snowflake_data_validation-1.24.2/src/snowflake/snowflake_data_validation/teradata/query/charset_normalization.py +193 -0
  33. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/query/query_generator_teradata.py +28 -2
  34. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/column_partitioning_strategy.py +7 -19
  35. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/constants.py +14 -6
  36. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/table_column_metadata.py +3 -2
  37. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/query/test_query_generator_redshift.py +41 -0
  38. snowflake_data_validation-1.24.2/tests/unit/Teradata/test_teradata_row_md5_select_template.py +136 -0
  39. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_azure_synapse_row_queries.py +2 -3
  40. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_query_generator.py +1 -1
  41. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlserver/test_sqlserver_row_queries.py +14 -3
  42. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_cell_validation_query_generation.py +17 -0
  43. snowflake_data_validation-1.24.2/tests/unit/test_charset_normalization.py +264 -0
  44. snowflake_data_validation-1.24.2/tests/unit/test_float_canonical_templates.py +60 -0
  45. snowflake_data_validation-1.24.2/tests/unit/test_query_generator_numeric_scale.py +115 -0
  46. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sql_catalog_template_guard.py +8 -0
  47. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sqlserver_multi_version_support.py +35 -0
  48. snowflake_data_validation-1.24.0/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_temporary_table_from_view_template.sql.j2 +0 -3
  49. snowflake_data_validation-1.24.0/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_md5_select.sql.j2 +0 -55
  50. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/.gitignore +0 -0
  51. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/LICENSE +0 -0
  52. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/docs/README.md +0 -0
  53. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/pyproject.toml +0 -0
  54. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/__init__.py +0 -0
  55. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/__main__.py +0 -0
  56. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/__init__.py +0 -0
  57. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/azure_synapse_arguments_manager.py +0 -0
  58. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/azure_synapse_cli.py +0 -0
  59. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/connector/__init__.py +0 -0
  60. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_azure_synapse.py +0 -0
  61. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_factory_azure_synapse.py +0 -0
  62. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/__init__.py +0 -0
  63. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/metadata_extractor_azure_synapse.py +0 -0
  64. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_cell_validation_data_select.sql.j2 +0 -0
  65. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_column_metrics_templates.yaml +0 -0
  66. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_get_columns_metadata.sql.j2 +0 -0
  67. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_count_query.sql.j2 +0 -0
  68. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_md5_select.sql.j2 +0 -0
  69. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_table_metadata_query.sql.j2 +0 -0
  70. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_to_snowflake_datatypes_mapping_template.yaml +0 -0
  71. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/model/__init__.py +0 -0
  72. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/model/azure_synapse_credentials_connection.py +0 -0
  73. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/query/__init__.py +0 -0
  74. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/__init__.py +0 -0
  75. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/script_writer_azure_synapse.py +0 -0
  76. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/common_cli/cli_partitioning.py +0 -0
  77. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/common_cli/cli_sync_validation.py +0 -0
  78. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/comparison_orchestrator.py +0 -0
  79. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/__init__.py +0 -0
  80. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/configuration_loader.py +0 -0
  81. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/configuration_model.py +0 -0
  82. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/connection_types.py +0 -0
  83. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/connections/__init__.py +0 -0
  84. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/logging_configuration.py +0 -0
  85. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/table_configuration.py +0 -0
  86. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/validation_configuration.py +0 -0
  87. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/model/view_configuration.py +0 -0
  88. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/configuration/singleton.py +0 -0
  89. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/connector/__init__.py +0 -0
  90. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/connector/connector_base.py +0 -0
  91. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/connector/connector_factory_base.py +0 -0
  92. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/connector/connector_failure_tracker.py +0 -0
  93. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/__init__.py +0 -0
  94. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/async_generation_executor.py +0 -0
  95. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/async_validation_executor.py +0 -0
  96. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/base_validation_executor.py +0 -0
  97. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/executor_factory.py +0 -0
  98. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/extractor_types.py +0 -0
  99. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/source_validation_executor.py +0 -0
  100. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/executer/sync_validation_executor.py +0 -0
  101. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/extractor/__init__.py +0 -0
  102. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/extractor/metadata_extractor_base.py +0 -0
  103. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/main_cli.py +0 -0
  104. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/__init__.py +0 -0
  105. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/__init__.py +0 -0
  106. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/metadata_extractor_oracle.py +0 -0
  107. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_cell_validation_data_select.sql.j2 +0 -0
  108. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_column_metrics_templates.yaml +0 -0
  109. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_get_columns_metadata.sql.j2 +0 -0
  110. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_count_query.sql.j2 +0 -0
  111. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_md5_select.sql.j2 +0 -0
  112. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_table_metadata_query.sql.j2 +0 -0
  113. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_to_snowflake_datatypes_mapping_template.yaml +0 -0
  114. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/oracle_iso_normalization.py +0 -0
  115. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/query/__init__.py +0 -0
  116. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/script_writer/__init__.py +0 -0
  117. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/oracle/script_writer/script_writer_oracle.py +0 -0
  118. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/console_progress_reporter.py +0 -0
  119. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/html_report/__init__.py +0 -0
  120. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/html_report/html_report_builder.py +0 -0
  121. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/html_report/report_metadata.py +0 -0
  122. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/parallel_execution_engine.py +0 -0
  123. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/table_metadata_processor.py +0 -0
  124. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/orchestration/validation_progress_reporter.py +0 -0
  125. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/__init__.py +0 -0
  126. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/connector/__init__.py +0 -0
  127. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_factory_postgresql.py +0 -0
  128. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_postgresql.py +0 -0
  129. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/__init__.py +0 -0
  130. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/metadata_extractor_postgresql.py +0 -0
  131. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_cell_validation_data_select.sql.j2 +0 -0
  132. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_column_metrics_templates.yaml +0 -0
  133. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_extract_md5_rows_chunk.sql.j2 +0 -0
  134. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_get_columns_metadata.sql.j2 +0 -0
  135. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_count_query.sql.j2 +0 -0
  136. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_md5_select.sql.j2 +0 -0
  137. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_table_metadata_query.sql.j2 +0 -0
  138. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_to_snowflake_datatypes_mapping_template.yaml +0 -0
  139. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/model/__init__.py +0 -0
  140. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/model/postgresql_credentials_connection.py +0 -0
  141. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/postgresql_arguments_manager.py +0 -0
  142. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/postgresql_cli.py +0 -0
  143. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/postgresql_tz_normalization.py +0 -0
  144. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/query/__init__.py +0 -0
  145. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/script_writer/__init__.py +0 -0
  146. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/postgresql/script_writer/script_writer_postgresql.py +0 -0
  147. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/DATA_VALIDATION_API_OVERVIEW.md +0 -0
  148. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/__init__.py +0 -0
  149. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/_internal.py +0 -0
  150. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/_teradata_internal.py +0 -0
  151. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/async_mode/__init__.py +0 -0
  152. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/async_mode/file_loader.py +0 -0
  153. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/async_mode/script_writer.py +0 -0
  154. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/cli/__init__.py +0 -0
  155. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/cli/commands.py +0 -0
  156. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/configuration/__init__.py +0 -0
  157. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/connectors/__init__.py +0 -0
  158. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/context/__init__.py +0 -0
  159. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/data_validation_api.py +0 -0
  160. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/enums/__init__.py +0 -0
  161. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/execution/__init__.py +0 -0
  162. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/execution/query_executor.py +0 -0
  163. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/generators/__init__.py +0 -0
  164. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/metadata/__init__.py +0 -0
  165. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/__init__.py +0 -0
  166. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/data_validation_exception.py +0 -0
  167. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/generated_query.py +0 -0
  168. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/metrics_result_shape.py +0 -0
  169. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/query_execution_result.py +0 -0
  170. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/query_generator_factory.py +0 -0
  171. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/result_set.py +0 -0
  172. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/model/validation_result.py +0 -0
  173. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_generation/__init__.py +0 -0
  174. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_generation/row_validation_queries.py +0 -0
  175. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_generation/schema_metrics_queries.py +0 -0
  176. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_validation/__init__.py +0 -0
  177. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/query_validation/query_comparison.py +0 -0
  178. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/reshape/__init__.py +0 -0
  179. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/reshape/metrics_reshape.py +0 -0
  180. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/result_set_validation/__init__.py +0 -0
  181. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/result_set_validation/result_set_comparison.py +0 -0
  182. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/snapshot/__init__.py +0 -0
  183. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_generation.py +0 -0
  184. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_validation.py +0 -0
  185. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/utils/__init__.py +0 -0
  186. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/utils/helpers.py +0 -0
  187. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/validation/__init__.py +0 -0
  188. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/validation/cell_validation.py +0 -0
  189. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/validation/metrics_validation.py +0 -0
  190. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/validation/row_validation.py +0 -0
  191. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/public/validation/schema_validation.py +0 -0
  192. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/chunk_md5_tiered.py +0 -0
  193. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_column_metrics_templates.yaml +0 -0
  194. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_modifiers.sql.j2 +0 -0
  195. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/query/query_generator_query.py +0 -0
  196. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/query/query_arguments_manager.py +0 -0
  197. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/__init__.py +0 -0
  198. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/connector/__init__.py +0 -0
  199. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/connector/connector_factory_redshift.py +0 -0
  200. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/connector/connector_redshift.py +0 -0
  201. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/metadata_extractor_redshift.py +0 -0
  202. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_cell_validation_data_select.sql.j2 +0 -0
  203. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  204. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_table_template.sql.j2 +0 -0
  205. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_insert_template.sql.j2 +0 -0
  206. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_table_template.sql.j2 +0 -0
  207. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_column_metrics_templates.yaml +0 -0
  208. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_extract_md5_rows_chunk.sql.j2 +0 -0
  209. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_get_columns_metadata.sql.j2 +0 -0
  210. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_count_query.sql.j2 +0 -0
  211. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_md5_select.sql.j2 +0 -0
  212. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_table_metadata_query.sql.j2 +0 -0
  213. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_to_snowflake_datatypes_mapping_template.yaml +0 -0
  214. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/model/__init__.py +0 -0
  215. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/model/redshift_credentials_connection.py +0 -0
  216. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/query/__init__.py +0 -0
  217. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/redshift_arguments_manager.py +0 -0
  218. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/redshift_cli.py +0 -0
  219. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/script_writer/__init__.py +0 -0
  220. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/redshift/script_writer/script_writer_redshift.py +0 -0
  221. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_cell_validation_data_select.sql.j2 +0 -0
  222. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_column_metrics_templates.yaml +0 -0
  223. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/snowflake_to_result_set_datatypes_mapping_template.yaml +0 -0
  224. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/query/query_generator_result_set.py +0 -0
  225. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/result_set/result_set_arguments_manager.py +0 -0
  226. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/script_writer/__init__.py +0 -0
  227. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/__init__.py +0 -0
  228. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_factory_snowflake.py +0 -0
  229. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_snowflake.py +0 -0
  230. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/metadata_extractor_snowflake.py +0 -0
  231. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_cell_validation_data_select.sql.j2 +0 -0
  232. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_concatenated_template.sql.j2 +0 -0
  233. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_md5_template.sql.j2 +0 -0
  234. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_column_metrics_templates.yaml +0 -0
  235. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_extract_md5_rows_chunk.sql.j2 +0 -0
  236. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_case_sensitive_columns.sql.j2 +0 -0
  237. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_columns_metadata.sql.j2 +0 -0
  238. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_count_query.sql.j2 +0 -0
  239. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_md5_select.sql.j2 +0 -0
  240. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_table_metadata_query.sql.j2 +0 -0
  241. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_temporary_table_from_view_template.sql.j2 +0 -0
  242. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_to_snowflake_datatypes_mapping_template.yaml +0 -0
  243. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/model/__init__.py +0 -0
  244. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_credentials_connection.py +0 -0
  245. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_default_connection.py +0 -0
  246. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_named_connection.py +0 -0
  247. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/query/__init__.py +0 -0
  248. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/script_writer/__init__.py +0 -0
  249. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/script_writer/script_writer_snowflake.py +0 -0
  250. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/snowflake_arguments_manager.py +0 -0
  251. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/snowflake/snowflake_cli.py +0 -0
  252. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/__init__.py +0 -0
  253. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/connector/__init__.py +0 -0
  254. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_factory_sqlite.py +0 -0
  255. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_sqlite.py +0 -0
  256. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/__init__.py +0 -0
  257. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/metadata_extractor_sqlite.py +0 -0
  258. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_cell_validation_data_select.sql.j2 +0 -0
  259. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_column_metrics_templates.yaml +0 -0
  260. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_compute_md5_sql.j2 +0 -0
  261. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_datatypes_normalization_templates.yaml +0 -0
  262. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_extract_md5_rows_chunk.sql.j2 +0 -0
  263. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_get_columns_metadata.sql.j2 +0 -0
  264. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_count_query.sql.j2 +0 -0
  265. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_md5_select.sql.j2 +0 -0
  266. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_table_metadata_query.sql.j2 +0 -0
  267. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_snowflake_datatypes_mapping_template.yaml +0 -0
  268. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_sqlite_datatypes_mapping_template.yaml +0 -0
  269. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/model/__init__.py +0 -0
  270. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/model/sqlite_connection.py +0 -0
  271. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/query/__init__.py +0 -0
  272. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/query/query_generator_sqlite.py +0 -0
  273. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/script_writer/__init__.py +0 -0
  274. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlite/script_writer/script_writer_sqlite.py +0 -0
  275. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/__init__.py +0 -0
  276. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/connector/__init__.py +0 -0
  277. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_factory_sql_server.py +0 -0
  278. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_sql_server.py +0 -0
  279. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/__init__.py +0 -0
  280. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/metadata_extractor_sqlserver.py +0 -0
  281. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_cell_validation_data_select.sql.j2 +0 -0
  282. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_column_metrics_templates.yaml +0 -0
  283. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_compute_md5_sql.j2 +0 -0
  284. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_extract_md5_rows_chunk.sql.j2 +0 -0
  285. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_columns_metadata.sql.j2 +0 -0
  286. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_temporary_table_internal_identifier_template.sql.j2 +0 -0
  287. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_count_query.sql.j2 +0 -0
  288. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_md5_select.sql.j2 +0 -0
  289. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_table_metadata_query.sql.j2 +0 -0
  290. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_to_snowflake_datatypes_mapping_template.yaml +0 -0
  291. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/model/__init__.py +0 -0
  292. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/model/sqlserver_credentials_connection.py +0 -0
  293. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/query/__init__.py +0 -0
  294. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/__init__.py +0 -0
  295. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/script_writer_sqlserver.py +0 -0
  296. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_arguments_manager.py +0 -0
  297. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_cli.py +0 -0
  298. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/table_partitioning_strategy.md +0 -0
  299. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/__init__.py +0 -0
  300. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/connector/__init__.py +0 -0
  301. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/connector/connector_factory_teradata.py +0 -0
  302. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/connector/connector_teradata.py +0 -0
  303. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/__init__.py +0 -0
  304. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/metadata_extractor_teradata.py +0 -0
  305. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_cell_validation_data_select.sql.j2 +0 -0
  306. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_column_metrics_templates.yaml +0 -0
  307. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_compute_md5_sql.j2 +0 -0
  308. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_concatenated.sql.j2 +0 -0
  309. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_md5.sql.j2 +0 -0
  310. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_extract_md5_rows_chunk.sql.j2 +0 -0
  311. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_count_query.sql.j2 +0 -0
  312. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_to_snowflake_datatypes_mapping_template.yaml +0 -0
  313. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/model/__init__.py +0 -0
  314. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/model/teradata_credentials_connection.py +0 -0
  315. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/query/__init__.py +0 -0
  316. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/script_writer/__init__.py +0 -0
  317. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/script_writer/script_writer_teradata.py +0 -0
  318. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/teradata_arguments_manager.py +0 -0
  319. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/teradata_cli.py +0 -0
  320. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/teradata/teradata_iso_normalization.py +0 -0
  321. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/__init__.py +0 -0
  322. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/arguments_manager_base.py +0 -0
  323. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/arguments_manager_factory.py +0 -0
  324. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/base_output_handler.py +0 -0
  325. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/column_grouping.py +0 -0
  326. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/configuration_file_editor.py +0 -0
  327. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/configuration_file_generator.py +0 -0
  328. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/configuration_file_synchronizer.py +0 -0
  329. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/connection_pool.py +0 -0
  330. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/connector_factory.py +0 -0
  331. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/console_output_handler.py +0 -0
  332. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/context.py +0 -0
  333. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/cpu_optimizer.py +0 -0
  334. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helper.py +0 -0
  335. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_database.py +0 -0
  336. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_dataframe.py +0 -0
  337. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_io.py +0 -0
  338. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_misc.py +0 -0
  339. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_polars_cast.py +0 -0
  340. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_query_result.py +0 -0
  341. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/helpers/helper_templates.py +0 -0
  342. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/index_key_format.py +0 -0
  343. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/iso_dv_common.py +0 -0
  344. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/logging_config.py +0 -0
  345. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/logging_utils.py +0 -0
  346. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/chunk.py +0 -0
  347. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/column_metadata.py +0 -0
  348. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/custom_templates.py +0 -0
  349. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/table_context.py +0 -0
  350. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/model/templates_loader_manager.py +0 -0
  351. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/progress_reporter.py +0 -0
  352. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/row_partitioning_strategy.py +0 -0
  353. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/run_context.py +0 -0
  354. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/shutdown_coordinator.py +0 -0
  355. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/snapshot_validation_statements.py +0 -0
  356. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/telemetry.py +0 -0
  357. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/templates/configuration_file_templates.py +0 -0
  358. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/thread_safe_singleton.py +0 -0
  359. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/utils/validation_utils.py +0 -0
  360. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/__init__.py +0 -0
  361. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/accepted_transformation.py +0 -0
  362. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/cell_data_validator.py +0 -0
  363. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/comparison_codec.py +0 -0
  364. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/data_validator_base.py +0 -0
  365. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/dataframe_validator_base.py +0 -0
  366. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/metrics_data_validator.py +0 -0
  367. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/query_validator.py +0 -0
  368. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/result_set_validator.py +0 -0
  369. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/results_summary_report.py +0 -0
  370. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/row_data_validator.py +0 -0
  371. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/row_validation_report_buffer.py +0 -0
  372. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/schema_data_validator.py +0 -0
  373. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_database/__init__.py +0 -0
  374. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_database/sqlite_validation_connection.py +0 -0
  375. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_database/validation_database_connection_base.py +0 -0
  376. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_database_manager.py +0 -0
  377. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_execution_context.py +0 -0
  378. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_report_buffer.py +0 -0
  379. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/src/snowflake/snowflake_data_validation/validation/validation_report_status.py +0 -0
  380. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/.coveragerc +0 -0
  381. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/conftest.py +0 -0
  382. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/.coveragerc +0 -0
  383. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/Redshift/test_metadata_extractor_integration.py +0 -0
  384. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/test_async_generation_integration.py +0 -0
  385. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/test_async_validation_integration.py +0 -0
  386. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/test_reference_integration.py +0 -0
  387. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/test_source_validation_integration.py +0 -0
  388. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/integration/test_sync_validation_integration.py +0 -0
  389. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_general.py +0 -0
  390. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_generate_validation_scripts.py +0 -0
  391. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_get_configuration_files.py +0 -0
  392. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_run_async_validation.py +0 -0
  393. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_run_validation.py +0 -0
  394. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/cli/test_redshift_cli_run_validation_ipc.py +0 -0
  395. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/model/test_redshift_credentials_connection.py +0 -0
  396. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/script_writer/test_script_writer_redshift.py +0 -0
  397. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/test_connector_redshift.py +0 -0
  398. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Redshift/test_redshift_arguments_manager.py +0 -0
  399. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Teradata/test_connector_teradata.py +0 -0
  400. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Teradata/test_metadata_extractor_teradata.py +0 -0
  401. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Teradata/test_query_generator_teradata.py +0 -0
  402. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/Teradata/test_teradata_cli.py +0 -0
  403. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/__init__.py +0 -0
  404. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/custom_templates_loader/snowflake_column_metrics_templates.yaml +0 -0
  405. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/custom_templates_loader/snowflake_datatypes_normalization_templates.yaml +0 -0
  406. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/custom_templates_loader/snowflake_table_metadata_query.sql.j2 +0 -0
  407. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_configuration_loader/test_load_configuration_model/conf.yaml +0 -0
  408. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_configuration_loader/test_load_configuration_model_reading_file_exception/conf.yaml +0 -0
  409. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_configuration_file.json +0 -0
  410. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_connection_source_db.toml +0 -0
  411. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_datatypes_normalization_template.yaml +0 -0
  412. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_datatypes_template.yaml +0 -0
  413. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_metrics_template.yaml +0 -0
  414. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_metrics_template_datatypes.yaml +0 -0
  415. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/dummy_template.csv +0 -0
  416. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_helpers/not_valid_format.yaml +0 -0
  417. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_templates_loader_manager/snowflake_column_metrics_templates.yaml +0 -0
  418. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/assets/test_templates_loader_manager/snowflake_datatypes_normalization_templates.yaml +0 -0
  419. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/__init__.py +0 -0
  420. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_azure_synapse_credentials_connection.py +0 -0
  421. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_azure_synapse_metadata_extractor.py +0 -0
  422. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_azure_synapse_metrics_templates.py +0 -0
  423. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_azure_synapse_query_generator.py +0 -0
  424. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_connector_azure_synapse.py +0 -0
  425. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/azure_synapse/test_connector_factory_azure_synapse.py +0 -0
  426. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/__init__.py +0 -0
  427. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_iso_normalization.py +0 -0
  428. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_metadata_extractor.py +0 -0
  429. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_metrics_templates.py +0 -0
  430. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_normalization_templates.py +0 -0
  431. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/oracle/test_oracle_type_mappings.py +0 -0
  432. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/query/test_chunk_md5_tiered.py +0 -0
  433. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/__init__.py +0 -0
  434. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_connector_factory_sqlite.py +0 -0
  435. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_connector_sqlite.py +0 -0
  436. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_metadata_extractor_sqlite.py +0 -0
  437. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_metadata_query_template_sqlite.py +0 -0
  438. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_query_generator_sqlite.py +0 -0
  439. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlite/test_script_writer_sqlite.py +0 -0
  440. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/sqlserver/__init__.py +0 -0
  441. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_accepted_transformation.py +0 -0
  442. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_arguments_manager_base.py +0 -0
  443. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_arguments_manager_factory.py +0 -0
  444. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_batched_metrics_queries.py +0 -0
  445. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_boolean_binary_canonical_templates.py +0 -0
  446. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_cell_data_validator.py +0 -0
  447. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_column_grouping.py +0 -0
  448. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_column_metadata.py +0 -0
  449. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_column_partitioning_strategy.py +0 -0
  450. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_comparison_codec.py +0 -0
  451. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_comparison_orchestrator.py +0 -0
  452. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_configuration_file_editor.py +0 -0
  453. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_configuration_file_synchronizer.py +0 -0
  454. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_configuration_loader.py +0 -0
  455. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_configuration_model.py +0 -0
  456. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_connection_pool.py +0 -0
  457. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_connector_failure_tracker.py +0 -0
  458. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_connector_snowflake.py +0 -0
  459. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_console_progress_reporter.py +0 -0
  460. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_cpu_optimizer.py +0 -0
  461. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_custom_templates_models.py +0 -0
  462. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_data_validator.py +0 -0
  463. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_escape_odbc_value.py +0 -0
  464. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_executor_factory.py +0 -0
  465. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_get_configuration_file.py +0 -0
  466. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_helper_dataframe.py +0 -0
  467. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_helper_polars_cast.py +0 -0
  468. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_helpers.py +0 -0
  469. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_html_report_builder.py +0 -0
  470. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_index_key_format.py +0 -0
  471. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_internal_helpers.py +0 -0
  472. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_iso_dv_common.py +0 -0
  473. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_logging_config.py +0 -0
  474. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_metrics_reshape.py +0 -0
  475. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_metrics_result_shape.py +0 -0
  476. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_metrics_templates_casts.py +0 -0
  477. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_platform_bridge.py +0 -0
  478. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_postgresql_normalization_templates.py +0 -0
  479. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_postgresql_tz_normalization.py +0 -0
  480. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_query_cell_level_validation.py +0 -0
  481. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_query_metrics_level_validation.py +0 -0
  482. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_query_to_dataframe.py +0 -0
  483. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_query_validator.py +0 -0
  484. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_report_metadata.py +0 -0
  485. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_cell_level_validation.py +0 -0
  486. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_column_metrics_validation.py +0 -0
  487. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_snapshot_generation.py +0 -0
  488. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_snapshot_validation.py +0 -0
  489. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_to_dataframe.py +0 -0
  490. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_result_set_validator.py +0 -0
  491. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_row_data_validator.py +0 -0
  492. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_row_partitioning_strategy.py +0 -0
  493. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_row_validation_report_buffer.py +0 -0
  494. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_shutdown_coordinator.py +0 -0
  495. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_snapshot_validation_statements.py +0 -0
  496. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_snowflake_arguments_manager.py +0 -0
  497. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_snowflake_binary_normalization_templates.py +0 -0
  498. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_snowflake_cli.py +0 -0
  499. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_source_validation_executor.py +0 -0
  500. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sql_literal_jinja_filter.py +0 -0
  501. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sqlite_validation_connection.py +0 -0
  502. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sqlserver_arguments_manager.py +0 -0
  503. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_sqlserver_cli.py +0 -0
  504. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_column_metadata_model.py +0 -0
  505. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_configuration.py +0 -0
  506. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_context.py +0 -0
  507. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_metadata_processor.py +0 -0
  508. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_snapshot_generation.py +0 -0
  509. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_table_snapshot_validation.py +0 -0
  510. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_target_platform_factory.py +0 -0
  511. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_telemetry.py +0 -0
  512. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_templates_loader_manager.py +0 -0
  513. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_teradata_iso_normalization.py +0 -0
  514. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_timestamp_golden_vectors.py +0 -0
  515. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_configuration.py +0 -0
  516. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_database_connection.py +0 -0
  517. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_execution_context.py +0 -0
  518. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_progress_reporter.py +0 -0
  519. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_report_buffer.py +0 -0
  520. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_validation_report_status.py +0 -0
  521. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/test_view_configuration.py +0 -0
  522. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/utils/__init__.py +0 -0
  523. {snowflake_data_validation-1.24.0 → snowflake_data_validation-1.24.2}/tests/unit/utils/test_constants.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-data-validation
3
- Version: 1.24.0
3
+ Version: 1.24.2
4
4
  Summary: Snowflake Data Validation
5
5
  Project-URL: Bug Tracker, https://github.com/snowflake-eng/migrations-data-validation/issues
6
6
  Project-URL: Source code, https://github.com/snowflake-eng/migrations-data-validation/
@@ -129,6 +129,8 @@ pip install "snowflake-data-validation[sqlite]"
129
129
 
130
130
  > **SQLite prerequisite:** This extra installs [sqlean.py](https://github.com/nalgeon/sqlean), a drop-in `sqlite3` replacement that bundles the [sqlean-crypto](https://github.com/nalgeon/sqlean/blob/main/docs/crypto.md) extension. The `crypto_md5` function provided by this extension is required for row-level MD5 computation during SQLite data validation. Wheels are available for **Linux and macOS** only; Windows is not supported by `sqlean.py`.
131
131
 
132
+ > **Teradata L3 prerequisite:** Hybrid row validation on Teradata requires a **`HASH_MD5` UDF** installed in the **same database** as the Teradata connection default (the database the worker uses when it connects). Generated SQL calls `HASH_MD5(...)` without qualification; pointing at a UDF in another database is not supported. See [teradata-dv-prerequisites.md](../docs/data-migration-orchestrator/teradata-dv-prerequisites.md) in this repo.
133
+
132
134
  For development and testing:
133
135
 
134
136
  ```bash
@@ -216,6 +218,38 @@ For complete command reference, configuration options, and examples, see the [Da
216
218
 
217
219
  ## Changelog
218
220
 
221
+ ### v1.24.2
222
+
223
+ **New features**
224
+
225
+ - Added character set normalization foundation for cross-platform encoding validation.
226
+
227
+ **Improvements**
228
+
229
+ - Improved float canonical rendering to full precision for L2/L3 validation.
230
+ - Improved numeric canonical rendering with scale-aware handling for T-SQL and Snowflake.
231
+ - Added query modifier support for SQL Server and Synapse.
232
+
233
+ **Bug fixes**
234
+
235
+ - Fixed Teradata L3 row-hash computation.
236
+
237
+ ### v1.24.1
238
+
239
+ **New features**
240
+
241
+ - Added charset normalization foundation for cross-platform character encoding validation.
242
+ - Added scale-aware numeric canonical rendering for T-SQL and Snowflake.
243
+ - Added query modifier support for SQL Server and Synapse.
244
+
245
+ **Improvements**
246
+
247
+ - Improved float canonical rendering to full precision for L2/L3 validation.
248
+
249
+ **Bug fixes**
250
+
251
+ - Fixed Teradata L3 row-hash computation.
252
+
219
253
  ### v1.24.0
220
254
 
221
255
  No user-facing changes in this release.
@@ -43,6 +43,8 @@ pip install "snowflake-data-validation[sqlite]"
43
43
 
44
44
  > **SQLite prerequisite:** This extra installs [sqlean.py](https://github.com/nalgeon/sqlean), a drop-in `sqlite3` replacement that bundles the [sqlean-crypto](https://github.com/nalgeon/sqlean/blob/main/docs/crypto.md) extension. The `crypto_md5` function provided by this extension is required for row-level MD5 computation during SQLite data validation. Wheels are available for **Linux and macOS** only; Windows is not supported by `sqlean.py`.
45
45
 
46
+ > **Teradata L3 prerequisite:** Hybrid row validation on Teradata requires a **`HASH_MD5` UDF** installed in the **same database** as the Teradata connection default (the database the worker uses when it connects). Generated SQL calls `HASH_MD5(...)` without qualification; pointing at a UDF in another database is not supported. See [teradata-dv-prerequisites.md](../docs/data-migration-orchestrator/teradata-dv-prerequisites.md) in this repo.
47
+
46
48
  For development and testing:
47
49
 
48
50
  ```bash
@@ -130,6 +132,38 @@ For complete command reference, configuration options, and examples, see the [Da
130
132
 
131
133
  ## Changelog
132
134
 
135
+ ### v1.24.2
136
+
137
+ **New features**
138
+
139
+ - Added character set normalization foundation for cross-platform encoding validation.
140
+
141
+ **Improvements**
142
+
143
+ - Improved float canonical rendering to full precision for L2/L3 validation.
144
+ - Improved numeric canonical rendering with scale-aware handling for T-SQL and Snowflake.
145
+ - Added query modifier support for SQL Server and Synapse.
146
+
147
+ **Bug fixes**
148
+
149
+ - Fixed Teradata L3 row-hash computation.
150
+
151
+ ### v1.24.1
152
+
153
+ **New features**
154
+
155
+ - Added charset normalization foundation for cross-platform character encoding validation.
156
+ - Added scale-aware numeric canonical rendering for T-SQL and Snowflake.
157
+ - Added query modifier support for SQL Server and Synapse.
158
+
159
+ **Improvements**
160
+
161
+ - Improved float canonical rendering to full precision for L2/L3 validation.
162
+
163
+ **Bug fixes**
164
+
165
+ - Fixed Teradata L3 row-hash computation.
166
+
133
167
  ### v1.24.0
134
168
 
135
169
  No user-facing changes in this release.
@@ -10,16 +10,16 @@
10
10
  # CASE WHEN (IIF is unsupported on Synapse Dedicated SQL Pool).
11
11
 
12
12
  # ---- Numeric types ----
13
- BIGINT: FORMAT("{{ col_name }}", '0.0000')
14
- INT: FORMAT("{{ col_name }}", '0.0000')
15
- SMALLINT: FORMAT("{{ col_name }}", '0.0000')
16
- TINYINT: FORMAT("{{ col_name }}", '0.0000')
17
- DECIMAL: FORMAT("{{ col_name }}", '0.0000')
18
- NUMERIC: FORMAT("{{ col_name }}", '0.0000')
19
- MONEY: FORMAT(ROUND(CAST("{{ col_name }}" AS DECIMAL(38, 4)), 0), '0.0000')
20
- SMALLMONEY: FORMAT(ROUND(CAST("{{ col_name }}" AS DECIMAL(38, 4)), 0), '0.0000')
21
- FLOAT: FORMAT("{{ col_name }}", '0.0000')
22
- REAL: FORMAT("{{ col_name }}", '0.0000')
13
+ BIGINT: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
14
+ INT: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
15
+ SMALLINT: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
16
+ TINYINT: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
17
+ DECIMAL: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
18
+ NUMERIC: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
19
+ MONEY: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
20
+ SMALLMONEY: FORMAT("{{ col_name }}", '{{ numeric_format_mask }}')
21
+ FLOAT: '{{ float_tme_shim }}'
22
+ REAL: '{{ float_tme_shim }}'
23
23
 
24
24
  # ---- Boolean type ----
25
25
  BIT: CASE WHEN "{{ col_name }}" = 1 THEN 'TRUE' WHEN "{{ col_name }}" = 0 THEN 'FALSE' END
@@ -34,8 +34,10 @@ from snowflake.snowflake_data_validation.query.query_generator_base import (
34
34
  QueryGeneratorBase,
35
35
  resolve_table_context_modifiers,
36
36
  )
37
+ from snowflake.snowflake_data_validation.sqlserver.query.query_generator_sqlserver import (
38
+ build_sqlserver_float_tme_shim,
39
+ )
37
40
  from snowflake.snowflake_data_validation.utils.constants import (
38
- COL_NAME_NO_QUOTES_PLACEHOLDER,
39
41
  Platform,
40
42
  )
41
43
  from snowflake.snowflake_data_validation.utils.model.table_context import TableContext
@@ -57,6 +59,12 @@ class QueryGeneratorAzureSynapse(QueryGeneratorBase):
57
59
  """Initialize the Azure Synapse query generator."""
58
60
  super().__init__(platform=Platform.AZURE_SYNAPSE)
59
61
 
62
+ def _float_column_reference(self, column) -> str:
63
+ return f'"{column.name}"'
64
+
65
+ def build_float_tme_shim(self, column, col_ref: str) -> str:
66
+ return build_sqlserver_float_tme_shim(col_ref)
67
+
60
68
  def _resolve_normalization_templates(self, table_context: TableContext) -> dict[str, str]:
61
69
  """Build a ``{column_name: rendered_expression}`` mapping.
62
70
 
@@ -76,7 +84,7 @@ class QueryGeneratorAzureSynapse(QueryGeneratorBase):
76
84
  normalization_template = datatypes_normalization_templates.get("DEFAULT")
77
85
  if normalization_template is None:
78
86
  raise ValueError(f"No normalization template found for data type {column.data_type} and no DEFAULT template available.")
79
- rendered[column.name] = normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
87
+ rendered[column.name] = self._render_normalization_template(normalization_template, column)
80
88
  return rendered
81
89
 
82
90
  def generate_row_md5_select_query(
@@ -641,6 +641,7 @@ class SQLQueriesTemplateGenerator:
641
641
  fully_qualified_temporary_table_name: str,
642
642
  fully_qualified_view_name: str,
643
643
  platform: str,
644
+ query_modifiers=None,
644
645
  ) -> str:
645
646
  """
646
647
  Generate the SQL query to materialize a view as a temporary table.
@@ -649,6 +650,7 @@ class SQLQueriesTemplateGenerator:
649
650
  fully_qualified_temporary_table_name (str): The fully qualified name of the temporary table.
650
651
  fully_qualified_view_name (str): The fully qualified name of the view.
651
652
  platform (str): The platform identifier (e.g., Platform.SNOWFLAKE.value, Platform.SQLSERVER.value)
653
+ query_modifiers: Resolved query modifiers for the source view scan.
652
654
 
653
655
  Returns:
654
656
  str: SQL query string to materialize the view as a temporary table.
@@ -660,6 +662,7 @@ class SQLQueriesTemplateGenerator:
660
662
  template_file,
661
663
  fully_qualified_temporary_table_name=fully_qualified_temporary_table_name,
662
664
  fully_qualified_view_name=fully_qualified_view_name,
665
+ query_modifiers=query_modifiers,
663
666
  )
664
667
  except jinja2.exceptions.TemplateNotFound:
665
668
  raise ValueError(f"Template not found: {template_file}. Please create it in the {self.template_dir} directory.") from None
@@ -14,16 +14,16 @@
14
14
  # ---- Numeric types ----
15
15
  # TRIM() strips the leading spaces that TO_CHAR produces, matching Snowflake's FM format output.
16
16
  NUMBER: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
17
- FLOAT: TRIM(TO_CHAR(CAST({{ col_name }} AS NUMBER(28,4)), 'FM999999999999999999999999999990.0000'))
18
- BINARY_FLOAT: TRIM(TO_CHAR(CAST({{ col_name }} AS NUMBER(28,4)), 'FM999999999999999999999999999990.0000'))
19
- BINARY_DOUBLE: TRIM(TO_CHAR(CAST({{ col_name }} AS NUMBER(28,4)), 'FM999999999999999999999999999990.0000'))
17
+ FLOAT: '{{ float_tme_shim }}'
18
+ BINARY_FLOAT: '{{ float_tme_shim }}'
19
+ BINARY_DOUBLE: '{{ float_tme_shim }}'
20
20
  INTEGER: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
21
21
  SMALLINT: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
22
22
  # ANSI synonyms — Oracle stores these as NUMBER/INTEGER/FLOAT(63) internally
23
23
  DECIMAL: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
24
24
  NUMERIC: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
25
25
  INT: TRIM(TO_CHAR({{ col_name }}, '999999999999999999999999999990.0000'))
26
- REAL: TRIM(TO_CHAR(CAST({{ col_name }} AS NUMBER(28,4)), 'FM999999999999999999999999999990.0000'))
26
+ REAL: '{{ float_tme_shim }}'
27
27
 
28
28
  # ---- Character types ----
29
29
  # NCHAR and NVARCHAR2 must be explicitly cast to VARCHAR2 before concatenation.
@@ -48,7 +48,6 @@ from snowflake.snowflake_data_validation.query.query_generator_base import (
48
48
  resolve_table_context_modifiers,
49
49
  )
50
50
  from snowflake.snowflake_data_validation.utils.constants import (
51
- COL_NAME_NO_QUOTES_PLACEHOLDER,
52
51
  NULL_HASHING_SENTINEL,
53
52
  NULL_HASHING_SENTINEL_KEY,
54
53
  Platform,
@@ -62,6 +61,27 @@ from snowflake.snowflake_data_validation.utils.model.table_context import TableC
62
61
  LOGGER = logging.getLogger(__name__)
63
62
 
64
63
 
64
+ def build_oracle_float_tme_shim(col_ref: str) -> str:
65
+ """Return inline Oracle SQL that renders *col_ref* in Snowflake ``TME`` shape."""
66
+ base = f"LOWER(TRIM(TO_CHAR({col_ref}, 'TME')))"
67
+ exponent_pos = f"NULLIF(INSTR({base}, 'e'), 0)"
68
+ mantissa = f"SUBSTR({base}, 1, {exponent_pos} - 1)"
69
+ exponent_int = f"CAST(SUBSTR({base}, {exponent_pos} + 1, 50) AS NUMBER)"
70
+ decimal_pos = f"NULLIF(INSTR({mantissa}, '.'), 0)"
71
+ fraction = f"SUBSTR({mantissa}, {decimal_pos} + 1, 50)"
72
+ fraction_trimmed = f"RTRIM({fraction}, '0')"
73
+ mantissa_trimmed = (
74
+ f"CASE WHEN {decimal_pos} IS NULL THEN {mantissa} "
75
+ f"ELSE SUBSTR({mantissa}, 1, {decimal_pos} - 1) || "
76
+ f"CASE WHEN {fraction_trimmed} IS NULL OR {fraction_trimmed} = '' THEN '' ELSE '.' || {fraction_trimmed} END END"
77
+ )
78
+ return (
79
+ f"CASE WHEN {col_ref} IS NULL THEN NULL "
80
+ f"WHEN {exponent_pos} IS NULL THEN UPPER({base}) "
81
+ f"ELSE ({mantissa_trimmed}) || 'E' || CAST({exponent_int} AS VARCHAR2(11)) END"
82
+ )
83
+
84
+
65
85
  class QueryGeneratorOracle(QueryGeneratorBase):
66
86
  """Oracle-specific implementation of the query generator.
67
87
 
@@ -78,6 +98,9 @@ class QueryGeneratorOracle(QueryGeneratorBase):
78
98
  self.jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(str(templates_dir)))
79
99
  self.jinja_env.globals[NULL_HASHING_SENTINEL_KEY] = NULL_HASHING_SENTINEL
80
100
 
101
+ def build_float_tme_shim(self, column, col_ref: str) -> str:
102
+ return build_oracle_float_tme_shim(col_ref)
103
+
81
104
  def generate_extract_md5_rows_chunk_query(self, chunk_id: str, table_context: TableContext) -> str:
82
105
  """Not used in the Oracle CDV pipeline.
83
106
 
@@ -130,7 +153,10 @@ class QueryGeneratorOracle(QueryGeneratorBase):
130
153
  datatypes_normalization_templates,
131
154
  table_context,
132
155
  )
133
- renderer_templates[column.name] = normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
156
+ renderer_templates[column.name] = self.render_normalization_template(
157
+ normalization_template,
158
+ column,
159
+ )
134
160
  return renderer_templates
135
161
 
136
162
  def _build_row_md5_select(
@@ -1,3 +1,4 @@
1
+ from shared.query_modifiers.template_context import QueryModifiersTemplateContext
1
2
  from snowflake.snowflake_data_validation.configuration.model.view_configuration import (
2
3
  ViewConfiguration,
3
4
  )
@@ -49,6 +50,7 @@ class ViewPreProcessor:
49
50
  fully_qualified_temporary_table_name=view_configuration.internal_fully_qualified_name,
50
51
  platform=context.source_platform,
51
52
  sql_generator=context.sql_generator,
53
+ query_modifiers=QueryModifiersTemplateContext.empty(),
52
54
  )
53
55
 
54
56
  # Execute the materialization (create temporary table)
@@ -45,9 +45,9 @@ DATERANGE: TRIM(CAST("{{ col_name }}" AS TEXT))
45
45
  DECIMAL: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST("{{ col_name }}" AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST("{{ col_name }}" AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
46
46
  DEFAULT: RTRIM(CAST("{{ col_name }}" AS TEXT))
47
47
  DOMAIN: RTRIM(CAST("{{ col_name }}" AS TEXT))
48
- DOUBLE PRECISION: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST(CASE WHEN CAST("{{ col_name }}" AS DOUBLE PRECISION) IS NOT DISTINCT FROM 0::DOUBLE PRECISION THEN 0::DOUBLE PRECISION ELSE CAST("{{ col_name }}" AS DOUBLE PRECISION) END AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST(CASE WHEN CAST("{{ col_name }}" AS DOUBLE PRECISION) IS NOT DISTINCT FROM 0::DOUBLE PRECISION THEN 0::DOUBLE PRECISION ELSE CAST("{{ col_name }}" AS DOUBLE PRECISION) END AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
48
+ DOUBLE PRECISION: '{{ float_tme_shim }}'
49
49
  ENUM: RTRIM(CAST("{{ col_name }}" AS TEXT))
50
- FLOAT: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST(CASE WHEN CAST("{{ col_name }}" AS DOUBLE PRECISION) IS NOT DISTINCT FROM 0::DOUBLE PRECISION THEN 0::DOUBLE PRECISION ELSE CAST("{{ col_name }}" AS DOUBLE PRECISION) END AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST(CASE WHEN CAST("{{ col_name }}" AS DOUBLE PRECISION) IS NOT DISTINCT FROM 0::DOUBLE PRECISION THEN 0::DOUBLE PRECISION ELSE CAST("{{ col_name }}" AS DOUBLE PRECISION) END AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
50
+ FLOAT: '{{ float_tme_shim }}'
51
51
  GEOGRAPHY: TRIM(ST_AsText("{{ col_name }}"))
52
52
  GEOMETRY: TRIM(ST_AsText("{{ col_name }}"))
53
53
  INET: TRIM(CAST("{{ col_name }}" AS TEXT))
@@ -69,7 +69,7 @@ OID: TRIM(CAST("{{ col_name }}" AS TEXT))
69
69
  PATH: TRIM(CAST("{{ col_name }}" AS TEXT))
70
70
  POINT: TRIM(FORMAT('POINT(%s %s)', ("{{ col_name }}")[0], ("{{ col_name }}")[1]))
71
71
  POLYGON: TRIM(CAST("{{ col_name }}" AS TEXT))
72
- REAL: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST(CAST(CASE WHEN CAST("{{ col_name }}" AS REAL) IS NOT DISTINCT FROM 0::REAL THEN 0::REAL ELSE CAST("{{ col_name }}" AS REAL) END AS DOUBLE PRECISION) AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST(CAST(CASE WHEN CAST("{{ col_name }}" AS REAL) IS NOT DISTINCT FROM 0::REAL THEN 0::REAL ELSE CAST("{{ col_name }}" AS REAL) END AS DOUBLE PRECISION) AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
72
+ REAL: '{{ float_tme_shim }}'
73
73
  SERIAL: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST("{{ col_name }}" AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST("{{ col_name }}" AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
74
74
  SMALLINT: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST("{{ col_name }}" AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST("{{ col_name }}" AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
75
75
  SMALLSERIAL: CASE WHEN "{{ col_name }}" IS NULL THEN NULL WHEN CAST("{{ col_name }}" AS NUMERIC(38, 12)) = 0 THEN '0.0000' ELSE TRIM(REGEXP_REPLACE(TRIM(TO_CHAR(CAST("{{ col_name }}" AS NUMERIC(38, 12)), 'FM9999999999999999999999999999.0000')), '^\\.', '0.')) END
@@ -25,7 +25,6 @@ from snowflake.snowflake_data_validation.query.query_generator_base import (
25
25
  resolve_table_context_modifiers,
26
26
  )
27
27
  from snowflake.snowflake_data_validation.utils.constants import (
28
- COL_NAME_NO_QUOTES_PLACEHOLDER,
29
28
  NULL_HASHING_SENTINEL,
30
29
  NULL_HASHING_SENTINEL_KEY,
31
30
  Platform,
@@ -36,6 +35,27 @@ from snowflake.snowflake_data_validation.utils.model.table_context import TableC
36
35
  LOGGER = logging.getLogger(__name__)
37
36
 
38
37
 
38
+ def build_postgresql_float_tme_shim(col_ref: str) -> str:
39
+ """Return inline PostgreSQL SQL that renders *col_ref* in Snowflake ``TME`` shape."""
40
+ base = f"LOWER(TRIM(CAST({col_ref} AS TEXT)))"
41
+ exponent_pos = f"NULLIF(POSITION('e' IN {base}), 0)"
42
+ mantissa_src = f"CASE WHEN {exponent_pos} IS NULL THEN {base} ELSE SUBSTRING({base} FROM 1 FOR {exponent_pos} - 1) END"
43
+ exponent_int = f"CAST(TRIM(SUBSTRING({base} FROM {exponent_pos} + 1)) AS BIGINT)"
44
+ decimal_pos = f"NULLIF(POSITION('.' IN {mantissa_src}), 0)"
45
+ fraction = f"SUBSTRING({mantissa_src} FROM {decimal_pos} + 1)"
46
+ fraction_trimmed = f"RTRIM({fraction}, '0')"
47
+ mantissa_trimmed = (
48
+ f"CASE WHEN {decimal_pos} IS NULL THEN {mantissa_src} "
49
+ f"ELSE SUBSTRING({mantissa_src} FROM 1 FOR {decimal_pos} - 1) || "
50
+ f"CASE WHEN {fraction_trimmed} = '' THEN '' ELSE '.' || {fraction_trimmed} END END"
51
+ )
52
+ return (
53
+ f"CASE WHEN {col_ref} IS NULL THEN NULL "
54
+ f"WHEN {exponent_pos} IS NULL THEN UPPER({mantissa_trimmed}) || 'E0' "
55
+ f"ELSE UPPER({mantissa_trimmed}) || 'E' || TRIM(CAST({exponent_int} AS TEXT)) END"
56
+ )
57
+
58
+
39
59
  class QueryGeneratorPostgresql(QueryGeneratorBase):
40
60
  """Query generator for PostgreSQL (chunked MD5 pipeline aligned with Redshift)."""
41
61
 
@@ -47,6 +67,15 @@ class QueryGeneratorPostgresql(QueryGeneratorBase):
47
67
  self.jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(str(templates_dir)))
48
68
  self.jinja_env.globals[NULL_HASHING_SENTINEL_KEY] = NULL_HASHING_SENTINEL
49
69
 
70
+ def _float_column_reference(self, column) -> str:
71
+ return f'"{column.name}"'
72
+
73
+ def build_float_tme_shim(self, column, col_ref: str) -> str:
74
+ return build_postgresql_float_tme_shim(col_ref)
75
+
76
+ def _render_normalization_template(self, template: str, column) -> str:
77
+ return super()._render_normalization_template(template, column)
78
+
50
79
  def generate_cell_validation_data_query(
51
80
  self,
52
81
  table_context: TableContext,
@@ -58,8 +87,10 @@ class QueryGeneratorPostgresql(QueryGeneratorBase):
58
87
  for column in table_context.columns_to_validate:
59
88
  data_type = "VARCHAR" if column.data_type == "TEXT" else column.data_type
60
89
  normalization_template = datatypes_normalization_templates[data_type]
61
- normalization_template_rendered = normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
62
- datatypes_normalization_renderer_templates[column.name] = normalization_template_rendered
90
+ datatypes_normalization_renderer_templates[column.name] = self._render_normalization_template(
91
+ normalization_template,
92
+ column,
93
+ )
63
94
 
64
95
  return table_context.sql_generator.generate_cell_validation_data_select_query(
65
96
  platform=table_context.platform.value,
@@ -101,8 +132,10 @@ class QueryGeneratorPostgresql(QueryGeneratorBase):
101
132
  normalization_template = datatypes_normalization_templates.get("DEFAULT")
102
133
  if normalization_template is None:
103
134
  raise ValueError(f"No normalization template found for data type {column.data_type} and no DEFAULT template available.")
104
- normalization_template_rendered = normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
105
- datatypes_normalization_renderer_templates[column.name] = normalization_template_rendered
135
+ datatypes_normalization_renderer_templates[column.name] = self._render_normalization_template(
136
+ normalization_template,
137
+ column,
138
+ )
106
139
 
107
140
  column_groups = table_context.column_groups
108
141
 
@@ -17,6 +17,7 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
+ from shared.query_modifiers.template_context import QueryModifiersTemplateContext
20
21
  from snowflake.snowflake_data_validation.configuration.model.table_configuration import (
21
22
  TableConfiguration,
22
23
  )
@@ -41,6 +42,7 @@ def generate_view_materialization_query(
41
42
  fully_qualified_temporary_table_name: str,
42
43
  platform: Platform,
43
44
  sql_generator: SQLQueriesTemplateGenerator,
45
+ query_modifiers: QueryModifiersTemplateContext | None = None,
44
46
  ) -> GeneratedQuery:
45
47
  """Generate a query to materialize a view as a temporary table.
46
48
 
@@ -55,6 +57,7 @@ def generate_view_materialization_query(
55
57
  temporary table to create (e.g., "database.schema.temp_table_name").
56
58
  platform: The database platform (SNOWFLAKE, SQLSERVER, etc.).
57
59
  sql_generator: The SQLQueriesTemplateGenerator instance to use for query generation.
60
+ query_modifiers: Resolved source-side SQL modifiers for the view scan.
58
61
 
59
62
  Returns:
60
63
  GeneratedQuery: The generated DDL statement to create the temporary table.
@@ -70,6 +73,7 @@ def generate_view_materialization_query(
70
73
  fully_qualified_view_name=fully_qualified_view_name,
71
74
  platform=platform,
72
75
  sql_generator=sql_generator,
76
+ query_modifiers=query_modifiers,
73
77
  )
74
78
  return GeneratedQuery(query_string=query_string)
75
79
 
@@ -199,9 +203,7 @@ def generate_case_sensitive_columns_query(
199
203
 
200
204
  """
201
205
  try:
202
- database_name = HelperDatabase.normalize_identifier(
203
- identifier=target_database_name
204
- )
206
+ database_name = HelperDatabase.normalize_identifier(identifier=target_database_name)
205
207
 
206
208
  schema_name = HelperDatabase.normalize_identifier(identifier=target_schema_name)
207
209
 
@@ -15,8 +15,16 @@
15
15
 
16
16
  """Query generation package for database-specific query generators."""
17
17
 
18
+ from snowflake.snowflake_data_validation.query.charset_normalization import (
19
+ CharacterSetResolver,
20
+ DefaultCharacterSetResolver,
21
+ )
18
22
  from snowflake.snowflake_data_validation.query.query_generator_base import (
19
23
  QueryGeneratorBase,
20
24
  )
21
25
 
22
- __all__ = ["QueryGeneratorBase"]
26
+ __all__ = [
27
+ "CharacterSetResolver",
28
+ "DefaultCharacterSetResolver",
29
+ "QueryGeneratorBase",
30
+ ]
@@ -0,0 +1,159 @@
1
+ # Copyright 2026 Snowflake Inc.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ """Dialect-agnostic character-set-aware normalization template resolution."""
17
+
18
+ from __future__ import annotations
19
+
20
+ import logging
21
+
22
+ from typing import Any
23
+
24
+ from snowflake.snowflake_data_validation.utils.constants import (
25
+ CHARACTER_SET_KEY,
26
+ COL_NAME_NO_QUOTES_PLACEHOLDER,
27
+ )
28
+ from snowflake.snowflake_data_validation.utils.model.column_metadata import (
29
+ ColumnMetadata,
30
+ )
31
+
32
+
33
+ LOGGER = logging.getLogger(__name__)
34
+
35
+
36
+ class CharacterSetResolver:
37
+ """Resolves datatype normalization templates and charset-cast columns per dialect."""
38
+
39
+ recognized_charsets: frozenset[str] = frozenset()
40
+ default_charset: str | None = None
41
+ string_data_types: frozenset[str] = frozenset()
42
+ type_aliases: dict[str, str] = {}
43
+
44
+ def normalize_type_key(self, data_type: str) -> str:
45
+ """Fold a catalog data type string to a YAML template lookup key."""
46
+ key = (data_type or "").strip().upper().split("(")[0].strip()
47
+ return self.type_aliases.get(key, key)
48
+
49
+ def resolve_charset(self, column: ColumnMetadata) -> str | None:
50
+ """Return the column's character set, if present in metadata."""
51
+ charset = column.properties.get(CHARACTER_SET_KEY)
52
+ if isinstance(charset, str):
53
+ return charset.strip().upper()
54
+ return None
55
+
56
+ def candidate_template_keys(
57
+ self,
58
+ column: ColumnMetadata,
59
+ type_key: str,
60
+ charset: str | None,
61
+ ) -> list[str]:
62
+ """Build normalization template lookup keys in priority order."""
63
+ keys: list[str] = []
64
+ if charset and charset in self.recognized_charsets and charset != self.default_charset:
65
+ keys.append(f"{type_key}_{charset}")
66
+ keys.append(type_key)
67
+ raw_key = (column.data_type or "").strip().upper()
68
+ if raw_key != type_key and raw_key not in keys:
69
+ keys.append(raw_key)
70
+ return keys
71
+
72
+ def resolve_normalization_template(
73
+ self,
74
+ column: ColumnMetadata,
75
+ datatypes_normalization_templates: dict[str, str],
76
+ *,
77
+ is_case_sensitive: bool = True,
78
+ ) -> str:
79
+ """Pick and render the normalization template for a column.
80
+
81
+ Lookup order:
82
+ 1. ``{DATA_TYPE}_{CHARACTER_SET}`` when charset is present and not default
83
+ 2. ``{DATA_TYPE}`` fallback
84
+ 3. ``DEFAULT`` template
85
+ """
86
+ type_key = self.normalize_type_key(column.data_type)
87
+ charset = self.resolve_charset(column)
88
+
89
+ for key in self.candidate_template_keys(column, type_key, charset):
90
+ normalization_template = datatypes_normalization_templates.get(key)
91
+ if normalization_template is not None:
92
+ return normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
93
+
94
+ normalization_template = datatypes_normalization_templates.get("DEFAULT")
95
+ if normalization_template is None:
96
+ raise ValueError(
97
+ f"No normalization template found for data type {column.data_type} "
98
+ f"(character set {charset!r}) and no DEFAULT template available."
99
+ )
100
+
101
+ LOGGER.debug(
102
+ "No normalization template found for data type %s (character set %s), using DEFAULT.",
103
+ column.data_type,
104
+ charset,
105
+ )
106
+ return normalization_template.replace(COL_NAME_NO_QUOTES_PLACEHOLDER, column.name)
107
+
108
+ def is_string_data_type(self, column: ColumnMetadata) -> bool:
109
+ """Whether *column* is a dialect string type eligible for charset/casing wraps."""
110
+ return self.normalize_type_key(column.data_type) in self.string_data_types
111
+
112
+ def wrap_for_comparison(
113
+ self,
114
+ expr: str,
115
+ column: ColumnMetadata,
116
+ *,
117
+ is_case_sensitive: bool = True,
118
+ ) -> str:
119
+ """Apply case-folding for string columns when validation is case-insensitive."""
120
+ if is_case_sensitive or not self.is_string_data_type(column):
121
+ return expr
122
+ stripped = expr.strip()
123
+ if stripped.upper().startswith("LOWER("):
124
+ return expr
125
+ return f"LOWER({expr})"
126
+
127
+ def needs_charset_cast(self, column: ColumnMetadata) -> bool:
128
+ """Whether the column needs an engine charset cast in cell SELECTs."""
129
+ return False
130
+
131
+ def cast_column_names(self, columns: list[ColumnMetadata]) -> frozenset[str]:
132
+ """Column names that require a charset cast in cell SELECTs."""
133
+ return frozenset(col.name for col in columns if self.needs_charset_cast(col))
134
+
135
+ def server_hash_unsafe_column_names(self, columns: list[ColumnMetadata]) -> frozenset[str]:
136
+ """Columns whose charset needs UTF-8 hex encoding before server-side hashing (none by default)."""
137
+ return frozenset()
138
+
139
+ def enrich_column_character_sets(
140
+ self,
141
+ columns: list[ColumnMetadata],
142
+ cursor: Any,
143
+ table_fqn: str,
144
+ ) -> None:
145
+ """Populate charset metadata on *columns* when supported by this dialect."""
146
+ return
147
+
148
+
149
+ class DefaultCharacterSetResolver(CharacterSetResolver):
150
+ """Plain type-key lookup with optional aliases; no charset handling."""
151
+
152
+ string_data_types = frozenset(
153
+ {"CHAR", "VARCHAR", "CLOB", "LONG VARCHAR", "GRAPHIC", "VARGRAPHIC", "TEXT", "STRING", "NVARCHAR", "NCHAR", "CHARACTER"}
154
+ )
155
+
156
+ def __init__(self, type_aliases: dict[str, str] | None = None) -> None:
157
+ """Initialize with optional data-type alias overrides for template lookup."""
158
+ if type_aliases:
159
+ self.type_aliases = type_aliases
@@ -1,4 +1,4 @@
1
- Float64: CAST(ROUND("{{ col_name }}", 4) AS VARCHAR)
1
+ Float64: CAST("{{ col_name }}" AS VARCHAR)
2
2
  Int64: CAST(ROUND("{{ col_name }}", 4) AS VARCHAR)
3
3
  Utf8: \"{{ col_name }}\"
4
4
  Boolean: CASE WHEN "{{ col_name }}" IS TRUE THEN 'TRUE' WHEN "{{ col_name }}" IS FALSE THEN 'FALSE' END