snowflake-data-validation 1.45.2__tar.gz → 1.45.4__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 (715) hide show
  1. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/PKG-INFO +28 -2
  2. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/README.md +26 -0
  3. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/pyproject.toml +3 -2
  4. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/query/query_generator_bigquery.py +1 -1
  5. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/extractor/sql_queries_template_generator.py +35 -1
  6. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/query/query_generator_oracle.py +27 -1
  7. snowflake_data_validation-1.45.4/src/snowflake/snowflake_data_validation/query/normalization_render_context.py +51 -0
  8. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/query_generator_base.py +8 -9
  9. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_column_metrics_templates.yaml +46 -0
  10. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/query/query_generator_redshift.py +38 -22
  11. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_column_metrics_templates.yaml +46 -0
  12. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_datatypes_normalization_templates.yaml +10 -8
  13. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_case_sensitive_columns.sql.j2 +4 -4
  14. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_columns_metadata.sql.j2 +3 -3
  15. snowflake_data_validation-1.45.4/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_iceberg_format_version.sql.j2 +2 -0
  16. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_table_metadata_query.sql.j2 +7 -7
  17. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/query/query_generator_snowflake.py +49 -28
  18. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_column_metrics_templates.yaml +4 -2
  19. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_table_metadata_query.sql.j2 +5 -0
  20. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/query/query_generator_teradata.py +2 -1
  21. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/constants.py +21 -0
  22. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/iceberg_dv_common.py +127 -8
  23. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/iso_dv_common.py +20 -5
  24. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/teradata_string_rtrim.py +42 -3
  25. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/data_validator_base.py +71 -1
  26. snowflake_data_validation-1.45.4/src/snowflake/snowflake_data_validation/validation/lossy_number_mapping.py +59 -0
  27. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_table_metadata_float_precision.py +2 -2
  28. snowflake_data_validation-1.45.4/tests/unit/Teradata/test_teradata_unicode_character_length.py +98 -0
  29. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_query_generator.py +47 -0
  30. snowflake_data_validation-1.45.4/tests/unit/query/test_normalization_render_context.py +56 -0
  31. snowflake_data_validation-1.45.4/tests/unit/snowflake/test_snowflake_get_iceberg_format_version.py +73 -0
  32. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_data_validator.py +81 -1
  33. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_float_bit_canonical.py +19 -25
  34. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_iceberg_dv_l3_normalization.py +103 -10
  35. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_iso_dv_common.py +47 -1
  36. snowflake_data_validation-1.45.4/tests/unit/test_lossy_number_mapping.py +57 -0
  37. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_metrics_tolerance.py +23 -0
  38. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_postgresql_tz_normalization.py +2 -1
  39. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_generator_numeric_scale.py +10 -6
  40. snowflake_data_validation-1.45.4/tests/unit/test_redshift_iceberg_timestamp_metrics.py +175 -0
  41. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_redshift_native_timestamptz_ltz.py +3 -1
  42. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sql_literal_jinja_filter.py +51 -1
  43. snowflake_data_validation-1.45.4/tests/unit/test_teradata_string_rtrim_policy.py +305 -0
  44. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_timestamp_golden_vectors.py +26 -10
  45. snowflake_data_validation-1.45.2/tests/unit/test_teradata_string_rtrim_policy.py +0 -170
  46. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/.gitignore +0 -0
  47. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/LICENSE +0 -0
  48. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/docs/README.md +0 -0
  49. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/__init__.py +0 -0
  50. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/__init__.py +0 -0
  51. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/azure_synapse_arguments_manager.py +0 -0
  52. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/connector/__init__.py +0 -0
  53. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_azure_synapse.py +0 -0
  54. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/connector/connector_factory_azure_synapse.py +0 -0
  55. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/__init__.py +0 -0
  56. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/metadata_extractor_azure_synapse.py +0 -0
  57. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_cell_validation_data_select.sql.j2 +0 -0
  58. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_column_metrics_templates.yaml +0 -0
  59. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_datatypes_normalization_templates.yaml +0 -0
  60. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_get_columns_metadata.sql.j2 +0 -0
  61. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_count_query.sql.j2 +0 -0
  62. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_row_md5_select.sql.j2 +0 -0
  63. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_table_metadata_query.sql.j2 +0 -0
  64. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/extractor/templates/azure_synapse_to_snowflake_datatypes_mapping_template.yaml +0 -0
  65. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/model/__init__.py +0 -0
  66. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/model/azure_synapse_credentials_connection.py +0 -0
  67. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/query/__init__.py +0 -0
  68. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/query/query_generator_azure_synapse.py +0 -0
  69. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/__init__.py +0 -0
  70. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/azure_synapse/script_writer/script_writer_azure_synapse.py +0 -0
  71. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/__init__.py +0 -0
  72. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/__init__.py +0 -0
  73. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_cell_validation_data_select.sql.j2 +0 -0
  74. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_column_metrics_templates.yaml +0 -0
  75. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_datatypes_normalization_templates.yaml +0 -0
  76. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_get_columns_metadata.sql.j2 +0 -0
  77. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_row_count_query.sql.j2 +0 -0
  78. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_row_md5_select.sql.j2 +0 -0
  79. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_table_metadata_query.sql.j2 +0 -0
  80. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/extractor/templates/bigquery_to_snowflake_datatypes_mapping_template.yaml +0 -0
  81. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/bigquery/query/__init__.py +0 -0
  82. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/comparison_orchestrator.py +0 -0
  83. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/__init__.py +0 -0
  84. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/configuration_loader.py +0 -0
  85. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/configuration_model.py +0 -0
  86. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/connection_types.py +0 -0
  87. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/connections/__init__.py +0 -0
  88. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/logging_configuration.py +0 -0
  89. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/table_configuration.py +0 -0
  90. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/validation_configuration.py +0 -0
  91. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/model/view_configuration.py +0 -0
  92. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/configuration/singleton.py +0 -0
  93. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/connector/__init__.py +0 -0
  94. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/connector/connector_base.py +0 -0
  95. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/connector/connector_factory_base.py +0 -0
  96. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/connector/connector_failure_tracker.py +0 -0
  97. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/__init__.py +0 -0
  98. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/db2_lob_normalization.py +0 -0
  99. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/__init__.py +0 -0
  100. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/metadata_extractor_db2.py +0 -0
  101. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_cell_validation_data_select.sql.j2 +0 -0
  102. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_column_metrics_templates.yaml +0 -0
  103. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_datatypes_normalization_templates.yaml +0 -0
  104. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_get_columns_metadata.sql.j2 +0 -0
  105. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_row_count_query.sql.j2 +0 -0
  106. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_row_md5_select.sql.j2 +0 -0
  107. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_table_metadata_query.sql.j2 +0 -0
  108. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/extractor/templates/db2_to_snowflake_datatypes_mapping_template.yaml +0 -0
  109. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/query/__init__.py +0 -0
  110. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/query/query_generator_db2.py +0 -0
  111. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/script_writer/__init__.py +0 -0
  112. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/db2/script_writer/script_writer_db2.py +0 -0
  113. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/__init__.py +0 -0
  114. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/async_generation_executor.py +0 -0
  115. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/async_validation_executor.py +0 -0
  116. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/base_validation_executor.py +0 -0
  117. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/executor_factory.py +0 -0
  118. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/extractor_types.py +0 -0
  119. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/source_validation_executor.py +0 -0
  120. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/executer/sync_validation_executor.py +0 -0
  121. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/extractor/__init__.py +0 -0
  122. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/extractor/metadata_extractor_base.py +0 -0
  123. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/__init__.py +0 -0
  124. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/__init__.py +0 -0
  125. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/metadata_extractor_oracle.py +0 -0
  126. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_cell_validation_data_select.sql.j2 +0 -0
  127. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_column_metrics_templates.yaml +0 -0
  128. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_datatypes_normalization_templates.yaml +0 -0
  129. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_get_columns_metadata.sql.j2 +0 -0
  130. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_count_query.sql.j2 +0 -0
  131. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_row_md5_select.sql.j2 +0 -0
  132. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_table_metadata_query.sql.j2 +0 -0
  133. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/extractor/templates/oracle_to_snowflake_datatypes_mapping_template.yaml +0 -0
  134. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_bfile.py +0 -0
  135. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_iso_normalization.py +0 -0
  136. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_lob_normalization.py +0 -0
  137. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_statement_functions.py +0 -0
  138. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_vector_extraction.py +0 -0
  139. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/oracle_xmltype.py +0 -0
  140. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/query/__init__.py +0 -0
  141. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/script_writer/__init__.py +0 -0
  142. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/oracle/script_writer/script_writer_oracle.py +0 -0
  143. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/__init__.py +0 -0
  144. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/html_report_builder.py +0 -0
  145. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/report_metadata.py +0 -0
  146. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/parallel_execution_engine.py +0 -0
  147. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/table_metadata_processor.py +0 -0
  148. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/validation_progress_reporter.py +0 -0
  149. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/orchestration/view_preprocessor.py +0 -0
  150. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/__init__.py +0 -0
  151. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/connector/__init__.py +0 -0
  152. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_factory_postgresql.py +0 -0
  153. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/connector/connector_postgresql.py +0 -0
  154. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/__init__.py +0 -0
  155. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/metadata_extractor_postgresql.py +0 -0
  156. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_cell_validation_data_select.sql.j2 +0 -0
  157. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  158. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_concatenated_table_template.sql.j2 +0 -0
  159. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_md5_insert_template.sql.j2 +0 -0
  160. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_chunk_row_md5_table_template.sql.j2 +0 -0
  161. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_column_metrics_templates.yaml +0 -0
  162. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_datatypes_normalization_templates.yaml +0 -0
  163. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_extract_md5_rows_chunk.sql.j2 +0 -0
  164. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_get_columns_metadata.sql.j2 +0 -0
  165. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_count_query.sql.j2 +0 -0
  166. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_row_md5_select.sql.j2 +0 -0
  167. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_table_metadata_query.sql.j2 +0 -0
  168. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/extractor/templates/postgresql_to_snowflake_datatypes_mapping_template.yaml +0 -0
  169. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/model/__init__.py +0 -0
  170. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/model/postgresql_credentials_connection.py +0 -0
  171. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/postgresql_arguments_manager.py +0 -0
  172. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/postgresql_tz_normalization.py +0 -0
  173. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/query/__init__.py +0 -0
  174. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/query/charset_normalization.py +0 -0
  175. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/query/query_generator_postgresql.py +0 -0
  176. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/script_writer/__init__.py +0 -0
  177. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/postgresql/script_writer/script_writer_postgresql.py +0 -0
  178. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/DATA_VALIDATION_API_OVERVIEW.md +0 -0
  179. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/__init__.py +0 -0
  180. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/_internal.py +0 -0
  181. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/_teradata_internal.py +0 -0
  182. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/async_mode/__init__.py +0 -0
  183. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/async_mode/file_loader.py +0 -0
  184. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/async_mode/script_writer.py +0 -0
  185. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/cli/__init__.py +0 -0
  186. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/cli/commands.py +0 -0
  187. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/configuration/__init__.py +0 -0
  188. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/connectors/__init__.py +0 -0
  189. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/context/__init__.py +0 -0
  190. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/data_validation_api.py +0 -0
  191. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/enums/__init__.py +0 -0
  192. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/execution/__init__.py +0 -0
  193. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/execution/query_executor.py +0 -0
  194. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/generators/__init__.py +0 -0
  195. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/metadata/__init__.py +0 -0
  196. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/__init__.py +0 -0
  197. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/data_validation_exception.py +0 -0
  198. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/generated_query.py +0 -0
  199. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/metrics_result_shape.py +0 -0
  200. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/query_execution_result.py +0 -0
  201. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/query_generator_factory.py +0 -0
  202. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/result_set.py +0 -0
  203. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/validation_progress_callback.py +0 -0
  204. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/model/validation_result.py +0 -0
  205. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_generation/__init__.py +0 -0
  206. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_generation/metadata_queries.py +0 -0
  207. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_generation/row_validation_queries.py +0 -0
  208. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_generation/schema_metrics_queries.py +0 -0
  209. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_validation/__init__.py +0 -0
  210. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/query_validation/query_comparison.py +0 -0
  211. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/reshape/__init__.py +0 -0
  212. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/reshape/metrics_reshape.py +0 -0
  213. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/result_set_validation/__init__.py +0 -0
  214. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/result_set_validation/result_set_comparison.py +0 -0
  215. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/snapshot/__init__.py +0 -0
  216. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_generation.py +0 -0
  217. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/snapshot/snapshot_validation.py +0 -0
  218. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/utils/__init__.py +0 -0
  219. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/utils/helpers.py +0 -0
  220. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/validation/__init__.py +0 -0
  221. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/validation/cell_validation.py +0 -0
  222. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/validation/metrics_validation.py +0 -0
  223. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/validation/row_validation.py +0 -0
  224. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/public/validation/schema_validation.py +0 -0
  225. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/__init__.py +0 -0
  226. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/charset_normalization.py +0 -0
  227. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/chunk_md5_tiered.py +0 -0
  228. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/decimal_text_normalization.py +0 -0
  229. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_column_metrics_templates.yaml +0 -0
  230. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_datatypes_normalization_templates.yaml +0 -0
  231. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/extractor/templates/query_modifiers.sql.j2 +0 -0
  232. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/float_aggregate_reduction.py +0 -0
  233. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/float_bit_normalization.py +0 -0
  234. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/numeric_scale_resolution.py +0 -0
  235. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/query/query_generator_query.py +0 -0
  236. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/query_arguments_manager.py +0 -0
  237. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/sql_type_families.py +0 -0
  238. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/time_precision_resolution.py +0 -0
  239. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/tsql_float_remainder.py +0 -0
  240. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/query/vector_element_kind.py +0 -0
  241. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/__init__.py +0 -0
  242. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/connector/__init__.py +0 -0
  243. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/connector/connector_factory_redshift.py +0 -0
  244. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/connector/connector_redshift.py +0 -0
  245. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/metadata_extractor_redshift.py +0 -0
  246. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_cell_validation_data_select.sql.j2 +0 -0
  247. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  248. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_table_template.sql.j2 +0 -0
  249. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_insert_template.sql.j2 +0 -0
  250. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_table_template.sql.j2 +0 -0
  251. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_datatypes_normalization_templates.yaml +0 -0
  252. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_extract_md5_rows_chunk.sql.j2 +0 -0
  253. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_get_columns_metadata.sql.j2 +0 -0
  254. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_count_query.sql.j2 +0 -0
  255. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_md5_select.sql.j2 +0 -0
  256. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_show_columns_query.sql.j2 +0 -0
  257. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_to_snowflake_datatypes_mapping_template.yaml +0 -0
  258. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/model/__init__.py +0 -0
  259. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/model/redshift_credentials_connection.py +0 -0
  260. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/query/__init__.py +0 -0
  261. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/query/charset_normalization.py +0 -0
  262. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/redshift_arguments_manager.py +0 -0
  263. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/redshift_super_normalization.py +0 -0
  264. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/script_writer/__init__.py +0 -0
  265. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/redshift/script_writer/script_writer_redshift.py +0 -0
  266. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_cell_validation_data_select.sql.j2 +0 -0
  267. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_column_metrics_templates.yaml +0 -0
  268. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/result_set_datatypes_normalization_templates.yaml +0 -0
  269. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/extractor/templates/snowflake_to_result_set_datatypes_mapping_template.yaml +0 -0
  270. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/query/query_generator_result_set.py +0 -0
  271. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/result_set/result_set_arguments_manager.py +0 -0
  272. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/script_writer/__init__.py +0 -0
  273. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/script_writer/script_writer_base.py +0 -0
  274. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/__init__.py +0 -0
  275. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_factory_snowflake.py +0 -0
  276. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_snowflake.py +0 -0
  277. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/metadata_extractor_snowflake.py +0 -0
  278. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/_wkt_despace.sql.j2 +0 -0
  279. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_cell_validation_data_select.sql.j2 +0 -0
  280. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_concatenated_template.sql.j2 +0 -0
  281. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_md5_template.sql.j2 +0 -0
  282. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_extract_md5_rows_chunk.sql.j2 +0 -0
  283. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_count_query.sql.j2 +0 -0
  284. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_md5_select.sql.j2 +0 -0
  285. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_temporary_table_from_view_template.sql.j2 +0 -0
  286. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_to_snowflake_datatypes_mapping_template.yaml +0 -0
  287. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/l3/__init__.py +0 -0
  288. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/l3/pushdown_diff_sql.py +0 -0
  289. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/l3/signature_external_table.py +0 -0
  290. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/l3/warm_start.py +0 -0
  291. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/model/__init__.py +0 -0
  292. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_credentials_connection.py +0 -0
  293. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_default_connection.py +0 -0
  294. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_named_connection.py +0 -0
  295. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/query/__init__.py +0 -0
  296. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/query/charset_normalization.py +0 -0
  297. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/script_writer/__init__.py +0 -0
  298. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/script_writer/script_writer_snowflake.py +0 -0
  299. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/snowflake/snowflake_arguments_manager.py +0 -0
  300. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/__init__.py +0 -0
  301. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/connector/__init__.py +0 -0
  302. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_factory_sqlite.py +0 -0
  303. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/connector/connector_sqlite.py +0 -0
  304. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/__init__.py +0 -0
  305. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/metadata_extractor_sqlite.py +0 -0
  306. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_cell_validation_data_select.sql.j2 +0 -0
  307. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_column_metrics_templates.yaml +0 -0
  308. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_compute_md5_sql.j2 +0 -0
  309. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_datatypes_normalization_templates.yaml +0 -0
  310. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_extract_md5_rows_chunk.sql.j2 +0 -0
  311. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_get_columns_metadata.sql.j2 +0 -0
  312. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_count_query.sql.j2 +0 -0
  313. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_row_md5_select.sql.j2 +0 -0
  314. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_table_metadata_query.sql.j2 +0 -0
  315. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_snowflake_datatypes_mapping_template.yaml +0 -0
  316. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/extractor/templates/sqlite_to_sqlite_datatypes_mapping_template.yaml +0 -0
  317. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/model/__init__.py +0 -0
  318. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/model/sqlite_connection.py +0 -0
  319. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/query/__init__.py +0 -0
  320. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/query/query_generator_sqlite.py +0 -0
  321. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/script_writer/__init__.py +0 -0
  322. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlite/script_writer/script_writer_sqlite.py +0 -0
  323. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/__init__.py +0 -0
  324. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/__init__.py +0 -0
  325. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_factory_sql_server.py +0 -0
  326. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_sql_server.py +0 -0
  327. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/__init__.py +0 -0
  328. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/metadata_extractor_sqlserver.py +0 -0
  329. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_cell_validation_data_select.sql.j2 +0 -0
  330. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_column_metrics_templates.yaml +0 -0
  331. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_compute_md5_sql.j2 +0 -0
  332. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_datatypes_normalization_templates.yaml +0 -0
  333. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_extract_md5_rows_chunk.sql.j2 +0 -0
  334. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_columns_metadata.sql.j2 +0 -0
  335. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_temporary_table_internal_identifier_template.sql.j2 +0 -0
  336. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_count_query.sql.j2 +0 -0
  337. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_md5_select.sql.j2 +0 -0
  338. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_table_metadata_query.sql.j2 +0 -0
  339. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_temporary_table_from_view_template.sql.j2 +0 -0
  340. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_to_snowflake_datatypes_mapping_template.yaml +0 -0
  341. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/model/__init__.py +0 -0
  342. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/model/sqlserver_credentials_connection.py +0 -0
  343. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/query/__init__.py +0 -0
  344. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/query/charset_normalization.py +0 -0
  345. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/query/query_generator_sqlserver.py +0 -0
  346. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/__init__.py +0 -0
  347. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/script_writer_sqlserver.py +0 -0
  348. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_arguments_manager.py +0 -0
  349. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_string_length_normalization.py +0 -0
  350. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_tz_normalization.py +0 -0
  351. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_uniqueidentifier_normalization.py +0 -0
  352. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/table_partitioning_strategy.md +0 -0
  353. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/__init__.py +0 -0
  354. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/connector/__init__.py +0 -0
  355. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/connector/connector_factory_teradata.py +0 -0
  356. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/connector/connector_teradata.py +0 -0
  357. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/__init__.py +0 -0
  358. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/metadata_extractor_teradata.py +0 -0
  359. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_cell_validation_data_select.sql.j2 +0 -0
  360. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_compute_md5_sql.j2 +0 -0
  361. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_concatenated.sql.j2 +0 -0
  362. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_md5.sql.j2 +0 -0
  363. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_datatypes_normalization_templates.yaml +0 -0
  364. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_extract_md5_rows_chunk.sql.j2 +0 -0
  365. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_get_columns_metadata.sql.j2 +0 -0
  366. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_count_query.sql.j2 +0 -0
  367. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_md5_select.sql.j2 +0 -0
  368. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_to_snowflake_datatypes_mapping_template.yaml +0 -0
  369. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/model/__init__.py +0 -0
  370. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/model/teradata_credentials_connection.py +0 -0
  371. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/query/__init__.py +0 -0
  372. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/query/charset_normalization.py +0 -0
  373. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/script_writer/__init__.py +0 -0
  374. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/script_writer/script_writer_teradata.py +0 -0
  375. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/teradata_arguments_manager.py +0 -0
  376. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/teradata/teradata_iso_normalization.py +0 -0
  377. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/__init__.py +0 -0
  378. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/arguments_manager_base.py +0 -0
  379. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/arguments_manager_factory.py +0 -0
  380. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/base_output_handler.py +0 -0
  381. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/catalog_column_size.py +0 -0
  382. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/column_grouping.py +0 -0
  383. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/column_partitioning_strategy.py +0 -0
  384. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_editor.py +0 -0
  385. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_generator.py +0 -0
  386. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_synchronizer.py +0 -0
  387. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/connection_pool.py +0 -0
  388. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/connector_factory.py +0 -0
  389. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/console_output_handler.py +0 -0
  390. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/context.py +0 -0
  391. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/cpu_optimizer.py +0 -0
  392. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/dv_tracing.py +0 -0
  393. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/error_classifier.py +0 -0
  394. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helper.py +0 -0
  395. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_database.py +0 -0
  396. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_dataframe.py +0 -0
  397. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_io.py +0 -0
  398. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_misc.py +0 -0
  399. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_polars_cast.py +0 -0
  400. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_query_result.py +0 -0
  401. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_templates.py +0 -0
  402. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/index_key_format.py +0 -0
  403. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/interval_common.py +0 -0
  404. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/lob_source_types.py +0 -0
  405. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/logging_config.py +0 -0
  406. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/logging_utils.py +0 -0
  407. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/measure_collation.py +0 -0
  408. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/chunk.py +0 -0
  409. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/column_metadata.py +0 -0
  410. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/column_selection.py +0 -0
  411. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/custom_templates.py +0 -0
  412. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/table_column_metadata.py +0 -0
  413. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/table_context.py +0 -0
  414. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/model/templates_loader_manager.py +0 -0
  415. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/period_common.py +0 -0
  416. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/progress_reporter.py +0 -0
  417. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/qvci_fallback.py +0 -0
  418. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/row_partitioning_strategy.py +0 -0
  419. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/row_validation_lob_exclusion.py +0 -0
  420. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/run_context.py +0 -0
  421. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/semi_structured_json_canonicalization.py +0 -0
  422. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/shutdown_coordinator.py +0 -0
  423. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/snapshot_validation_statements.py +0 -0
  424. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/telemetry.py +0 -0
  425. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/templates/configuration_file_templates.py +0 -0
  426. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/thread_safe_singleton.py +0 -0
  427. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/validation_utils.py +0 -0
  428. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/vector_common.py +0 -0
  429. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/utils/vector_normalization.py +0 -0
  430. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/__init__.py +0 -0
  431. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/accepted_transformation.py +0 -0
  432. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/cell_data_validator.py +0 -0
  433. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/column_pairing.py +0 -0
  434. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/comparison_codec.py +0 -0
  435. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/dataframe_validator_base.py +0 -0
  436. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/metrics_data_validator.py +0 -0
  437. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/metrics_tolerance.py +0 -0
  438. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/object_type_criterion.py +0 -0
  439. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/__init__.py +0 -0
  440. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/base.py +0 -0
  441. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/db2.py +0 -0
  442. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/redshift.py +0 -0
  443. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/registry.py +0 -0
  444. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/snowflake.py +0 -0
  445. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/sqlite.py +0 -0
  446. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/sqlserver.py +0 -0
  447. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/platform_text_codec/teradata.py +0 -0
  448. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/query_validator.py +0 -0
  449. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/result_set_validator.py +0 -0
  450. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/results_summary_report.py +0 -0
  451. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/row_data_validator.py +0 -0
  452. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/row_validation_report_buffer.py +0 -0
  453. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/schema_data_validator.py +0 -0
  454. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_database/__init__.py +0 -0
  455. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_database/sqlite_validation_connection.py +0 -0
  456. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_database/validation_database_connection_base.py +0 -0
  457. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_database_manager.py +0 -0
  458. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_execution_context.py +0 -0
  459. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_report_buffer.py +0 -0
  460. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/src/snowflake/snowflake_data_validation/validation/validation_report_status.py +0 -0
  461. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/.coveragerc +0 -0
  462. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/conftest.py +0 -0
  463. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/.coveragerc +0 -0
  464. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/Redshift/test_metadata_extractor_integration.py +0 -0
  465. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/test_async_generation_integration.py +0 -0
  466. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/test_async_validation_integration.py +0 -0
  467. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/test_reference_integration.py +0 -0
  468. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/test_source_validation_integration.py +0 -0
  469. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/integration/test_sync_validation_integration.py +0 -0
  470. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_bit_count_distinct.py +0 -0
  471. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_collation.py +0 -0
  472. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_enum_metadata.py +0 -0
  473. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_json_cell_validation.py +0 -0
  474. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_jsonb_row_hash.py +0 -0
  475. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_numeric_leading_zero.py +0 -0
  476. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Postgresql/test_postgresql_spatial_templates.py +0 -0
  477. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/model/test_redshift_credentials_connection.py +0 -0
  478. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/query/test_query_generator_redshift.py +0 -0
  479. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/script_writer/test_script_writer_redshift.py +0 -0
  480. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_connector_redshift.py +0 -0
  481. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_arguments_manager.py +0 -0
  482. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_collation.py +0 -0
  483. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_columns_metadata_template.py +0 -0
  484. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_hllsketch_templates.py +0 -0
  485. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_spatial_templates.py +0 -0
  486. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_split_schema_query.py +0 -0
  487. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_super_normalization.py +0 -0
  488. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_timetz_sentinel_normalization.py +0 -0
  489. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Redshift/test_redshift_varchar_count_distinct.py +0 -0
  490. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_connector_teradata.py +0 -0
  491. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_metadata_extractor_teradata.py +0 -0
  492. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_period_varchar_l1.py +0 -0
  493. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_query_generator_teradata.py +0 -0
  494. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_collation.py +0 -0
  495. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_columns_metadata_precision_scale.py +0 -0
  496. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_row_md5_select_template.py +0 -0
  497. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_spatial_templates.py +0 -0
  498. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_view_generate_boundary.py +0 -0
  499. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/Teradata/test_teradata_view_l1_metadata_templates.py +0 -0
  500. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/__init__.py +0 -0
  501. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/custom_templates_loader/snowflake_column_metrics_templates.yaml +0 -0
  502. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/custom_templates_loader/snowflake_datatypes_normalization_templates.yaml +0 -0
  503. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/custom_templates_loader/snowflake_table_metadata_query.sql.j2 +0 -0
  504. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_configuration_loader/test_load_configuration_model/conf.yaml +0 -0
  505. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_configuration_loader/test_load_configuration_model_reading_file_exception/conf.yaml +0 -0
  506. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_configuration_file.json +0 -0
  507. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_connection_source_db.toml +0 -0
  508. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_datatypes_normalization_template.yaml +0 -0
  509. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_datatypes_template.yaml +0 -0
  510. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_metrics_template.yaml +0 -0
  511. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_metrics_template_datatypes.yaml +0 -0
  512. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/dummy_template.csv +0 -0
  513. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_helpers/not_valid_format.yaml +0 -0
  514. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_templates_loader_manager/snowflake_column_metrics_templates.yaml +0 -0
  515. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/assets/test_templates_loader_manager/snowflake_datatypes_normalization_templates.yaml +0 -0
  516. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/__init__.py +0 -0
  517. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_credentials_connection.py +0 -0
  518. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_l3_convert_normalization.py +0 -0
  519. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_metadata_extractor.py +0 -0
  520. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_metrics_templates.py +0 -0
  521. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_query_generator.py +0 -0
  522. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_azure_synapse_row_queries.py +0 -0
  523. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_connector_azure_synapse.py +0 -0
  524. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/azure_synapse/test_connector_factory_azure_synapse.py +0 -0
  525. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/bigquery/__init__.py +0 -0
  526. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/bigquery/test_bigquery_l1_string_length.py +0 -0
  527. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/bigquery/test_bigquery_spatial_templates.py +0 -0
  528. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/bigquery/test_query_generator_bigquery.py +0 -0
  529. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/bigquery/test_query_generator_factory_bigquery.py +0 -0
  530. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/conftest.py +0 -0
  531. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/__init__.py +0 -0
  532. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_lob_dv_generation.py +0 -0
  533. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_metadata_extractor.py +0 -0
  534. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_query_generator.py +0 -0
  535. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_registration.py +0 -0
  536. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_xml_long_dv_generation.py +0 -0
  537. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/db2/test_db2_xml_long_metrics.py +0 -0
  538. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/__init__.py +0 -0
  539. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_metadata_extractor_oracle_vector.py +0 -0
  540. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_configured_index_columns.py +0 -0
  541. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_iso_normalization.py +0 -0
  542. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_lob_dv_generation.py +0 -0
  543. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_lob_normalization.py +0 -0
  544. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_metadata_extractor.py +0 -0
  545. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_metrics_templates.py +0 -0
  546. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_normalization_templates.py +0 -0
  547. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_query_modifiers.py +0 -0
  548. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_quoted_identifiers.py +0 -0
  549. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/oracle/test_oracle_type_mappings.py +0 -0
  550. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/query/test_chunk_md5_tiered.py +0 -0
  551. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/query/test_time_fraction_rendering.py +0 -0
  552. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/snowflake/test_snowflake_get_case_sensitive_columns.py +0 -0
  553. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/snowflake/test_snowflake_spatial_metrics_templates.py +0 -0
  554. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/__init__.py +0 -0
  555. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_connector_factory_sqlite.py +0 -0
  556. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_connector_sqlite.py +0 -0
  557. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_metadata_extractor_sqlite.py +0 -0
  558. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_metadata_query_template_sqlite.py +0 -0
  559. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_query_generator_sqlite.py +0 -0
  560. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlite/test_script_writer_sqlite.py +0 -0
  561. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/__init__.py +0 -0
  562. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_connector_factory_sql_server.py +0 -0
  563. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_metadata_extractor_sqlserver_vector.py +0 -0
  564. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_datetimeoffset_full_ingest_utc.py +0 -0
  565. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_datetimeoffset_metrics_utc.py +0 -0
  566. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_datetimeoffset_physical_target.py +0 -0
  567. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_json.py +0 -0
  568. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_l1_catalog.py +0 -0
  569. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_l1_character_length.py +0 -0
  570. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_l3_convert_normalization.py +0 -0
  571. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_length_metrics_chars.py +0 -0
  572. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_row_count_overflow.py +0 -0
  573. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_row_queries.py +0 -0
  574. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_spatial_l1_metadata.py +0 -0
  575. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_spatial_metrics_templates.py +0 -0
  576. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_string_length_pairing.py +0 -0
  577. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_uniqueidentifier_l3_normalization.py +0 -0
  578. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_sqlserver_xml_image_metrics.py +0 -0
  579. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/sqlserver/test_tsql_integer_stddev_exact.py +0 -0
  580. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_accepted_transformation.py +0 -0
  581. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_arguments_manager_base.py +0 -0
  582. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_arguments_manager_factory.py +0 -0
  583. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_batched_metrics_queries.py +0 -0
  584. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_boolean_binary_canonical_templates.py +0 -0
  585. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_case_sensitive_column_pairing.py +0 -0
  586. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_catalog_column_size.py +0 -0
  587. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_catalog_queries_take_actual_names.py +0 -0
  588. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_cell_data_validator.py +0 -0
  589. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_cell_data_validator_threading.py +0 -0
  590. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_cell_validation_query_generation.py +0 -0
  591. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_charset_normalization.py +0 -0
  592. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_grouping.py +0 -0
  593. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_metadata.py +0 -0
  594. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_normalization_override.py +0 -0
  595. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_partitioning_strategy.py +0 -0
  596. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_selection.py +0 -0
  597. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_column_selection_actual_names.py +0 -0
  598. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_comparison_codec.py +0 -0
  599. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_comparison_orchestrator.py +0 -0
  600. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_configuration_file_editor.py +0 -0
  601. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_configuration_file_generator.py +0 -0
  602. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_configuration_file_synchronizer.py +0 -0
  603. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_configuration_loader.py +0 -0
  604. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_configuration_model.py +0 -0
  605. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_connection_pool.py +0 -0
  606. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_connector_failure_tracker.py +0 -0
  607. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_connector_snowflake.py +0 -0
  608. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_cpu_optimizer.py +0 -0
  609. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_custom_templates_models.py +0 -0
  610. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_decimal_text_canonical.py +0 -0
  611. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_dv_tracing.py +0 -0
  612. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_error_classifier.py +0 -0
  613. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_escape_odbc_value.py +0 -0
  614. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_executor_factory.py +0 -0
  615. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_extraction_keeps_catalog_column_spelling.py +0 -0
  616. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_fetch_schema_metadata.py +0 -0
  617. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_float_aggregate_reduction.py +0 -0
  618. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_float_canonical_templates.py +0 -0
  619. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_get_configuration_file.py +0 -0
  620. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_get_target_cols.py +0 -0
  621. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_helper_dataframe.py +0 -0
  622. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_helper_io.py +0 -0
  623. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_helper_polars_cast.py +0 -0
  624. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_helper_polars_cast_threading.py +0 -0
  625. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_helpers.py +0 -0
  626. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_html_report_builder.py +0 -0
  627. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_iceberg_v2_metrics_exclusion.py +0 -0
  628. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_index_key_format.py +0 -0
  629. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_internal_helpers.py +0 -0
  630. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_interval_common.py +0 -0
  631. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_l2_collation_metadata.py +0 -0
  632. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_l2_count_distinct_opt_in_config.py +0 -0
  633. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_logging_config.py +0 -0
  634. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_metric_identifier_rendering.py +0 -0
  635. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_metrics_reshape.py +0 -0
  636. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_metrics_result_shape.py +0 -0
  637. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_metrics_templates_casts.py +0 -0
  638. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_normalize_shape_aware.py +0 -0
  639. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_numeric_scale_resolution.py +0 -0
  640. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_object_type_criterion.py +0 -0
  641. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_parallel_execution_engine_fatal_errors.py +0 -0
  642. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_period_common.py +0 -0
  643. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_platform_bridge.py +0 -0
  644. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_postgresql_normalization_templates.py +0 -0
  645. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_pushdown_diff_sql.py +0 -0
  646. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_cell_level_validation.py +0 -0
  647. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_executor.py +0 -0
  648. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_metrics_level_validation.py +0 -0
  649. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_to_dataframe.py +0 -0
  650. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_query_validator.py +0 -0
  651. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_qvci_fallback.py +0 -0
  652. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_qvci_fallback_na_skip.py +0 -0
  653. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_qvci_fallback_triggers.py +0 -0
  654. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_report_metadata.py +0 -0
  655. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_cell_level_validation.py +0 -0
  656. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_column_metrics_validation.py +0 -0
  657. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_snapshot_generation.py +0 -0
  658. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_snapshot_validation.py +0 -0
  659. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_to_dataframe.py +0 -0
  660. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_result_set_validator.py +0 -0
  661. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_count_bigint_overflow.py +0 -0
  662. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_data_validator.py +0 -0
  663. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_data_validator_empty_chunk.py +0 -0
  664. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_hash_column_delimiter.py +0 -0
  665. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_partitioning_strategy.py +0 -0
  666. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_validation_lob_exclusion.py +0 -0
  667. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_row_validation_report_buffer.py +0 -0
  668. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_schema_accepted_native_datatypes.py +0 -0
  669. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_schema_column_selection.py +0 -0
  670. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_schema_query_capability.py +0 -0
  671. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_shutdown_coordinator.py +0 -0
  672. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_signature_external_table.py +0 -0
  673. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_signature_row_md5_query.py +0 -0
  674. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_snapshot_validation_statements.py +0 -0
  675. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_snowflake_arguments_manager.py +0 -0
  676. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_snowflake_binary_normalization_templates.py +0 -0
  677. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_snowflake_redshift_super_size_guard.py +0 -0
  678. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_source_validation_executor.py +0 -0
  679. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_spatial_wkt_canonicalization.py +0 -0
  680. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sql_catalog_template_guard.py +0 -0
  681. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sqlite_validation_connection.py +0 -0
  682. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sqlserver_arguments_manager.py +0 -0
  683. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sqlserver_multi_version_support.py +0 -0
  684. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sync_executor_qvci_fallback.py +0 -0
  685. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sync_schema_validation_real_callbacks.py +0 -0
  686. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_sync_validation_executor.py +0 -0
  687. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_column_metadata_model.py +0 -0
  688. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_configuration.py +0 -0
  689. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_context.py +0 -0
  690. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_metadata_processor.py +0 -0
  691. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_snapshot_generation.py +0 -0
  692. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_table_snapshot_validation.py +0 -0
  693. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_target_platform_factory.py +0 -0
  694. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_telemetry.py +0 -0
  695. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_templates_loader_manager.py +0 -0
  696. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_teradata_iso_normalization.py +0 -0
  697. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_teradata_timetz_metric_domain.py +0 -0
  698. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_teradata_type_code_mapping.py +0 -0
  699. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_trace_bridge.py +0 -0
  700. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_tsql_float_l2_aggregates.py +0 -0
  701. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_configuration.py +0 -0
  702. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_database_connection.py +0 -0
  703. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_execution_context.py +0 -0
  704. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_progress_reporter.py +0 -0
  705. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_report_buffer.py +0 -0
  706. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_report_status.py +0 -0
  707. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_validation_templates_dto.py +0 -0
  708. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_vector_bit_normalization.py +0 -0
  709. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_vector_common.py +0 -0
  710. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_vector_normalization.py +0 -0
  711. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_view_configuration.py +0 -0
  712. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/test_warm_start.py +0 -0
  713. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/utils/__init__.py +0 -0
  714. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/tests/unit/utils/test_constants.py +0 -0
  715. {snowflake_data_validation-1.45.2 → snowflake_data_validation-1.45.4}/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.45.2
3
+ Version: 1.45.4
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/
@@ -79,7 +79,7 @@ Requires-Dist: psycopg[binary]>=3.2.0; extra == 'postgresql'
79
79
  Provides-Extra: redshift
80
80
  Requires-Dist: redshift-connector>=2.1.14; extra == 'redshift'
81
81
  Provides-Extra: scai
82
- Requires-Dist: snowflake-code-unit-registry>=0.9.2; extra == 'scai'
82
+ Requires-Dist: snowflake-code-unit-registry>=0.9.5; extra == 'scai'
83
83
  Provides-Extra: sqlite
84
84
  Requires-Dist: sqlean-py>=3.45.0; extra == 'sqlite'
85
85
  Provides-Extra: sqlserver
@@ -160,8 +160,12 @@ Some differences are reported as `WARNING` and do not fail L1:
160
160
 
161
161
  A nullable source column on a `NOT NULL` Snowflake column still fails, since Snowflake can reject the source's NULLs.
162
162
 
163
+ An integer column mapped to a `NUMBER` with scale 0 is the exception to the precision warning: SQL Server `INT` (precision 10) in `NUMBER(38,0)` holds every value, so its `NUMERIC_PRECISION` row is `SUCCESS`.
164
+
163
165
  A PostgreSQL user-defined `ENUM` column is validated as `ENUM` against a Snowflake `VARCHAR`. `information_schema` reports every enum as `USER-DEFINED`, so the metadata queries read `pg_type.typtype` to tell enums apart, and report the longest label as the column's length. L2 and L3 compare the label text.
164
166
 
167
+ Snowflake database, schema and table names may contain a backslash or an apostrophe, for example `NAFMAIN\TUSDB102`. Snowflake reads backslash escapes inside a string literal, so the Snowflake metadata queries (table metadata, column metadata, case-sensitive columns and object-type lookups) write each name through `escape_snowflake_sql_literal` / `quote_snowflake_sql_literal` in `shared/queries/sql_literals.py`, which double backslashes as well as single quotes. Use these helpers, not `escape_sql_literal`, for any name embedded in a Snowflake string literal.
168
+
165
169
  ### Metrics Validation
166
170
  Compares statistical metrics for each column:
167
171
  - Row count
@@ -226,6 +230,28 @@ For configuration options and examples, see the [official documentation](https:/
226
230
 
227
231
  ## Changelog
228
232
 
233
+ ### v1.45.4
234
+
235
+ **Improvements**
236
+
237
+ - Improved Iceberg validation to read the table format version from the Snowflake catalog once before validation starts, so every validation level uses the actual format version.
238
+
239
+ **Bug fixes**
240
+
241
+ - Fixed Redshift Iceberg metrics validation comparing signed-year `DATE` and `TIMESTAMPTZ` values.
242
+ - Fixed Teradata `UNICODE` `CHAR`, `VARCHAR`, and `CLOB` column lengths being reported in bytes, which raised false truncation warnings.
243
+
244
+ ### v1.45.3
245
+
246
+ **Bug fixes**
247
+
248
+ - Fixed schema validation reporting SQL Server `INT` columns mapped to `NUMBER(38,0)` as precision differences.
249
+ - Surfaced rounding of scale-less `NUMBER` values as a lossy mapping instead of a hidden match.
250
+ - Fixed schema validation reporting every column as missing when the schema name contains a backslash (for example `DOMAIN\user` schemas).
251
+ - Fixed Teradata `VARCHAR` distinct and empty-value metrics not matching when values have trailing spaces.
252
+ - Fixed Iceberg timestamp comparisons to use `FF6` or `FF9` fractional precision based on the catalog format version.
253
+ - Fixed metrics validation for signed-year `TIMESTAMP` values, including BC and post-9999 dates.
254
+
229
255
  ### v1.45.2
230
256
 
231
257
  **Bug fixes**
@@ -69,8 +69,12 @@ Some differences are reported as `WARNING` and do not fail L1:
69
69
 
70
70
  A nullable source column on a `NOT NULL` Snowflake column still fails, since Snowflake can reject the source's NULLs.
71
71
 
72
+ An integer column mapped to a `NUMBER` with scale 0 is the exception to the precision warning: SQL Server `INT` (precision 10) in `NUMBER(38,0)` holds every value, so its `NUMERIC_PRECISION` row is `SUCCESS`.
73
+
72
74
  A PostgreSQL user-defined `ENUM` column is validated as `ENUM` against a Snowflake `VARCHAR`. `information_schema` reports every enum as `USER-DEFINED`, so the metadata queries read `pg_type.typtype` to tell enums apart, and report the longest label as the column's length. L2 and L3 compare the label text.
73
75
 
76
+ Snowflake database, schema and table names may contain a backslash or an apostrophe, for example `NAFMAIN\TUSDB102`. Snowflake reads backslash escapes inside a string literal, so the Snowflake metadata queries (table metadata, column metadata, case-sensitive columns and object-type lookups) write each name through `escape_snowflake_sql_literal` / `quote_snowflake_sql_literal` in `shared/queries/sql_literals.py`, which double backslashes as well as single quotes. Use these helpers, not `escape_sql_literal`, for any name embedded in a Snowflake string literal.
77
+
74
78
  ### Metrics Validation
75
79
  Compares statistical metrics for each column:
76
80
  - Row count
@@ -135,6 +139,28 @@ For configuration options and examples, see the [official documentation](https:/
135
139
 
136
140
  ## Changelog
137
141
 
142
+ ### v1.45.4
143
+
144
+ **Improvements**
145
+
146
+ - Improved Iceberg validation to read the table format version from the Snowflake catalog once before validation starts, so every validation level uses the actual format version.
147
+
148
+ **Bug fixes**
149
+
150
+ - Fixed Redshift Iceberg metrics validation comparing signed-year `DATE` and `TIMESTAMPTZ` values.
151
+ - Fixed Teradata `UNICODE` `CHAR`, `VARCHAR`, and `CLOB` column lengths being reported in bytes, which raised false truncation warnings.
152
+
153
+ ### v1.45.3
154
+
155
+ **Bug fixes**
156
+
157
+ - Fixed schema validation reporting SQL Server `INT` columns mapped to `NUMBER(38,0)` as precision differences.
158
+ - Surfaced rounding of scale-less `NUMBER` values as a lossy mapping instead of a hidden match.
159
+ - Fixed schema validation reporting every column as missing when the schema name contains a backslash (for example `DOMAIN\user` schemas).
160
+ - Fixed Teradata `VARCHAR` distinct and empty-value metrics not matching when values have trailing spaces.
161
+ - Fixed Iceberg timestamp comparisons to use `FF6` or `FF9` fractional precision based on the catalog format version.
162
+ - Fixed metrics validation for signed-year `TIMESTAMP` values, including BC and post-9999 dates.
163
+
138
164
  ### v1.45.2
139
165
 
140
166
  **Bug fixes**
@@ -4,7 +4,8 @@ requires = ["hatchling"]
4
4
 
5
5
  [tool.uv]
6
6
  constraint-dependencies = [
7
- "virtualenv>=21.7.13,<21.8",
7
+ "certifi>=2026.10.23,<2026.11",
8
+ "virtualenv>=21.14.9,<21.15",
8
9
  ]
9
10
 
10
11
  [project]
@@ -105,7 +106,7 @@ db2 = [
105
106
  # musllinux build, and SDV is published to public PyPI. Inside DMO/DEA the
106
107
  # dependency is already declared, so SDV's logger tree is covered there.
107
108
  scai = [
108
- "snowflake-code-unit-registry>=0.9.2",
109
+ "snowflake-code-unit-registry>=0.9.5",
109
110
  ]
110
111
 
111
112
  [project.urls]
@@ -157,7 +157,7 @@ class QueryGeneratorBigQuery(QueryGeneratorBase):
157
157
  normalized = normalized[:index]
158
158
  return normalized.strip()
159
159
 
160
- def _resolve_metrics_col_type(self, col, table_context: TableContext) -> str:
160
+ def _resolve_metrics_col_type(self, col: ColumnMetadata, table_context: TableContext) -> str:
161
161
  """Key the metrics YAML lookup off the parameterless base type."""
162
162
  return self.normalize_bigquery_type(col.data_type)
163
163
 
@@ -26,7 +26,7 @@ import snowflake.snowflake_data_validation as sdv_pkg
26
26
 
27
27
  from shared.identifiers.managers import identifier_manager
28
28
  from shared.identifiers.sql_identifier import SqlIdentifier
29
- from shared.queries.sql_literals import escape_sql_literal
29
+ from shared.queries.sql_literals import escape_snowflake_sql_literal, escape_sql_literal
30
30
  from shared.query_modifiers.strict import check_query_modifiers_strict
31
31
  from shared.query_modifiers.template_context import QueryModifiersTemplateContext
32
32
  from snowflake.snowflake_data_validation.utils.constants import (
@@ -132,6 +132,7 @@ class SQLQueriesTemplateGenerator:
132
132
  # Identifiers are written in Python (write_sql_name, column_sql_names)
133
133
  # and handed to the templates already written; only literals are escaped here.
134
134
  self.env.filters["escape_sql_literal"] = escape_sql_literal
135
+ self.env.filters["escape_snowflake_sql_literal"] = escape_snowflake_sql_literal
135
136
  # Single source of truth for the NULL sentinel used by L3 row-MD5 and
136
137
  # cell-validation normalization. Exposed to every template so the
137
138
  # COALESCE fallback can keep a real SQL NULL distinct from "".
@@ -351,6 +352,39 @@ class SQLQueriesTemplateGenerator:
351
352
  except Exception as e:
352
353
  raise Exception(f"Error generating template: {e}") from e
353
354
 
355
+ def get_iceberg_format_version(self, database_name: str, schema_name: str, table_name: str, platform: str) -> str:
356
+ """Generate the query that reads one target table's Iceberg format version.
357
+
358
+ Args:
359
+ database_name (str): Database that contains the table.
360
+ schema_name (str): Schema that contains the table.
361
+ table_name (str): Table whose ``ICEBERG_VERSION`` parameter is read.
362
+ platform (str): Platform identifier (``Platform.SNOWFLAKE.value``).
363
+
364
+ Returns:
365
+ str: The SQL query. The ``value`` column is ``ICEBERG_FORMAT_VERSION_V2``
366
+ or ``ICEBERG_FORMAT_VERSION_V3``.
367
+
368
+ Raises:
369
+ ValueError: If the template file is not found.
370
+ Exception: If an error occurs during template rendering.
371
+
372
+ """
373
+ template_file = f"{platform}_get_iceberg_format_version.sql.j2"
374
+ try:
375
+ return self._render(
376
+ template_file,
377
+ database_sql=write_sql_name(database_name, platform),
378
+ schema_sql=write_sql_name(schema_name, platform),
379
+ table_sql=write_sql_name(table_name, platform),
380
+ )
381
+ except jinja2.exceptions.TemplateNotFound:
382
+ raise ValueError(
383
+ f"Template not found for platform: {platform}. Please create {template_file} in the {self.template_dir} directory."
384
+ ) from None
385
+ except Exception as e:
386
+ raise Exception(f"Error generating template: {e}") from e
387
+
354
388
  def generate_compute_md5_query(
355
389
  self,
356
390
  platform: str,
@@ -77,6 +77,7 @@ from snowflake.snowflake_data_validation.utils.constants import (
77
77
  ROW_HASH_COLUMN_DELIMITER,
78
78
  ROW_HASH_COLUMN_DELIMITER_KEY,
79
79
  Platform,
80
+ renders_full_precision,
80
81
  )
81
82
  from snowflake.snowflake_data_validation.utils.iso_dv_common import (
82
83
  get_paired_target_column_types,
@@ -156,6 +157,28 @@ def build_oracle_numeric_canonical_expr(col_ref: str, format_mask: str) -> str:
156
157
  )
157
158
 
158
159
 
160
+ def build_oracle_full_precision_numeric_expr(col_ref: str, format_mask: str) -> str:
161
+ """Render a value that fits the mask's scale through the mask, any other at its stored precision.
162
+
163
+ For a bare NUMBER the target scale was never checked against the data. A value
164
+ the target could hold renders exactly like :func:`build_oracle_numeric_canonical_expr`,
165
+ the text Snowflake prints. A value with more fractional digits renders with
166
+ ``TM9`` (shortest exact text, scientific only past 64 characters, which no
167
+ NUMBER(38, s) value reaches), so the target's rounding shows as a cell diff.
168
+ """
169
+ scale = _oracle_scale_from_fm_mask(format_mask)
170
+ full_text = f"TRIM(REGEXP_REPLACE(TRIM(REGEXP_REPLACE(TRIM(TO_CHAR({col_ref}, 'TM9')), '^-\\.', '-0.')), '^\\.', '0.'))"
171
+ return (
172
+ f"CASE WHEN {col_ref} IS NULL THEN NULL "
173
+ f"WHEN {col_ref} = ROUND({col_ref}, {scale}) THEN {build_oracle_numeric_canonical_expr(col_ref, format_mask)} "
174
+ f"ELSE {full_text} END"
175
+ )
176
+
177
+
178
+ def _renders_full_precision(column: object) -> bool:
179
+ return renders_full_precision(getattr(column, "properties", None))
180
+
181
+
159
182
  class QueryGeneratorOracle(QueryGeneratorBase):
160
183
  """Oracle-specific implementation of the query generator.
161
184
 
@@ -250,7 +273,10 @@ class QueryGeneratorOracle(QueryGeneratorBase):
250
273
  """Wrap numeric ``TO_CHAR`` output to restore the FM-suppressed leading zero."""
251
274
  if NUMERIC_FORMAT_MASK_PLACEHOLDER in template and "TO_CHAR" in template and self._is_numeric_normalization_type(column.data_type):
252
275
  mask = self._build_numeric_format_mask(self._resolve_numeric_scale(column))
253
- return build_oracle_numeric_canonical_expr(self._write_sql_identifier(column.name), mask)
276
+ col_ref = self._write_sql_identifier(column.name)
277
+ if _renders_full_precision(column):
278
+ return build_oracle_full_precision_numeric_expr(col_ref, mask)
279
+ return build_oracle_numeric_canonical_expr(col_ref, mask)
254
280
  return super().render_normalization_template(template, column)
255
281
 
256
282
  def build_float_bit_shim(self, column, col_ref: str) -> str:
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass, replace
4
+ from typing import TYPE_CHECKING
5
+
6
+ from snowflake.snowflake_data_validation.utils.constants import Platform
7
+ from snowflake.snowflake_data_validation.utils.iceberg_dv_common import IcebergProfile
8
+
9
+
10
+ if TYPE_CHECKING:
11
+ from snowflake.snowflake_data_validation.utils.model.table_context import TableContext
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class NormalizationRenderContext:
16
+ """Per-render inputs a normalization template needs beyond the column itself.
17
+
18
+ Resolve the per-table inputs once with ``from_table_context``, then specialize
19
+ per column with ``for_column``. A new render input becomes a field here instead
20
+ of another parameter on ``render_normalization_template``.
21
+ """
22
+
23
+ paired_source_platform: Platform | None = None
24
+ paired_source_type: str | None = None
25
+ iceberg_fraction_digits: int = IcebergProfile().fraction_digits
26
+ has_custom_normalization: bool = False
27
+
28
+ @classmethod
29
+ def from_table_context(cls, table_context: TableContext) -> NormalizationRenderContext:
30
+ """Resolve the per-table inputs; ``for_column`` adds the per-column paired type."""
31
+ return cls(
32
+ paired_source_platform=table_context.paired_source_platform,
33
+ iceberg_fraction_digits=IcebergProfile.from_table_context(table_context).fraction_digits,
34
+ )
35
+
36
+ def for_column(
37
+ self,
38
+ paired_source_type: str | None,
39
+ *,
40
+ has_custom_normalization: bool = False,
41
+ ) -> NormalizationRenderContext:
42
+ """Return a copy specialized for one column; the base context is left unchanged.
43
+
44
+ Sets the column's paired source type and whether its template is a user
45
+ override. ``has_custom_normalization`` resets to False unless passed.
46
+ """
47
+ return replace(
48
+ self,
49
+ paired_source_type=paired_source_type,
50
+ has_custom_normalization=has_custom_normalization,
51
+ )
@@ -58,6 +58,7 @@ from snowflake.snowflake_data_validation.utils.constants import (
58
58
  DEFAULT_MAX_COLUMNS_PER_METRICS_BATCH,
59
59
  EXPLICIT_METRIC_NORMALIZATION_COLUMN_KEY,
60
60
  FLOAT_BIT_SHIM_PLACEHOLDER,
61
+ ICEBERG_FRACTION_DIGITS_PLACEHOLDER,
61
62
  MEASURE_COLLATION_PREFIX_PLACEHOLDER,
62
63
  MEASURE_COLLATION_SUFFIX_PLACEHOLDER,
63
64
  METRIC_COLUMN_KEY,
@@ -393,8 +394,7 @@ class QueryGeneratorBase(ABC):
393
394
  override this. Combined generators leave the base raise in place.
394
395
  """
395
396
  raise NotImplementedError(
396
- f"{self.platform.value} uses a combined schema query; "
397
- "call generate_schema_query instead of generate_schema_row_count_query"
397
+ f"{self.platform.value} uses a combined schema query; call generate_schema_query instead of generate_schema_row_count_query"
398
398
  )
399
399
 
400
400
  def generate_schema_details_query(self, table_context: TableContext) -> str:
@@ -404,8 +404,7 @@ class QueryGeneratorBase(ABC):
404
404
  override this. Combined generators leave the base raise in place.
405
405
  """
406
406
  raise NotImplementedError(
407
- f"{self.platform.value} uses a combined schema query; "
408
- "call generate_schema_query instead of generate_schema_details_query"
407
+ f"{self.platform.value} uses a combined schema query; call generate_schema_query instead of generate_schema_details_query"
409
408
  )
410
409
 
411
410
  def normalize_schema_details_result(
@@ -419,10 +418,7 @@ class QueryGeneratorBase(ABC):
419
418
  as a combined schema query (without ``ROW_COUNT``; the fetch helper
420
419
  attaches that). Combined generators leave the base raise in place.
421
420
  """
422
- raise NotImplementedError(
423
- f"{self.platform.value} uses a combined schema query; "
424
- "normalize_schema_details_result is not used"
425
- )
421
+ raise NotImplementedError(f"{self.platform.value} uses a combined schema query; normalize_schema_details_result is not used")
426
422
 
427
423
  def generate_metrics_query(self, table_context: TableContext) -> GeneratedMetricsQuery:
428
424
  """Generate a single wide metrics SELECT for a table.
@@ -644,7 +640,7 @@ class QueryGeneratorBase(ABC):
644
640
  return numeric_norm
645
641
  return None
646
642
 
647
- def _resolve_metrics_col_type(self, col, table_context: TableContext) -> str:
643
+ def _resolve_metrics_col_type(self, col: ColumnMetadata, table_context: TableContext) -> str:
648
644
  """Return the metrics YAML type key for a column (platforms may override)."""
649
645
  from snowflake.snowflake_data_validation.utils.vector_common import is_vector_base_type
650
646
 
@@ -892,6 +888,7 @@ class QueryGeneratorBase(ABC):
892
888
  # set the attribute keep the default instead of a truthy Mock.
893
889
  include_count_distinct = getattr(table_context, "include_count_distinct", False) is True
894
890
  apply_metric_column_modifier = table_context.apply_metric_column_modifier
891
+ iceberg_fraction_digits = IcebergProfile.from_table_context(table_context).fraction_digits
895
892
 
896
893
  select_exprs: list[str] = []
897
894
  cells: list[tuple[str, str]] = []
@@ -953,6 +950,8 @@ class QueryGeneratorBase(ABC):
953
950
  if NUMERIC_FORMAT_MASK_PLACEHOLDER in normalization:
954
951
  mask = self._build_numeric_format_mask(self._resolve_numeric_scale(col))
955
952
  normalization = normalization.replace(NUMERIC_FORMAT_MASK_PLACEHOLDER, mask)
953
+ if ICEBERG_FRACTION_DIGITS_PLACEHOLDER in normalization:
954
+ normalization = normalization.replace(ICEBERG_FRACTION_DIGITS_PLACEHOLDER, str(iceberg_fraction_digits))
956
955
  metric_expr = self._wrap_metric_with_normalization(normalization, metric_expr)
957
956
  alias = f"c{measured_idx}_m{metric_idx}"
958
957
  select_exprs.append(f"{metric_expr} AS {alias}")
@@ -619,6 +619,52 @@ TIMESTAMP WITHOUT TIME ZONE:
619
619
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
620
620
  metric_return_datatype: BIGINT
621
621
 
622
+ # Iceberg VARCHAR target (SNOW-4353618): MIN/MAX of the instant, rendered as the
623
+ # signed astronomical-year text the UNLOAD footer writes (``TO_CHAR 'YYYY'``
624
+ # drops the era). Kept in sync with DMO by test_redshift_consistency.py.
625
+ TIMESTAMP_AS_TEXT:
626
+ min:
627
+ metric_query: MIN("{{ col_name }}")
628
+ metric_return_datatype: VARCHAR
629
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR END)) || TO_CHAR({{ metric_query }}, ''-MM-DD"T"HH24:MI:SS.US'') || ''000'''
630
+ max:
631
+ metric_query: MAX("{{ col_name }}")
632
+ metric_return_datatype: VARCHAR
633
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR END)) || TO_CHAR({{ metric_query }}, ''-MM-DD"T"HH24:MI:SS.US'') || ''000'''
634
+ count_null:
635
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
636
+ metric_return_datatype: BIGINT
637
+
638
+ # Iceberg VARCHAR DATE (SNOW-4381535): MIN/MAX rendered as the UNLOAD footer's
639
+ # signed astronomical-year text. Kept in sync with DMO by test_redshift_consistency.py.
640
+ DATE_AS_TEXT:
641
+ min:
642
+ metric_query: MIN("{{ col_name }}")
643
+ metric_return_datatype: VARCHAR
644
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR END)) || ''-'' || LPAD(EXTRACT(MONTH FROM {{ metric_query }})::VARCHAR, 2, ''0'') || ''-'' || LPAD(EXTRACT(DAY FROM {{ metric_query }})::VARCHAR, 2, ''0'')'
645
+ max:
646
+ metric_query: MAX("{{ col_name }}")
647
+ metric_return_datatype: VARCHAR
648
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM {{ metric_query }})::INT < 0 THEN EXTRACT(YEAR FROM {{ metric_query }})::INT + 1 ELSE EXTRACT(YEAR FROM {{ metric_query }})::INT END))::VARCHAR END)) || ''-'' || LPAD(EXTRACT(MONTH FROM {{ metric_query }})::VARCHAR, 2, ''0'') || ''-'' || LPAD(EXTRACT(DAY FROM {{ metric_query }})::VARCHAR, 2, ''0'')'
649
+ count_null:
650
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
651
+ metric_return_datatype: BIGINT
652
+
653
+ # Iceberg VARCHAR TIMESTAMPTZ (SNOW-4381535): MIN/MAX of the instant, rendered in
654
+ # UTC with the UNLOAD footer's signed year. Kept in sync with DMO by test_redshift_consistency.py.
655
+ TIMESTAMPTZ_AS_TEXT:
656
+ min:
657
+ metric_query: MIN("{{ col_name }}")
658
+ metric_return_datatype: VARCHAR
659
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END))::VARCHAR END)) || TO_CHAR(({{ metric_query }} AT TIME ZONE ''UTC''), ''-MM-DD"T"HH24:MI:SS.US'') || ''000'' || ''+00:00'''
660
+ max:
661
+ metric_query: MAX("{{ col_name }}")
662
+ metric_return_datatype: VARCHAR
663
+ metric_normalization: '(CASE WHEN (CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END) < 0 THEN ''-'' ELSE '''' END || (CASE WHEN ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END)) < 1000 THEN LPAD(ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END))::VARCHAR, 4, ''0'') ELSE ABS((CASE WHEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT < 0 THEN EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT + 1 ELSE EXTRACT(YEAR FROM ({{ metric_query }} AT TIME ZONE ''UTC''))::INT END))::VARCHAR END)) || TO_CHAR(({{ metric_query }} AT TIME ZONE ''UTC''), ''-MM-DD"T"HH24:MI:SS.US'') || ''000'' || ''+00:00'''
664
+ count_null:
665
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
666
+ metric_return_datatype: BIGINT
667
+
622
668
  TIMESTAMPTZ:
623
669
  min:
624
670
  metric_query: MIN("{{ col_name }}")
@@ -62,6 +62,9 @@ from snowflake.snowflake_data_validation.utils.constants import (
62
62
  SchemaValidationFields,
63
63
  )
64
64
  from snowflake.snowflake_data_validation.utils.iceberg_dv_common import (
65
+ DATE_AS_TEXT_KEY,
66
+ TIMESTAMP_AS_TEXT_KEY,
67
+ TIMESTAMPTZ_AS_TEXT_KEY,
65
68
  IcebergProfile,
66
69
  resolve_iceberg_v2_compatible_source_normalization_key,
67
70
  )
@@ -71,6 +74,7 @@ from snowflake.snowflake_data_validation.utils.interval_common import (
71
74
  )
72
75
  from snowflake.snowflake_data_validation.utils.iso_dv_common import (
73
76
  get_paired_target_column_types,
77
+ is_snowflake_varchar_like_type,
74
78
  )
75
79
  from snowflake.snowflake_data_validation.utils.measure_collation import (
76
80
  COUNT_DISTINCT_METRIC,
@@ -78,11 +82,21 @@ from snowflake.snowflake_data_validation.utils.measure_collation import (
78
82
  base_type,
79
83
  has_effective_collation,
80
84
  )
85
+ from snowflake.snowflake_data_validation.utils.model.column_metadata import ColumnMetadata
81
86
  from snowflake.snowflake_data_validation.utils.model.table_context import TableContext
82
87
 
83
88
 
84
89
  LOGGER = logging.getLogger(__name__)
85
90
  _REDSHIFT_NORMALIZED_COLLATION_TOKENS = ("COLLATE(", ", 'case_sensitive')")
91
+ # Source clocks the Iceberg UNLOAD stages as signed-year text, keyed to the
92
+ # metrics template that renders MIN / MAX the same way.
93
+ _SIGNED_YEAR_TEXT_METRICS_KEYS: dict[str, str] = {
94
+ CommonType.DATE: DATE_AS_TEXT_KEY,
95
+ CommonType.TIMESTAMP: TIMESTAMP_AS_TEXT_KEY,
96
+ CommonType.TIMESTAMP_WITHOUT_TIME_ZONE: TIMESTAMP_AS_TEXT_KEY,
97
+ CommonType.TIMESTAMPTZ: TIMESTAMPTZ_AS_TEXT_KEY,
98
+ CommonType.TIMESTAMP_WITH_TIME_ZONE: TIMESTAMPTZ_AS_TEXT_KEY,
99
+ }
86
100
 
87
101
  # Redshift ``TO_CHAR`` formats numbers with 64-bit arithmetic. A numeric format
88
102
  # mask with N total digit placeholders (integer nines + fractional zeros) admits
@@ -522,19 +536,12 @@ class QueryGeneratorRedshift(QueryGeneratorBase):
522
536
  ``schema.table`` only (same rule as :func:`quoted_non_empty_fqn`).
523
537
  """
524
538
  if not table_context.schema_name or not table_context.internal_table_name:
525
- raise ValueError(
526
- "Redshift schema-details query requires schema and table names for "
527
- f"{table_context.fully_qualified_name}"
528
- )
539
+ raise ValueError(f"Redshift schema-details query requires schema and table names for {table_context.fully_qualified_name}")
529
540
  platform = self.platform.value
530
- template = self.jinja_env.get_template(
531
- SHOW_COLUMNS_QUERY_TEMPLATE_NAME_FORMAT.format(platform=platform)
532
- )
541
+ template = self.jinja_env.get_template(SHOW_COLUMNS_QUERY_TEMPLATE_NAME_FORMAT.format(platform=platform))
533
542
  database_name = table_context.database_name or ""
534
543
  return template.render(
535
- object_database_sql=(
536
- write_sql_name(database_name, platform) if database_name.strip() else ""
537
- ),
544
+ object_database_sql=(write_sql_name(database_name, platform) if database_name.strip() else ""),
538
545
  object_schema_sql=write_sql_name(table_context.schema_name, platform),
539
546
  object_name_sql=write_sql_name(table_context.internal_table_name, platform),
540
547
  )
@@ -579,9 +586,7 @@ class QueryGeneratorRedshift(QueryGeneratorBase):
579
586
  @staticmethod
580
587
  def _lowered_data_types(data_types: pd.Series) -> pd.Series:
581
588
  """Lower-case data-type spellings for the fixup masks, with missing values as ``""``."""
582
- return data_types.map(
583
- lambda value: str(value).lower() if value is not None and not pd.isna(value) else ""
584
- )
589
+ return data_types.map(lambda value: str(value).lower() if value is not None and not pd.isna(value) else "")
585
590
 
586
591
  def _apply_length_overrides(self, frame: pd.DataFrame, lowered_data_types: pd.Series) -> None:
587
592
  """Null the length of spatial and binary types, and set the HLLSKETCH length."""
@@ -589,25 +594,19 @@ class QueryGeneratorRedshift(QueryGeneratorBase):
589
594
  if length_column not in frame.columns:
590
595
  return
591
596
  frame.loc[lowered_data_types.isin(self._NULL_LENGTH_DATA_TYPES), length_column] = None
592
- frame.loc[lowered_data_types == RedshiftType.HLLSKETCH.lower(), length_column] = (
593
- REDSHIFT_HLLSKETCH_CHARACTER_MAXIMUM_LENGTH
594
- )
597
+ frame.loc[lowered_data_types == RedshiftType.HLLSKETCH.lower(), length_column] = REDSHIFT_HLLSKETCH_CHARACTER_MAXIMUM_LENGTH
595
598
 
596
599
  def _apply_float_precision(self, frame: pd.DataFrame, lowered_data_types: pd.Series) -> None:
597
600
  """Give float types the precision L1 compares, which ``SHOW COLUMNS`` does not report."""
598
601
  precision_column = SchemaValidationFields.NUMERIC_PRECISION.value
599
602
  if precision_column not in frame.columns:
600
603
  return
601
- frame.loc[lowered_data_types.isin(self._FLOAT_PRECISION_DATA_TYPES), precision_column] = (
602
- REDSHIFT_FLOAT_NUMERIC_PRECISION
603
- )
604
+ frame.loc[lowered_data_types.isin(self._FLOAT_PRECISION_DATA_TYPES), precision_column] = REDSHIFT_FLOAT_NUMERIC_PRECISION
604
605
 
605
606
  @staticmethod
606
607
  def _uppercased_data_types(data_types: pd.Series) -> pd.Series:
607
608
  """Upper-case data-type spellings, leaving missing values untouched."""
608
- return data_types.map(
609
- lambda value: str(value).upper() if value is not None and not pd.isna(value) else value
610
- )
609
+ return data_types.map(lambda value: str(value).upper() if value is not None and not pd.isna(value) else value)
611
610
 
612
611
  @staticmethod
613
612
  def _stamp_object_type(frame: pd.DataFrame, table_context: TableContext) -> None:
@@ -752,6 +751,23 @@ class QueryGeneratorRedshift(QueryGeneratorBase):
752
751
  raise ValueError(f"No normalization template found for data type {data_type} and no DEFAULT template available.")
753
752
  return normalization_template
754
753
 
754
+ def _resolve_metrics_col_type(self, col: ColumnMetadata, table_context: TableContext) -> str:
755
+ """Key an Iceberg VARCHAR DATE / TIMESTAMP / TIMESTAMPTZ to the signed-year metrics.
756
+
757
+ ``TO_CHAR 'YYYY'`` drops the era, so MIN / MAX would not match the text
758
+ the UNLOAD staged (SNOW-4353618, SNOW-4381535). Native targets keep the
759
+ shared templates.
760
+ """
761
+ col_type = super()._resolve_metrics_col_type(col, table_context)
762
+ if not IcebergProfile.from_table_context(table_context).is_active:
763
+ return col_type
764
+ signed_year_key = _SIGNED_YEAR_TEXT_METRICS_KEYS.get(col_type.upper())
765
+ if signed_year_key is None:
766
+ return col_type
767
+ if not is_snowflake_varchar_like_type(get_paired_target_column_types(table_context).get(col.name)):
768
+ return col_type
769
+ return signed_year_key
770
+
755
771
  def _resolve_normalization_templates(
756
772
  self,
757
773
  table_context: TableContext,
@@ -249,6 +249,52 @@ VARCHAR_TIMESTAMP:
249
249
  metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
250
250
  metric_return_datatype: NUMBER
251
251
 
252
+ # Signed-year ISO text (Redshift Iceberg, SNOW-4353618): TRY_TO_TIMESTAMP_NTZ
253
+ # returns NULL for negative and 5+ digit years, so parse from parts like the
254
+ # Iceberg column comment's cast back (DMO iceberg_column_comment.py).
255
+ VARCHAR_TIMESTAMP_SIGNED:
256
+ min:
257
+ metric_query: 'MIN(TIMESTAMP_NTZ_FROM_PARTS(IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL), TRY_TO_TIME(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''T([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)'', 1, 1, ''e'', 1))))'
258
+ metric_return_datatype: VARCHAR
259
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
260
+ max:
261
+ metric_query: 'MAX(TIMESTAMP_NTZ_FROM_PARTS(IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL), TRY_TO_TIME(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''T([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)'', 1, 1, ''e'', 1))))'
262
+ metric_return_datatype: VARCHAR
263
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
264
+ count_null:
265
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
266
+ metric_return_datatype: NUMBER
267
+
268
+ # Signed-year ISO DATE text (Redshift Iceberg, SNOW-4381535): TRY_TO_DATE alone is
269
+ # NULL for negative and 5+ digit years, so parse like the column comment's cast back.
270
+ VARCHAR_DATE_SIGNED:
271
+ min:
272
+ metric_query: 'MIN(IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL))'
273
+ metric_return_datatype: VARCHAR
274
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD')
275
+ max:
276
+ metric_query: 'MAX(IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL))'
277
+ metric_return_datatype: VARCHAR
278
+ metric_normalization: TO_CHAR({{ metric_query }}, 'YYYY-MM-DD')
279
+ count_null:
280
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
281
+ metric_return_datatype: NUMBER
282
+
283
+ # Signed-year ISO TIMESTAMPTZ text (Redshift Iceberg, SNOW-4381535), staged in UTC.
284
+ # Parse like the column comment's cast back; TO_CHAR prints a zero offset as Z.
285
+ VARCHAR_TIMESTAMP_TZ_SIGNED:
286
+ min:
287
+ metric_query: 'MIN(DATEADD(nanosecond, DATEDIFF(nanosecond, ''00:00:00''::TIME, TRY_TO_TIME(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''T([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)'', 1, 1, ''e'', 1))), DATEADD(day, DATEDIFF(day, ''2000-01-01''::DATE, IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL)), TRY_TO_TIMESTAMP_TZ(''2000-01-01 00:00:00 '' || COALESCE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''([+-][0-9]{2}:[0-9]{2})$'', 1, 1, ''e'', 1), ''+00:00''), ''YYYY-MM-DD HH24:MI:SS TZH:TZM''))))'
288
+ metric_return_datatype: VARCHAR
289
+ metric_normalization: REGEXP_REPLACE(TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM'), 'Z$', '+00:00')
290
+ max:
291
+ metric_query: 'MAX(DATEADD(nanosecond, DATEDIFF(nanosecond, ''00:00:00''::TIME, TRY_TO_TIME(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''T([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)'', 1, 1, ''e'', 1))), DATEADD(day, DATEDIFF(day, ''2000-01-01''::DATE, IFF(TRY_TO_NUMBER(REGEXP_SUBSTR(TO_VARCHAR(TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), ''YYYY-MM-DD''), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0) = TRY_TO_NUMBER(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+)-'', 1, 1, ''e'', 1), 38, 0), TRY_TO_DATE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''^(-?[0-9]+-[0-9]{2}-[0-9]{2})'', 1, 1, ''e'', 1)), NULL)), TRY_TO_TIMESTAMP_TZ(''2000-01-01 00:00:00 '' || COALESCE(REGEXP_SUBSTR(TRIM("{{ col_name }}"), ''([+-][0-9]{2}:[0-9]{2})$'', 1, 1, ''e'', 1), ''+00:00''), ''YYYY-MM-DD HH24:MI:SS TZH:TZM''))))'
292
+ metric_return_datatype: VARCHAR
293
+ metric_normalization: REGEXP_REPLACE(TO_CHAR({{ metric_query }}, 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM'), 'Z$', '+00:00')
294
+ count_null:
295
+ metric_query: SUM(CASE WHEN "{{ col_name }}" IS NULL THEN 1 ELSE 0 END)
296
+ metric_return_datatype: NUMBER
297
+
252
298
  # Order by UTC time-of-day. A plain MIN of the parsed instant uses today's date
253
299
  # and can cross midnight, so the formatted value would keep the wrong offset.
254
300
  VARCHAR_TIME_TZ:
@@ -11,20 +11,22 @@ NUMBER: TO_CHAR("{{ col_name }}", '{{ numeric_format_mask }}')
11
11
  # truncates the same way on every engine; a CAST to TIME(p) would round.
12
12
  TIME: LEFT(TO_CHAR("{{ col_name }}", 'HH24:MI:SS.FF9'), {{ time_text_length }})
13
13
  TIME WITH TIME ZONE: LEFT(TO_CHAR("{{ col_name }}", 'HH24:MI:SS.FF9'), {{ time_text_length }})
14
- TIMESTAMP_LTZ: TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
14
+ # Typed Snowflake timestamps. The fractional-second digits are the Iceberg Parquet
15
+ # format version (v2 micro FF6 / v3 nano FF9), substituted at render from
16
+ # resolve_iceberg_fraction_digits from iceberg_spec; a spec other than v2 stays FF9.
17
+ TIMESTAMP_LTZ: TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}')
15
18
  # Paired Oracle TIMESTAMP WITH LOCAL TIME ZONE: compare the retained instant in UTC.
16
- TIMESTAMP_LTZ_UTC: TO_CHAR(CONVERT_TIMEZONE('UTC', "{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
17
- TIMESTAMP_NTZ: TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF9')
18
- TIMESTAMP_TZ: REGEXP_REPLACE(TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM'), 'Z$', '+00:00')
19
+ TIMESTAMP_LTZ_UTC: TO_CHAR(CONVERT_TIMEZONE('UTC', "{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}')
20
+ TIMESTAMP_NTZ: TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}')
21
+ TIMESTAMP_TZ: REGEXP_REPLACE(TO_CHAR("{{ col_name }}", 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}TZH:TZM'), 'Z$', '+00:00')
19
22
  # Paired PostgreSQL timestamptz: compare UTC instants (Oracle/Teradata use TIMESTAMP_TZ).
20
- TIMESTAMP_TZ_UTC: TO_CHAR(CONVERT_TIMEZONE('UTC', "{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF9') || '+00:00'
21
- VARCHAR_ISO_TZ: REGEXP_REPLACE(TO_CHAR(TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}")), 'YYYY-MM-DD"T"HH24:MI:SS.FF9TZH:TZM'), 'Z$', '+00:00')
23
+ TIMESTAMP_TZ_UTC: TO_CHAR(CONVERT_TIMEZONE('UTC', "{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}') || '+00:00'
24
+ VARCHAR_ISO_TZ: REGEXP_REPLACE(TO_CHAR(TRY_TO_TIMESTAMP_TZ(TRIM("{{ col_name }}")), 'YYYY-MM-DD"T"HH24:MI:SS.FF{{ fraction_digits }}TZH:TZM'), 'Z$', '+00:00')
22
25
  # Canonical UTC-instant form for every Snowflake TIMESTAMP_LTZ mirror of a
23
26
  # UTC-instant TIMESTAMPTZ source (Redshift / PostgreSQL), reached from either
24
27
  # the native path (iceberg_spec and storage_mode both None, target
25
28
  # TIMESTAMP_LTZ / TIMESTAMP_LTZ(6) / TIMESTAMP_LTZ(9)) or the Iceberg v2
26
- # compatible overlay (TIMESTAMP_LTZ(6)). Source side emits the same
27
- # FF9-padded +00:00 string.
29
+ # compatible overlay (TIMESTAMP_LTZ(6)). Always FF9-padded +00:00 on both sides.
28
30
  TIMESTAMP_LTZ_UTC_FF9_OFFSET: TO_CHAR(CONVERT_TIMEZONE('UTC', "{{ col_name }}"), 'YYYY-MM-DD"T"HH24:MI:SS.FF9') || '+00:00'
29
31
  # Complex values flattened to VARCHAR under Iceberg compatible DDL retain the
30
32
  # exact Redshift JSON_SERIALIZE text staged by UNLOAD. Compare that migration