snowflake-data-validation 1.42.2__tar.gz → 1.42.3__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 (635) hide show
  1. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/PKG-INFO +13 -1
  2. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/README.md +12 -0
  3. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_column_metrics_templates.yaml +18 -3
  4. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_column_metrics_templates.yaml +6 -0
  5. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/query/query_generator_redshift.py +8 -0
  6. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_column_metrics_templates.yaml +45 -0
  7. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/query/query_generator_snowflake.py +44 -0
  8. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_column_metrics_templates.yaml +20 -7
  9. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/iso_dv_common.py +95 -0
  10. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_timetz_sentinel_normalization.py +38 -0
  11. snowflake_data_validation-1.42.3/tests/unit/sqlserver/test_tsql_integer_stddev_exact.py +140 -0
  12. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_float_bit_canonical.py +4 -0
  13. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_iceberg_dv_l3_normalization.py +13 -0
  14. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_iso_dv_common.py +136 -0
  15. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_generator_numeric_scale.py +6 -1
  16. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_timestamp_golden_vectors.py +68 -0
  17. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/.gitignore +0 -0
  18. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/LICENSE +0 -0
  19. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/docs/README.md +0 -0
  20. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/pyproject.toml +0 -0
  21. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/__init__.py +0 -0
  22. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/__init__.py +0 -0
  23. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/azure_synapse_arguments_manager.py +0 -0
  24. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/connector/__init__.py +0 -0
  25. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_azure_synapse.py +0 -0
  26. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_factory_azure_synapse.py +0 -0
  27. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/__init__.py +0 -0
  28. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/metadata_extractor_azure_synapse.py +0 -0
  29. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_cell_validation_data_select.sql.j2 +0 -0
  30. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_datatypes_normalization_templates.yaml +0 -0
  31. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_get_columns_metadata.sql.j2 +0 -0
  32. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_count_query.sql.j2 +0 -0
  33. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_md5_select.sql.j2 +0 -0
  34. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_table_metadata_query.sql.j2 +0 -0
  35. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_to_snowflake_datatypes_mapping_template.yaml +0 -0
  36. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/model/__init__.py +0 -0
  37. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/model/azure_synapse_credentials_connection.py +0 -0
  38. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/query/__init__.py +0 -0
  39. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/query/query_generator_azure_synapse.py +0 -0
  40. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/__init__.py +0 -0
  41. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/script_writer_azure_synapse.py +0 -0
  42. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/__init__.py +0 -0
  43. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/__init__.py +0 -0
  44. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_cell_validation_data_select.sql.j2 +0 -0
  45. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_column_metrics_templates.yaml +0 -0
  46. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_datatypes_normalization_templates.yaml +0 -0
  47. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_get_columns_metadata.sql.j2 +0 -0
  48. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_row_count_query.sql.j2 +0 -0
  49. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_row_md5_select.sql.j2 +0 -0
  50. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_table_metadata_query.sql.j2 +0 -0
  51. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_to_snowflake_datatypes_mapping_template.yaml +0 -0
  52. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/query/__init__.py +0 -0
  53. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/bigquery/query/query_generator_bigquery.py +0 -0
  54. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/comparison_orchestrator.py +0 -0
  55. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/__init__.py +0 -0
  56. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/configuration_loader.py +0 -0
  57. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/configuration_model.py +0 -0
  58. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/connection_types.py +0 -0
  59. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/connections/__init__.py +0 -0
  60. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/logging_configuration.py +0 -0
  61. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/table_configuration.py +0 -0
  62. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/validation_configuration.py +0 -0
  63. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/model/view_configuration.py +0 -0
  64. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/configuration/singleton.py +0 -0
  65. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/connector/__init__.py +0 -0
  66. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/connector/connector_base.py +0 -0
  67. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/connector/connector_factory_base.py +0 -0
  68. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/connector/connector_failure_tracker.py +0 -0
  69. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/__init__.py +0 -0
  70. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/__init__.py +0 -0
  71. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/metadata_extractor_db2.py +0 -0
  72. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_cell_validation_data_select.sql.j2 +0 -0
  73. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_column_metrics_templates.yaml +0 -0
  74. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_datatypes_normalization_templates.yaml +0 -0
  75. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_get_columns_metadata.sql.j2 +0 -0
  76. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_row_count_query.sql.j2 +0 -0
  77. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_row_md5_select.sql.j2 +0 -0
  78. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_table_metadata_query.sql.j2 +0 -0
  79. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_to_snowflake_datatypes_mapping_template.yaml +0 -0
  80. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/query/__init__.py +0 -0
  81. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/query/query_generator_db2.py +0 -0
  82. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/script_writer/__init__.py +0 -0
  83. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/db2/script_writer/script_writer_db2.py +0 -0
  84. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/__init__.py +0 -0
  85. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/async_generation_executor.py +0 -0
  86. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/async_validation_executor.py +0 -0
  87. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/base_validation_executor.py +0 -0
  88. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/executor_factory.py +0 -0
  89. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/extractor_types.py +0 -0
  90. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/source_validation_executor.py +0 -0
  91. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/executer/sync_validation_executor.py +0 -0
  92. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/extractor/__init__.py +0 -0
  93. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/extractor/metadata_extractor_base.py +0 -0
  94. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/extractor/sql_queries_template_generator.py +0 -0
  95. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/__init__.py +0 -0
  96. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/__init__.py +0 -0
  97. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/metadata_extractor_oracle.py +0 -0
  98. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_cell_validation_data_select.sql.j2 +0 -0
  99. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_column_metrics_templates.yaml +0 -0
  100. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_datatypes_normalization_templates.yaml +0 -0
  101. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_get_columns_metadata.sql.j2 +0 -0
  102. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_count_query.sql.j2 +0 -0
  103. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_md5_select.sql.j2 +0 -0
  104. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_table_metadata_query.sql.j2 +0 -0
  105. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_to_snowflake_datatypes_mapping_template.yaml +0 -0
  106. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/oracle_bfile.py +0 -0
  107. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/oracle_iso_normalization.py +0 -0
  108. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/oracle_lob_normalization.py +0 -0
  109. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/oracle_vector_extraction.py +0 -0
  110. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/query/__init__.py +0 -0
  111. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/query/query_generator_oracle.py +0 -0
  112. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/script_writer/__init__.py +0 -0
  113. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/oracle/script_writer/script_writer_oracle.py +0 -0
  114. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/html_report/__init__.py +0 -0
  115. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/html_report/html_report_builder.py +0 -0
  116. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/html_report/report_metadata.py +0 -0
  117. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/parallel_execution_engine.py +0 -0
  118. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/table_metadata_processor.py +0 -0
  119. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/validation_progress_reporter.py +0 -0
  120. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/orchestration/view_preprocessor.py +0 -0
  121. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/__init__.py +0 -0
  122. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/connector/__init__.py +0 -0
  123. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_factory_postgresql.py +0 -0
  124. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_postgresql.py +0 -0
  125. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/__init__.py +0 -0
  126. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/metadata_extractor_postgresql.py +0 -0
  127. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_cell_validation_data_select.sql.j2 +0 -0
  128. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  129. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_concatenated_table_template.sql.j2 +0 -0
  130. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_md5_insert_template.sql.j2 +0 -0
  131. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_md5_table_template.sql.j2 +0 -0
  132. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_column_metrics_templates.yaml +0 -0
  133. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_datatypes_normalization_templates.yaml +0 -0
  134. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_extract_md5_rows_chunk.sql.j2 +0 -0
  135. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_get_columns_metadata.sql.j2 +0 -0
  136. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_count_query.sql.j2 +0 -0
  137. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_md5_select.sql.j2 +0 -0
  138. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_table_metadata_query.sql.j2 +0 -0
  139. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_to_snowflake_datatypes_mapping_template.yaml +0 -0
  140. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/model/__init__.py +0 -0
  141. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/model/postgresql_credentials_connection.py +0 -0
  142. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/postgresql_arguments_manager.py +0 -0
  143. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/postgresql_tz_normalization.py +0 -0
  144. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/query/__init__.py +0 -0
  145. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/query/charset_normalization.py +0 -0
  146. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/query/query_generator_postgresql.py +0 -0
  147. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/script_writer/__init__.py +0 -0
  148. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/postgresql/script_writer/script_writer_postgresql.py +0 -0
  149. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/DATA_VALIDATION_API_OVERVIEW.md +0 -0
  150. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/__init__.py +0 -0
  151. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/_internal.py +0 -0
  152. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/_teradata_internal.py +0 -0
  153. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/async_mode/__init__.py +0 -0
  154. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/async_mode/file_loader.py +0 -0
  155. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/async_mode/script_writer.py +0 -0
  156. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/cli/__init__.py +0 -0
  157. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/cli/commands.py +0 -0
  158. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/configuration/__init__.py +0 -0
  159. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/connectors/__init__.py +0 -0
  160. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/context/__init__.py +0 -0
  161. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/data_validation_api.py +0 -0
  162. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/enums/__init__.py +0 -0
  163. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/execution/__init__.py +0 -0
  164. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/execution/query_executor.py +0 -0
  165. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/generators/__init__.py +0 -0
  166. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/metadata/__init__.py +0 -0
  167. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/__init__.py +0 -0
  168. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/data_validation_exception.py +0 -0
  169. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/generated_query.py +0 -0
  170. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/metrics_result_shape.py +0 -0
  171. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/query_execution_result.py +0 -0
  172. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/query_generator_factory.py +0 -0
  173. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/result_set.py +0 -0
  174. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/validation_progress_callback.py +0 -0
  175. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/model/validation_result.py +0 -0
  176. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_generation/__init__.py +0 -0
  177. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_generation/metadata_queries.py +0 -0
  178. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_generation/row_validation_queries.py +0 -0
  179. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_generation/schema_metrics_queries.py +0 -0
  180. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_validation/__init__.py +0 -0
  181. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/query_validation/query_comparison.py +0 -0
  182. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/reshape/__init__.py +0 -0
  183. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/reshape/metrics_reshape.py +0 -0
  184. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/result_set_validation/__init__.py +0 -0
  185. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/result_set_validation/result_set_comparison.py +0 -0
  186. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/snapshot/__init__.py +0 -0
  187. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_generation.py +0 -0
  188. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_validation.py +0 -0
  189. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/utils/__init__.py +0 -0
  190. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/utils/helpers.py +0 -0
  191. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/validation/__init__.py +0 -0
  192. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/validation/cell_validation.py +0 -0
  193. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/validation/metrics_validation.py +0 -0
  194. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/validation/row_validation.py +0 -0
  195. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/public/validation/schema_validation.py +0 -0
  196. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/__init__.py +0 -0
  197. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/charset_normalization.py +0 -0
  198. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/chunk_md5_tiered.py +0 -0
  199. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_column_metrics_templates.yaml +0 -0
  200. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_datatypes_normalization_templates.yaml +0 -0
  201. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_modifiers.sql.j2 +0 -0
  202. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/float_bit_normalization.py +0 -0
  203. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/numeric_scale_resolution.py +0 -0
  204. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/query/query_generator_query.py +0 -0
  205. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/query_arguments_manager.py +0 -0
  206. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/query_generator_base.py +0 -0
  207. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/sql_type_families.py +0 -0
  208. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/query/vector_element_kind.py +0 -0
  209. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/__init__.py +0 -0
  210. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/connector/__init__.py +0 -0
  211. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/connector/connector_factory_redshift.py +0 -0
  212. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/connector/connector_redshift.py +0 -0
  213. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/metadata_extractor_redshift.py +0 -0
  214. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_cell_validation_data_select.sql.j2 +0 -0
  215. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  216. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_table_template.sql.j2 +0 -0
  217. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_insert_template.sql.j2 +0 -0
  218. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_table_template.sql.j2 +0 -0
  219. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_datatypes_normalization_templates.yaml +0 -0
  220. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_extract_md5_rows_chunk.sql.j2 +0 -0
  221. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_get_columns_metadata.sql.j2 +0 -0
  222. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_count_query.sql.j2 +0 -0
  223. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_md5_select.sql.j2 +0 -0
  224. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_table_metadata_query.sql.j2 +0 -0
  225. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_to_snowflake_datatypes_mapping_template.yaml +0 -0
  226. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/model/__init__.py +0 -0
  227. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/model/redshift_credentials_connection.py +0 -0
  228. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/query/__init__.py +0 -0
  229. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/query/charset_normalization.py +0 -0
  230. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/redshift_arguments_manager.py +0 -0
  231. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/redshift_super_normalization.py +0 -0
  232. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/script_writer/__init__.py +0 -0
  233. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/redshift/script_writer/script_writer_redshift.py +0 -0
  234. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_cell_validation_data_select.sql.j2 +0 -0
  235. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_column_metrics_templates.yaml +0 -0
  236. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_datatypes_normalization_templates.yaml +0 -0
  237. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/snowflake_to_result_set_datatypes_mapping_template.yaml +0 -0
  238. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/query/query_generator_result_set.py +0 -0
  239. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/result_set/result_set_arguments_manager.py +0 -0
  240. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/script_writer/__init__.py +0 -0
  241. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/script_writer/script_writer_base.py +0 -0
  242. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/__init__.py +0 -0
  243. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_factory_snowflake.py +0 -0
  244. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_snowflake.py +0 -0
  245. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/metadata_extractor_snowflake.py +0 -0
  246. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_cell_validation_data_select.sql.j2 +0 -0
  247. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_concatenated_template.sql.j2 +0 -0
  248. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_md5_template.sql.j2 +0 -0
  249. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_datatypes_normalization_templates.yaml +0 -0
  250. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_extract_md5_rows_chunk.sql.j2 +0 -0
  251. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_case_sensitive_columns.sql.j2 +0 -0
  252. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_columns_metadata.sql.j2 +0 -0
  253. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_count_query.sql.j2 +0 -0
  254. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_md5_select.sql.j2 +0 -0
  255. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_table_metadata_query.sql.j2 +0 -0
  256. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_temporary_table_from_view_template.sql.j2 +0 -0
  257. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_to_snowflake_datatypes_mapping_template.yaml +0 -0
  258. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/l3/__init__.py +0 -0
  259. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/l3/pushdown_diff_sql.py +0 -0
  260. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/l3/signature_external_table.py +0 -0
  261. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/l3/warm_start.py +0 -0
  262. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/model/__init__.py +0 -0
  263. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_credentials_connection.py +0 -0
  264. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_default_connection.py +0 -0
  265. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_named_connection.py +0 -0
  266. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/query/__init__.py +0 -0
  267. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/query/charset_normalization.py +0 -0
  268. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/script_writer/__init__.py +0 -0
  269. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/script_writer/script_writer_snowflake.py +0 -0
  270. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/snowflake/snowflake_arguments_manager.py +0 -0
  271. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/__init__.py +0 -0
  272. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/connector/__init__.py +0 -0
  273. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_factory_sqlite.py +0 -0
  274. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_sqlite.py +0 -0
  275. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/__init__.py +0 -0
  276. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/metadata_extractor_sqlite.py +0 -0
  277. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_cell_validation_data_select.sql.j2 +0 -0
  278. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_column_metrics_templates.yaml +0 -0
  279. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_compute_md5_sql.j2 +0 -0
  280. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_datatypes_normalization_templates.yaml +0 -0
  281. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_extract_md5_rows_chunk.sql.j2 +0 -0
  282. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_get_columns_metadata.sql.j2 +0 -0
  283. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_count_query.sql.j2 +0 -0
  284. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_md5_select.sql.j2 +0 -0
  285. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_table_metadata_query.sql.j2 +0 -0
  286. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_snowflake_datatypes_mapping_template.yaml +0 -0
  287. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_sqlite_datatypes_mapping_template.yaml +0 -0
  288. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/model/__init__.py +0 -0
  289. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/model/sqlite_connection.py +0 -0
  290. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/query/__init__.py +0 -0
  291. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/query/query_generator_sqlite.py +0 -0
  292. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/script_writer/__init__.py +0 -0
  293. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlite/script_writer/script_writer_sqlite.py +0 -0
  294. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/__init__.py +0 -0
  295. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/connector/__init__.py +0 -0
  296. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_factory_sql_server.py +0 -0
  297. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_sql_server.py +0 -0
  298. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/__init__.py +0 -0
  299. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/metadata_extractor_sqlserver.py +0 -0
  300. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_cell_validation_data_select.sql.j2 +0 -0
  301. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_compute_md5_sql.j2 +0 -0
  302. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_datatypes_normalization_templates.yaml +0 -0
  303. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_extract_md5_rows_chunk.sql.j2 +0 -0
  304. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_columns_metadata.sql.j2 +0 -0
  305. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_temporary_table_internal_identifier_template.sql.j2 +0 -0
  306. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_count_query.sql.j2 +0 -0
  307. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_md5_select.sql.j2 +0 -0
  308. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_table_metadata_query.sql.j2 +0 -0
  309. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_temporary_table_from_view_template.sql.j2 +0 -0
  310. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_to_snowflake_datatypes_mapping_template.yaml +0 -0
  311. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/model/__init__.py +0 -0
  312. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/model/sqlserver_credentials_connection.py +0 -0
  313. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/query/__init__.py +0 -0
  314. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/query/charset_normalization.py +0 -0
  315. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/query/query_generator_sqlserver.py +0 -0
  316. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/__init__.py +0 -0
  317. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/script_writer_sqlserver.py +0 -0
  318. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_arguments_manager.py +0 -0
  319. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/table_partitioning_strategy.md +0 -0
  320. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/__init__.py +0 -0
  321. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/connector/__init__.py +0 -0
  322. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/connector/connector_factory_teradata.py +0 -0
  323. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/connector/connector_teradata.py +0 -0
  324. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/__init__.py +0 -0
  325. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/metadata_extractor_teradata.py +0 -0
  326. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_cell_validation_data_select.sql.j2 +0 -0
  327. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_column_metrics_templates.yaml +0 -0
  328. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_compute_md5_sql.j2 +0 -0
  329. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_concatenated.sql.j2 +0 -0
  330. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_md5.sql.j2 +0 -0
  331. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_datatypes_normalization_templates.yaml +0 -0
  332. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_extract_md5_rows_chunk.sql.j2 +0 -0
  333. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_get_columns_metadata.sql.j2 +0 -0
  334. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_count_query.sql.j2 +0 -0
  335. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_md5_select.sql.j2 +0 -0
  336. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_table_metadata_query.sql.j2 +0 -0
  337. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_to_snowflake_datatypes_mapping_template.yaml +0 -0
  338. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/model/__init__.py +0 -0
  339. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/model/teradata_credentials_connection.py +0 -0
  340. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/query/__init__.py +0 -0
  341. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/query/charset_normalization.py +0 -0
  342. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/query/query_generator_teradata.py +0 -0
  343. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/script_writer/__init__.py +0 -0
  344. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/script_writer/script_writer_teradata.py +0 -0
  345. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/teradata_arguments_manager.py +0 -0
  346. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/teradata/teradata_iso_normalization.py +0 -0
  347. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/__init__.py +0 -0
  348. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/arguments_manager_base.py +0 -0
  349. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/arguments_manager_factory.py +0 -0
  350. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/base_output_handler.py +0 -0
  351. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/catalog_column_size.py +0 -0
  352. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/column_grouping.py +0 -0
  353. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/column_partitioning_strategy.py +0 -0
  354. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/configuration_file_editor.py +0 -0
  355. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/configuration_file_generator.py +0 -0
  356. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/configuration_file_synchronizer.py +0 -0
  357. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/connection_pool.py +0 -0
  358. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/connector_factory.py +0 -0
  359. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/console_output_handler.py +0 -0
  360. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/constants.py +0 -0
  361. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/context.py +0 -0
  362. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/cpu_optimizer.py +0 -0
  363. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helper.py +0 -0
  364. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_database.py +0 -0
  365. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_dataframe.py +0 -0
  366. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_io.py +0 -0
  367. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_misc.py +0 -0
  368. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_polars_cast.py +0 -0
  369. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_query_result.py +0 -0
  370. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/helpers/helper_templates.py +0 -0
  371. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/iceberg_dv_common.py +0 -0
  372. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/index_key_format.py +0 -0
  373. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/interval_common.py +0 -0
  374. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/logging_config.py +0 -0
  375. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/logging_utils.py +0 -0
  376. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/measure_collation.py +0 -0
  377. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/chunk.py +0 -0
  378. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/column_metadata.py +0 -0
  379. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/custom_templates.py +0 -0
  380. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/table_column_metadata.py +0 -0
  381. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/table_context.py +0 -0
  382. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/model/templates_loader_manager.py +0 -0
  383. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/progress_reporter.py +0 -0
  384. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/qvci_fallback.py +0 -0
  385. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/row_partitioning_strategy.py +0 -0
  386. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/run_context.py +0 -0
  387. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/semi_structured_json_canonicalization.py +0 -0
  388. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/shutdown_coordinator.py +0 -0
  389. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/snapshot_validation_statements.py +0 -0
  390. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/telemetry.py +0 -0
  391. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/templates/configuration_file_templates.py +0 -0
  392. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/teradata_string_rtrim.py +0 -0
  393. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/thread_safe_singleton.py +0 -0
  394. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/validation_utils.py +0 -0
  395. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/vector_common.py +0 -0
  396. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/utils/vector_normalization.py +0 -0
  397. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/__init__.py +0 -0
  398. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/accepted_transformation.py +0 -0
  399. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/cell_data_validator.py +0 -0
  400. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/comparison_codec.py +0 -0
  401. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/data_validator_base.py +0 -0
  402. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/dataframe_validator_base.py +0 -0
  403. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/metrics_data_validator.py +0 -0
  404. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/metrics_tolerance.py +0 -0
  405. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/__init__.py +0 -0
  406. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/base.py +0 -0
  407. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/db2.py +0 -0
  408. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/redshift.py +0 -0
  409. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/registry.py +0 -0
  410. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/snowflake.py +0 -0
  411. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/sqlite.py +0 -0
  412. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/sqlserver.py +0 -0
  413. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/teradata.py +0 -0
  414. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/query_validator.py +0 -0
  415. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/result_set_validator.py +0 -0
  416. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/results_summary_report.py +0 -0
  417. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/row_data_validator.py +0 -0
  418. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/row_validation_report_buffer.py +0 -0
  419. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/schema_data_validator.py +0 -0
  420. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_database/__init__.py +0 -0
  421. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_database/sqlite_validation_connection.py +0 -0
  422. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_database/validation_database_connection_base.py +0 -0
  423. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_database_manager.py +0 -0
  424. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_execution_context.py +0 -0
  425. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_report_buffer.py +0 -0
  426. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/src/snowflake/snowflake_data_validation/validation/validation_report_status.py +0 -0
  427. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/.coveragerc +0 -0
  428. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/conftest.py +0 -0
  429. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/.coveragerc +0 -0
  430. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/Redshift/test_metadata_extractor_integration.py +0 -0
  431. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/test_async_generation_integration.py +0 -0
  432. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/test_async_validation_integration.py +0 -0
  433. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/test_reference_integration.py +0 -0
  434. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/test_source_validation_integration.py +0 -0
  435. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/integration/test_sync_validation_integration.py +0 -0
  436. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Postgresql/test_postgresql_collation.py +0 -0
  437. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Postgresql/test_postgresql_numeric_leading_zero.py +0 -0
  438. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Postgresql/test_postgresql_spatial_templates.py +0 -0
  439. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/model/test_redshift_credentials_connection.py +0 -0
  440. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/query/test_query_generator_redshift.py +0 -0
  441. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/script_writer/test_script_writer_redshift.py +0 -0
  442. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_connector_redshift.py +0 -0
  443. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_arguments_manager.py +0 -0
  444. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_collation.py +0 -0
  445. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_hllsketch_templates.py +0 -0
  446. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_spatial_templates.py +0 -0
  447. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_super_normalization.py +0 -0
  448. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Redshift/test_redshift_varchar_count_distinct.py +0 -0
  449. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_connector_teradata.py +0 -0
  450. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_metadata_extractor_teradata.py +0 -0
  451. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_query_generator_teradata.py +0 -0
  452. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_teradata_collation.py +0 -0
  453. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_teradata_row_md5_select_template.py +0 -0
  454. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_teradata_spatial_templates.py +0 -0
  455. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_teradata_view_generate_boundary.py +0 -0
  456. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/Teradata/test_teradata_view_l1_metadata_templates.py +0 -0
  457. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/__init__.py +0 -0
  458. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/custom_templates_loader/snowflake_column_metrics_templates.yaml +0 -0
  459. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/custom_templates_loader/snowflake_datatypes_normalization_templates.yaml +0 -0
  460. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/custom_templates_loader/snowflake_table_metadata_query.sql.j2 +0 -0
  461. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_configuration_loader/test_load_configuration_model/conf.yaml +0 -0
  462. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_configuration_loader/test_load_configuration_model_reading_file_exception/conf.yaml +0 -0
  463. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_configuration_file.json +0 -0
  464. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_connection_source_db.toml +0 -0
  465. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_datatypes_normalization_template.yaml +0 -0
  466. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_datatypes_template.yaml +0 -0
  467. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_metrics_template.yaml +0 -0
  468. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_metrics_template_datatypes.yaml +0 -0
  469. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/dummy_template.csv +0 -0
  470. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_helpers/not_valid_format.yaml +0 -0
  471. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_templates_loader_manager/snowflake_column_metrics_templates.yaml +0 -0
  472. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/assets/test_templates_loader_manager/snowflake_datatypes_normalization_templates.yaml +0 -0
  473. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/__init__.py +0 -0
  474. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_azure_synapse_credentials_connection.py +0 -0
  475. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_azure_synapse_metadata_extractor.py +0 -0
  476. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_azure_synapse_metrics_templates.py +0 -0
  477. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_azure_synapse_query_generator.py +0 -0
  478. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_azure_synapse_row_queries.py +0 -0
  479. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_connector_azure_synapse.py +0 -0
  480. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/azure_synapse/test_connector_factory_azure_synapse.py +0 -0
  481. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/bigquery/__init__.py +0 -0
  482. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/bigquery/test_bigquery_l1_string_length.py +0 -0
  483. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/bigquery/test_bigquery_spatial_templates.py +0 -0
  484. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/bigquery/test_query_generator_bigquery.py +0 -0
  485. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/bigquery/test_query_generator_factory_bigquery.py +0 -0
  486. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/db2/__init__.py +0 -0
  487. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/db2/test_db2_metadata_extractor.py +0 -0
  488. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/db2/test_db2_query_generator.py +0 -0
  489. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/db2/test_db2_registration.py +0 -0
  490. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/__init__.py +0 -0
  491. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_metadata_extractor_oracle_vector.py +0 -0
  492. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_iso_normalization.py +0 -0
  493. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_lob_dv_generation.py +0 -0
  494. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_lob_normalization.py +0 -0
  495. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_metadata_extractor.py +0 -0
  496. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_metrics_templates.py +0 -0
  497. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_normalization_templates.py +0 -0
  498. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_query_generator.py +0 -0
  499. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_query_modifiers.py +0 -0
  500. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/oracle/test_oracle_type_mappings.py +0 -0
  501. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/query/test_chunk_md5_tiered.py +0 -0
  502. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/snowflake/test_snowflake_spatial_metrics_templates.py +0 -0
  503. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/__init__.py +0 -0
  504. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_connector_factory_sqlite.py +0 -0
  505. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_connector_sqlite.py +0 -0
  506. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_metadata_extractor_sqlite.py +0 -0
  507. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_metadata_query_template_sqlite.py +0 -0
  508. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_query_generator_sqlite.py +0 -0
  509. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlite/test_script_writer_sqlite.py +0 -0
  510. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/__init__.py +0 -0
  511. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_connector_factory_sql_server.py +0 -0
  512. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_metadata_extractor_sqlserver_vector.py +0 -0
  513. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_l1_catalog.py +0 -0
  514. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_length_metrics_chars.py +0 -0
  515. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_row_count_overflow.py +0 -0
  516. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_row_queries.py +0 -0
  517. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_spatial_l1_metadata.py +0 -0
  518. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/sqlserver/test_sqlserver_spatial_metrics_templates.py +0 -0
  519. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_accepted_transformation.py +0 -0
  520. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_arguments_manager_base.py +0 -0
  521. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_arguments_manager_factory.py +0 -0
  522. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_batched_metrics_queries.py +0 -0
  523. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_boolean_binary_canonical_templates.py +0 -0
  524. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_catalog_column_size.py +0 -0
  525. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_cell_data_validator.py +0 -0
  526. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_cell_data_validator_threading.py +0 -0
  527. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_cell_validation_query_generation.py +0 -0
  528. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_charset_normalization.py +0 -0
  529. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_column_grouping.py +0 -0
  530. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_column_metadata.py +0 -0
  531. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_column_normalization_override.py +0 -0
  532. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_column_partitioning_strategy.py +0 -0
  533. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_comparison_codec.py +0 -0
  534. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_comparison_orchestrator.py +0 -0
  535. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_configuration_file_editor.py +0 -0
  536. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_configuration_file_generator.py +0 -0
  537. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_configuration_file_synchronizer.py +0 -0
  538. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_configuration_loader.py +0 -0
  539. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_configuration_model.py +0 -0
  540. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_connection_pool.py +0 -0
  541. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_connector_failure_tracker.py +0 -0
  542. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_connector_snowflake.py +0 -0
  543. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_cpu_optimizer.py +0 -0
  544. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_custom_templates_models.py +0 -0
  545. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_data_validator.py +0 -0
  546. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_escape_odbc_value.py +0 -0
  547. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_executor_factory.py +0 -0
  548. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_float_canonical_templates.py +0 -0
  549. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_get_configuration_file.py +0 -0
  550. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_get_target_cols.py +0 -0
  551. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_helper_dataframe.py +0 -0
  552. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_helper_polars_cast.py +0 -0
  553. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_helpers.py +0 -0
  554. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_html_report_builder.py +0 -0
  555. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_index_key_format.py +0 -0
  556. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_internal_helpers.py +0 -0
  557. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_interval_common.py +0 -0
  558. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_l2_collation_metadata.py +0 -0
  559. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_logging_config.py +0 -0
  560. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_metric_identifier_rendering.py +0 -0
  561. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_metrics_reshape.py +0 -0
  562. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_metrics_result_shape.py +0 -0
  563. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_metrics_templates_casts.py +0 -0
  564. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_metrics_tolerance.py +0 -0
  565. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_normalize_shape_aware.py +0 -0
  566. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_numeric_scale_resolution.py +0 -0
  567. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_platform_bridge.py +0 -0
  568. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_postgresql_normalization_templates.py +0 -0
  569. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_postgresql_tz_normalization.py +0 -0
  570. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_pushdown_diff_sql.py +0 -0
  571. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_cell_level_validation.py +0 -0
  572. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_executor.py +0 -0
  573. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_metrics_level_validation.py +0 -0
  574. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_to_dataframe.py +0 -0
  575. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_query_validator.py +0 -0
  576. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_qvci_fallback.py +0 -0
  577. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_qvci_fallback_na_skip.py +0 -0
  578. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_qvci_fallback_triggers.py +0 -0
  579. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_redshift_native_timestamptz_ltz.py +0 -0
  580. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_report_metadata.py +0 -0
  581. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_cell_level_validation.py +0 -0
  582. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_column_metrics_validation.py +0 -0
  583. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_snapshot_generation.py +0 -0
  584. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_snapshot_validation.py +0 -0
  585. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_to_dataframe.py +0 -0
  586. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_result_set_validator.py +0 -0
  587. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_row_count_bigint_overflow.py +0 -0
  588. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_row_data_validator.py +0 -0
  589. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_row_hash_column_delimiter.py +0 -0
  590. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_row_partitioning_strategy.py +0 -0
  591. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_row_validation_report_buffer.py +0 -0
  592. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_schema_column_selection.py +0 -0
  593. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_shutdown_coordinator.py +0 -0
  594. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_signature_external_table.py +0 -0
  595. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_signature_row_md5_query.py +0 -0
  596. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_snapshot_validation_statements.py +0 -0
  597. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_snowflake_arguments_manager.py +0 -0
  598. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_snowflake_binary_normalization_templates.py +0 -0
  599. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_snowflake_redshift_super_size_guard.py +0 -0
  600. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_source_validation_executor.py +0 -0
  601. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_spatial_wkt_canonicalization.py +0 -0
  602. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sql_catalog_template_guard.py +0 -0
  603. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sql_literal_jinja_filter.py +0 -0
  604. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sqlite_validation_connection.py +0 -0
  605. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sqlserver_arguments_manager.py +0 -0
  606. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sqlserver_multi_version_support.py +0 -0
  607. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sync_executor_qvci_fallback.py +0 -0
  608. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_sync_validation_executor.py +0 -0
  609. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_column_metadata_model.py +0 -0
  610. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_configuration.py +0 -0
  611. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_context.py +0 -0
  612. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_metadata_processor.py +0 -0
  613. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_snapshot_generation.py +0 -0
  614. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_table_snapshot_validation.py +0 -0
  615. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_target_platform_factory.py +0 -0
  616. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_telemetry.py +0 -0
  617. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_templates_loader_manager.py +0 -0
  618. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_teradata_iso_normalization.py +0 -0
  619. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_teradata_string_rtrim_policy.py +0 -0
  620. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_teradata_timetz_metric_domain.py +0 -0
  621. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_configuration.py +0 -0
  622. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_database_connection.py +0 -0
  623. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_execution_context.py +0 -0
  624. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_progress_reporter.py +0 -0
  625. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_report_buffer.py +0 -0
  626. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_report_status.py +0 -0
  627. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_validation_templates_dto.py +0 -0
  628. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_vector_bit_normalization.py +0 -0
  629. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_vector_common.py +0 -0
  630. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_vector_normalization.py +0 -0
  631. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_view_configuration.py +0 -0
  632. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/test_warm_start.py +0 -0
  633. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/utils/__init__.py +0 -0
  634. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/utils/test_constants.py +0 -0
  635. {snowflake_data_validation-1.42.2 → snowflake_data_validation-1.42.3}/tests/unit/utils/test_semi_structured_json_canonicalization.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: snowflake-data-validation
3
- Version: 1.42.2
3
+ Version: 1.42.3
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/
@@ -190,6 +190,18 @@ For configuration options and examples, see the [official documentation](https:/
190
190
 
191
191
  ## Changelog
192
192
 
193
+ ### v1.42.3
194
+
195
+ **Improvements**
196
+
197
+ - Improved comparison of clock values stored as `VARCHAR` in Iceberg metrics.
198
+ - Added support for staging Redshift `REAL` NaN and infinity values without aborting the extract.
199
+
200
+ **Bug fixes**
201
+
202
+ - Fixed false L2 mismatch on T-SQL integer `STDDEV` columns.
203
+ - Fixed Redshift `TIMETZ` source-vs-target value mismatch in L2 validation.
204
+
193
205
  ### v1.42.2
194
206
 
195
207
  No user-facing changes in this release.
@@ -99,6 +99,18 @@ For configuration options and examples, see the [official documentation](https:/
99
99
 
100
100
  ## Changelog
101
101
 
102
+ ### v1.42.3
103
+
104
+ **Improvements**
105
+
106
+ - Improved comparison of clock values stored as `VARCHAR` in Iceberg metrics.
107
+ - Added support for staging Redshift `REAL` NaN and infinity values without aborting the extract.
108
+
109
+ **Bug fixes**
110
+
111
+ - Fixed false L2 mismatch on T-SQL integer `STDDEV` columns.
112
+ - Fixed Redshift `TIMETZ` source-vs-target value mismatch in L2 validation.
113
+
102
114
  ### v1.42.2
103
115
 
104
116
  No user-facing changes in this release.
@@ -63,8 +63,13 @@ INT:
63
63
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
64
64
  metric_return_datatype: BIGINT
65
65
  metric_column_modifier: "% 2097143"
66
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
67
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
68
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
69
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
70
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
66
71
  stddev:
67
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
72
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
68
73
  metric_return_datatype: FLOAT
69
74
  metric_column_modifier: "% 2097143"
70
75
 
@@ -92,8 +97,13 @@ SMALLINT:
92
97
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
93
98
  metric_return_datatype: BIGINT
94
99
  metric_column_modifier: "% 2097143"
100
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
101
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
102
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
103
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
104
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
95
105
  stddev:
96
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
106
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
97
107
  metric_return_datatype: FLOAT
98
108
  metric_column_modifier: "% 2097143"
99
109
 
@@ -121,8 +131,13 @@ TINYINT:
121
131
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
122
132
  metric_return_datatype: BIGINT
123
133
  metric_column_modifier: "% 2097143"
134
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
135
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
136
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
137
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
138
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
124
139
  stddev:
125
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
140
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
126
141
  metric_return_datatype: FLOAT
127
142
  metric_column_modifier: "% 2097143"
128
143
 
@@ -666,13 +666,17 @@ TIME WITHOUT TIME ZONE:
666
666
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
667
667
  metric_return_datatype: BIGINT
668
668
 
669
+ # TIMETZ migrates to TIMESTAMP_TZ on a 1970-01-01 sentinel (Snowflake has no
670
+ # offset-aware TIME); render min/max like the L3 template so both sides match.
669
671
  TIMETZ:
670
672
  min:
671
673
  metric_query: MIN("{{ col_name }}")
672
674
  metric_return_datatype: TIMETZ
675
+ metric_normalization: "'1970-01-01T' || TO_CHAR((CURRENT_DATE + {{ metric_query }}) AT TIME ZONE 'UTC', 'HH24:MI:SS.US') || '000+00:00'"
673
676
  max:
674
677
  metric_query: MAX("{{ col_name }}")
675
678
  metric_return_datatype: TIMETZ
679
+ metric_normalization: "'1970-01-01T' || TO_CHAR((CURRENT_DATE + {{ metric_query }}) AT TIME ZONE 'UTC', 'HH24:MI:SS.US') || '000+00:00'"
676
680
  count_null:
677
681
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
678
682
  metric_return_datatype: BIGINT
@@ -681,9 +685,11 @@ TIME WITH TIME ZONE:
681
685
  min:
682
686
  metric_query: MIN("{{ col_name }}")
683
687
  metric_return_datatype: TIMETZ
688
+ metric_normalization: "'1970-01-01T' || TO_CHAR((CURRENT_DATE + {{ metric_query }}) AT TIME ZONE 'UTC', 'HH24:MI:SS.US') || '000+00:00'"
684
689
  max:
685
690
  metric_query: MAX("{{ col_name }}")
686
691
  metric_return_datatype: TIMETZ
692
+ metric_normalization: "'1970-01-01T' || TO_CHAR((CURRENT_DATE + {{ metric_query }}) AT TIME ZONE 'UTC', 'HH24:MI:SS.US') || '000+00:00'"
687
693
  count_null:
688
694
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
689
695
  metric_return_datatype: BIGINT
@@ -112,9 +112,17 @@ def _ln_power_tme_canonical_expr(col_ref: str) -> str:
112
112
  f"ELSE SUBSTRING({mantissa_base}, 1, {decimal_pos} - 1) || "
113
113
  f"CASE WHEN {fraction_trimmed} = '' THEN '' ELSE '.' || {fraction_trimmed} END END"
114
114
  )
115
+ # NaN and ±Inf must return before the NUMERIC cast. Redshift raises 8001
116
+ # (numeric_bound.cpp, "scale float to decimal") if either reaches it.
117
+ # A stored REAL NaN does not compare equal to ``'NaN'::float4``; its text does.
118
+ # ±Inf does compare equal to the float8 literals. Snowflake TO_DOUBLE accepts
119
+ # the texts below.
115
120
  return (
116
121
  f"CASE WHEN {col_ref} IS NULL THEN NULL "
117
122
  f"WHEN {col_ref} = 0 THEN '0E0' "
123
+ f"WHEN LOWER(CAST({col_ref} AS VARCHAR)) = 'nan' THEN 'nan' "
124
+ f"WHEN {col_ref} = 'Infinity'::float8 THEN 'inf' "
125
+ f"WHEN {col_ref} = '-Infinity'::float8 THEN '-inf' "
118
126
  f"ELSE UPPER({mantissa_trimmed}) || 'E' || TRIM(CAST({exp_int} AS VARCHAR)) END"
119
127
  )
120
128
 
@@ -186,6 +186,51 @@ VARCHAR_ISO_TZ:
186
186
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
187
187
  metric_return_datatype: NUMBER
188
188
 
189
+ # VARCHAR mirror of a source clock. Parse the text, then emit FF6 and drop an
190
+ # all-zero fraction (the literal '.000000' that TO_CHAR FF6 always writes).
191
+ # TIME WITH TIME ZONE uses its own parser: TRY_TO_TIMESTAMP_TZ without a format
192
+ # returns NULL for 'HH:MI:SS±HH:MM' text.
193
+ VARCHAR_TIME:
194
+ min:
195
+ metric_query: MIN(TRY_TO_TIME(TRIM("{{ col_name }}")))
196
+ metric_return_datatype: VARCHAR
197
+ metric_normalization: REPLACE(TO_CHAR({{ metric_query }}, 'HH24:MI:SS.FF6'), '.000000', '')
198
+ max:
199
+ metric_query: MAX(TRY_TO_TIME(TRIM("{{ col_name }}")))
200
+ metric_return_datatype: VARCHAR
201
+ metric_normalization: REPLACE(TO_CHAR({{ metric_query }}, 'HH24:MI:SS.FF6'), '.000000', '')
202
+ count_null:
203
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
204
+ metric_return_datatype: NUMBER
205
+
206
+ VARCHAR_TIMESTAMP:
207
+ min:
208
+ metric_query: MIN(TRY_TO_TIMESTAMP_NTZ(TRIM("{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF9'))
209
+ metric_return_datatype: VARCHAR
210
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
211
+ max:
212
+ metric_query: MAX(TRY_TO_TIMESTAMP_NTZ(TRIM("{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF9'))
213
+ metric_return_datatype: VARCHAR
214
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
215
+ count_null:
216
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
217
+ metric_return_datatype: NUMBER
218
+
219
+ # Order by UTC time-of-day. A plain MIN of the parsed instant uses today's date
220
+ # and can cross midnight, so the formatted value would keep the wrong offset.
221
+ VARCHAR_TIME_TZ:
222
+ min:
223
+ metric_query: MIN_BY(TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}"), 'HH24:MI:SS.FF6TZH:TZM'), TIME(CONVERT_TIMEZONE('UTC', TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}"), 'HH24:MI:SS.FF6TZH:TZM'))))
224
+ metric_return_datatype: VARCHAR
225
+ metric_normalization: REPLACE(REGEXP_REPLACE(TO_CHAR({{ metric_query }}, 'HH24:MI:SS.FF6TZH:TZM'), 'Z$', '+00:00'), '.000000', '')
226
+ max:
227
+ metric_query: MAX_BY(TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}"), 'HH24:MI:SS.FF6TZH:TZM'), TIME(CONVERT_TIMEZONE('UTC', TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}"), 'HH24:MI:SS.FF6TZH:TZM'))))
228
+ metric_return_datatype: VARCHAR
229
+ metric_normalization: REPLACE(REGEXP_REPLACE(TO_CHAR({{ metric_query }}, 'HH24:MI:SS.FF6TZH:TZM'), 'Z$', '+00:00'), '.000000', '')
230
+ count_null:
231
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
232
+ metric_return_datatype: NUMBER
233
+
189
234
  # Paired PostgreSQL BYTEA / SQL Server VARBINARY mirrors.
190
235
  BINARY:
191
236
  min:
@@ -15,6 +15,7 @@
15
15
 
16
16
 
17
17
  import logging
18
+ import re
18
19
 
19
20
  import pandas as pd
20
21
 
@@ -50,6 +51,7 @@ from snowflake.snowflake_data_validation.teradata.teradata_iso_normalization imp
50
51
  )
51
52
  from snowflake.snowflake_data_validation.utils.constants import (
52
53
  COL_NAME_NO_QUOTES_PLACEHOLDER,
54
+ COL_NAME_QUOTES_PLACEHOLDER,
53
55
  EXPLICIT_METRIC_NORMALIZATION_COLUMN_KEY,
54
56
  METRIC_QUERY_PLACEHOLDER,
55
57
  NORMALIZATION_COLUMN_KEY,
@@ -61,6 +63,7 @@ from snowflake.snowflake_data_validation.utils.iso_dv_common import (
61
63
  normalize_snowflake_base_type,
62
64
  resolve_snowflake_interval_normalization_key,
63
65
  resolve_snowflake_iso_tz_varchar_metrics_type,
66
+ resolve_snowflake_varchar_temporal_metrics_type,
64
67
  )
65
68
  from snowflake.snowflake_data_validation.utils.measure_collation import (
66
69
  COUNT_DISTINCT_METRIC,
@@ -133,6 +136,23 @@ def build_snowflake_float_bit_canonical_expr(col_ref: str) -> str:
133
136
  return build_binary64_canonical_expr(col_ref)
134
137
 
135
138
 
139
+ # Paired T-SQL sources whose L2 stddev is exact integer math (SNOW-4229286). Snowflake must
140
+ # match it: STDDEV_POP over FLOAT drifts too (0.0055 on 3M identical inv_date_sk values).
141
+ _EXACT_STDDEV_SOURCE_PLATFORMS = (Platform.SQLSERVER, Platform.AZURE_SYNAPSE)
142
+ _EXACT_STDDEV_SOURCE_TYPES = frozenset({"INT", "SMALLINT", "TINYINT"})
143
+ _FLOAT_STDDEV_POP_RE = re.compile(r"STDDEV_POP\(CAST\((?P<operand>.+) AS FLOAT\)\)")
144
+
145
+
146
+ def _exact_integer_stddev(metric_template: str) -> str | None:
147
+ """Rewrite ``STDDEV_POP(CAST(x AS FLOAT))`` as exact ``SQRT(n*SUM(x^2) - SUM(x)^2) / n``."""
148
+ match = _FLOAT_STDDEV_POP_RE.fullmatch(metric_template.strip())
149
+ if not match:
150
+ return None
151
+ col = COL_NAME_QUOTES_PLACEHOLDER
152
+ x = f"CAST({match.group('operand')} AS NUMBER(38, 0))"
153
+ return f"SQRT(CAST(COUNT({col}) * SUM({x} * {x}) - SUM({x}) * SUM({x}) AS FLOAT)) / NULLIF(COUNT({col}), 0)"
154
+
155
+
136
156
  class QueryGeneratorSnowflake(QueryGeneratorBase):
137
157
  """Snowflake-specific implementation of query generator."""
138
158
 
@@ -417,6 +437,15 @@ class QueryGeneratorSnowflake(QueryGeneratorBase):
417
437
  )
418
438
  if iso_tz_type:
419
439
  return iso_tz_type
440
+ temporal_text_type = resolve_snowflake_varchar_temporal_metrics_type(
441
+ col.data_type,
442
+ paired_source,
443
+ paired_source_platform=table_context.paired_source_platform,
444
+ iceberg_spec=table_context.iceberg_spec,
445
+ storage_mode=table_context.storage_mode,
446
+ )
447
+ if temporal_text_type:
448
+ return temporal_text_type
420
449
  if target_base in {"TEXT", "STRING"}:
421
450
  return "VARCHAR"
422
451
  return target_base or col.data_type
@@ -438,6 +467,8 @@ class QueryGeneratorSnowflake(QueryGeneratorBase):
438
467
  if metric_name == "count_null":
439
468
  return metric_template
440
469
  paired_source_type = get_paired_source_column_types(table_context).get(col.name)
470
+ if metric_name == "stddev":
471
+ return self._paired_stddev_template(metric_template, paired_source_type, table_context)
441
472
  if not is_blank_padded_char_type(paired_source_type or ""):
442
473
  return metric_template
443
474
  if not should_rtrim_snowflake_for_padded_source(col.data_type, paired_source_type, metric_template):
@@ -445,6 +476,19 @@ class QueryGeneratorSnowflake(QueryGeneratorBase):
445
476
  quoted_col = f'"{COL_NAME_NO_QUOTES_PLACEHOLDER}"'
446
477
  return metric_template.replace(quoted_col, wrap_rtrim(quoted_col))
447
478
 
479
+ @staticmethod
480
+ def _paired_stddev_template(
481
+ metric_template: str,
482
+ paired_source_type: str | None,
483
+ table_context: TableContext,
484
+ ) -> str:
485
+ """Use the exact integer stddev the paired T-SQL source computes, else keep the template."""
486
+ if getattr(table_context, "paired_source_platform", None) not in _EXACT_STDDEV_SOURCE_PLATFORMS:
487
+ return metric_template
488
+ if (paired_source_type or "").upper().split("(")[0].strip() not in _EXACT_STDDEV_SOURCE_TYPES:
489
+ return metric_template
490
+ return _exact_integer_stddev(metric_template) or metric_template
491
+
448
492
  def _resolve_metric_normalization(
449
493
  self,
450
494
  col,
@@ -260,10 +260,13 @@ INT:
260
260
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
261
261
  metric_return_datatype: BIGINT
262
262
  metric_column_modifier: "% 2097143"
263
- # Cast STDEVP input to FLOAT to prevent SUM-of-squares overflow
264
- # (SNOW-3443973).
265
- stddev:
266
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
263
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
264
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
265
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
266
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
267
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
268
+ stddev:
269
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
267
270
  metric_return_datatype: FLOAT
268
271
  metric_column_modifier: "% 2097143"
269
272
 
@@ -479,8 +482,13 @@ SMALLINT:
479
482
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
480
483
  metric_return_datatype: BIGINT
481
484
  metric_column_modifier: "% 2097143"
482
- stddev:
483
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
485
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
486
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
487
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
488
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
489
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
490
+ stddev:
491
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
484
492
  metric_return_datatype: FLOAT
485
493
  metric_column_modifier: "% 2097143"
486
494
 
@@ -572,8 +580,13 @@ TINYINT:
572
580
  metric_query: SUM(CAST("{{ col_name }}" {{ modifier }} AS BIGINT))
573
581
  metric_return_datatype: BIGINT
574
582
  metric_column_modifier: "% 2097143"
583
+ # Exact integer variance (SNOW-4229286): n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), only the
584
+ # final SQRT in FLOAT. STDEVP over FLOAT cancels catastrophically when values are large
585
+ # and spread small (inventory.inv_date_sk: 0-5.5 vs Snowflake 3.5 on identical data).
586
+ # 32-bit values keep n*SUM(x^2) inside DECIMAL(38) even with the modifier off; BIGINT
587
+ # stays on FLOAT STDEVP because raw 64-bit squares would overflow it.
575
588
  stddev:
576
- metric_query: STDEVP(CAST("{{ col_name }}" {{ modifier }} AS FLOAT))
589
+ metric_query: SQRT(CAST(COUNT_BIG("{{ col_name }}") * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0)) * CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) - SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) * SUM(CAST("{{ col_name }}" {{ modifier }} AS DECIMAL(38, 0))) AS FLOAT)) / NULLIF(COUNT_BIG("{{ col_name }}"), 0)
577
590
  metric_return_datatype: FLOAT
578
591
  metric_column_modifier: "% 2097143"
579
592
 
@@ -14,6 +14,8 @@ from __future__ import annotations
14
14
 
15
15
  import re
16
16
 
17
+ from enum import StrEnum
18
+
17
19
  import pandas as pd
18
20
 
19
21
  from snowflake.snowflake_data_validation.utils.constants import (
@@ -23,6 +25,9 @@ from snowflake.snowflake_data_validation.utils.constants import (
23
25
  NOT_APPLICABLE_CRITERIA_VALUE,
24
26
  Platform,
25
27
  )
28
+ from snowflake.snowflake_data_validation.utils.iceberg_dv_common import (
29
+ is_iceberg_compatible_dv_profile,
30
+ )
26
31
  from snowflake.snowflake_data_validation.utils.interval_common import (
27
32
  SNOWFLAKE_INTERVAL_DV_FAMILIES,
28
33
  normalize_interval_datatype_key,
@@ -39,6 +44,49 @@ _SNOWFLAKE_TIMESTAMP_FAMILY = frozenset({"TIMESTAMP_NTZ", "TIMESTAMP_TZ", "TIMES
39
44
  PAIRED_TARGET_COLUMN_TYPES_ATTR = "paired_target_column_types"
40
45
  PAIRED_SOURCE_COLUMN_TYPES_ATTR = "paired_source_column_types"
41
46
  VARCHAR_ISO_TZ_METRICS_TYPE = "VARCHAR_ISO_TZ"
47
+ VARCHAR_TIME_METRICS_TYPE = "VARCHAR_TIME"
48
+ VARCHAR_TIMESTAMP_METRICS_TYPE = "VARCHAR_TIMESTAMP"
49
+ VARCHAR_TIME_TZ_METRICS_TYPE = "VARCHAR_TIME_TZ"
50
+
51
+
52
+ class _IsoClockTextKey(StrEnum):
53
+ """Lookup key for a source clock whose extract writes the template text.
54
+
55
+ ``TIME_TZ`` is synthesized from ``TIME … WITH TIME ZONE``. The other
56
+ members match the leading catalog token.
57
+ """
58
+
59
+ TIME = "TIME"
60
+ TIME_TZ = "TIME_TZ"
61
+ TIMESTAMP = "TIMESTAMP"
62
+ DATETIME = "DATETIME"
63
+ DATETIME2 = "DATETIME2"
64
+ SMALLDATETIME = "SMALLDATETIME"
65
+
66
+
67
+ # SQL Server and Azure Synapse emit the same datetime text canon.
68
+ _SQLSERVER_DATETIME_CLOCK_METRICS: dict[_IsoClockTextKey, str] = {
69
+ _IsoClockTextKey.DATETIME: VARCHAR_TIMESTAMP_METRICS_TYPE,
70
+ _IsoClockTextKey.DATETIME2: VARCHAR_TIMESTAMP_METRICS_TYPE,
71
+ _IsoClockTextKey.SMALLDATETIME: VARCHAR_TIMESTAMP_METRICS_TYPE,
72
+ }
73
+
74
+ # Redshift TIME and PostgreSQL TIMESTAMP are absent: their extract is not that canon.
75
+ _ISO_CLOCK_TEXT_METRICS: dict[Platform, dict[_IsoClockTextKey, str]] = {
76
+ Platform.TERADATA: {
77
+ _IsoClockTextKey.TIME: VARCHAR_TIME_METRICS_TYPE,
78
+ _IsoClockTextKey.TIME_TZ: VARCHAR_TIME_TZ_METRICS_TYPE,
79
+ _IsoClockTextKey.TIMESTAMP: VARCHAR_TIMESTAMP_METRICS_TYPE,
80
+ },
81
+ Platform.REDSHIFT: {
82
+ _IsoClockTextKey.TIMESTAMP: VARCHAR_TIMESTAMP_METRICS_TYPE,
83
+ },
84
+ Platform.ORACLE: {
85
+ _IsoClockTextKey.TIMESTAMP: VARCHAR_TIMESTAMP_METRICS_TYPE,
86
+ },
87
+ Platform.SQLSERVER: _SQLSERVER_DATETIME_CLOCK_METRICS,
88
+ Platform.AZURE_SYNAPSE: _SQLSERVER_DATETIME_CLOCK_METRICS,
89
+ }
42
90
 
43
91
  _MAPPED_VARCHAR_LENGTH_RE = re.compile(
44
92
  r"^\s*VARCHAR\s*\(\s*(\d+)\s*\)\s*$",
@@ -113,6 +161,53 @@ def resolve_snowflake_iso_tz_varchar_metrics_type(
113
161
  return None
114
162
 
115
163
 
164
+ def _iso_clock_text_key(source_data_type: str) -> _IsoClockTextKey | None:
165
+ """Return the extract-canon key for a source clock label."""
166
+ upper = source_data_type.strip().upper()
167
+ if not upper or upper.startswith("PERIOD") or "WITH LOCAL TIME ZONE" in upper:
168
+ return None
169
+ leading = upper.split("(", 1)[0].strip().split()[0]
170
+ has_time_zone = "WITH TIME ZONE" in upper
171
+ if leading == _IsoClockTextKey.TIME and has_time_zone:
172
+ return _IsoClockTextKey.TIME_TZ
173
+ if leading == _IsoClockTextKey.TIME:
174
+ return _IsoClockTextKey.TIME
175
+ if leading == _IsoClockTextKey.TIMESTAMP and not has_time_zone:
176
+ return _IsoClockTextKey.TIMESTAMP
177
+ if leading in _SQLSERVER_DATETIME_CLOCK_METRICS:
178
+ return _IsoClockTextKey(leading)
179
+ return None
180
+
181
+
182
+ def resolve_snowflake_varchar_temporal_metrics_type(
183
+ target_snowflake_type: str,
184
+ source_data_type: str | None,
185
+ *,
186
+ paired_source_platform: Platform | None = None,
187
+ iceberg_spec: str | None = None,
188
+ storage_mode: str | None = None,
189
+ ) -> str | None:
190
+ """Return the VARCHAR clock metric key when this extract writes that canon.
191
+
192
+ Iceberg compatible stores some source clocks as VARCHAR. The parser is
193
+ selected only for a platform whose extract emits the template text.
194
+ Any other pairing stays on VARCHAR length metrics.
195
+ """
196
+ if not source_data_type:
197
+ return None
198
+ if not is_iceberg_compatible_dv_profile(iceberg_spec, storage_mode):
199
+ return None
200
+ if normalize_snowflake_base_type(target_snowflake_type) not in _VARCHAR_LIKE_SNOWFLAKE_BASE_TYPES:
201
+ return None
202
+ clock_key = _iso_clock_text_key(source_data_type)
203
+ if clock_key is None or paired_source_platform is None:
204
+ return None
205
+ platform_metrics = _ISO_CLOCK_TEXT_METRICS.get(paired_source_platform)
206
+ if platform_metrics is None:
207
+ return None
208
+ return platform_metrics.get(clock_key)
209
+
210
+
116
211
  def is_snowflake_varchar_like_type(data_type: str | None) -> bool:
117
212
  """Return True for any Snowflake VARCHAR-family catalog label.
118
213
 
@@ -96,3 +96,41 @@ def test_timetz_l1_enrichment_clears_source_scale() -> None:
96
96
  )
97
97
 
98
98
  assert enriched["NUMERIC_SCALE"].isna().all()
99
+
100
+
101
+ _METRICS_YAML = _TEMPLATES / "redshift_column_metrics_templates.yaml"
102
+
103
+
104
+ @pytest.fixture(scope="module")
105
+ def metrics_templates() -> dict[str, dict[str, dict[str, str]]]:
106
+ """Load Redshift L2 column metrics templates from disk."""
107
+ with _METRICS_YAML.open(encoding="utf-8") as handle:
108
+ return yaml.safe_load(handle)
109
+
110
+
111
+ @pytest.mark.parametrize("metric", ["min", "max"])
112
+ @pytest.mark.parametrize("redshift_type", _TIMETZ_ALIASES)
113
+ def test_timetz_l2_min_max_emit_unix_epoch_sentinel_utc_iso(
114
+ metrics_templates: dict[str, dict[str, dict[str, str]]],
115
+ redshift_type: str,
116
+ metric: str,
117
+ ) -> None:
118
+ """L2 min/max must render the same sentinel TIMESTAMP_TZ text as L3.
119
+
120
+ Snowflake reports MIN/MAX of the TIMESTAMP_TZ mirror as
121
+ ``1970-01-01T12:00:00.000000000+00:00``; a bare ``12:00:00+00:00`` from
122
+ Redshift would flag equal values as different.
123
+ """
124
+ from snowflake.snowflake_data_validation.query.query_generator_base import (
125
+ QueryGeneratorBase,
126
+ )
127
+
128
+ entry = metrics_templates[redshift_type][metric]
129
+ normalization = entry.get("metric_normalization")
130
+ assert normalization, f"{redshift_type}.{metric} has no metric_normalization"
131
+ aggregate = f'{metric.upper()}("COL_TIMETZ")'
132
+ rendered = QueryGeneratorBase._wrap_metric_with_normalization(normalization, aggregate)
133
+ assert rendered == (
134
+ f"'1970-01-01T' || TO_CHAR((CURRENT_DATE + {aggregate}) AT TIME ZONE 'UTC', "
135
+ "'HH24:MI:SS.US') || '000+00:00'"
136
+ )
@@ -0,0 +1,140 @@
1
+ # Copyright 2026 Snowflake Inc.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ """T-SQL integer stddev is computed exactly, not by STDEVP over FLOAT (SNOW-4229286).
5
+
6
+ STDEVP(CAST(col AS FLOAT)) cancels catastrophically when values are large and the spread
7
+ small: dmvf-benchmark #158 saw inventory.inv_date_sk stddev swing 0-5.5 per partition on
8
+ SQL Server while Snowflake reported a steady 3.5 on identical data (MIN/MAX/SUM/AVG all
9
+ matched). 32-bit integer columns now get n*SUM(x^2) - SUM(x)^2 in DECIMAL(38, 0), with only
10
+ the final SQRT in FLOAT, and the Snowflake side of those pairings does the same in NUMBER(38, 0)
11
+ because its STDDEV_POP over FLOAT drifts as well (0.0055 on 3M identical values).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import math
17
+
18
+ from types import SimpleNamespace
19
+
20
+ from pathlib import Path
21
+
22
+ import pytest
23
+ import yaml
24
+
25
+ from jinja2 import Template
26
+
27
+ from snowflake.snowflake_data_validation.snowflake.query.query_generator_snowflake import (
28
+ QueryGeneratorSnowflake,
29
+ )
30
+ from snowflake.snowflake_data_validation.utils.constants import Platform
31
+
32
+
33
+ TEMPLATES_ROOT = Path(__file__).resolve().parents[3] / "src/snowflake/snowflake_data_validation"
34
+ TEMPLATE_FILES = {
35
+ "sqlserver": TEMPLATES_ROOT / "sqlserver/extractor/templates/sqlserver_column_metrics_templates.yaml",
36
+ "azure_synapse": TEMPLATES_ROOT
37
+ / "azure_synapse/extractor/templates/azure_synapse_column_metrics_templates.yaml",
38
+ }
39
+ INTEGER_TYPES = ("INT", "SMALLINT", "TINYINT")
40
+ MODIFIER = "% 2097143"
41
+
42
+
43
+ def _stddev(platform: str, section: str) -> dict:
44
+ return yaml.safe_load(TEMPLATE_FILES[platform].read_text())[section]["stddev"]
45
+
46
+
47
+ @pytest.mark.parametrize("platform", TEMPLATE_FILES)
48
+ @pytest.mark.parametrize("section", INTEGER_TYPES)
49
+ def test_integer_stddev_uses_exact_decimal_variance(platform, section):
50
+ metric = _stddev(platform, section)
51
+ query = metric["metric_query"]
52
+ assert "STDEVP" not in query, f"{platform}.{section} still uses float STDEVP: {query}"
53
+ assert "AS DECIMAL(38, 0)" in query
54
+ assert "COUNT_BIG(" in query
55
+ assert "NULLIF(COUNT_BIG(" in query, "empty partition must yield NULL, not divide by zero"
56
+ assert metric["metric_column_modifier"] == MODIFIER
57
+ assert metric["metric_return_datatype"] == "FLOAT"
58
+
59
+
60
+ @pytest.mark.parametrize("platform", TEMPLATE_FILES)
61
+ def test_bigint_stddev_stays_on_float(platform):
62
+ # Raw 64-bit squares overflow DECIMAL(38) once the modifier is turned off.
63
+ assert _stddev(platform, "BIGINT")["metric_query"].startswith("STDEVP(CAST(")
64
+
65
+
66
+ @pytest.mark.parametrize("platform", TEMPLATE_FILES)
67
+ def test_rendered_query_applies_modifier_to_every_operand(platform):
68
+ rendered = Template(_stddev(platform, "INT")["metric_query"]).render(
69
+ col_name="INV_DATE_SK", modifier=MODIFIER
70
+ )
71
+ assert rendered.count(f'CAST("INV_DATE_SK" {MODIFIER} AS DECIMAL(38, 0))') == 4
72
+ assert rendered.count('COUNT_BIG("INV_DATE_SK")') == 2
73
+
74
+
75
+ def test_formula_matches_population_stddev_where_float_cancels():
76
+ # Two weekly date keys, as in an inventory partition: exact answer is 3.5.
77
+ values = [2451000 % 2097143] * 3_000_000 + [2451007 % 2097143] * 3_000_000
78
+ n = len(values)
79
+ s = sum(values)
80
+ ss = sum(v * v for v in values)
81
+ assert math.sqrt(n * ss - s * s) / n == pytest.approx(3.5, abs=1e-9)
82
+
83
+
84
+ SNOWFLAKE_TEMPLATES = (
85
+ TEMPLATES_ROOT / "snowflake/extractor/templates/snowflake_column_metrics_templates.yaml"
86
+ )
87
+ # Other-pairing cases only need a shape the regex accepts. The rewrite case loads
88
+ # NUMBER.stddev from YAML so a template edit that misses _FLOAT_STDDEV_POP_RE fails here
89
+ # instead of silently keeping float STDDEV_POP.
90
+ SNOWFLAKE_FLOAT_STDDEV = 'STDDEV_POP(CAST("{{ col_name }}" % 2097143 AS FLOAT))'
91
+
92
+
93
+ def _snowflake_number_stddev_template() -> str:
94
+ metric = yaml.safe_load(SNOWFLAKE_TEMPLATES.read_text())["NUMBER"]["stddev"]
95
+ return metric["metric_query"].replace("{{ modifier }}", metric["metric_column_modifier"])
96
+
97
+
98
+ def _snowflake_ctx(platform, source_type):
99
+ return SimpleNamespace(
100
+ paired_source_platform=platform,
101
+ paired_source_column_types={"INV_DATE_SK": source_type},
102
+ )
103
+
104
+
105
+ @pytest.mark.parametrize("platform", [Platform.SQLSERVER, Platform.AZURE_SYNAPSE])
106
+ @pytest.mark.parametrize("source_type", ["int", "SMALLINT", "TINYINT"])
107
+ def test_snowflake_matches_exact_tsql_integer_stddev(platform, source_type):
108
+ template = _snowflake_number_stddev_template()
109
+ assert "STDDEV_POP(CAST(" in template
110
+ query = QueryGeneratorSnowflake._paired_stddev_template(
111
+ template, source_type, _snowflake_ctx(platform, source_type)
112
+ )
113
+ assert "STDDEV_POP" not in query
114
+ assert query.count('CAST("{{ col_name }}" % 2097143 AS NUMBER(38, 0))') == 4
115
+ assert query.endswith('/ NULLIF(COUNT("{{ col_name }}"), 0)')
116
+
117
+
118
+ def test_paired_stddev_keeps_template_when_shape_misses():
119
+ raw = 'STDDEV_POP("x")'
120
+ query = QueryGeneratorSnowflake._paired_stddev_template(
121
+ raw, "int", _snowflake_ctx(Platform.SQLSERVER, "int")
122
+ )
123
+ assert query == raw
124
+
125
+
126
+ @pytest.mark.parametrize(
127
+ ("platform", "source_type"),
128
+ [
129
+ (Platform.SQLSERVER, "bigint"),
130
+ (Platform.SQLSERVER, "decimal(18,2)"),
131
+ (Platform.ORACLE, "NUMBER"),
132
+ (Platform.TERADATA, "INTEGER"),
133
+ (None, None),
134
+ ],
135
+ )
136
+ def test_snowflake_keeps_float_stddev_for_other_pairings(platform, source_type):
137
+ query = QueryGeneratorSnowflake._paired_stddev_template(
138
+ SNOWFLAKE_FLOAT_STDDEV, source_type, _snowflake_ctx(platform, source_type)
139
+ )
140
+ assert query == SNOWFLAKE_FLOAT_STDDEV
@@ -92,6 +92,10 @@ def test_redshift_tme_shims_remain_for_data_migration_staging() -> None:
92
92
  real_expr = build_redshift_real_tme_shim("v")
93
93
  assert float_expr == real_expr
94
94
  assert "'0E0'" in real_expr
95
+ assert "WHEN LOWER(CAST(v AS VARCHAR)) = 'nan' THEN 'nan'" in real_expr
96
+ assert "WHEN v = 'Infinity'::float8 THEN 'inf'" in real_expr
97
+ assert "WHEN v = '-Infinity'::float8 THEN '-inf'" in real_expr
98
+ assert real_expr.index("= 'nan'") < real_expr.index("NUMERIC(38, 15)")
95
99
  assert "POWER(10" in real_expr
96
100
  assert "'0|0|0'" not in real_expr
97
101