snowflake-data-validation 1.3.3__tar.gz → 1.3.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 (320) hide show
  1. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/PKG-INFO +2 -2
  2. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/README.md +1 -1
  3. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/__version__.py +1 -1
  4. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/__init__.py +6 -0
  5. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/_internal.py +2 -0
  6. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/data_validation_api.py +178 -0
  7. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/query_execution_result.py +2 -0
  8. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/redshift_cli.py +1 -1
  9. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_sql_server.py +16 -4
  10. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_cli.py +1 -1
  11. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/teradata_cli.py +1 -1
  12. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_report_buffer.py +2 -0
  13. snowflake_data_validation-1.3.4/tests/unit/test_escape_odbc_value.py +94 -0
  14. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/.gitignore +0 -0
  15. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/LICENSE +0 -0
  16. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/pyproject.toml +0 -0
  17. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/__init__.py +0 -0
  18. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/__main__.py +0 -0
  19. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/common_cli/cli_partitioning.py +0 -0
  20. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/common_cli/cli_sync_validation.py +0 -0
  21. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/comparison_orchestrator.py +0 -0
  22. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/__init__.py +0 -0
  23. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/configuration_loader.py +0 -0
  24. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/configuration_model.py +0 -0
  25. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/connection_types.py +0 -0
  26. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/connections/__init__.py +0 -0
  27. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/logging_configuration.py +0 -0
  28. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/table_configuration.py +0 -0
  29. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/validation_configuration.py +0 -0
  30. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/model/view_configuration.py +0 -0
  31. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/configuration/singleton.py +0 -0
  32. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/connector/__init__.py +0 -0
  33. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/connector/connector_base.py +0 -0
  34. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/connector/connector_factory_base.py +0 -0
  35. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/connector/connector_failure_tracker.py +0 -0
  36. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/__init__.py +0 -0
  37. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/async_generation_executor.py +0 -0
  38. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/async_validation_executor.py +0 -0
  39. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/base_validation_executor.py +0 -0
  40. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/executor_factory.py +0 -0
  41. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/extractor_types.py +0 -0
  42. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/source_validation_executor.py +0 -0
  43. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/executer/sync_validation_executor.py +0 -0
  44. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/extractor/__init__.py +0 -0
  45. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/extractor/metadata_extractor_base.py +0 -0
  46. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/extractor/sql_queries_template_generator.py +0 -0
  47. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/main_cli.py +0 -0
  48. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/console_progress_reporter.py +0 -0
  49. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/__init__.py +0 -0
  50. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/html_report_builder.py +0 -0
  51. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/html_report/report_metadata.py +0 -0
  52. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/parallel_execution_engine.py +0 -0
  53. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/table_metadata_processor.py +0 -0
  54. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/validation_progress_reporter.py +0 -0
  55. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/orchestration/view_preprocessor.py +0 -0
  56. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/DATA_VALIDATION_API_OVERVIEW.md +0 -0
  57. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/configuration/__init__.py +0 -0
  58. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/connectors/__init__.py +0 -0
  59. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/context/__init__.py +0 -0
  60. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/enums/__init__.py +0 -0
  61. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/generators/__init__.py +0 -0
  62. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/metadata/__init__.py +0 -0
  63. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/__init__.py +0 -0
  64. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/data_validation_exception.py +0 -0
  65. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/generated_query.py +0 -0
  66. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/query_generator_factory.py +0 -0
  67. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/public/model/validation_result.py +0 -0
  68. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/query/__init__.py +0 -0
  69. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/query/query_generator_base.py +0 -0
  70. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/__init__.py +0 -0
  71. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/connector/__init__.py +0 -0
  72. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/connector/connector_factory_redshift.py +0 -0
  73. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/connector/connector_redshift.py +0 -0
  74. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/metadata_extractor_redshift.py +0 -0
  75. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/redshift_cte_generator.py +0 -0
  76. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_insert_template.sql.j2 +0 -0
  77. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_concatenated_table_template.sql.j2 +0 -0
  78. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_insert_template.sql.j2 +0 -0
  79. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunk_row_md5_table_template.sql.j2 +0 -0
  80. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_chunks_md5_table_template.sql.j2 +0 -0
  81. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_column_metrics_templates.yaml +0 -0
  82. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_columns_cte_template.sql.j2 +0 -0
  83. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_datatypes_normalization_templates.yaml +0 -0
  84. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_extract_chunks_md5_table_template.sql.j2 +0 -0
  85. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_extract_md5_rows_chunk.sql.j2 +0 -0
  86. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_get_columns_metadata.sql.j2 +0 -0
  87. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_insert_chunk_row_md5_template.sql.j2 +0 -0
  88. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_row_count_query.sql.j2 +0 -0
  89. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_table_metadata_query.sql.j2 +0 -0
  90. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/extractor/templates/redshift_to_snowflake_datatypes_mapping_template.yaml +0 -0
  91. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/model/__init__.py +0 -0
  92. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/model/redshift_credentials_connection.py +0 -0
  93. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/query/__init__.py +0 -0
  94. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/query/query_generator_redshift.py +0 -0
  95. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/redshift_arguments_manager.py +0 -0
  96. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/script_writer/__init__.py +0 -0
  97. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/redshift/script_writer/script_writer_redshift.py +0 -0
  98. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/script_writer/__init__.py +0 -0
  99. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/script_writer/script_writer_base.py +0 -0
  100. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/__init__.py +0 -0
  101. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_factory_snowflake.py +0 -0
  102. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/connector/connector_snowflake.py +0 -0
  103. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/metadata_extractor_snowflake.py +0 -0
  104. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/snowflake_cte_generator.py +0 -0
  105. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_concatenated_template.sql.j2 +0 -0
  106. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunk_row_md5_template.sql.j2 +0 -0
  107. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_chunks_md5_table_template.sql.j2 +0 -0
  108. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_column_metrics_templates.yaml +0 -0
  109. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_columns_cte_template.sql.j2 +0 -0
  110. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_datatypes_normalization_templates.yaml +0 -0
  111. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_extract_chunks_md5_table_template.sql.j2 +0 -0
  112. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_extract_md5_rows_chunk.sql.j2 +0 -0
  113. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_case_sensitive_columns.sql.j2 +0 -0
  114. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_get_columns_metadata.sql.j2 +0 -0
  115. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_insert_chunk_row_md5_template.sql.j2 +0 -0
  116. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_row_count_query.sql.j2 +0 -0
  117. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_table_metadata_query.sql.j2 +0 -0
  118. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_temporary_table_from_view_template.sql.j2 +0 -0
  119. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/extractor/templates/snowflake_to_snowflake_datatypes_mapping_template.yaml +0 -0
  120. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/model/__init__.py +0 -0
  121. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_credentials_connection.py +0 -0
  122. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_default_connection.py +0 -0
  123. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/model/snowflake_named_connection.py +0 -0
  124. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/query/__init__.py +0 -0
  125. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/query/query_generator_snowflake.py +0 -0
  126. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/script_writer/__init__.py +0 -0
  127. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/script_writer/script_writer_snowflake.py +0 -0
  128. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/snowflake_arguments_manager.py +0 -0
  129. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/snowflake/snowflake_cli.py +0 -0
  130. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/__init__.py +0 -0
  131. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/__init__.py +0 -0
  132. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/connector/connector_factory_sql_server.py +0 -0
  133. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/__init__.py +0 -0
  134. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/metadata_extractor_sqlserver.py +0 -0
  135. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/sqlserver_cte_generator.py +0 -0
  136. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_chunks_md5_table_template.sql.j2 +0 -0
  137. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_column_metrics_templates.yaml +0 -0
  138. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_columns_cte_template.sql.j2 +0 -0
  139. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_compute_md5_sql.j2 +0 -0
  140. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_datatypes_normalization_templates.yaml +0 -0
  141. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_extract_chunks_md5_table_template.sql.j2 +0 -0
  142. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_extract_md5_rows_chunk.sql.j2 +0 -0
  143. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_columns_metadata.sql.j2 +0 -0
  144. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_get_temporary_table_internal_identifier_template.sql.j2 +0 -0
  145. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_row_count_query.sql.j2 +0 -0
  146. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_table_metadata_query.sql.j2 +0 -0
  147. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_temporary_table_from_view_template.sql.j2 +0 -0
  148. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/extractor/templates/sqlserver_to_snowflake_datatypes_mapping_template.yaml +0 -0
  149. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/model/__init__.py +0 -0
  150. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/model/sqlserver_credentials_connection.py +0 -0
  151. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/query/__init__.py +0 -0
  152. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/query/query_generator_sqlserver.py +0 -0
  153. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/__init__.py +0 -0
  154. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/script_writer/script_writer_sqlserver.py +0 -0
  155. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/sqlserver/sqlserver_arguments_manager.py +0 -0
  156. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/table_partitioning_strategy.md +0 -0
  157. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/__init__.py +0 -0
  158. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/connector/__init__.py +0 -0
  159. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/connector/connector_factory_teradata.py +0 -0
  160. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/connector/connector_teradata.py +0 -0
  161. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/__init__.py +0 -0
  162. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/metadata_extractor_teradata.py +0 -0
  163. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_chunks_md5_table_template.sql.j2 +0 -0
  164. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_column_metrics_templates.yaml +0 -0
  165. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_columns_cte_template.sql.j2 +0 -0
  166. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_compute_md5_sql.j2 +0 -0
  167. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_concatenated.sql.j2 +0 -0
  168. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_create_row_md5.sql.j2 +0 -0
  169. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_datatypes_normalization_templates.yaml +0 -0
  170. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_extract_chunks_md5_table_template.sql.j2 +0 -0
  171. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_extract_md5_rows_chunk.sql.j2 +0 -0
  172. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_get_columns_metadata.sql.j2 +0 -0
  173. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_row_count_query.sql.j2 +0 -0
  174. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_table_metadata_query.sql.j2 +0 -0
  175. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/templates/teradata_to_snowflake_datatypes_mapping_template.yaml +0 -0
  176. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/extractor/teradata_cte_generator.py +0 -0
  177. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/model/__init__.py +0 -0
  178. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/model/teradata_credentials_connection.py +0 -0
  179. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/query/__init__.py +0 -0
  180. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/query/query_generator_teradata.py +0 -0
  181. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/script_writer/__init__.py +0 -0
  182. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/script_writer/script_writer_teradata.py +0 -0
  183. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/teradata/teradata_arguments_manager.py +0 -0
  184. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/__init__.py +0 -0
  185. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/arguments_manager_base.py +0 -0
  186. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/arguments_manager_factory.py +0 -0
  187. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/base_output_handler.py +0 -0
  188. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/column_partitioning_strategy.py +0 -0
  189. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_editor.py +0 -0
  190. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_generator.py +0 -0
  191. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/configuration_file_synchronizer.py +0 -0
  192. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/connection_pool.py +0 -0
  193. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/connector_factory.py +0 -0
  194. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/console_output_handler.py +0 -0
  195. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/constants.py +0 -0
  196. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/context.py +0 -0
  197. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/cpu_optimizer.py +0 -0
  198. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helper.py +0 -0
  199. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_database.py +0 -0
  200. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_dataframe.py +0 -0
  201. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_io.py +0 -0
  202. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_misc.py +0 -0
  203. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_query_result.py +0 -0
  204. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/helpers/helper_templates.py +0 -0
  205. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/logging_config.py +0 -0
  206. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/logging_utils.py +0 -0
  207. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/model/chunk.py +0 -0
  208. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/model/column_metadata.py +0 -0
  209. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/model/table_column_metadata.py +0 -0
  210. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/model/table_context.py +0 -0
  211. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/model/templates_loader_manager.py +0 -0
  212. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/progress_reporter.py +0 -0
  213. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/row_partitioning_strategy.py +0 -0
  214. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/run_context.py +0 -0
  215. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/telemetry.py +0 -0
  216. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/templates/configuration_file_templates.py +0 -0
  217. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/thread_safe_singleton.py +0 -0
  218. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/utils/validation_utils.py +0 -0
  219. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/__init__.py +0 -0
  220. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/cell_data_validator.py +0 -0
  221. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/data_validator_base.py +0 -0
  222. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/metrics_data_validator.py +0 -0
  223. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/results_summary_report.py +0 -0
  224. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/row_data_validator.py +0 -0
  225. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/row_validation_report_buffer.py +0 -0
  226. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/schema_data_validator.py +0 -0
  227. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_database/__init__.py +0 -0
  228. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_database/sqlite_validation_connection.py +0 -0
  229. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_database/validation_database_connection_base.py +0 -0
  230. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_database_manager.py +0 -0
  231. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/src/snowflake/snowflake_data_validation/validation/validation_execution_context.py +0 -0
  232. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/.coveragerc +0 -0
  233. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/.coveragerc +0 -0
  234. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/Redshift/test_metadata_extractor_integration.py +0 -0
  235. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/test_async_generation_integration.py +0 -0
  236. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/test_async_validation_integration.py +0 -0
  237. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/test_reference_integration.py +0 -0
  238. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/test_source_validation_integration.py +0 -0
  239. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/integration/test_sync_validation_integration.py +0 -0
  240. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_general.py +0 -0
  241. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_generate_validation_scripts.py +0 -0
  242. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_get_configuration_files.py +0 -0
  243. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_run_async_validation.py +0 -0
  244. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_run_validation.py +0 -0
  245. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/cli/test_redshift_cli_run_validation_ipc.py +0 -0
  246. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/model/test_redshift_credentials_connection.py +0 -0
  247. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/query/test_query_generator_redshift.py +0 -0
  248. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/script_writer/test_script_writer_redshift.py +0 -0
  249. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/test_connector_redshift.py +0 -0
  250. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/test_redshift_arguments_manager.py +0 -0
  251. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/test_redshift_cte_generator.py +0 -0
  252. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Redshift/test_redshift_metrics_templates.py +0 -0
  253. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Teradata/test_connector_teradata.py +0 -0
  254. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Teradata/test_metadata_extractor_teradata.py +0 -0
  255. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Teradata/test_query_generator_teradata.py +0 -0
  256. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Teradata/test_teradata_cli.py +0 -0
  257. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/Teradata/test_teradata_metrics_validation.py +0 -0
  258. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/__init__.py +0 -0
  259. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/custom_templates_loader/snowflake_column_metrics_templates.yaml +0 -0
  260. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/custom_templates_loader/snowflake_datatypes_normalization_templates.yaml +0 -0
  261. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/custom_templates_loader/snowflake_table_metadata_query.sql.j2 +0 -0
  262. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_configuration_loader/test_load_configuration_model/conf.yaml +0 -0
  263. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_configuration_loader/test_load_configuration_model_reading_file_exception/conf.yaml +0 -0
  264. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_configuration_file.json +0 -0
  265. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_connection_source_db.toml +0 -0
  266. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_datatypes_normalization_template.yaml +0 -0
  267. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_datatypes_template.yaml +0 -0
  268. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_metrics_template.yaml +0 -0
  269. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_metrics_template_datatypes.yaml +0 -0
  270. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/dummy_template.csv +0 -0
  271. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_helpers/not_valid_format.yaml +0 -0
  272. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_templates_loader_manager/snowflake_column_metrics_templates.yaml +0 -0
  273. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/assets/test_templates_loader_manager/snowflake_datatypes_normalization_templates.yaml +0 -0
  274. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_arguments_manager_base.py +0 -0
  275. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_arguments_manager_factory.py +0 -0
  276. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_cell_data_validator.py +0 -0
  277. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_column_metadata.py +0 -0
  278. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_column_partitioning_strategy.py +0 -0
  279. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_comparison_orchestrator.py +0 -0
  280. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_configuration_file_editor.py +0 -0
  281. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_configuration_file_synchronizer.py +0 -0
  282. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_configuration_loader.py +0 -0
  283. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_configuration_model.py +0 -0
  284. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_connection_pool.py +0 -0
  285. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_connector_failure_tracker.py +0 -0
  286. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_connector_snowflake.py +0 -0
  287. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_console_progress_reporter.py +0 -0
  288. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_cpu_optimizer.py +0 -0
  289. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_data_validator.py +0 -0
  290. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_executor_factory.py +0 -0
  291. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_helper_dataframe.py +0 -0
  292. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_helpers.py +0 -0
  293. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_html_report_builder.py +0 -0
  294. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_logging_config.py +0 -0
  295. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_metrics_templates.py +0 -0
  296. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_report_metadata.py +0 -0
  297. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_row_data_validator.py +0 -0
  298. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_row_partitioning_strategy.py +0 -0
  299. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_row_validation_report_buffer.py +0 -0
  300. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_snowflake_arguments_manager.py +0 -0
  301. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_snowflake_cli.py +0 -0
  302. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_source_validation_executor.py +0 -0
  303. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_sqlite_validation_connection.py +0 -0
  304. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_sqlserver_arguments_manager.py +0 -0
  305. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_sqlserver_cli.py +0 -0
  306. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_sqlserver_multi_version_support.py +0 -0
  307. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_table_column_metadata_model.py +0 -0
  308. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_table_configuration.py +0 -0
  309. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_table_context.py +0 -0
  310. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_table_metadata_processor.py +0 -0
  311. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_telemetry.py +0 -0
  312. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_templates_loader_manager.py +0 -0
  313. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_validation_configuration.py +0 -0
  314. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_validation_database_connection.py +0 -0
  315. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_validation_execution_context.py +0 -0
  316. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_validation_progress_reporter.py +0 -0
  317. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_validation_report_buffer.py +0 -0
  318. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/test_view_configuration.py +0 -0
  319. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/utils/__init__.py +0 -0
  320. {snowflake_data_validation-1.3.3 → snowflake_data_validation-1.3.4}/tests/unit/utils/test_constants.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-data-validation
3
- Version: 1.3.3
3
+ Version: 1.3.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/
@@ -186,7 +186,7 @@ This project is licensed under the Snowflake Conversion Software Terms. See the
186
186
  ## 🆘 Support
187
187
 
188
188
  - **Documentation**: [Full documentation](https://docs.snowflake.com/en/migrations/snowconvert-docs/data-validation-cli/CLI_QUICK_REFERENCE)
189
- - **Issues**: [GitHub Issues](https://github.com/snowflakedb/migrations-data-validation/issues)
189
+ - **Issues**: [GitHub Issues](https://github.com/snowflake-eng/migrations-data-validation/issues)
190
190
 
191
191
  ---
192
192
 
@@ -110,7 +110,7 @@ This project is licensed under the Snowflake Conversion Software Terms. See the
110
110
  ## 🆘 Support
111
111
 
112
112
  - **Documentation**: [Full documentation](https://docs.snowflake.com/en/migrations/snowconvert-docs/data-validation-cli/CLI_QUICK_REFERENCE)
113
- - **Issues**: [GitHub Issues](https://github.com/snowflakedb/migrations-data-validation/issues)
113
+ - **Issues**: [GitHub Issues](https://github.com/snowflake-eng/migrations-data-validation/issues)
114
114
 
115
115
  ---
116
116
 
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- __version__ = "1.3.3"
16
+ __version__ = "1.3.4"
@@ -42,6 +42,9 @@ from snowflake.snowflake_data_validation.public.data_validation_api import (
42
42
  build_validation_file_path,
43
43
  compare_md5_chunks,
44
44
  compare_md5_rows_chunk,
45
+ create_source_table_context_from_configuration,
46
+ create_table_context,
47
+ create_target_table_context_from_configuration,
45
48
  execute_query,
46
49
  execute_query_from_table_configuration,
47
50
  execute_statement,
@@ -155,6 +158,9 @@ __all__ = [
155
158
  "build_validation_file_path",
156
159
  "compare_md5_chunks",
157
160
  "compare_md5_rows_chunk",
161
+ "create_source_table_context_from_configuration",
162
+ "create_table_context",
163
+ "create_target_table_context_from_configuration",
158
164
  "execute_query",
159
165
  "execute_query_from_table_configuration",
160
166
  "execute_statement",
@@ -22,6 +22,8 @@ WARNING: Functions in this module are internal implementation details and
22
22
  may change without notice. Do not import from this module directly.
23
23
  """
24
24
 
25
+ from __future__ import annotations
26
+
25
27
  import os
26
28
 
27
29
  from collections.abc import Callable
@@ -13,7 +13,10 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from __future__ import annotations
17
+
16
18
  from collections.abc import Callable
19
+ from pathlib import Path
17
20
 
18
21
  import pandas as pd
19
22
 
@@ -54,15 +57,23 @@ from snowflake.snowflake_data_validation.utils.constants import (
54
57
  ROW_COUNT_KEY,
55
58
  SCHEMA_NAME_KEY,
56
59
  TABLE_NAME_KEY,
60
+ ObjectType,
61
+ Origin,
57
62
  Platform,
58
63
  )
59
64
  from snowflake.snowflake_data_validation.utils.helpers.helper_database import (
60
65
  HelperDatabase,
61
66
  )
67
+ from snowflake.snowflake_data_validation.utils.model.column_metadata import (
68
+ ColumnMetadata,
69
+ )
62
70
  from snowflake.snowflake_data_validation.utils.model.table_column_metadata import (
63
71
  TableColumnMetadata,
64
72
  )
65
73
  from snowflake.snowflake_data_validation.utils.model.table_context import TableContext
74
+ from snowflake.snowflake_data_validation.utils.model.templates_loader_manager import (
75
+ TemplatesLoaderManager,
76
+ )
66
77
  from snowflake.snowflake_data_validation.validation.cell_data_validator import (
67
78
  CellDataValidator,
68
79
  )
@@ -1288,3 +1299,170 @@ def build_validation_file_path(
1288
1299
  filename = f"{table_context.fully_qualified_name}.csv"
1289
1300
 
1290
1301
  return os.path.join(base_directory, validation_type, filename)
1302
+
1303
+
1304
+ def create_table_context(
1305
+ columns: list[ColumnMetadata],
1306
+ database_name: str,
1307
+ fully_qualified_name: str,
1308
+ id: int,
1309
+ internal_fully_qualified_name: str,
1310
+ internal_table_name: str,
1311
+ object_type: ObjectType,
1312
+ origin: Origin,
1313
+ platform: Platform,
1314
+ queries_templates_directory_path: str,
1315
+ row_count: int,
1316
+ run_id: str,
1317
+ run_start_time: str,
1318
+ schema_name: str,
1319
+ table_name: str,
1320
+ templates_directory_path: str,
1321
+ apply_metric_column_modifier: bool = True,
1322
+ chunk_number: int = 1,
1323
+ column_mappings: dict[str, str] = None,
1324
+ column_selection_list: list[str] = None,
1325
+ exclude_metrics: bool = False,
1326
+ index_column_collection: list[str] = None,
1327
+ is_case_sensitive: bool = False,
1328
+ is_exclusion_mode: bool = False,
1329
+ max_failed_rows_number: int = 100,
1330
+ where_clause: str = "",
1331
+ ) -> TableContext:
1332
+ """Create a TableContext with the provided parameters."""
1333
+ has_where_clause = where_clause != ""
1334
+ is_temporary_table = object_type != ObjectType.TABLE
1335
+ sql_generator = SQLQueriesTemplateGenerator(
1336
+ jinja_templates_folder_path=Path(queries_templates_directory_path)
1337
+ )
1338
+ templates_loader_manager = TemplatesLoaderManager(
1339
+ templates_directory_path=Path(templates_directory_path),
1340
+ platform=platform,
1341
+ )
1342
+ if column_mappings is None:
1343
+ column_mappings = {}
1344
+
1345
+ if column_selection_list is None:
1346
+ column_selection_list = []
1347
+
1348
+ if index_column_collection is None:
1349
+ index_column_collection = []
1350
+
1351
+ table_context = TableContext(
1352
+ apply_metric_column_modifier=apply_metric_column_modifier,
1353
+ chunk_number=chunk_number,
1354
+ column_mappings=column_mappings,
1355
+ column_selection_list=column_selection_list,
1356
+ columns=columns,
1357
+ database_name=database_name,
1358
+ exclude_metrics=exclude_metrics,
1359
+ fully_qualified_name=fully_qualified_name,
1360
+ has_where_clause=has_where_clause,
1361
+ id=id,
1362
+ internal_fully_qualified_name=internal_fully_qualified_name,
1363
+ internal_table_name=internal_table_name,
1364
+ is_case_sensitive=is_case_sensitive,
1365
+ is_exclusion_mode=is_exclusion_mode,
1366
+ is_temporary_table=is_temporary_table,
1367
+ max_failed_rows_number=max_failed_rows_number,
1368
+ object_type=object_type,
1369
+ origin=origin,
1370
+ platform=platform,
1371
+ row_count=row_count,
1372
+ run_id=run_id,
1373
+ run_start_time=run_start_time,
1374
+ schema_name=schema_name,
1375
+ sql_generator=sql_generator,
1376
+ table_name=table_name,
1377
+ templates_loader_manager=templates_loader_manager,
1378
+ user_index_column_collection=index_column_collection,
1379
+ where_clause=where_clause,
1380
+ )
1381
+
1382
+ return table_context
1383
+
1384
+
1385
+ def create_source_table_context_from_configuration(
1386
+ table_configuration: TableConfiguration,
1387
+ columns: list[ColumnMetadata],
1388
+ platform: Platform,
1389
+ row_count: int,
1390
+ queries_templates_directory_path: str,
1391
+ templates_directory_path: str,
1392
+ run_id: str,
1393
+ run_start_time: str,
1394
+ ) -> TableContext:
1395
+ """Create a source TableContext from a given TableConfiguration."""
1396
+ source_table_context = create_table_context(
1397
+ apply_metric_column_modifier=table_configuration.apply_metric_column_modifier,
1398
+ chunk_number=table_configuration.chunk_number,
1399
+ column_mappings=table_configuration.column_mappings,
1400
+ column_selection_list=table_configuration.column_selection_list,
1401
+ columns=columns,
1402
+ database_name=table_configuration.source_database,
1403
+ exclude_metrics=table_configuration.exclude_metrics,
1404
+ fully_qualified_name=table_configuration.fully_qualified_name,
1405
+ id=table_configuration.id,
1406
+ index_column_collection=table_configuration.index_column_list,
1407
+ internal_fully_qualified_name=table_configuration.internal_fully_qualified_name,
1408
+ internal_table_name=table_configuration.internal_source_table,
1409
+ is_case_sensitive=table_configuration.is_case_sensitive,
1410
+ is_exclusion_mode=table_configuration.use_column_selection_as_exclude_list,
1411
+ max_failed_rows_number=table_configuration.max_failed_rows_number,
1412
+ object_type=table_configuration.object_type,
1413
+ origin=Origin.SOURCE,
1414
+ platform=platform,
1415
+ queries_templates_directory_path=queries_templates_directory_path,
1416
+ row_count=row_count,
1417
+ run_id=run_id,
1418
+ run_start_time=run_start_time,
1419
+ schema_name=table_configuration.source_schema,
1420
+ table_name=table_configuration.source_table,
1421
+ templates_directory_path=templates_directory_path,
1422
+ where_clause=table_configuration.where_clause,
1423
+ )
1424
+
1425
+ return source_table_context
1426
+
1427
+
1428
+ def create_target_table_context_from_configuration(
1429
+ table_configuration: TableConfiguration,
1430
+ columns: list[ColumnMetadata],
1431
+ platform: Platform,
1432
+ row_count: int,
1433
+ queries_templates_directory_path: str,
1434
+ templates_directory_path: str,
1435
+ run_id: str,
1436
+ run_start_time: str,
1437
+ ) -> TableContext:
1438
+ """Create a target TableContext from a given TableConfiguration."""
1439
+ target_table_context = create_table_context(
1440
+ apply_metric_column_modifier=table_configuration.apply_metric_column_modifier,
1441
+ chunk_number=table_configuration.chunk_number,
1442
+ column_mappings=table_configuration.column_mappings,
1443
+ column_selection_list=table_configuration.column_selection_list,
1444
+ columns=columns,
1445
+ database_name=table_configuration.target_database,
1446
+ exclude_metrics=table_configuration.exclude_metrics,
1447
+ fully_qualified_name=table_configuration.target_fully_qualified_name,
1448
+ id=table_configuration.id,
1449
+ index_column_collection=table_configuration.target_index_column_list,
1450
+ internal_fully_qualified_name=table_configuration.internal_target_fully_qualified_name,
1451
+ internal_table_name=table_configuration.internal_target_name,
1452
+ is_case_sensitive=table_configuration.is_case_sensitive,
1453
+ is_exclusion_mode=table_configuration.use_column_selection_as_exclude_list,
1454
+ max_failed_rows_number=table_configuration.max_failed_rows_number,
1455
+ object_type=table_configuration.object_type,
1456
+ origin=Origin.TARGET,
1457
+ platform=platform,
1458
+ queries_templates_directory_path=queries_templates_directory_path,
1459
+ row_count=row_count,
1460
+ run_id=run_id,
1461
+ run_start_time=run_start_time,
1462
+ schema_name=table_configuration.target_schema,
1463
+ table_name=table_configuration.target_name,
1464
+ templates_directory_path=templates_directory_path,
1465
+ where_clause=table_configuration.target_where_clause,
1466
+ )
1467
+
1468
+ return target_table_context
@@ -15,6 +15,8 @@
15
15
 
16
16
  """Query execution result data transfer object."""
17
17
 
18
+ from __future__ import annotations
19
+
18
20
  from dataclasses import dataclass
19
21
 
20
22
  import pandas as pd
@@ -428,7 +428,7 @@ def redshift_run_validation_ipc(
428
428
  mode=NAME_CONNECTION_MODE,
429
429
  name=snow_connection_name,
430
430
  )
431
- elif snow_account and snow_password:
431
+ elif snow_account and (snow_password or snow_private_key_file):
432
432
  snow_credential_object = build_snowflake_credentials(
433
433
  account=snow_account,
434
434
  username=snow_username,
@@ -74,6 +74,15 @@ def import_azure_identity():
74
74
  NAMED_INSTANCE_PATTERN_DETAILED = r"^[a-zA-Z0-9.-]+\\[a-zA-Z0-9_]+$"
75
75
  DEFAULT_SQL_SERVER_PORT = 1433
76
76
 
77
+ def _escape_odbc_value(value: str) -> str:
78
+ """Escape a value for safe inclusion in an ODBC connection string.
79
+
80
+ ODBC uses `;` as a key-value separator and `{`/`}` as quoting
81
+ characters. Wrapping in braces and doubling `}` is always safe,
82
+ even when the value has no special characters.
83
+ """
84
+ return "{" + value.replace("}", "}}") + "}"
85
+
77
86
  # Azure SQL Database scope for token authentication
78
87
  AZURE_SQL_SCOPE = "https://database.windows.net/.default"
79
88
 
@@ -575,14 +584,17 @@ class ConnectorSqlServer(BaseConnector):
575
584
 
576
585
  else:
577
586
  # SQL Server Authentication (username/password)
587
+ safe_user = _escape_odbc_value(user) if user else user
588
+ safe_password = _escape_odbc_value(password) if password else password
589
+
578
590
  if is_named_instance and not is_custom_port:
579
591
  self.string_connection = SQLSERVER_CONNECTION_STRING_NAMED.format(
580
592
  driver=driver,
581
593
  server=host,
582
594
  port=port,
583
595
  database=database,
584
- user=user,
585
- password=password,
596
+ user=safe_user,
597
+ password=safe_password,
586
598
  trust_server_certificate=trust_server_certificate,
587
599
  encrypt=encrypt,
588
600
  )
@@ -592,8 +604,8 @@ class ConnectorSqlServer(BaseConnector):
592
604
  server=host,
593
605
  port=port,
594
606
  database=database,
595
- user=user,
596
- password=password,
607
+ user=safe_user,
608
+ password=safe_password,
597
609
  trust_server_certificate=trust_server_certificate,
598
610
  encrypt=encrypt,
599
611
  )
@@ -534,7 +534,7 @@ def sqlserver_run_validation_ipc(
534
534
  mode=NAME_CONNECTION_MODE,
535
535
  name=snow_connection_name,
536
536
  )
537
- elif snow_account and snow_password:
537
+ elif snow_account and (snow_password or snow_private_key_file):
538
538
  # Build Snowflake credentials
539
539
  snow_credential_object = build_snowflake_credentials(
540
540
  account=snow_account,
@@ -709,7 +709,7 @@ def teradata_run_validation_ipc(
709
709
  mode=NAME_CONNECTION_MODE,
710
710
  name=snow_connection_name,
711
711
  )
712
- elif snow_account and snow_password:
712
+ elif snow_account and (snow_password or snow_private_key_file):
713
713
  # Build Snowflake credentials target
714
714
  snow_credential_object = build_snowflake_credentials(
715
715
  account=snow_account,
@@ -13,6 +13,8 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from __future__ import annotations
17
+
16
18
  import logging
17
19
  import os
18
20
  import queue
@@ -0,0 +1,94 @@
1
+ # Copyright 2026 Snowflake Inc.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ """Unit tests for _escape_odbc_value in ConnectorSqlServer."""
17
+
18
+ import pytest
19
+
20
+ from snowflake.snowflake_data_validation.sqlserver.connector.connector_sql_server import (
21
+ SQLSERVER_CONNECTION_STRING,
22
+ _escape_odbc_value,
23
+ )
24
+
25
+
26
+ class TestEscapeOdbcValue:
27
+ """Tests for _escape_odbc_value ODBC connection string escaping."""
28
+
29
+ def test_plain_password(self):
30
+ assert _escape_odbc_value("SimplePass1!") == "{SimplePass1!}"
31
+
32
+ def test_semicolon(self):
33
+ assert _escape_odbc_value("Semi;Colon123@") == "{Semi;Colon123@}"
34
+
35
+ def test_opening_brace_at_start(self):
36
+ assert _escape_odbc_value("{StartBrace1!") == "{{StartBrace1!}"
37
+
38
+ def test_closing_brace_doubled(self):
39
+ assert _escape_odbc_value("Pass}word1!") == "{Pass}}word1!}"
40
+
41
+ def test_both_braces(self):
42
+ assert _escape_odbc_value("a{b}c") == "{a{b}}c}"
43
+
44
+ def test_semicolon_and_braces(self):
45
+ assert _escape_odbc_value("Semi;{Colon}123@") == "{Semi;{Colon}}123@}"
46
+
47
+ def test_multiple_semicolons(self):
48
+ assert _escape_odbc_value("a;b;c;d") == "{a;b;c;d}"
49
+
50
+ def test_multiple_closing_braces(self):
51
+ assert _escape_odbc_value("a}}b") == "{a}}}}b}"
52
+
53
+ def test_empty_string(self):
54
+ assert _escape_odbc_value("") == "{}"
55
+
56
+ @pytest.mark.parametrize(
57
+ "char",
58
+ ["=", " ", "\\", "'", '"', "%", "&", "@", "#", "]", "["],
59
+ )
60
+ def test_non_special_chars_safe(self, char):
61
+ pwd = f"Pass{char}word1!"
62
+ result = _escape_odbc_value(pwd)
63
+ assert result == "{" + pwd + "}"
64
+
65
+
66
+ class TestEscapedPasswordInConnectionString:
67
+ """Verify escaped passwords produce valid ODBC connection strings."""
68
+
69
+ PARAMS = dict(
70
+ driver="ODBC Driver 18 for SQL Server",
71
+ server="127.0.0.1",
72
+ port=1433,
73
+ database="testdb",
74
+ user="sa",
75
+ trust_server_certificate="yes",
76
+ encrypt="yes",
77
+ )
78
+
79
+ def test_semicolon_not_split(self):
80
+ safe = _escape_odbc_value("Semi;Colon123@")
81
+ conn_str = SQLSERVER_CONNECTION_STRING.format(password=safe, **self.PARAMS)
82
+ assert "PWD={Semi;Colon123@};" in conn_str
83
+ assert "Encrypt=yes" in conn_str
84
+
85
+ def test_brace_at_start_not_misinterpreted(self):
86
+ safe = _escape_odbc_value("{StartBrace1!")
87
+ conn_str = SQLSERVER_CONNECTION_STRING.format(password=safe, **self.PARAMS)
88
+ assert "PWD={{StartBrace1!};" in conn_str
89
+
90
+ def test_plain_password_in_connection_string(self):
91
+ safe = _escape_odbc_value("NormalPass1!")
92
+ conn_str = SQLSERVER_CONNECTION_STRING.format(password=safe, **self.PARAMS)
93
+ assert "PWD={NormalPass1!};" in conn_str
94
+ assert "UID=sa;" in conn_str