==========================================
Backend Test Coverage Report (T053)
==========================================

Running tests with coverage analysis...

============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-9.0.2, pluggy-1.6.0 -- /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend
configfile: pyproject.toml
plugins: anyio-4.12.0, asyncio-1.3.0, cov-7.0.0
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collecting ... collected 303 items

tests/unit/models/test_cascade.py::test_cascade_delete_removes_tasks PASSED [  0%]
tests/unit/models/test_cascade.py::test_cascade_delete_only_affects_user_tasks PASSED [  0%]
tests/unit/models/test_cascade.py::test_orphaned_task_prevented_by_foreign_key PASSED [  0%]
tests/unit/models/test_isolation.py::test_user_isolation_basic PASSED    [  1%]
tests/unit/models/test_isolation.py::test_user_isolation_with_completed_filter PASSED [  1%]
tests/unit/models/test_isolation.py::test_user_isolation_prevents_cross_user_access PASSED [  1%]
tests/unit/models/test_isolation.py::test_user_isolation_with_soft_delete PASSED [  2%]
tests/unit/models/test_isolation.py::test_user_isolation_index_performance PASSED [  2%]
tests/unit/models/test_notification_model.py::test_create_notification PASSED [  2%]
tests/unit/models/test_notification_model.py::test_create_notification_with_task PASSED [  3%]
tests/unit/models/test_notification_model.py::test_notification_status_transition_pending_to_sent PASSED [  3%]
tests/unit/models/test_notification_model.py::test_notification_status_transition_pending_to_failed PASSED [  3%]
tests/unit/models/test_notification_model.py::test_notification_type_enum_constraint PASSED [  4%]
tests/unit/models/test_notification_model.py::test_notification_channel_enum_constraint PASSED [  4%]
tests/unit/models/test_notification_model.py::test_notification_status_enum_constraint PASSED [  4%]
tests/unit/models/test_notification_model.py::test_notification_recipient_max_length PASSED [  5%]
tests/unit/models/test_notification_model.py::test_notification_subject_max_length PASSED [  5%]
tests/unit/models/test_notification_model.py::test_notification_body_max_length PASSED [  5%]
tests/unit/models/test_notification_model.py::test_notification_cascade_delete_on_user PASSED [  6%]
tests/unit/models/test_notification_model.py::test_notification_set_null_on_task_deletion PASSED [  6%]
tests/unit/models/test_notification_model.py::test_query_pending_notifications PASSED [  6%]
tests/unit/models/test_performance.py::test_idx_tasks_due_reminders_performance FAILED [  7%]
tests/unit/models/test_performance.py::test_idx_tasks_user_completed_performance FAILED [  7%]
tests/unit/models/test_performance.py::test_idx_tasks_user_priority_performance FAILED [  7%]
tests/unit/models/test_performance.py::test_idx_tasks_user_due_date_performance FAILED [  8%]
tests/unit/models/test_performance.py::test_notification_pending_index_performance FAILED [  8%]
tests/unit/models/test_performance.py::test_gin_index_fulltext_search_performance FAILED [  8%]
tests/unit/models/test_performance.py::test_gin_index_prefix_search_performance FAILED [  9%]
tests/unit/models/test_performance.py::test_gin_index_complex_search_performance FAILED [  9%]
tests/unit/models/test_queries.py::test_find_all_tasks_with_specific_tag PASSED [  9%]
tests/unit/models/test_queries.py::test_find_tasks_with_multiple_tags PASSED [ 10%]
tests/unit/models/test_queries.py::test_find_tags_for_specific_task PASSED [ 10%]
tests/unit/models/test_queries.py::test_filter_tasks_by_tag_and_user_isolation PASSED [ 10%]
tests/unit/models/test_queries.py::test_filter_tasks_excluding_soft_deleted_tags PASSED [ 11%]
tests/unit/models/test_queries.py::test_count_tasks_per_tag PASSED       [ 11%]
tests/unit/models/test_queries.py::test_find_untagged_tasks PASSED       [ 11%]
tests/unit/models/test_recurrence.py::test_task_with_recurrence_config_daily PASSED [ 12%]
tests/unit/models/test_recurrence.py::test_task_with_recurrence_config_weekly PASSED [ 12%]
tests/unit/models/test_recurrence.py::test_task_with_recurrence_config_monthly PASSED [ 12%]
tests/unit/models/test_recurrence.py::test_task_with_custom_recurrence_config PASSED [ 13%]
tests/unit/models/test_recurrence.py::test_task_recurrence_config_nullable PASSED [ 13%]
tests/unit/models/test_recurrence.py::test_task_recurrence_config_update PASSED [ 13%]
tests/unit/models/test_recurrence.py::test_task_recurrence_config_jsonb_query PASSED [ 14%]
tests/unit/models/test_recurrence.py::test_task_recurrence_config_complex_structure PASSED [ 14%]
tests/unit/models/test_recurrence.py::test_validate_rrule_format PASSED  [ 14%]
tests/unit/models/test_recurrence.py::test_validate_rrule_with_complex_pattern PASSED [ 15%]
tests/unit/models/test_relationships.py::test_create_task_tag_relationship PASSED [ 15%]
tests/unit/models/test_relationships.py::test_task_with_multiple_tags PASSED [ 15%]
tests/unit/models/test_relationships.py::test_tag_with_multiple_tasks PASSED [ 16%]
tests/unit/models/test_relationships.py::test_task_tag_composite_primary_key_uniqueness PASSED [ 16%]
tests/unit/models/test_relationships.py::test_task_tag_cascade_delete_on_task_deletion PASSED [ 16%]
tests/unit/models/test_relationships.py::test_task_tag_cascade_delete_on_tag_deletion PASSED [ 17%]
tests/unit/models/test_relationships.py::test_task_tag_foreign_key_task_required PASSED [ 17%]
tests/unit/models/test_relationships.py::test_task_tag_foreign_key_tag_required PASSED [ 17%]
tests/unit/models/test_soft_delete.py::test_soft_delete_sets_deleted_at PASSED [ 18%]
tests/unit/models/test_soft_delete.py::test_soft_deleted_tasks_excluded_from_queries PASSED [ 18%]
tests/unit/models/test_soft_delete.py::test_soft_deleted_tasks_can_be_queried PASSED [ 18%]
tests/unit/models/test_soft_delete.py::test_soft_delete_preserves_data PASSED [ 19%]
tests/unit/models/test_soft_delete.py::test_undelete_task PASSED         [ 19%]
tests/unit/models/test_soft_delete.py::test_multiple_soft_deletes_per_user PASSED [ 19%]
tests/unit/models/test_tag_model.py::test_create_tag PASSED              [ 20%]
tests/unit/models/test_tag_model.py::test_create_tag_without_color PASSED [ 20%]
tests/unit/models/test_tag_model.py::test_tag_name_required PASSED       [ 20%]
tests/unit/models/test_tag_model.py::test_tag_user_id_required PASSED    [ 21%]
tests/unit/models/test_tag_model.py::test_tag_name_max_length PASSED     [ 21%]
tests/unit/models/test_tag_model.py::test_tag_color_hex_format PASSED    [ 21%]
tests/unit/models/test_tag_model.py::test_tag_unique_constraint_per_user PASSED [ 22%]
tests/unit/models/test_tag_model.py::test_tag_unique_constraint_across_users PASSED [ 22%]
tests/unit/models/test_tag_model.py::test_tag_soft_delete PASSED         [ 22%]
tests/unit/models/test_tag_model.py::test_tag_soft_delete_allows_name_reuse PASSED [ 23%]
tests/unit/models/test_tag_model.py::test_tag_cascade_delete_on_user_deletion PASSED [ 23%]
tests/unit/models/test_task_model.py::test_create_task PASSED            [ 23%]
tests/unit/models/test_task_model.py::test_create_task_with_advanced_fields PASSED [ 24%]
tests/unit/models/test_task_model.py::test_task_title_required PASSED    [ 24%]
tests/unit/models/test_task_model.py::test_task_user_id_required PASSED  [ 24%]
tests/unit/models/test_task_model.py::test_task_default_completed_false PASSED [ 25%]
tests/unit/models/test_task_model.py::test_task_priority_enum_constraint PASSED [ 25%]
tests/unit/models/test_task_model.py::test_task_recurrence_pattern_enum_constraint PASSED [ 25%]
tests/unit/models/test_task_model.py::test_task_description_max_length PASSED [ 26%]
tests/unit/search/test_search.py::test_fulltext_search_basic_query FAILED [ 26%]
tests/unit/search/test_search.py::test_fulltext_search_title_only PASSED [ 26%]
tests/unit/search/test_search.py::test_fulltext_search_description_only PASSED [ 27%]
tests/unit/search/test_search.py::test_fulltext_search_no_results PASSED [ 27%]
tests/unit/search/test_search.py::test_fulltext_search_user_isolation PASSED [ 27%]
tests/unit/search/test_search.py::test_fulltext_search_stemming PASSED   [ 28%]
tests/unit/search/test_search.py::test_fulltext_search_partial_word_matching PASSED [ 28%]
tests/unit/search/test_search.py::test_fulltext_search_multiple_terms PASSED [ 28%]
tests/unit/search/test_search.py::test_fulltext_search_case_insensitive PASSED [ 29%]
tests/unit/search/test_search.py::test_fulltext_search_special_characters PASSED [ 29%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_valid_token_returns_user FAILED [ 29%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_expired_token_raises_401 FAILED [ 30%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_tampered_token_raises_401 FAILED [ 30%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_missing_sub_claim_raises_401 FAILED [ 30%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_user_not_found_raises_401 FAILED [ 31%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_correlation_id_logging_on_success FAILED [ 31%]
tests/unit/test_auth_deps.py::TestGetCurrentUser::test_correlation_id_logging_on_failure FAILED [ 31%]
tests/unit/test_auth_deps.py::TestVerifyUserMatch::test_matching_user_id_returns_user PASSED [ 32%]
tests/unit/test_auth_deps.py::TestVerifyUserMatch::test_mismatched_user_id_raises_403 PASSED [ 32%]
tests/unit/test_auth_deps.py::TestVerifyUserMatch::test_user_isolation_logging PASSED [ 32%]
tests/unit/test_auth_deps.py::TestVerifyUserMatch::test_uuid_and_string_id_comparison PASSED [ 33%]
tests/unit/test_auth_deps.py::TestVerifyUserMatch::test_case_sensitive_id_comparison PASSED [ 33%]
tests/unit/test_auth_deps.py::TestCorrelationIDExtraction::test_get_correlation_id_from_context FAILED [ 33%]
tests/unit/test_auth_deps.py::TestCorrelationIDExtraction::test_get_correlation_id_default_empty FAILED [ 33%]
tests/unit/test_auth_deps.py::TestJWKSIntegration::test_jwks_cache_used_for_verification FAILED [ 34%]
tests/unit/test_auth_deps.py::TestJWKSIntegration::test_eddsa_algorithm_enforced_in_deps FAILED [ 34%]
tests/unit/test_jwks_service.py::TestJWKSCache::test_cache_miss_on_first_fetch PASSED [ 34%]
tests/unit/test_jwks_service.py::TestJWKSCache::test_cache_hit_within_ttl PASSED [ 35%]
tests/unit/test_jwks_service.py::TestJWKSCache::test_cache_expires_after_ttl PASSED [ 35%]
tests/unit/test_jwks_service.py::TestJWKSCache::test_retry_logic_with_exponential_backoff FAILED [ 35%]
tests/unit/test_jwks_service.py::TestJWKSCache::test_concurrent_fetch_uses_lock PASSED [ 36%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_valid_jwt_token_verification PASSED [ 36%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_expired_token_raises_error FAILED [ 36%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_tampered_token_raises_error FAILED [ 37%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_missing_kid_raises_error FAILED [ 37%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_unknown_kid_raises_error FAILED [ 37%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_wrong_issuer_raises_error FAILED [ 38%]
tests/unit/test_jwks_service.py::TestJWTVerification::test_eddsa_algorithm_enforced PASSED [ 38%]
tests/unit/test_jwks_service.py::TestPerformance::test_cache_hit_rate_above_95_percent PASSED [ 38%]
tests/unit/test_jwks_service.py::TestPerformance::test_warm_cache_verification_under_50ms ERROR [ 39%]
tests/unit/test_migrations.py::test_migrations_up_and_down PASSED        [ 39%]
tests/unit/test_migrations.py::test_migration_history PASSED             [ 39%]
tests/unit/test_notifications.py::TestNotificationService::test_service_initialization_default PASSED [ 40%]
tests/unit/test_notifications.py::TestNotificationService::test_service_initialization_with_email_enabled PASSED [ 40%]
tests/unit/test_notifications.py::TestNotificationService::test_notify_task_created_success PASSED [ 40%]
tests/unit/test_notifications.py::TestNotificationService::test_notify_task_updated_success PASSED [ 41%]
tests/unit/test_notifications.py::TestNotificationService::test_notify_task_completed_success PASSED [ 41%]
tests/unit/test_notifications.py::TestNotificationService::test_notify_task_reminder_success PASSED [ 41%]
tests/unit/test_notifications.py::TestNotificationService::test_task_created_template_rendering PASSED [ 42%]
tests/unit/test_notifications.py::TestNotificationService::test_task_updated_template_rendering PASSED [ 42%]
tests/unit/test_notifications.py::TestNotificationService::test_task_completed_template_rendering PASSED [ 42%]
tests/unit/test_notifications.py::TestNotificationService::test_task_reminder_template_rendering PASSED [ 43%]
tests/unit/test_notifications.py::TestNotificationServiceLogging::test_notification_logged_when_email_disabled FAILED [ 43%]
tests/unit/test_notifications.py::TestNotificationServiceSMTPErrorHandling::test_smtp_error_handling_returns_false PASSED [ 43%]
tests/unit/test_notifications.py::TestNotificationServiceSoftDeleteFiltering::test_notification_not_sent_for_soft_deleted_task PASSED [ 44%]
tests/unit/test_notifications.py::TestNotificationServiceSoftDeleteFiltering::test_repository_filters_soft_deleted_before_notification PASSED [ 44%]
tests/unit/test_notifications.py::TestUserEmailValidation::test_notification_requires_valid_user_email PASSED [ 44%]
tests/unit/test_notifications.py::TestUserEmailValidation::test_notification_with_empty_email PASSED [ 45%]
tests/unit/test_notifications.py::TestUserEmailValidation::test_email_format_validation_in_user_model PASSED [ 45%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_status_incomplete PASSED [ 45%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_status_complete PASSED [ 46%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_priority PASSED [ 46%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_single_tag PASSED [ 46%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_multiple_tags_or_logic PASSED [ 47%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_tag_none_untagged_tasks PASSED [ 47%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_tag_none_and_tag_name_or_logic PASSED [ 47%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_filter_by_due_date_range PASSED [ 48%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_full_text_search PASSED [ 48%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_sorting_by_created_at_desc PASSED [ 48%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_sorting_by_due_date_asc PASSED [ 49%]
tests/unit/test_query_service.py::TestQueryServiceFiltering::test_combined_filters_and_sort PASSED [ 49%]
tests/unit/test_repositories.py::TestSoftDeleteFilters::test_task_repository_list_tasks_excludes_soft_deleted PASSED [ 49%]
tests/unit/test_repositories.py::TestSoftDeleteFilters::test_tag_repository_list_tags_excludes_soft_deleted PASSED [ 50%]
tests/unit/test_repositories.py::TestSoftDeleteFilters::test_soft_deleted_tasks_not_queryable_by_id PASSED [ 50%]
tests/unit/test_repositories.py::TestSoftDeleteFilters::test_soft_deleted_tags_not_queryable_by_id PASSED [ 50%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_create_task PASSED [ 51%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_get_by_id_with_user_isolation PASSED [ 51%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_update_task_partial PASSED [ 51%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_replace_task_full PASSED [ 52%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_soft_delete_task PASSED [ 52%]
tests/unit/test_repositories.py::TestTaskRepositoryCRUD::test_soft_delete_nonexistent_task_returns_false PASSED [ 52%]
tests/unit/test_repositories.py::TestTagRepositoryCRUD::test_create_tag_with_color_normalization PASSED [ 53%]
tests/unit/test_repositories.py::TestTagRepositoryCRUD::test_exists_by_name_for_unique_constraint PASSED [ 53%]
tests/unit/test_repositories.py::TestTagRepositoryCRUD::test_update_tag PASSED [ 53%]
tests/unit/test_repositories.py::TestTagRepositoryCRUD::test_soft_delete_tag_preserves_junction_records PASSED [ 54%]
tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_assign_tag_to_task ERROR [ 54%]
tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_unassign_tag_from_task ERROR [ 54%]
tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_get_task_tags_excludes_soft_deleted ERROR [ 55%]
tests/unit/test_rollback.py::test_rollback_to_base_and_forward PASSED    [ 55%]
tests/unit/test_rollback.py::test_rollback_one_migration PASSED          [ 55%]
tests/unit/test_rollback.py::test_rollback_to_specific_revision FAILED   [ 56%]
tests/unit/test_security.py::TestPasswordHashing::test_hash_password PASSED [ 56%]
tests/unit/test_security.py::TestPasswordHashing::test_verify_password_correct PASSED [ 56%]
tests/unit/test_security.py::TestPasswordHashing::test_verify_password_incorrect PASSED [ 57%]
tests/unit/test_security.py::TestPasswordHashing::test_different_passwords_different_hashes PASSED [ 57%]
tests/unit/test_security.py::TestPasswordHashing::test_same_password_different_hashes PASSED [ 57%]
tests/unit/test_security.py::TestJWTToken::test_create_access_token PASSED [ 58%]
tests/unit/test_security.py::TestJWTToken::test_decode_access_token_valid PASSED [ 58%]
tests/unit/test_security.py::TestJWTToken::test_decode_access_token_expired PASSED [ 58%]
tests/unit/test_security.py::TestJWTToken::test_decode_access_token_invalid PASSED [ 59%]
tests/unit/test_security.py::TestJWTToken::test_decode_access_token_wrong_secret PASSED [ 59%]
tests/unit/test_security.py::TestJWTToken::test_extract_token_from_header_valid PASSED [ 59%]
tests/unit/test_security.py::TestJWTToken::test_extract_token_from_header_invalid PASSED [ 60%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_valid PASSED [ 60%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_email_normalization PASSED [ 60%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_name_trimmed PASSED [ 61%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_invalid_email PASSED [ 61%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_password_too_short PASSED [ 61%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_empty_name PASSED [ 62%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_whitespace_only_name PASSED [ 62%]
tests/unit/test_user_model.py::TestUserModel::test_user_create_missing_fields PASSED [ 62%]
tests/unit/test_user_model.py::TestUserLogin::test_user_login_valid PASSED [ 63%]
tests/unit/test_user_model.py::TestUserLogin::test_user_login_email_normalization PASSED [ 63%]
tests/unit/test_user_model.py::TestUserLogin::test_user_login_invalid_email PASSED [ 63%]
tests/unit/test_user_model.py::TestUserLogin::test_user_login_password_too_short PASSED [ 64%]
tests/unit/test_user_model.py::TestUserLogin::test_user_login_missing_fields PASSED [ 64%]
tests/unit/test_user_service.py::TestUserService::test_create_user ERROR [ 64%]
tests/unit/test_user_service.py::TestUserService::test_create_user_duplicate_email ERROR [ 65%]
tests/unit/test_user_service.py::TestUserService::test_get_user_by_email ERROR [ 65%]
tests/unit/test_user_service.py::TestUserService::test_get_user_by_email_case_insensitive ERROR [ 65%]
tests/unit/test_user_service.py::TestUserService::test_get_user_by_email_not_found ERROR [ 66%]
tests/unit/test_user_service.py::TestUserService::test_get_user_by_id ERROR [ 66%]
tests/unit/test_user_service.py::TestUserService::test_get_user_by_id_not_found ERROR [ 66%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rgb_shorthand_lowercase PASSED [ 66%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rgb_shorthand_uppercase PASSED [ 67%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rgb_shorthand_mixed_case PASSED [ 67%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rrggbb_lowercase PASSED [ 67%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rrggbb_uppercase PASSED [ 68%]
tests/unit/test_validators.py::TestHexColorValidator::test_valid_rrggbb_mixed_case PASSED [ 68%]
tests/unit/test_validators.py::TestHexColorValidator::test_none_returns_none PASSED [ 68%]
tests/unit/test_validators.py::TestHexColorValidator::test_missing_hash_raises_error PASSED [ 69%]
tests/unit/test_validators.py::TestHexColorValidator::test_wrong_length_raises_error PASSED [ 69%]
tests/unit/test_validators.py::TestHexColorValidator::test_non_hex_characters_raises_error PASSED [ 69%]
tests/unit/test_validators.py::TestHexColorValidator::test_whitespace_trimmed PASSED [ 70%]
tests/unit/test_validators.py::TestHexColorValidator::test_empty_string_raises_error PASSED [ 70%]
tests/unit/test_validators.py::TestHexColorValidator::test_special_characters_raise_error PASSED [ 70%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_title_required PASSED [ 71%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_title_max_length_255 PASSED [ 71%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_title_not_whitespace_only PASSED [ 71%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_description_max_length_10000 PASSED [ 72%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_reminder_at_must_be_before_due_date PASSED [ 72%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_reminder_at_equal_to_due_date_raises_error PASSED [ 72%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_reminder_at_before_due_date_valid PASSED [ 73%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_completed_defaults_to_false PASSED [ 73%]
tests/unit/test_validators.py::TestTaskCreateSchemaValidation::test_valid_task_with_all_fields PASSED [ 73%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_normalization_rgb_to_rrggbb PASSED [ 74%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_normalization_lowercase_to_uppercase PASSED [ 74%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_normalization_mixed_case PASSED [ 74%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_validation_invalid_format PASSED [ 75%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_validation_wrong_length PASSED [ 75%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_validation_non_hex_characters PASSED [ 75%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_optional_none PASSED [ 76%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_hex_color_optional_omitted PASSED [ 76%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_name_required PASSED [ 76%]
tests/unit/test_validators.py::TestTagCreateSchemaValidation::test_name_max_length_50 PASSED [ 77%]
tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_valid_data ERROR [ 77%]
tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_duplicate_email ERROR [ 77%]
tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_invalid_email ERROR [ 78%]
tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_short_password ERROR [ 78%]
tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_missing_fields ERROR [ 78%]
tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_correct_credentials ERROR [ 79%]
tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_wrong_password ERROR [ 79%]
tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_nonexistent_email ERROR [ 79%]
tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_valid_token ERROR [ 80%]
tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_invalid_token ERROR [ 80%]
tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_expired_token ERROR [ 80%]
tests/integration/test_auth_endpoints.py::TestLogoutEndpoint::test_logout_with_valid_token ERROR [ 81%]
tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_user_record_has_hashed_password ERROR [ 81%]
tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_database_email_uniqueness ERROR [ 81%]
tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_updated_at_field_updates ERROR [ 82%]
tests/integration/test_auth_endpoints.py::TestUnicodeHandling::test_unicode_in_names ERROR [ 82%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_complete_registration_login_protected_access_flow ERROR [ 82%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_jwt_cookie_transmission_with_credentials ERROR [ 83%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_cors_with_credentials_enabled ERROR [ 83%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_session_persistence_across_requests ERROR [ 83%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_expired_token_rejected ERROR [ 84%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_missing_authorization_header_rejected ERROR [ 84%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_malformed_jwt_token_rejected ERROR [ 84%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_login_with_wrong_password_fails ERROR [ 85%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_login_with_nonexistent_email_fails ERROR [ 85%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_duplicate_email_registration_fails ERROR [ 85%]
tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_logout_invalidates_session ERROR [ 86%]
tests/integration/test_auth_flow.py::TestCorrelationIDPropagation::test_correlation_id_in_response_headers ERROR [ 86%]
tests/integration/test_auth_flow.py::TestCorrelationIDPropagation::test_correlation_id_auto_generated_if_missing ERROR [ 86%]
tests/integration/test_notifications_integration.py::TestTaskCreationNotifications::test_post_task_sends_notification ERROR [ 87%]
tests/integration/test_notifications_integration.py::TestTaskUpdateNotifications::test_patch_task_sends_notification ERROR [ 87%]
tests/integration/test_notifications_integration.py::TestTaskCompletionNotifications::test_complete_task_sends_notification ERROR [ 87%]
tests/integration/test_notifications_integration.py::TestNotificationUserIsolation::test_notification_not_sent_on_user_mismatch ERROR [ 88%]
tests/integration/test_notifications_integration.py::TestReminderNotifications::test_reminder_notification_sent_when_reminder_at_reached ERROR [ 88%]
tests/integration/test_notifications_integration.py::TestReminderNotifications::test_reminder_not_sent_for_completed_tasks ERROR [ 88%]
tests/integration/test_notifications_integration.py::TestNotificationServiceIntegration::test_notification_service_with_real_task_and_user ERROR [ 89%]
tests/integration/test_notifications_integration.py::TestNotificationErrorHandling::test_endpoint_continues_on_notification_failure ERROR [ 89%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_create_tag_201_with_color_normalization ERROR [ 89%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_create_duplicate_tag_409_conflict ERROR [ 90%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_list_tags_200_ok ERROR [ 90%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_get_single_tag_200_ok ERROR [ 90%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_update_tag_200_ok ERROR [ 91%]
tests/integration/test_tags.py::TestTagCRUDEndpoints::test_delete_tag_204_no_content ERROR [ 91%]
tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_assign_tag_to_task_201_created ERROR [ 91%]
tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_assign_duplicate_tag_409_conflict ERROR [ 92%]
tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_list_task_tags_200_ok ERROR [ 92%]
tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_remove_tag_from_task_204_no_content ERROR [ 92%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_create_task_201_created ERROR [ 93%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_list_tasks_200_ok_array ERROR [ 93%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_get_single_task_200_ok_with_nested_tags ERROR [ 93%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_replace_task_200_ok_full_replacement ERROR [ 94%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_update_task_200_ok_partial ERROR [ 94%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_toggle_complete_200_ok ERROR [ 94%]
tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_delete_task_204_no_content ERROR [ 95%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_due_date_and_reminder ERROR [ 95%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_recurrence_pattern_and_config ERROR [ 95%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_update_task_recurrence_fields ERROR [ 96%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_validation_reminder_at_must_be_before_due_date ERROR [ 96%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_all_advanced_fields ERROR [ 96%]
tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_get_task_returns_advanced_fields ERROR [ 97%]
tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_access_returns_403 ERROR [ 97%]
tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_update_returns_403 ERROR [ 97%]
tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_deletion_returns_403 ERROR [ 98%]
tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_tag_access_returns_403 ERROR [ 98%]
tests/integration/test_user_isolation.py::TestUserIDMismatchDetection::test_url_path_user_id_must_match_jwt_user_id ERROR [ 98%]
tests/integration/test_user_isolation.py::TestUserIDMismatchDetection::test_valid_user_id_match_allows_access ERROR [ 99%]
tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_database_query_filters_by_user_id ERROR [ 99%]
tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_search_filters_respect_user_isolation ERROR [ 99%]
tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_authorization_bypass_attempts_fail ERROR [100%]

==================================== ERRORS ====================================
__ ERROR at setup of TestPerformance.test_warm_cache_verification_under_50ms ___
file /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py, line 272
      @pytest.mark.asyncio
      async def test_warm_cache_verification_under_50ms(self, mock_jwks_cache):
          """Test JWT verification p95 <50ms with warm cache per SC-003"""
          import time

          latencies = []

          with patch("jose.jwt.decode") as mock_decode:
              mock_decode.return_value = {"sub": "user_123"}

              for _ in range(100):
                  start = time.perf_counter()
                  await verify_better_auth_jwt("test-token")
                  latency_ms = (time.perf_counter() - start) * 1000
                  latencies.append(latency_ms)

          latencies.sort()
          p95_latency = latencies[94]  # 95th percentile

          assert (
              p95_latency < 50
          ), f"P95 latency {p95_latency:.2f}ms exceeds 50ms threshold"
E       fixture 'mock_jwks_cache' not found
>       available fixtures: _class_scoped_runner, _function_scoped_runner, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, anyio_backend, anyio_backend_name, anyio_backend_options, async_client, auth_headers, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, client, cov, doctest_namespace, event_loop, event_loop_policy, free_tcp_port, free_tcp_port_factory, free_udp_port, free_udp_port_factory, monkeypatch, no_cover, override_get_session, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, subtests, test_engine, test_session, test_user, test_user_unit, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, user_id, user_id_unit
>       use 'pytest --fixtures [testpath]' for help on them.

/mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:272
_____ ERROR at setup of TestTaskTagRepositoryCRUD.test_assign_tag_to_task ______

self = <sqlalchemy.engine.base.Connection object at 0x75f2566bcf20>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257d986b0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2566b22d0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2566b2210>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ea50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_assign_tag_to_task>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ea50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestTaskTagRepositoryCRUD.test_unassign_tag_from_task ____

self = <sqlalchemy.engine.base.Connection object at 0x75f2566dfcb0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256627080>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2566bd280>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2566bc0e0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_unassign_tag_from_task>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskTagRepositoryCRUD.test_get_task_tags_excludes_soft_deleted _

self = <sqlalchemy.engine.base.Connection object at 0x75f25627dfd0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255db1d60>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255ddce60>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ddd6a0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_task_tags_excludes_soft_deleted>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______________ ERROR at setup of TestUserService.test_create_user ______________

self = <sqlalchemy.engine.base.Connection object at 0x75f254a088c0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2565610a0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256695430>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255db32f0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314b90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_user>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314b90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______ ERROR at setup of TestUserService.test_create_user_duplicate_email ______

self = <sqlalchemy.engine.base.Connection object at 0x75f257e4acf0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2563dfdd0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2563dd5e0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2563dd970>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315490>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_user_duplicate_email>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315490>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___________ ERROR at setup of TestUserService.test_get_user_by_email ___________

self = <sqlalchemy.engine.base.Connection object at 0x75f257e68e30>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256327e30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256324e30>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256324c80>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315d90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_user_by_email>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315d90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
__ ERROR at setup of TestUserService.test_get_user_by_email_case_insensitive ___

self = <sqlalchemy.engine.base.Connection object at 0x75f25460fda0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256457d40>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2564555e0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256455010>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315fd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_user_by_email_case_insensitive>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315fd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______ ERROR at setup of TestUserService.test_get_user_by_email_not_found ______

self = <sqlalchemy.engine.base.Connection object at 0x75f257e48440>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256413e00>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2564116a0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256411a90>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316e10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_user_by_email_not_found>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316e10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
____________ ERROR at setup of TestUserService.test_get_user_by_id _____________

self = <sqlalchemy.engine.base.Connection object at 0x75f25645a6c0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256327d70>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2562b06e0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2562b0110>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_user_by_id>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_______ ERROR at setup of TestUserService.test_get_user_by_id_not_found ________

self = <sqlalchemy.engine.base.Connection object at 0x75f256631ca0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2561796d0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256107350>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256105670>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256131190>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_user_by_id_not_found>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256131190>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_____ ERROR at setup of TestRegistrationEndpoint.test_register_valid_data ______

self = <sqlalchemy.engine.base.Connection object at 0x75f2563b0320>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25697ef00>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2549bcc50>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25697fb00>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_register_valid_data>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestRegistrationEndpoint.test_register_duplicate_email ___

self = <sqlalchemy.engine.base.Connection object at 0x75f257ddcf20>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257ddee70>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256177d10>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257d2f530>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f950>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_register_duplicate_email>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f950>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
____ ERROR at setup of TestRegistrationEndpoint.test_register_invalid_email ____

self = <sqlalchemy.engine.base.Connection object at 0x75f2554d5cd0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25628fbc0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257e1a8a0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2577df530>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f710>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_register_invalid_email>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f710>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestRegistrationEndpoint.test_register_short_password ____

self = <sqlalchemy.engine.base.Connection object at 0x75f256633830>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564128a0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25643bbf0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256413230>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e8d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_register_short_password>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e8d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestRegistrationEndpoint.test_register_missing_fields ____

self = <sqlalchemy.engine.base.Connection object at 0x75f2564ab770>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564ab9b0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2564ab500>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2564abfe0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563165d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_register_missing_fields>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563165d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______ ERROR at setup of TestLoginEndpoint.test_login_correct_credentials ______

self = <sqlalchemy.engine.base.Connection object at 0x75f257e99e80>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564b3f80>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2564b0ec0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2564b3560>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563150d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_login_correct_credentials>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563150d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
________ ERROR at setup of TestLoginEndpoint.test_login_wrong_password _________

self = <sqlalchemy.engine.base.Connection object at 0x75f256324680>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256847860>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256845490>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256844fe0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_login_wrong_password>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_______ ERROR at setup of TestLoginEndpoint.test_login_nonexistent_email _______

self = <sqlalchemy.engine.base.Connection object at 0x75f2568f5d90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564b0200>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25c23bec0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25c238770>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e090>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_login_nonexistent_email>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e090>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
____ ERROR at setup of TestProtectedEndpoints.test_get_me_with_valid_token _____

self = <sqlalchemy.engine.base.Connection object at 0x75f255bd4950>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256168140>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25697fa70>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255db3c80>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ee10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_me_with_valid_token>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ee10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestProtectedEndpoints.test_get_me_with_invalid_token ____

self = <sqlalchemy.engine.base.Connection object at 0x75f256312c90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2563de270>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256325af0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2549bd670>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256132b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_me_with_invalid_token>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256132b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestProtectedEndpoints.test_get_me_with_expired_token ____

self = <sqlalchemy.engine.base.Connection object at 0x75f257e6a420>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256454e30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256325a90>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257560d10>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2150>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_me_with_expired_token>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2150>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______ ERROR at setup of TestLogoutEndpoint.test_logout_with_valid_token _______

self = <sqlalchemy.engine.base.Connection object at 0x75f256603bc0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2568c2ba0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2568c1100>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256846cf0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_logout_with_valid_token>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestDatabaseIntegration.test_user_record_has_hashed_password _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564133e0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2568c1d30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2568c16d0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2568c1250>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0650>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_user_record_has_hashed_password>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0650>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestDatabaseIntegration.test_database_email_uniqueness ___

self = <sqlalchemy.engine.base.Connection object at 0x75f2575b5c70>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25689e870>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25689d160>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25689d3a0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_database_email_uniqueness>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestDatabaseIntegration.test_updated_at_field_updates ____

self = <sqlalchemy.engine.base.Connection object at 0x75f256655250>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255eec830>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255eed940>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255eee120>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315550>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_updated_at_field_updates>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315550>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_________ ERROR at setup of TestUnicodeHandling.test_unicode_in_names __________

self = <sqlalchemy.engine.base.Connection object at 0x75f2564b0aa0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255eac770>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255eac740>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ead880>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563162d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_unicode_in_names>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563162d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_complete_registration_login_protected_access_flow _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564b0b90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255ed16d0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255ead730>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ead700>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f19d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_complete_registration_login_protected_access_flow>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f19d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_jwt_cookie_transmission_with_credentials _

self = <sqlalchemy.engine.base.Connection object at 0x75f256178620>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25689f7a0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2568d37d0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2568d11c0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3410>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_jwt_cookie_transmission_with_credentials>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3410>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_cors_with_credentials_enabled __

self = <sqlalchemy.engine.base.Connection object at 0x75f2563dd190>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254a0af00>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2562d2d50>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25e56c650>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_cors_with_credentials_enabled>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_session_persistence_across_requests _

self = <sqlalchemy.engine.base.Connection object at 0x75f2566952e0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25643a000>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25643a090>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2564547d0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133ad0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_session_persistence_across_requests>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133ad0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_____ ERROR at setup of TestAuthenticationFlow.test_expired_token_rejected _____

self = <sqlalchemy.engine.base.Connection object at 0x75f257d60e60>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564b0f80>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2568f5280>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2564b3e60>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d910>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_expired_token_rejected>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d910>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_missing_authorization_header_rejected _

self = <sqlalchemy.engine.base.Connection object at 0x75f254ae5490>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255ed2e70>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255ed2cc0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ed24b0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e990>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_missing_authorization_header_rejected>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e990>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
__ ERROR at setup of TestAuthenticationFlow.test_malformed_jwt_token_rejected __

self = <sqlalchemy.engine.base.Connection object at 0x75f25756eb40>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e36ae0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e36360>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e37980>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d550>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_malformed_jwt_token_rejected>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d550>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_login_with_wrong_password_fails _

self = <sqlalchemy.engine.base.Connection object at 0x75f255bd6fc0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e9eab0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e9cdd0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e9f8f0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563156d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_login_with_wrong_password_fails>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563156d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_login_with_nonexistent_email_fails _

self = <sqlalchemy.engine.base.Connection object at 0x75f255bd77a0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e071d0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e07170>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e06d80>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563147d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_login_with_nonexistent_email_fails>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2563147d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAuthenticationFlow.test_duplicate_email_registration_fails _

self = <sqlalchemy.engine.base.Connection object at 0x75f255e07b30>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255ebf710>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255eeeea0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ebd970>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315d90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_duplicate_email_registration_fails>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315d90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestAuthenticationFlow.test_logout_invalidates_session ___

self = <sqlalchemy.engine.base.Connection object at 0x75f257511ee0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e04cb0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e36b10>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e9f470>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d010>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_logout_invalidates_session>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d010>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestCorrelationIDPropagation.test_correlation_id_in_response_headers _

self = <sqlalchemy.engine.base.Connection object at 0x75f255e07590>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564a97f0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257da5c40>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2562b6570>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624fc50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_correlation_id_in_response_headers>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624fc50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestCorrelationIDPropagation.test_correlation_id_auto_generated_if_missing _

self = <sqlalchemy.engine.base.Connection object at 0x75f255eed610>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2564b0e30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e34cb0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25689f290>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_correlation_id_auto_generated_if_missing>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2b10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskCreationNotifications.test_post_task_sends_notification _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564116d0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2568d1190>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25756f350>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25756eb40>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256132690>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_post_task_sends_notification>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256132690>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskUpdateNotifications.test_patch_task_sends_notification _

self = <sqlalchemy.engine.base.Connection object at 0x75f2565d6ae0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2550cf440>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2550cf0e0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e9f2f0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_patch_task_sends_notification>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskCompletionNotifications.test_complete_task_sends_notification _

self = <sqlalchemy.engine.base.Connection object at 0x75f256106d50>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25508ea50>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25508ea20>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25508c8c0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_complete_task_sends_notification>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestNotificationUserIsolation.test_notification_not_sent_on_user_mismatch _

self = <sqlalchemy.engine.base.Connection object at 0x75f2566bca10>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25505f1d0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25505ed50>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25505d2e0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314050>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_notification_not_sent_on_user_mismatch>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314050>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestReminderNotifications.test_reminder_notification_sent_when_reminder_at_reached _

self = <sqlalchemy.engine.base.Connection object at 0x75f256457b90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25504f290>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25504d670>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25504f140>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315a90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_reminder_notification_sent_when_reminder_at_reached>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315a90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestReminderNotifications.test_reminder_not_sent_for_completed_tasks _

self = <sqlalchemy.engine.base.Connection object at 0x75f2568c3bc0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2550a35f0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256105220>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2550a10d0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_reminder_not_sent_for_completed_tasks>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestNotificationServiceIntegration.test_notification_service_with_real_task_and_user _

self = <sqlalchemy.engine.base.Connection object at 0x75f256858dd0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25508a090>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255088830>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255088890>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_notification_service_with_real_task_and_user>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0d10>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestNotificationErrorHandling.test_endpoint_continues_on_notification_failure _

self = <sqlalchemy.engine.base.Connection object at 0x75f2550a3d40>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25504c4d0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25504d670>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25504c050>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff2bd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_endpoint_continues_on_notification_failure>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff2bd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTagCRUDEndpoints.test_create_tag_201_with_color_normalization _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564b0aa0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2568d1010>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25508f140>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257ddfb30>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133890>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_tag_201_with_color_normalization>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133890>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTagCRUDEndpoints.test_create_duplicate_tag_409_conflict _

self = <sqlalchemy.engine.base.Connection object at 0x75f25617b140>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e34830>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255e36e10>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2577dda60>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f0710>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_duplicate_tag_409_conflict>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f0710>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_________ ERROR at setup of TestTagCRUDEndpoints.test_list_tags_200_ok _________

self = <sqlalchemy.engine.base.Connection object at 0x75f25460c410>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e079b0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25685b530>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255e073e0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cf50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_list_tags_200_ok>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cf50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
______ ERROR at setup of TestTagCRUDEndpoints.test_get_single_tag_200_ok _______

self = <sqlalchemy.engine.base.Connection object at 0x75f25488de80>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2547a7ce0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2547a6180>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547a49b0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ebd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_single_tag_200_ok>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624ebd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
________ ERROR at setup of TestTagCRUDEndpoints.test_update_tag_200_ok _________

self = <sqlalchemy.engine.base.Connection object at 0x75f255eecb30>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2547d5310>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2547d5eb0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547d6840>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cdd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_update_tag_200_ok>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cdd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
____ ERROR at setup of TestTagCRUDEndpoints.test_delete_tag_204_no_content _____

self = <sqlalchemy.engine.base.Connection object at 0x75f256844530>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2547edf40>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2547ee6c0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547eec90>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314e90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_delete_tag_204_no_content>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314e90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskTagRelationshipEndpoints.test_assign_tag_to_task_201_created _

self = <sqlalchemy.engine.base.Connection object at 0x75f2562b1e50>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25476e660>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25476cf50>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25476ec30>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316ed0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_assign_tag_to_task_201_created>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316ed0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskTagRelationshipEndpoints.test_assign_duplicate_tag_409_conflict _

self = <sqlalchemy.engine.base.Connection object at 0x75f2562dce90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254754920>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254755970>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254755940>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315a90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_assign_duplicate_tag_409_conflict>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315a90>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskTagRelationshipEndpoints.test_list_task_tags_200_ok _

self = <sqlalchemy.engine.base.Connection object at 0x75f25476f890>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2547edfa0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255ea3170>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547ef5f0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_list_task_tags_200_ok>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskTagRelationshipEndpoints.test_remove_tag_from_task_204_no_content _

self = <sqlalchemy.engine.base.Connection object at 0x75f254755fd0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2550ceab0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25460c410>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254a0a870>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e090>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_remove_tag_from_task_204_no_content>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e090>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_____ ERROR at setup of TestTaskCRUDEndpoints.test_create_task_201_created _____

self = <sqlalchemy.engine.base.Connection object at 0x75f255eed760>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25504c530>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25504c5f0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256858200>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133ad0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_task_201_created>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133ad0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_____ ERROR at setup of TestTaskCRUDEndpoints.test_list_tasks_200_ok_array _____

self = <sqlalchemy.engine.base.Connection object at 0x75f256439a00>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2550a3980>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f255088890>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254693320>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_list_tasks_200_ok_array>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskCRUDEndpoints.test_get_single_task_200_ok_with_nested_tags _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564d6690>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254750350>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254751010>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547517f0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_single_task_200_ok_with_nested_tags>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0c50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestTaskCRUDEndpoints.test_replace_task_200_ok_full_replacement _

self = <sqlalchemy.engine.base.Connection object at 0x75f25627eea0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2547d2930>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2547d3470>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2547d2ed0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3410>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_replace_task_200_ok_full_replacement>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3410>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestTaskCRUDEndpoints.test_update_task_200_ok_partial ____

self = <sqlalchemy.engine.base.Connection object at 0x75f2564820c0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b52390>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257b53020>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257b53170>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_update_task_200_ok_partial>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_____ ERROR at setup of TestTaskCRUDEndpoints.test_toggle_complete_200_ok ______

self = <sqlalchemy.engine.base.Connection object at 0x75f256411370>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b0c470>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257b0fc80>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257b0e210>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256317110>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_toggle_complete_200_ok>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256317110>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
___ ERROR at setup of TestTaskCRUDEndpoints.test_delete_task_204_no_content ____

self = <sqlalchemy.engine.base.Connection object at 0x75f25628ef00>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b835c0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257b833b0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257b82660>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316990>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_delete_task_204_no_content>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316990>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_create_task_with_due_date_and_reminder _

self = <sqlalchemy.engine.base.Connection object at 0x75f2563b1100>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b81d30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257b82030>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255bc2450>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_task_with_due_date_and_reminder>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2548f0dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_create_task_with_recurrence_pattern_and_config _

self = <sqlalchemy.engine.base.Connection object at 0x75f257da7680>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b51790>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257b53aa0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257b51880>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_task_with_recurrence_pattern_and_config>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff3dd0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_update_task_recurrence_fields _

self = <sqlalchemy.engine.base.Connection object at 0x75f2564b1310>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f25504c5f0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f256561550>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256657bc0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_update_task_recurrence_fields>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2561328d0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_validation_reminder_at_must_be_before_due_date _

self = <sqlalchemy.engine.base.Connection object at 0x75f2563d51f0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254752f60>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25476d4f0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25476d8e0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2210>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_validation_reminder_at_must_be_before_due_date>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f2575f2210>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_create_task_with_all_advanced_fields _

self = <sqlalchemy.engine.base.Connection object at 0x75f255e36b10>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256459280>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2564d4a40>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f2564d4290>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d010>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_create_task_with_all_advanced_fields>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624d010>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestAdvancedFieldsSupport.test_get_task_returns_advanced_fields _

self = <sqlalchemy.engine.base.Connection object at 0x75f257b484d0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b48920>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f257ba3440>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f257b4bd10>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f290>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_get_task_returns_advanced_fields>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f290>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIsolationEnforcement.test_cross_user_task_access_returns_403 _

self = <sqlalchemy.engine.base.Connection object at 0x75f2547ee090>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254a17dd0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254a14710>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254a179b0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cf50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_cross_user_task_access_returns_403>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624cf50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIsolationEnforcement.test_cross_user_task_update_returns_403 _

self = <sqlalchemy.engine.base.Connection object at 0x75f2569270e0>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254af7d10>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254af5370>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254af5940>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316a50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_cross_user_task_update_returns_403>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256316a50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIsolationEnforcement.test_cross_user_task_deletion_returns_403 _

self = <sqlalchemy.engine.base.Connection object at 0x75f254af7320>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254abec90>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254abd2e0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254abc800>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315b50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_cross_user_task_deletion_returns_403>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256315b50>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIsolationEnforcement.test_cross_user_tag_access_returns_403 _

self = <sqlalchemy.engine.base.Connection object at 0x75f2563b1040>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254a59250>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254a5a1b0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25689ce90>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314050>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_cross_user_tag_access_returns_403>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256314050>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIDMismatchDetection.test_url_path_user_id_must_match_jwt_user_id _

self = <sqlalchemy.engine.base.Connection object at 0x75f254a5b110>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254abcfb0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254af6450>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f254af7a10>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_url_path_user_id_must_match_jwt_user_id>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624e450>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestUserIDMismatchDetection.test_valid_user_id_match_allows_access _

self = <sqlalchemy.engine.base.Connection object at 0x75f25642cb90>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f2562b0530>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254a17b60>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256480200>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624eed0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_valid_user_id_match_allows_access>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624eed0>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestRowLevelSecurityEnforcement.test_database_query_filters_by_user_id _

self = <sqlalchemy.engine.base.Connection object at 0x75f257e6bb00>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f255e04fe0>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2550a3140>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f255ed19a0>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f650>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_database_query_filters_by_user_id>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624f650>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestRowLevelSecurityEnforcement.test_search_filters_respect_user_isolation _

self = <sqlalchemy.engine.base.Connection object at 0x75f254a58a40>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f257b82060>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f2547d2ed0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f256986930>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133890>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_search_filters_respect_user_isolation>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f256133890>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
_ ERROR at setup of TestRowLevelSecurityEnforcement.test_authorization_bypass_attempts_fail _

self = <sqlalchemy.engine.base.Connection object at 0x75f2569f3a40>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f254a9be30>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f254a98440>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25504c980>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0950>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DuplicateTable: relation "idx_task_tags_tag_id" already exists

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DuplicateTable

The above exception was the direct cause of the following exception:

self = <Coroutine test_authorization_bypass_attempts_fail>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
>       return super().setup()
               ^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:743: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:313: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/pytest_asyncio/plugin.py:309: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
tests/conftest.py:85: in test_engine
    await conn.run_sync(SQLModel.metadata.create_all)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn
    result = context.throw(*sys.exc_info())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py:5928: in create_all
    bind._run_ddl_visitor(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2467: in _run_ddl_visitor
    ).traverse_single(element)
      ^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:984: in visit_metadata
    self.traverse_single(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1026: in visit_table
    self.traverse_single(index, create_ok=True)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py:661: in traverse_single
    return meth(obj, **kw)
           ^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:1063: in visit_index
    CreateIndex(index)._invoke_with(self.connection)
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:321: in _invoke_with
    return bind.execute(self)
           ^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f257ff0950>
query = 'CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DuplicateTable) relation "idx_task_tags_tag_id" already exists
E           [SQL: CREATE INDEX idx_task_tags_tag_id ON task_tags (tag_id)]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
=================================== FAILURES ===================================
___________________ test_idx_tasks_due_reminders_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f257d2de80>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$UyPx31zQRgyyM97f/1MmYQ$YLWX5lzwgMR9wRArpczqbowXhgqDS8/CcbXJpxRgztc'...ZoneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 45, 3, 894189, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_idx_tasks_due_reminders_performance(test_session, test_user):
        """Test idx_tasks_due_reminders index performance (sub-50ms with 10,000 tasks)."""
        # Create 10,000 tasks with varying due dates and reminders
        tasks = []
        base_date = datetime.now(UTC)
    
        for i in range(10000):
            # Mix of tasks: some with due dates, some with reminders, some with both, some with neither
            task_data = {
                "user_id": test_user.id,
                "title": f"Task {i}",
                "completed": i % 5 == 0,  # 20% completed
                "deleted_at": None if i % 10 != 0 else base_date,  # 10% soft-deleted
            }
    
            # 40% have due dates
            if i % 10 < 4:
                task_data["due_date"] = base_date + timedelta(days=i % 30)
    
            # 30% have reminders (subset of those with due dates)
            if i % 10 < 3:
                task_data["reminder_at"] = base_date + timedelta(days=i % 30, hours=-1)
    
            tasks.append(Task(**task_data))
    
        # Bulk insert tasks
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Query for active tasks with upcoming due dates and reminders
        # This query should use idx_tasks_due_reminders index
        start_time = time.perf_counter()
    
        statement = select(Task).where(
            Task.completed == False,
            Task.deleted_at.is_(None),
            Task.due_date.is_not(None),
            Task.reminder_at.is_not(None),
            Task.due_date >= base_date,
            Task.due_date <= base_date + timedelta(days=7),
        )
        result = await test_session.execute(statement)
        upcoming_tasks = result.scalars().all()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify query returned results
        assert len(upcoming_tasks) > 0
    
        # Verify all returned tasks match criteria
        for task in upcoming_tasks:
            assert task.completed is False
            assert task.deleted_at is None
            assert task.due_date is not None
            assert task.reminder_at is not None
    
        # Performance assertion: query should complete in under 50ms
>       assert query_time_ms < 50, f"Query took {query_time_ms:.2f}ms, expected < 50ms"
E       AssertionError: Query took 1604.69ms, expected < 50ms
E       assert 1604.6904980030376 < 50

tests/unit/models/test_performance.py:69: AssertionError
__________________ test_idx_tasks_user_completed_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f257d03350>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$xcJ1QahgxtyUczztV61i3Q$rCHltBG7FaIdakdlikJyQrviquap2WNSEjGxGmsaatA'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 45, 33, 666360, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_idx_tasks_user_completed_performance(test_session, test_user):
        """Test idx_tasks_user_completed index performance."""
        # Create 5,000 tasks for this user
        tasks = []
        for i in range(5000):
            tasks.append(Task(
                user_id=test_user.id,
                title=f"Task {i}",
                completed=i % 2 == 0,  # 50% completed
            ))
    
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Query for incomplete tasks (should use idx_tasks_user_completed)
        start_time = time.perf_counter()
    
        statement = select(Task).where(
            Task.user_id == test_user.id,
            Task.completed == False,
        )
        result = await test_session.execute(statement)
        incomplete_tasks = result.scalars().all()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
        assert len(incomplete_tasks) == 2500  # 50% of 5000
    
        # Performance assertion: should be fast with index
>       assert query_time_ms < 50, f"Query took {query_time_ms:.2f}ms, expected < 50ms"
E       AssertionError: Query took 2886.43ms, expected < 50ms
E       assert 2886.42982699821 < 50

tests/unit/models/test_performance.py:104: AssertionError
___________________ test_idx_tasks_user_priority_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f2575b4e60>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$rhEGVTJ49b2jF8p8NtK/qQ$rg47fqE/7k/uqgPWF5WDR1r2J8pCyFzPfYu7Tzpus1k'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 45, 52, 630816, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_idx_tasks_user_priority_performance(test_session, test_user):
        """Test idx_tasks_user_priority partial index performance."""
        # Create 5,000 tasks, 40% with priority
        tasks = []
        for i in range(5000):
            task_data = {
                "user_id": test_user.id,
                "title": f"Task {i}",
                "completed": False,
            }
    
            # 40% have priority
            if i % 10 < 4:
                priorities = ["low", "medium", "high"]
                task_data["priority"] = priorities[i % 3]
    
            tasks.append(Task(**task_data))
    
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Query for high priority tasks (should use idx_tasks_user_priority partial index)
        start_time = time.perf_counter()
    
        statement = select(Task).where(
            Task.user_id == test_user.id,
            Task.priority == "high",
        )
        result = await test_session.execute(statement)
        high_priority_tasks = result.scalars().all()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
        assert len(high_priority_tasks) > 0
    
        # Performance assertion
>       assert query_time_ms < 50, f"Query took {query_time_ms:.2f}ms, expected < 50ms"
E       AssertionError: Query took 1366.41ms, expected < 50ms
E       assert 1366.4084569973056 < 50

tests/unit/models/test_performance.py:146: AssertionError
___________________ test_idx_tasks_user_due_date_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f255bd5eb0>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$HP35DitXFanCjF6JSM2cow$EiIRoQ56g4bJNeSqGA88FONiBT1Mr6bZNOMRKLFZyEQ'...ZoneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 46, 11, 56425, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_idx_tasks_user_due_date_performance(test_session, test_user):
        """Test idx_tasks_user_due_date partial index performance."""
        # Create 5,000 tasks, 40% with due dates
        tasks = []
        base_date = datetime.now(UTC)
    
        for i in range(5000):
            task_data = {
                "user_id": test_user.id,
                "title": f"Task {i}",
                "completed": False,
            }
    
            # 40% have due dates
            if i % 10 < 4:
                task_data["due_date"] = base_date + timedelta(days=i % 60)
    
            tasks.append(Task(**task_data))
    
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Query for tasks due in next 7 days (should use idx_tasks_user_due_date partial index)
        start_time = time.perf_counter()
    
        statement = select(Task).where(
            Task.user_id == test_user.id,
            Task.due_date.is_not(None),
            Task.due_date >= base_date,
            Task.due_date <= base_date + timedelta(days=7),
        )
        result = await test_session.execute(statement)
        upcoming_tasks = result.scalars().all()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
        assert len(upcoming_tasks) > 0
    
        # Performance assertion
>       assert query_time_ms < 50, f"Query took {query_time_ms:.2f}ms, expected < 50ms"
E       AssertionError: Query took 1153.02ms, expected < 50ms
E       assert 1153.0231340002501 < 50

tests/unit/models/test_performance.py:191: AssertionError
_________________ test_notification_pending_index_performance __________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f2555fac00>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$y8rmjcWJlnOsALkSzvVyMA$0c/8a/quNwyaPtxxVbVXPQQZi6vMeozkKUKqcnOnh/w'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 46, 28, 107328, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_notification_pending_index_performance(test_session, test_user):
        """Test idx_notifications_pending partial index performance."""
        from src.models.notification import Notification
    
        # Create 5,000 notifications with different statuses
        notifications = []
        for i in range(5000):
            status = "pending" if i % 10 < 3 else ("sent" if i % 2 == 0 else "failed")
    
            notifications.append(Notification(
                user_id=test_user.id,
                type="task_reminder",
                channel="email",
                recipient=f"user{i}@example.com",
                subject=f"Notification {i}",
                body="Test body",
                status=status,
            ))
    
        test_session.add_all(notifications)
        await test_session.commit()
    
        # Query for pending notifications (should use idx_notifications_pending partial index)
        start_time = time.perf_counter()
    
        statement = select(Notification).where(
            Notification.user_id == test_user.id,
            Notification.status == "pending",
        )
        result = await test_session.execute(statement)
        pending_notifications = result.scalars().all()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results (30% should be pending)
        assert len(pending_notifications) == 1500
    
        # Performance assertion
>       assert query_time_ms < 50, f"Query took {query_time_ms:.2f}ms, expected < 50ms"
E       AssertionError: Query took 2112.95ms, expected < 50ms
E       assert 2112.950977003493 < 50

tests/unit/models/test_performance.py:234: AssertionError
__________________ test_gin_index_fulltext_search_performance __________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f2562d0ef0>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$BVV4+0NBy8Yqo7W4aSrjIw$4AaRTwkyUJ43f1ScPIJgJaZBosEamuUVe7KePbDuM6E'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 46, 46, 707913, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_gin_index_fulltext_search_performance(test_session, test_user):
        """Test GIN index performance for full-text search (sub-100ms with 5,000+ tasks)."""
        from sqlalchemy import text
    
        # Create 5,000 tasks with varying content for full-text search
        tasks = []
        keywords = [
            "meeting project urgent",
            "report analysis data",
            "review code pull request",
            "design mockup wireframe",
            "bug fix production issue",
            "documentation API endpoint",
            "testing automation selenium",
            "deployment docker kubernetes",
            "database optimization query",
            "security authentication authorization",
        ]
    
        for i in range(5000):
            keyword_set = keywords[i % len(keywords)]
            tasks.append(Task(
                user_id=test_user.id,
                title=f"{keyword_set} - Task {i}",
                description=f"Detailed description for {keyword_set} involving multiple steps and requirements",
                completed=i % 3 == 0,  # 33% completed
            ))
    
        # Bulk insert tasks
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Perform full-text search query (should use GIN index)
        # Search for common term that appears in many tasks
        start_time = time.perf_counter()
    
        query = text("""
            SELECT id, title, description,
                   ts_rank(
                       to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, '')),
                       plainto_tsquery('english', :search_term)
                   ) AS rank
            FROM tasks
            WHERE user_id = :user_id
            AND to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, ''))
            @@ plainto_tsquery('english', :search_term)
            ORDER BY rank DESC
            LIMIT 100
        """)
    
        result = await test_session.execute(
            query, {"user_id": str(test_user.id), "search_term": "project meeting"}
        )
        rows = result.fetchall()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
        assert len(rows) > 0, "Should find tasks matching 'project meeting'"
    
        # Performance assertion: GIN index should enable sub-100ms queries even with 5,000+ tasks
>       assert query_time_ms < 100, f"Full-text search took {query_time_ms:.2f}ms, expected < 100ms"
E       AssertionError: Full-text search took 956.59ms, expected < 100ms
E       assert 956.5901320020203 < 100

tests/unit/models/test_performance.py:300: AssertionError
___________________ test_gin_index_prefix_search_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f25685b620>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$t3NvxixWNI53xDGnDej1ig$OB4YuVEaqH3iCCllq3TiZhdFCEI53rRHLx7tfNmp1n8'...ZoneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 47, 4, 546916, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_gin_index_prefix_search_performance(test_session, test_user):
        """Test GIN index performance for prefix search."""
        from sqlalchemy import text
    
        # Create 3,000 tasks with varied prefixes
        tasks = []
        prefixes = ["data", "develop", "deploy", "design", "debug", "document", "database"]
    
        for i in range(3000):
            prefix = prefixes[i % len(prefixes)]
            tasks.append(Task(
                user_id=test_user.id,
                title=f"{prefix}ing task {i}",
                description=f"This is about {prefix}ment and related activities",
                completed=False,
            ))
    
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Perform prefix search (should use GIN index)
        start_time = time.perf_counter()
    
        query = text("""
            SELECT id, title
            FROM tasks
            WHERE user_id = :user_id
            AND to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, ''))
            @@ to_tsquery('english', :search_term)
        """)
    
        result = await test_session.execute(
            query, {"user_id": str(test_user.id), "search_term": "data:*"}
        )
        rows = result.fetchall()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
        assert len(rows) > 0, "Should find tasks with 'data' prefix"
    
        # Performance assertion
>       assert query_time_ms < 100, f"Prefix search took {query_time_ms:.2f}ms, expected < 100ms"
E       AssertionError: Prefix search took 931.24ms, expected < 100ms
E       assert 931.2388390026172 < 100

tests/unit/models/test_performance.py:347: AssertionError
__________________ test_gin_index_complex_search_performance ___________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f255bd5910>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$ITbfkRbQe4kqt8H3YDF3dQ$PO9A0Ms7nvD8n8VtFAKL6qxoF6nu/l+tjIUEL1eonzM'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 47, 19, 136862, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_gin_index_complex_search_performance(test_session, test_user):
        """Test GIN index performance with complex multi-term search."""
        from sqlalchemy import text
    
        # Create 4,000 tasks with realistic content
        tasks = []
        categories = [
            ("Frontend", "React", "component UI rendering"),
            ("Backend", "API", "endpoint database query"),
            ("DevOps", "Docker", "container deployment pipeline"),
            ("Testing", "Pytest", "unit integration coverage"),
            ("Security", "OAuth", "authentication authorization token"),
        ]
    
        for i in range(4000):
            category, tech, content = categories[i % len(categories)]
            tasks.append(Task(
                user_id=test_user.id,
                title=f"{category} - {tech} implementation {i}",
                description=f"Working on {content} for the project",
                completed=i % 4 == 0,
            ))
    
        test_session.add_all(tasks)
        await test_session.commit()
    
        # Complex search with multiple terms
        start_time = time.perf_counter()
    
        query = text("""
            SELECT id, title, description,
                   ts_rank(
                       to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, '')),
                       plainto_tsquery('english', :search_term)
                   ) AS rank
            FROM tasks
            WHERE user_id = :user_id
            AND to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, ''))
            @@ plainto_tsquery('english', :search_term)
            ORDER BY rank DESC
            LIMIT 50
        """)
    
        result = await test_session.execute(
            query, {"user_id": str(test_user.id), "search_term": "API endpoint database authentication"}
        )
        rows = result.fetchall()
    
        end_time = time.perf_counter()
        query_time_ms = (end_time - start_time) * 1000
    
        # Verify results
>       assert len(rows) > 0, "Should find tasks matching complex query"
E       AssertionError: Should find tasks matching complex query
E       assert 0 > 0
E        +  where 0 = len([])

tests/unit/models/test_performance.py:403: AssertionError
_______________________ test_fulltext_search_basic_query _______________________

test_session = <sqlalchemy.orm.session.AsyncSession object at 0x75f2569cb9b0>
test_user = User(password_hash='$argon2id$v=19$m=65536,t=3,p=4$0XZ2tWk3aCLhTwWxZfKyyA$oIxRnZ+p/PdcPNPL/wrso4XKad71ixoPJHVUZTaySKE'...oneInfo(key='GMT')), created_at=datetime.datetime(2026, 1, 1, 19, 55, 33, 158592, tzinfo=zoneinfo.ZoneInfo(key='GMT')))

    @pytest.mark.asyncio
    async def test_fulltext_search_basic_query(test_session, test_user):
        """Test basic full-text search for 'meeting notes'."""
        # Create tasks with different content
        task1 = Task(
            user_id=test_user.id,
            title="Weekly team meeting",
            description="Discuss project progress and next steps",
            completed=False,
        )
        task2 = Task(
            user_id=test_user.id,
            title="Take meeting notes",
            description="Document important decisions from standup",
            completed=False,
        )
        task3 = Task(
            user_id=test_user.id,
            title="Buy groceries",
            description="Get milk, eggs, and bread",
            completed=False,
        )
        task4 = Task(
            user_id=test_user.id,
            title="Review notes from conference",
            description="Go through meeting recordings",
            completed=False,
        )
    
        test_session.add_all([task1, task2, task3, task4])
        await test_session.commit()
    
        # Search for "meeting notes" using full-text search
        # This should match tasks 1, 2, and 4 (contain "meeting" or "notes")
        query = text("""
            SELECT id, title, description
            FROM tasks
            WHERE user_id = :user_id
            AND to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, ''))
            @@ plainto_tsquery('english', :search_term)
            ORDER BY ts_rank(
                to_tsvector('english', coalesce(title, '') || ' ' || coalesce(description, '')),
                plainto_tsquery('english', :search_term)
            ) DESC
        """)
    
        result = await test_session.execute(
            query, {"user_id": str(test_user.id), "search_term": "meeting notes"}
        )
        rows = result.fetchall()
    
        # Should find tasks with "meeting" or "notes"
        assert len(rows) >= 2  # At least task1 and task2
        found_ids = [row[0] for row in rows]
>       assert task1.id in found_ids
E       AssertionError: assert 1 in [2, 4]
E        +  where 1 = Task(user_id=UUID('1fede052-5a05-4364-a3ca-6d4bf5e01e14'), title='Weekly team meeting', description='Discuss project progress and next steps', completed=False, id=1, created_at=datetime.datetime(2026, 1, 1, 19, 55, 35, 407876, tzinfo=datetime.timezone.utc), updated_at=datetime.datetime(2026, 1, 1, 19, 55, 35, 407907, tzinfo=datetime.timezone.utc), deleted_at=None, priority=None, due_date=None, reminder_at=None, recurrence_pattern=None, recurrence_config=None).id

tests/unit/search/test_search.py:63: AssertionError
_______________ TestGetCurrentUser.test_valid_token_returns_user _______________

credentials = <Mock id='129683686862880'>
session = Depends(dependency=<function get_session at 0x75f25e4677e0>, use_cache=True, scope=None)

    async def get_current_user(
        credentials: HTTPAuthorizationCredentials = Depends(security),
        session: AsyncSession = Depends(get_session),
    ) -> User:
        """
        Get current authenticated user from Better Auth JWT token.
    
        T008: Updated to use Better Auth JWKS verification instead of decode_access_token.
    
        This function:
        1. Verifies JWT signature using Better Auth JWKS endpoint
        2. Validates token claims (exp, iss)
        3. Extracts user_id from 'sub' claim
        4. Fetches user from database
        5. Logs validation events with correlation IDs (FR-032-033)
    
        Args:
            credentials: HTTP Bearer token from Authorization header
            session: Database session
    
        Returns:
            Authenticated user
    
        Raises:
            HTTPException: 401 if token is invalid or user not found
    
        Example:
            @app.get("/protected")
            async def protected_route(user: User = Depends(get_current_user)):
                return {"user_id": user.id}
        """
        credentials_exception = HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    
        try:
            # Verify JWT token using Better Auth JWKS (T008)
            payload = await verify_better_auth_jwt(credentials.credentials)
            user_id_str: Optional[str] = payload.get("sub")
    
            if user_id_str is None:
                logger.warning(
                    "JWT token missing 'sub' claim",
                    extra={
                        "correlation_id": get_correlation_id(),
                        "error_message": "Token missing user ID (sub claim)"
                    }
                )
                raise credentials_exception
    
>           user_id = UUID(user_id_str)
                      ^^^^^^^^^^^^^^^^^

src/api/deps.py:76: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'UUID' object has no attribute 'int'") raised in repr()] UUID object at 0x75f255e23050>
hex = 'user_123', bytes = None, bytes_le = None, fields = None, int = None
version = None

    def __init__(self, hex=None, bytes=None, bytes_le=None, fields=None,
                       int=None, version=None,
                       *, is_safe=SafeUUID.unknown):
        r"""Create a UUID from either a string of 32 hexadecimal digits,
        a string of 16 bytes as the 'bytes' argument, a string of 16 bytes
        in little-endian order as the 'bytes_le' argument, a tuple of six
        integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,
        8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as
        the 'fields' argument, or a single 128-bit integer as the 'int'
        argument.  When a string of hex digits is given, curly braces,
        hyphens, and a URN prefix are all optional.  For example, these
        expressions all yield the same UUID:
    
        UUID('{12345678-1234-5678-1234-567812345678}')
        UUID('12345678123456781234567812345678')
        UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
        UUID(bytes='\x12\x34\x56\x78'*4)
        UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +
                      '\x12\x34\x56\x78\x12\x34\x56\x78')
        UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
        UUID(int=0x12345678123456781234567812345678)
    
        Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must
        be given.  The 'version' argument is optional; if given, the resulting
        UUID will have its variant and version set according to RFC 4122,
        overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'.
    
        is_safe is an enum exposed as an attribute on the instance.  It
        indicates whether the UUID has been generated in a way that is safe
        for multiprocessing applications, via uuid_generate_time_safe(3).
        """
    
        if [hex, bytes, bytes_le, fields, int].count(None) != 4:
            raise TypeError('one of the hex, bytes, bytes_le, fields, '
                            'or int arguments must be given')
        if hex is not None:
            hex = hex.replace('urn:', '').replace('uuid:', '')
            hex = hex.strip('{}').replace('-', '')
            if len(hex) != 32:
>               raise ValueError('badly formed hexadecimal UUID string')
E               ValueError: badly formed hexadecimal UUID string

/usr/lib/python3.12/uuid.py:178: ValueError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c864920>

    @pytest.mark.asyncio
    async def test_valid_token_returns_user(self):
        """Test valid JWT token returns authenticated user"""
        # Mock JWT verification
        with patch("src.api.deps.verify_better_auth_jwt") as mock_verify:
            mock_verify.return_value = {
                "sub": "user_123",
                "email": "test@example.com",
                "name": "Test User",
            }
    
            # Mock database user fetch
            with patch("src.api.deps.get_user_by_id") as mock_get_user:
                mock_user = User(
                    id="user_123",
                    email="test@example.com",
                    name="Test User",
                    password_hash="hashed",
                )
                mock_get_user.return_value = mock_user
    
                # Mock request with Authorization header
                mock_credentials = Mock()
                mock_credentials.credentials = "valid-jwt-token"
    
>               user = await get_current_user(mock_credentials)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/unit/test_auth_deps.py:57: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

credentials = <Mock id='129683686862880'>
session = Depends(dependency=<function get_session at 0x75f25e4677e0>, use_cache=True, scope=None)

    async def get_current_user(
        credentials: HTTPAuthorizationCredentials = Depends(security),
        session: AsyncSession = Depends(get_session),
    ) -> User:
        """
        Get current authenticated user from Better Auth JWT token.
    
        T008: Updated to use Better Auth JWKS verification instead of decode_access_token.
    
        This function:
        1. Verifies JWT signature using Better Auth JWKS endpoint
        2. Validates token claims (exp, iss)
        3. Extracts user_id from 'sub' claim
        4. Fetches user from database
        5. Logs validation events with correlation IDs (FR-032-033)
    
        Args:
            credentials: HTTP Bearer token from Authorization header
            session: Database session
    
        Returns:
            Authenticated user
    
        Raises:
            HTTPException: 401 if token is invalid or user not found
    
        Example:
            @app.get("/protected")
            async def protected_route(user: User = Depends(get_current_user)):
                return {"user_id": user.id}
        """
        credentials_exception = HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    
        try:
            # Verify JWT token using Better Auth JWKS (T008)
            payload = await verify_better_auth_jwt(credentials.credentials)
            user_id_str: Optional[str] = payload.get("sub")
    
            if user_id_str is None:
                logger.warning(
                    "JWT token missing 'sub' claim",
                    extra={
                        "correlation_id": get_correlation_id(),
                        "error_message": "Token missing user ID (sub claim)"
                    }
                )
                raise credentials_exception
    
            user_id = UUID(user_id_str)
    
            # Log successful JWT validation (FR-032)
            logger.info(
                f"JWT validated successfully for user {user_id}",
                extra={
                    "user_id": str(user_id),
                    "correlation_id": get_correlation_id(),
                }
            )
    
        except (jwt.ExpiredSignatureError, jwt.InvalidTokenError, ValueError) as e:
            # Log JWT validation failure (FR-033)
            logger.warning(
                f"JWT validation failed: {str(e)}",
                extra={
                    "correlation_id": get_correlation_id(),
                    "error_message": str(e)
                }
            )
>           raise credentials_exception
E           fastapi.exceptions.HTTPException: 401: Could not validate credentials

src/api/deps.py:96: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:03,247 - src.api.deps - WARNING - [] - JWT validation failed: badly formed hexadecimal UUID string
------------------------------ Captured log call -------------------------------
WARNING  src.api.deps:deps.py:89 JWT validation failed: badly formed hexadecimal UUID string
_______________ TestGetCurrentUser.test_expired_token_raises_401 _______________

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c864cb0>

    @pytest.mark.asyncio
    async def test_expired_token_raises_401(self):
        """Test expired JWT token raises 401 Unauthorized"""
        with patch(
            "src.api.deps.verify_better_auth_jwt",
            side_effect=JWTError("Token has expired"),
        ):
            mock_credentials = Mock()
            mock_credentials.credentials = "expired-token"
    
            with pytest.raises(HTTPException) as exc_info:
>               await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:74: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/api/deps.py:63: in get_current_user
    payload = await verify_better_auth_jwt(credentials.credentials)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <AsyncMock name='verify_better_auth_jwt' id='129683686922560'>
args = ('expired-token',), kwargs = {}, _call = call('expired-token')
effect = JWTError('Token has expired')

    async def _execute_mock_call(self, /, *args, **kwargs):
        # This is nearly just like super(), except for special handling
        # of coroutines
    
        _call = _Call((args, kwargs), two=True)
        self.await_count += 1
        self.await_args = _call
        self.await_args_list.append(_call)
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Token has expired

/usr/lib/python3.12/unittest/mock.py:2262: JWTError
______________ TestGetCurrentUser.test_tampered_token_raises_401 _______________

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c8654c0>

    @pytest.mark.asyncio
    async def test_tampered_token_raises_401(self):
        """Test tampered JWT token (invalid signature) raises 401"""
        with patch(
            "src.api.deps.verify_better_auth_jwt",
            side_effect=JWTError("Invalid signature"),
        ):
            mock_credentials = Mock()
            mock_credentials.credentials = "tampered-token"
    
            with pytest.raises(HTTPException) as exc_info:
>               await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:90: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/api/deps.py:63: in get_current_user
    payload = await verify_better_auth_jwt(credentials.credentials)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <AsyncMock name='verify_better_auth_jwt' id='129683673688848'>
args = ('tampered-token',), kwargs = {}, _call = call('tampered-token')
effect = JWTError('Invalid signature')

    async def _execute_mock_call(self, /, *args, **kwargs):
        # This is nearly just like super(), except for special handling
        # of coroutines
    
        _call = _Call((args, kwargs), two=True)
        self.await_count += 1
        self.await_args = _call
        self.await_args_list.append(_call)
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Invalid signature

/usr/lib/python3.12/unittest/mock.py:2262: JWTError
_____________ TestGetCurrentUser.test_missing_sub_claim_raises_401 _____________

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c865850>

    @pytest.mark.asyncio
    async def test_missing_sub_claim_raises_401(self):
        """Test JWT without 'sub' claim raises 401"""
        with patch("src.api.deps.verify_better_auth_jwt") as mock_verify:
            # Return payload without 'sub' claim
            mock_verify.return_value = {"email": "test@example.com"}
    
            mock_credentials = Mock()
            mock_credentials.credentials = "token-without-sub"
    
            with pytest.raises(HTTPException) as exc_info:
                await get_current_user(mock_credentials)
    
            assert exc_info.value.status_code == status.HTTP_401_UNAUTHORIZED
>           assert "user identifier" in exc_info.value.detail.lower()
E           AssertionError: assert 'user identifier' in 'could not validate credentials'
E            +  where 'could not validate credentials' = <built-in method lower of str object at 0x75f25cd80d50>()
E            +    where <built-in method lower of str object at 0x75f25cd80d50> = 'Could not validate credentials'.lower
E            +      where 'Could not validate credentials' = HTTPException(status_code=401, detail='Could not validate credentials').detail
E            +        where HTTPException(status_code=401, detail='Could not validate credentials') = <ExceptionInfo HTTPException(status_code=401, detail='Could not validate credentials') tblen=2>.value

tests/unit/test_auth_deps.py:108: AssertionError
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:03,680 - src.api.deps - WARNING - [] - JWT token missing 'sub' claim
------------------------------ Captured log call -------------------------------
WARNING  src.api.deps:deps.py:67 JWT token missing 'sub' claim
______________ TestGetCurrentUser.test_user_not_found_raises_401 _______________

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c865be0>

    @pytest.mark.asyncio
    async def test_user_not_found_raises_401(self):
        """Test user_id from JWT not found in database raises 401"""
        with patch("src.api.deps.verify_better_auth_jwt") as mock_verify:
            mock_verify.return_value = {"sub": "nonexistent_user"}
    
            with patch("src.api.deps.get_user_by_id", return_value=None):
                mock_credentials = Mock()
                mock_credentials.credentials = "valid-token-unknown-user"
    
                with pytest.raises(HTTPException) as exc_info:
                    await get_current_user(mock_credentials)
    
                assert exc_info.value.status_code == status.HTTP_401_UNAUTHORIZED
>               assert "User not found" in exc_info.value.detail
E               AssertionError: assert 'User not found' in 'Could not validate credentials'
E                +  where 'Could not validate credentials' = HTTPException(status_code=401, detail='Could not validate credentials').detail
E                +    where HTTPException(status_code=401, detail='Could not validate credentials') = <ExceptionInfo HTTPException(status_code=401, detail='Could not validate credentials') tblen=2>.value

tests/unit/test_auth_deps.py:124: AssertionError
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:03,730 - src.api.deps - WARNING - [] - JWT validation failed: badly formed hexadecimal UUID string
------------------------------ Captured log call -------------------------------
WARNING  src.api.deps:deps.py:89 JWT validation failed: badly formed hexadecimal UUID string
__________ TestGetCurrentUser.test_correlation_id_logging_on_success ___________

credentials = <Mock id='129683688334848'>
session = Depends(dependency=<function get_session at 0x75f25e4677e0>, use_cache=True, scope=None)

    async def get_current_user(
        credentials: HTTPAuthorizationCredentials = Depends(security),
        session: AsyncSession = Depends(get_session),
    ) -> User:
        """
        Get current authenticated user from Better Auth JWT token.
    
        T008: Updated to use Better Auth JWKS verification instead of decode_access_token.
    
        This function:
        1. Verifies JWT signature using Better Auth JWKS endpoint
        2. Validates token claims (exp, iss)
        3. Extracts user_id from 'sub' claim
        4. Fetches user from database
        5. Logs validation events with correlation IDs (FR-032-033)
    
        Args:
            credentials: HTTP Bearer token from Authorization header
            session: Database session
    
        Returns:
            Authenticated user
    
        Raises:
            HTTPException: 401 if token is invalid or user not found
    
        Example:
            @app.get("/protected")
            async def protected_route(user: User = Depends(get_current_user)):
                return {"user_id": user.id}
        """
        credentials_exception = HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    
        try:
            # Verify JWT token using Better Auth JWKS (T008)
            payload = await verify_better_auth_jwt(credentials.credentials)
            user_id_str: Optional[str] = payload.get("sub")
    
            if user_id_str is None:
                logger.warning(
                    "JWT token missing 'sub' claim",
                    extra={
                        "correlation_id": get_correlation_id(),
                        "error_message": "Token missing user ID (sub claim)"
                    }
                )
                raise credentials_exception
    
>           user_id = UUID(user_id_str)
                      ^^^^^^^^^^^^^^^^^

src/api/deps.py:76: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'UUID' object has no attribute 'int'") raised in repr()] UUID object at 0x75f254927710>
hex = 'user_123', bytes = None, bytes_le = None, fields = None, int = None
version = None

    def __init__(self, hex=None, bytes=None, bytes_le=None, fields=None,
                       int=None, version=None,
                       *, is_safe=SafeUUID.unknown):
        r"""Create a UUID from either a string of 32 hexadecimal digits,
        a string of 16 bytes as the 'bytes' argument, a string of 16 bytes
        in little-endian order as the 'bytes_le' argument, a tuple of six
        integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,
        8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as
        the 'fields' argument, or a single 128-bit integer as the 'int'
        argument.  When a string of hex digits is given, curly braces,
        hyphens, and a URN prefix are all optional.  For example, these
        expressions all yield the same UUID:
    
        UUID('{12345678-1234-5678-1234-567812345678}')
        UUID('12345678123456781234567812345678')
        UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
        UUID(bytes='\x12\x34\x56\x78'*4)
        UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +
                      '\x12\x34\x56\x78\x12\x34\x56\x78')
        UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
        UUID(int=0x12345678123456781234567812345678)
    
        Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must
        be given.  The 'version' argument is optional; if given, the resulting
        UUID will have its variant and version set according to RFC 4122,
        overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'.
    
        is_safe is an enum exposed as an attribute on the instance.  It
        indicates whether the UUID has been generated in a way that is safe
        for multiprocessing applications, via uuid_generate_time_safe(3).
        """
    
        if [hex, bytes, bytes_le, fields, int].count(None) != 4:
            raise TypeError('one of the hex, bytes, bytes_le, fields, '
                            'or int arguments must be given')
        if hex is not None:
            hex = hex.replace('urn:', '').replace('uuid:', '')
            hex = hex.strip('{}').replace('-', '')
            if len(hex) != 32:
>               raise ValueError('badly formed hexadecimal UUID string')
E               ValueError: badly formed hexadecimal UUID string

/usr/lib/python3.12/uuid.py:178: ValueError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c865f70>

    @pytest.mark.asyncio
    async def test_correlation_id_logging_on_success(self):
        """Test correlation ID logged on successful JWT validation per FR-032"""
        with patch("src.api.deps.verify_better_auth_jwt") as mock_verify:
            mock_verify.return_value = {"sub": "user_123"}
    
            with patch("src.api.deps.get_user_by_id") as mock_get_user:
                mock_user = User(
                    id="user_123", email="test@example.com", password_hash="hashed"
                )
                mock_get_user.return_value = mock_user
    
                with patch("src.api.deps.logger.info") as mock_log:
                    with patch("src.api.deps.get_correlation_id", return_value="abc123"):
                        mock_credentials = Mock()
                        mock_credentials.credentials = "valid-token"
    
>                       await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:143: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

credentials = <Mock id='129683688334848'>
session = Depends(dependency=<function get_session at 0x75f25e4677e0>, use_cache=True, scope=None)

    async def get_current_user(
        credentials: HTTPAuthorizationCredentials = Depends(security),
        session: AsyncSession = Depends(get_session),
    ) -> User:
        """
        Get current authenticated user from Better Auth JWT token.
    
        T008: Updated to use Better Auth JWKS verification instead of decode_access_token.
    
        This function:
        1. Verifies JWT signature using Better Auth JWKS endpoint
        2. Validates token claims (exp, iss)
        3. Extracts user_id from 'sub' claim
        4. Fetches user from database
        5. Logs validation events with correlation IDs (FR-032-033)
    
        Args:
            credentials: HTTP Bearer token from Authorization header
            session: Database session
    
        Returns:
            Authenticated user
    
        Raises:
            HTTPException: 401 if token is invalid or user not found
    
        Example:
            @app.get("/protected")
            async def protected_route(user: User = Depends(get_current_user)):
                return {"user_id": user.id}
        """
        credentials_exception = HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    
        try:
            # Verify JWT token using Better Auth JWKS (T008)
            payload = await verify_better_auth_jwt(credentials.credentials)
            user_id_str: Optional[str] = payload.get("sub")
    
            if user_id_str is None:
                logger.warning(
                    "JWT token missing 'sub' claim",
                    extra={
                        "correlation_id": get_correlation_id(),
                        "error_message": "Token missing user ID (sub claim)"
                    }
                )
                raise credentials_exception
    
            user_id = UUID(user_id_str)
    
            # Log successful JWT validation (FR-032)
            logger.info(
                f"JWT validated successfully for user {user_id}",
                extra={
                    "user_id": str(user_id),
                    "correlation_id": get_correlation_id(),
                }
            )
    
        except (jwt.ExpiredSignatureError, jwt.InvalidTokenError, ValueError) as e:
            # Log JWT validation failure (FR-033)
            logger.warning(
                f"JWT validation failed: {str(e)}",
                extra={
                    "correlation_id": get_correlation_id(),
                    "error_message": str(e)
                }
            )
>           raise credentials_exception
E           fastapi.exceptions.HTTPException: 401: Could not validate credentials

src/api/deps.py:96: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:03,779 - src.api.deps - WARNING - [abc123] - JWT validation failed: badly formed hexadecimal UUID string
------------------------------ Captured log call -------------------------------
WARNING  src.api.deps:deps.py:89 JWT validation failed: badly formed hexadecimal UUID string
__________ TestGetCurrentUser.test_correlation_id_logging_on_failure ___________

self = <backend.tests.unit.test_auth_deps.TestGetCurrentUser object at 0x75f25c866300>

    @pytest.mark.asyncio
    async def test_correlation_id_logging_on_failure(self):
        """Test correlation ID logged on JWT validation failure per FR-032"""
        with patch(
            "src.api.deps.verify_better_auth_jwt", side_effect=JWTError("Invalid token")
        ):
            with patch("src.api.deps.logger.warning") as mock_log:
                with patch("src.api.deps.get_correlation_id", return_value="xyz789"):
                    mock_credentials = Mock()
                    mock_credentials.credentials = "invalid-token"
    
                    with pytest.raises(HTTPException):
>                       await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:163: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/api/deps.py:63: in get_current_user
    payload = await verify_better_auth_jwt(credentials.credentials)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <AsyncMock name='verify_better_auth_jwt' id='129683717461568'>
args = ('invalid-token',), kwargs = {}, _call = call('invalid-token')
effect = JWTError('Invalid token')

    async def _execute_mock_call(self, /, *args, **kwargs):
        # This is nearly just like super(), except for special handling
        # of coroutines
    
        _call = _Call((args, kwargs), two=True)
        self.await_count += 1
        self.await_args = _call
        self.await_args_list.append(_call)
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Invalid token

/usr/lib/python3.12/unittest/mock.py:2262: JWTError
_______ TestCorrelationIDExtraction.test_get_correlation_id_from_context _______

self = <backend.tests.unit.test_auth_deps.TestCorrelationIDExtraction object at 0x75f25c867950>

    def test_get_correlation_id_from_context(self):
        """Test correlation ID extracted from context variable"""
>       with patch("src.api.deps.correlation_id_var.get", return_value="cor_abc123"):

tests/unit/test_auth_deps.py:250: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.12/unittest/mock.py:1442: in __enter__
    self.target = self.getter()
                  ^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'src.api.deps.correlation_id_var'

    def resolve_name(name):
        """
        Resolve a name to an object.
    
        It is expected that `name` will be a string in one of the following
        formats, where W is shorthand for a valid Python identifier and dot stands
        for a literal period in these pseudo-regexes:
    
        W(.W)*
        W(.W)*:(W(.W)*)?
    
        The first form is intended for backward compatibility only. It assumes that
        some part of the dotted name is a package, and the rest is an object
        somewhere within that package, possibly nested inside other objects.
        Because the place where the package stops and the object hierarchy starts
        can't be inferred by inspection, repeated attempts to import must be done
        with this form.
    
        In the second form, the caller makes the division point clear through the
        provision of a single colon: the dotted name to the left of the colon is a
        package to be imported, and the dotted name to the right is the object
        hierarchy within that package. Only one import is needed in this form. If
        it ends with the colon, then a module object is returned.
    
        The function will return an object (which might be a module), or raise one
        of the following exceptions:
    
        ValueError - if `name` isn't in a recognised format
        ImportError - if an import failed when it shouldn't have
        AttributeError - if a failure occurred when traversing the object hierarchy
                         within the imported package to get to the desired object.
        """
        global _NAME_PATTERN
        if _NAME_PATTERN is None:
            # Lazy import to speedup Python startup time
            import re
            dotted_words = r'(?!\d)(\w+)(\.(?!\d)(\w+))*'
            _NAME_PATTERN = re.compile(f'^(?P<pkg>{dotted_words})'
                                       f'(?P<cln>:(?P<obj>{dotted_words})?)?$',
                                       re.UNICODE)
    
        m = _NAME_PATTERN.match(name)
        if not m:
            raise ValueError(f'invalid format: {name!r}')
        gd = m.groupdict()
        if gd.get('cln'):
            # there is a colon - a one-step import is all that's needed
            mod = importlib.import_module(gd['pkg'])
            parts = gd.get('obj')
            parts = parts.split('.') if parts else []
        else:
            # no colon - have to iterate to find the package boundary
            parts = name.split('.')
            modname = parts.pop(0)
            # first part *must* be a module/package.
            mod = importlib.import_module(modname)
            while parts:
                p = parts[0]
                s = f'{modname}.{p}'
                try:
                    mod = importlib.import_module(s)
                    parts.pop(0)
                    modname = s
                except ImportError:
                    break
        # if we reach this point, mod is the module, already imported, and
        # parts is the list of parts in the object hierarchy to be traversed, or
        # an empty list if just the module is wanted.
        result = mod
        for p in parts:
>           result = getattr(result, p)
                     ^^^^^^^^^^^^^^^^^^
E           AttributeError: module 'src.api.deps' has no attribute 'correlation_id_var'

/usr/lib/python3.12/pkgutil.py:528: AttributeError
______ TestCorrelationIDExtraction.test_get_correlation_id_default_empty _______

self = <backend.tests.unit.test_auth_deps.TestCorrelationIDExtraction object at 0x75f25c867740>

    def test_get_correlation_id_default_empty(self):
        """Test correlation ID returns empty string when not set"""
>       with patch("src.api.deps.correlation_id_var.get", return_value=""):

tests/unit/test_auth_deps.py:256: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.12/unittest/mock.py:1442: in __enter__
    self.target = self.getter()
                  ^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'src.api.deps.correlation_id_var'

    def resolve_name(name):
        """
        Resolve a name to an object.
    
        It is expected that `name` will be a string in one of the following
        formats, where W is shorthand for a valid Python identifier and dot stands
        for a literal period in these pseudo-regexes:
    
        W(.W)*
        W(.W)*:(W(.W)*)?
    
        The first form is intended for backward compatibility only. It assumes that
        some part of the dotted name is a package, and the rest is an object
        somewhere within that package, possibly nested inside other objects.
        Because the place where the package stops and the object hierarchy starts
        can't be inferred by inspection, repeated attempts to import must be done
        with this form.
    
        In the second form, the caller makes the division point clear through the
        provision of a single colon: the dotted name to the left of the colon is a
        package to be imported, and the dotted name to the right is the object
        hierarchy within that package. Only one import is needed in this form. If
        it ends with the colon, then a module object is returned.
    
        The function will return an object (which might be a module), or raise one
        of the following exceptions:
    
        ValueError - if `name` isn't in a recognised format
        ImportError - if an import failed when it shouldn't have
        AttributeError - if a failure occurred when traversing the object hierarchy
                         within the imported package to get to the desired object.
        """
        global _NAME_PATTERN
        if _NAME_PATTERN is None:
            # Lazy import to speedup Python startup time
            import re
            dotted_words = r'(?!\d)(\w+)(\.(?!\d)(\w+))*'
            _NAME_PATTERN = re.compile(f'^(?P<pkg>{dotted_words})'
                                       f'(?P<cln>:(?P<obj>{dotted_words})?)?$',
                                       re.UNICODE)
    
        m = _NAME_PATTERN.match(name)
        if not m:
            raise ValueError(f'invalid format: {name!r}')
        gd = m.groupdict()
        if gd.get('cln'):
            # there is a colon - a one-step import is all that's needed
            mod = importlib.import_module(gd['pkg'])
            parts = gd.get('obj')
            parts = parts.split('.') if parts else []
        else:
            # no colon - have to iterate to find the package boundary
            parts = name.split('.')
            modname = parts.pop(0)
            # first part *must* be a module/package.
            mod = importlib.import_module(modname)
            while parts:
                p = parts[0]
                s = f'{modname}.{p}'
                try:
                    mod = importlib.import_module(s)
                    parts.pop(0)
                    modname = s
                except ImportError:
                    break
        # if we reach this point, mod is the module, already imported, and
        # parts is the list of parts in the object hierarchy to be traversed, or
        # an empty list if just the module is wanted.
        result = mod
        for p in parts:
>           result = getattr(result, p)
                     ^^^^^^^^^^^^^^^^^^
E           AttributeError: module 'src.api.deps' has no attribute 'correlation_id_var'

/usr/lib/python3.12/pkgutil.py:528: AttributeError
__________ TestJWKSIntegration.test_jwks_cache_used_for_verification ___________

jwt = b'jwt-token'

    def _load(jwt):
        if isinstance(jwt, str):
            jwt = jwt.encode("utf-8")
        try:
>           signing_input, crypto_segment = jwt.rsplit(b".", 1)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           ValueError: not enough values to unpack (expected 2, got 1)

.venv/lib/python3.12/site-packages/jose/jws.py:180: ValueError

During handling of the above exception, another exception occurred:

token = 'jwt-token'

    def get_unverified_header(token):
        """Returns the decoded headers without verification of any kind.
    
        Args:
            token (str): A signed JWT to decode the headers from.
    
        Returns:
            dict: The dict representation of the token headers.
    
        Raises:
            JWTError: If there is an exception decoding the token.
        """
        try:
>           headers = jws.get_unverified_headers(token)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.venv/lib/python3.12/site-packages/jose/jwt.py:200: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/jose/jws.py:113: in get_unverified_headers
    return get_unverified_header(token)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/jose/jws.py:94: in get_unverified_header
    header, claims, signing_input, signature = _load(token)
                                               ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

jwt = b'jwt-token'

    def _load(jwt):
        if isinstance(jwt, str):
            jwt = jwt.encode("utf-8")
        try:
            signing_input, crypto_segment = jwt.rsplit(b".", 1)
            header_segment, claims_segment = signing_input.split(b".", 1)
            header_data = base64url_decode(header_segment)
        except ValueError:
>           raise JWSError("Not enough segments")
E           jose.exceptions.JWSError: Not enough segments

.venv/lib/python3.12/site-packages/jose/jws.py:184: JWSError

During handling of the above exception, another exception occurred:

token = 'jwt-token'
jwks_data = {'keys': [{'crv': 'Ed25519', 'kid': 'key-1', 'kty': 'OKP', 'x': 'test-key'}]}

    def get_signing_key(token: str, jwks_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Extract the public key from JWKS that matches the token's kid.
    
        Args:
            token: JWT token string
            jwks_data: JWKS response from Better Auth
    
        Returns:
            Public key from JWKS
    
        Raises:
            HTTPException 401: If kid not found in JWKS or token format invalid
        """
        try:
            # Get key ID from token header
>           unverified_header = jwt.get_unverified_header(token)
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

src/services/jwks.py:147: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'jwt-token'

    def get_unverified_header(token):
        """Returns the decoded headers without verification of any kind.
    
        Args:
            token (str): A signed JWT to decode the headers from.
    
        Returns:
            dict: The dict representation of the token headers.
    
        Raises:
            JWTError: If there is an exception decoding the token.
        """
        try:
            headers = jws.get_unverified_headers(token)
        except Exception:
>           raise JWTError("Error decoding token headers.")
E           jose.exceptions.JWTError: Error decoding token headers.

.venv/lib/python3.12/site-packages/jose/jwt.py:202: JWTError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_auth_deps.TestJWKSIntegration object at 0x75f25c8670e0>

    @pytest.mark.asyncio
    async def test_jwks_cache_used_for_verification(self):
        """Test JWKS cache is consulted for JWT verification"""
        with patch("src.services.jwks.jwks_cache.get_or_fetch") as mock_cache:
            mock_cache.return_value = {
                "keys": [
                    {
                        "kid": "key-1",
                        "kty": "OKP",
                        "crv": "Ed25519",
                        "x": "test-key",
                    }
                ]
            }
    
            with patch("jose.jwt.decode") as mock_decode:
                mock_decode.return_value = {"sub": "user_123"}
    
                with patch("src.api.deps.get_user_by_id") as mock_get_user:
                    mock_user = User(
                        id="user_123", email="test@example.com", password_hash="hashed"
                    )
                    mock_get_user.return_value = mock_user
    
                    mock_credentials = Mock()
                    mock_credentials.credentials = "jwt-token"
    
>                   await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:291: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/api/deps.py:63: in get_current_user
    payload = await verify_better_auth_jwt(credentials.credentials)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/services/jwks.py:216: in verify_better_auth_jwt
    signing_key = get_signing_key(token, jwks_data)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'jwt-token'
jwks_data = {'keys': [{'crv': 'Ed25519', 'kid': 'key-1', 'kty': 'OKP', 'x': 'test-key'}]}

    def get_signing_key(token: str, jwks_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Extract the public key from JWKS that matches the token's kid.
    
        Args:
            token: JWT token string
            jwks_data: JWKS response from Better Auth
    
        Returns:
            Public key from JWKS
    
        Raises:
            HTTPException 401: If kid not found in JWKS or token format invalid
        """
        try:
            # Get key ID from token header
            unverified_header = jwt.get_unverified_header(token)
            kid = unverified_header.get("kid")
    
            if not kid:
                logger.warning("Token missing key ID (kid)")
                raise HTTPException(
                    status_code=status.HTTP_401_UNAUTHORIZED,
                    detail="Token missing key ID (kid)",
                    headers={"WWW-Authenticate": "Bearer"},
                )
    
            # Find matching key in JWKS
            for key in jwks_data.get("keys", []):
                if key.get("kid") == kid:
                    logger.debug(f"Found matching signing key: kid={kid}")
                    return key
    
            # Key not found - might be a key rotation, clear cache
            logger.warning(f"Key ID {kid} not found in JWKS")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Unable to find matching signing key",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTError as e:
            logger.error(f"Error extracting key from token: {e}")
>           raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Invalid token format",
                headers={"WWW-Authenticate": "Bearer"},
            )
E           fastapi.exceptions.HTTPException: 401: Invalid token format

src/services/jwks.py:174: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:04,264 - src.services.jwks - ERROR - [] - Error extracting key from token: Error decoding token headers.
------------------------------ Captured log call -------------------------------
ERROR    src.services.jwks:jwks.py:173 Error extracting key from token: Error decoding token headers.
__________ TestJWKSIntegration.test_eddsa_algorithm_enforced_in_deps ___________

self = <backend.tests.unit.test_auth_deps.TestJWKSIntegration object at 0x75f25c866bd0>

    @pytest.mark.asyncio
    async def test_eddsa_algorithm_enforced_in_deps(self):
        """Test only EdDSA algorithm accepted per betterauth-fastapi-jwt-bridge"""
        with patch("src.api.deps.verify_better_auth_jwt") as mock_verify:
            # Simulate RS256 token (should be rejected)
            mock_verify.side_effect = JWTError("Algorithm not allowed")
    
            mock_credentials = Mock()
            mock_credentials.credentials = "rs256-token"
    
            with pytest.raises(HTTPException) as exc_info:
>               await get_current_user(mock_credentials)

tests/unit/test_auth_deps.py:307: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/api/deps.py:63: in get_current_user
    payload = await verify_better_auth_jwt(credentials.credentials)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <AsyncMock name='verify_better_auth_jwt' id='129683688198928'>
args = ('rs256-token',), kwargs = {}, _call = call('rs256-token')
effect = JWTError('Algorithm not allowed')

    async def _execute_mock_call(self, /, *args, **kwargs):
        # This is nearly just like super(), except for special handling
        # of coroutines
    
        _call = _Call((args, kwargs), two=True)
        self.await_count += 1
        self.await_args = _call
        self.await_args_list.append(_call)
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Algorithm not allowed

/usr/lib/python3.12/unittest/mock.py:2262: JWTError
___________ TestJWKSCache.test_retry_logic_with_exponential_backoff ____________

self = <backend.tests.unit.test_jwks_service.TestJWKSCache object at 0x75f25c6a4140>

    @pytest.mark.asyncio
    async def test_retry_logic_with_exponential_backoff(self):
        """Test exponential backoff: 100ms, 200ms, 400ms on failures"""
        cache = JWKSCache(ttl_seconds=3600)
    
        call_times = []
    
        async def mock_failing_get(*args, **kwargs):
            call_times.append(datetime.utcnow())
            raise Exception("Network error")
    
        with patch("httpx.AsyncClient.get", side_effect=mock_failing_get):
            with pytest.raises(Exception, match="Network error"):
                await cache._fetch_with_retry()
    
        # Verify 3 retry attempts occurred
>       assert len(call_times) == 3
E       assert 1 == 3
E        +  where 1 = len([datetime.datetime(2026, 1, 1, 19, 57, 5, 265996)])

tests/unit/test_jwks_service.py:110: AssertionError
_____________ TestJWTVerification.test_expired_token_raises_error ______________

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
>           payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )

src/services/jwks.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.12/unittest/mock.py:1134: in __call__
    return self._mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/unittest/mock.py:1138: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <MagicMock name='decode' id='129683710220176'>
args = ('eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...', {'crv': 'Ed25519', 'kid': 'test-key-1', 'kty': 'OKP', 'x': 'test-public-key-base64'})
kwargs = {'algorithms': ['EdDSA'], 'issuer': '', 'options': {'verify_exp': True, 'verify_iss': True, 'verify_signature': True}}
effect = JWTError('Token has expired')

    def _execute_mock_call(self, /, *args, **kwargs):
        # separate from _increment_mock_call so that awaited functions are
        # executed separately from their call, also AsyncMock overrides this method
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Token has expired

/usr/lib/python3.12/unittest/mock.py:1193: JWTError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_jwks_service.TestJWTVerification object at 0x75f25c6a4ce0>
mock_jwks_cache = <MagicMock name='jwks_cache' id='129683710216000'>

    @pytest.mark.asyncio
    async def test_expired_token_raises_error(self, mock_jwks_cache):
        """Test expired JWT token raises JWTError"""
        with patch("jose.jwt.decode", side_effect=JWTError("Token has expired")):
            token = "eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ..."
    
            with pytest.raises(JWTError, match="Token has expired"):
>               await verify_better_auth_jwt(token)

tests/unit/test_jwks_service.py:193: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
            payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )
    
            logger.debug(f"Successfully verified JWT for user: {payload.get('sub')}")
            return payload
    
        except ExpiredSignatureError:
            logger.warning("Token has expired")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Token has expired",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTClaimsError as e:
            logger.warning(f"Invalid token claims: {e}")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Invalid token claims",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTError as e:
            logger.error(f"JWT verification failed: {e}")
>           raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Could not validate credentials",
                headers={"WWW-Authenticate": "Bearer"},
            )
E           fastapi.exceptions.HTTPException: 401: Could not validate credentials

src/services/jwks.py:253: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:05,487 - src.services.jwks - ERROR - [] - JWT verification failed: Token has expired
------------------------------ Captured log call -------------------------------
ERROR    src.services.jwks:jwks.py:252 JWT verification failed: Token has expired
_____________ TestJWTVerification.test_tampered_token_raises_error _____________

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ.tampered...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
>           payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )

src/services/jwks.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.12/unittest/mock.py:1134: in __call__
    return self._mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/unittest/mock.py:1138: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <MagicMock name='decode' id='129683707802784'>
args = ('eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ.tampered...', {'crv': 'Ed25519', 'kid': 'test-key-1', 'kty': 'OKP', 'x': 'test-public-key-base64'})
kwargs = {'algorithms': ['EdDSA'], 'issuer': '', 'options': {'verify_exp': True, 'verify_iss': True, 'verify_signature': True}}
effect = JWTError('Invalid signature')

    def _execute_mock_call(self, /, *args, **kwargs):
        # separate from _increment_mock_call so that awaited functions are
        # executed separately from their call, also AsyncMock overrides this method
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Invalid signature

/usr/lib/python3.12/unittest/mock.py:1193: JWTError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_jwks_service.TestJWTVerification object at 0x75f25c867e00>
mock_jwks_cache = <MagicMock name='jwks_cache' id='129683710227616'>

    @pytest.mark.asyncio
    async def test_tampered_token_raises_error(self, mock_jwks_cache):
        """Test tampered JWT token (invalid signature) raises JWTError"""
        with patch("jose.jwt.decode", side_effect=JWTError("Invalid signature")):
            token = "eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ.tampered..."
    
            with pytest.raises(JWTError, match="Invalid signature"):
>               await verify_better_auth_jwt(token)

tests/unit/test_jwks_service.py:202: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ.tampered...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
            payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )
    
            logger.debug(f"Successfully verified JWT for user: {payload.get('sub')}")
            return payload
    
        except ExpiredSignatureError:
            logger.warning("Token has expired")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Token has expired",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTClaimsError as e:
            logger.warning(f"Invalid token claims: {e}")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Invalid token claims",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTError as e:
            logger.error(f"JWT verification failed: {e}")
>           raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Could not validate credentials",
                headers={"WWW-Authenticate": "Bearer"},
            )
E           fastapi.exceptions.HTTPException: 401: Could not validate credentials

src/services/jwks.py:253: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:05,729 - src.services.jwks - ERROR - [] - JWT verification failed: Invalid signature
------------------------------ Captured log call -------------------------------
ERROR    src.services.jwks:jwks.py:252 JWT verification failed: Invalid signature
______________ TestJWTVerification.test_missing_kid_raises_error _______________

self = <backend.tests.unit.test_jwks_service.TestJWTVerification object at 0x75f25c864b30>

    @pytest.mark.asyncio
    async def test_missing_kid_raises_error(self):
        """Test JWT without kid (key ID) raises ValueError"""
        token = "eyJhbGciOiJFZERTQSJ9..."  # Missing kid in header
    
        with pytest.raises(ValueError, match="kid"):
>           await verify_better_auth_jwt(token)

tests/unit/test_jwks_service.py:210: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/services/jwks.py:213: in verify_better_auth_jwt
    jwks_data = await jwks_cache.get_or_fetch()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/services/jwks.py:80: in get_or_fetch
    self._cache = await self._fetch_with_retry()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <src.services.jwks.JWKSCache object at 0x75f25cd4fce0>

    async def _fetch_with_retry(self) -> Dict[str, Any]:
        """
        Fetch JWKS with exponential backoff retry logic.
    
        Retry delays: 100ms, 200ms, 400ms (3 total attempts)
    
        Returns:
            JWKS data dictionary
    
        Raises:
            HTTPException 503: If all retries fail
        """
        delays = [0.1, 0.2, 0.4]  # Exponential backoff (100ms, 200ms, 400ms)
        last_error = None
    
        for attempt, delay in enumerate(delays, start=1):
            try:
                async with httpx.AsyncClient() as client:
                    response = await client.get(self._jwks_url, timeout=5.0)
                    response.raise_for_status()
                    jwks_data = response.json()
                    logger.info(f"Successfully fetched JWKS (attempt {attempt}/{len(delays)})")
                    return jwks_data
            except (httpx.HTTPError, httpx.TimeoutException) as e:
                last_error = e
                logger.warning(f"JWKS fetch attempt {attempt}/{len(delays)} failed: {e}")
                if attempt < len(delays):
                    await asyncio.sleep(delay)
    
        # All retries failed
        logger.error(f"Failed to fetch JWKS after {len(delays)} attempts: {last_error}")
>       raise HTTPException(
            status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
            detail="Authentication service unavailable after 3 retries"
        )
E       fastapi.exceptions.HTTPException: 503: Authentication service unavailable after 3 retries

src/services/jwks.py:115: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:05,967 - src.services.jwks - INFO - [] - JWKS cache miss or expired, fetching from 
2026-01-02 00:57:06,021 - src.services.jwks - WARNING - [] - JWKS fetch attempt 1/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
2026-01-02 00:57:06,173 - src.services.jwks - WARNING - [] - JWKS fetch attempt 2/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
2026-01-02 00:57:06,429 - src.services.jwks - WARNING - [] - JWKS fetch attempt 3/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
2026-01-02 00:57:06,429 - src.services.jwks - ERROR - [] - Failed to fetch JWKS after 3 attempts: Request URL is missing an 'http://' or 'https://' protocol.
------------------------------ Captured log call -------------------------------
INFO     src.services.jwks:jwks.py:79 JWKS cache miss or expired, fetching from 
WARNING  src.services.jwks:jwks.py:109 JWKS fetch attempt 1/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
WARNING  src.services.jwks:jwks.py:109 JWKS fetch attempt 2/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
WARNING  src.services.jwks:jwks.py:109 JWKS fetch attempt 3/3 failed: Request URL is missing an 'http://' or 'https://' protocol.
ERROR    src.services.jwks:jwks.py:114 Failed to fetch JWKS after 3 attempts: Request URL is missing an 'http://' or 'https://' protocol.
______________ TestJWTVerification.test_unknown_kid_raises_error _______________

self = <backend.tests.unit.test_jwks_service.TestJWTVerification object at 0x75f25c866de0>
mock_jwks_cache = <MagicMock name='jwks_cache' id='129683660608512'>

    @pytest.mark.asyncio
    async def test_unknown_kid_raises_error(self, mock_jwks_cache):
        """Test JWT with unknown kid raises ValueError"""
        # Mock JWKS with different key ID
        mock_jwks_cache.get_or_fetch.return_value = {
            "keys": [{"kid": "different-key"}]
        }
    
        token = "eyJhbGciOiJFZERTQSIsImtpZCI6InVua25vd24ta2V5In0..."
    
        with pytest.raises(ValueError, match="Unable to find matching signing key"):
>           await verify_better_auth_jwt(token)

tests/unit/test_jwks_service.py:223: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/services/jwks.py:216: in verify_better_auth_jwt
    signing_key = get_signing_key(token, jwks_data)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InVua25vd24ta2V5In0...'
jwks_data = {'keys': [{'kid': 'different-key'}]}

    def get_signing_key(token: str, jwks_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Extract the public key from JWKS that matches the token's kid.
    
        Args:
            token: JWT token string
            jwks_data: JWKS response from Better Auth
    
        Returns:
            Public key from JWKS
    
        Raises:
            HTTPException 401: If kid not found in JWKS or token format invalid
        """
        try:
            # Get key ID from token header
            unverified_header = jwt.get_unverified_header(token)
            kid = unverified_header.get("kid")
    
            if not kid:
                logger.warning("Token missing key ID (kid)")
                raise HTTPException(
                    status_code=status.HTTP_401_UNAUTHORIZED,
                    detail="Token missing key ID (kid)",
                    headers={"WWW-Authenticate": "Bearer"},
                )
    
            # Find matching key in JWKS
            for key in jwks_data.get("keys", []):
                if key.get("kid") == kid:
                    logger.debug(f"Found matching signing key: kid={kid}")
                    return key
    
            # Key not found - might be a key rotation, clear cache
            logger.warning(f"Key ID {kid} not found in JWKS")
>           raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Unable to find matching signing key",
                headers={"WWW-Authenticate": "Bearer"},
            )
E           fastapi.exceptions.HTTPException: 401: Unable to find matching signing key

src/services/jwks.py:166: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:06,512 - src.services.jwks - WARNING - [] - Key ID unknown-key not found in JWKS
------------------------------ Captured log call -------------------------------
WARNING  src.services.jwks:jwks.py:165 Key ID unknown-key not found in JWKS
______________ TestJWTVerification.test_wrong_issuer_raises_error ______________

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
>           payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )

src/services/jwks.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.12/unittest/mock.py:1134: in __call__
    return self._mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/unittest/mock.py:1138: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <MagicMock name='decode' id='129683710401216'>
args = ('eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...', {'crv': 'Ed25519', 'kid': 'test-key-1', 'kty': 'OKP', 'x': 'test-public-key-base64'})
kwargs = {'algorithms': ['EdDSA'], 'issuer': '', 'options': {'verify_exp': True, 'verify_iss': True, 'verify_signature': True}}
effect = JWTError('Invalid issuer')

    def _execute_mock_call(self, /, *args, **kwargs):
        # separate from _increment_mock_call so that awaited functions are
        # executed separately from their call, also AsyncMock overrides this method
    
        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               jose.exceptions.JWTError: Invalid issuer

/usr/lib/python3.12/unittest/mock.py:1193: JWTError

During handling of the above exception, another exception occurred:

self = <backend.tests.unit.test_jwks_service.TestJWTVerification object at 0x75f25c8673e0>
mock_jwks_cache = <MagicMock name='jwks_cache' id='129683710396752'>

    @pytest.mark.asyncio
    async def test_wrong_issuer_raises_error(self, mock_jwks_cache):
        """Test JWT with wrong issuer claim raises JWTError"""
        with patch("jose.jwt.decode", side_effect=JWTError("Invalid issuer")):
            token = "eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ..."
    
            with pytest.raises(JWTError, match="Invalid issuer"):
>               await verify_better_auth_jwt(token)

tests/unit/test_jwks_service.py:232: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

token = 'eyJhbGciOiJFZERTQSIsImtpZCI6InRlc3Qta2V5LTEifQ...'

    async def verify_better_auth_jwt(token: str) -> Dict[str, Any]:
        """
        Verify JWT token using Better Auth's JWKS endpoint.
    
        This function:
        1. Fetches JWKS (cached with 1-hour TTL)
        2. Extracts kid from token header
        3. Finds matching public key
        4. Verifies token signature using EdDSA algorithm
        5. Validates issuer claim
        6. Returns decoded payload
    
        Args:
            token: JWT token string
    
        Returns:
            Decoded token payload containing user information:
            {
                "sub": "user_id",
                "email": "user@example.com",
                "name": "User Name",
                "iat": 1234567890,
                "exp": 1234567890,
                "iss": "https://auth.yourdomain.com"
            }
    
        Raises:
            HTTPException 401: If token is invalid, expired, or verification fails
            HTTPException 503: If JWKS endpoint is unavailable
        """
        try:
            # Get JWKS (cached)
            jwks_data = await jwks_cache.get_or_fetch()
    
            # Get signing key
            signing_key = get_signing_key(token, jwks_data)
    
            # Verify and decode token
            payload = jwt.decode(
                token,
                signing_key,
                algorithms=[JWT_ALGORITHM],
                issuer=BETTER_AUTH_ISSUER,
                options={
                    "verify_signature": True,
                    "verify_exp": True,  # Verify expiration
                    "verify_iss": True,  # Verify issuer
                    # Note: Better Auth may not include 'aud' claim, so we don't verify it
                }
            )
    
            logger.debug(f"Successfully verified JWT for user: {payload.get('sub')}")
            return payload
    
        except ExpiredSignatureError:
            logger.warning("Token has expired")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Token has expired",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTClaimsError as e:
            logger.warning(f"Invalid token claims: {e}")
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Invalid token claims",
                headers={"WWW-Authenticate": "Bearer"},
            )
    
        except JWTError as e:
            logger.error(f"JWT verification failed: {e}")
>           raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Could not validate credentials",
                headers={"WWW-Authenticate": "Bearer"},
            )
E           fastapi.exceptions.HTTPException: 401: Could not validate credentials

src/services/jwks.py:253: HTTPException
----------------------------- Captured stdout call -----------------------------
2026-01-02 00:57:06,586 - src.services.jwks - ERROR - [] - JWT verification failed: Invalid issuer
------------------------------ Captured log call -------------------------------
ERROR    src.services.jwks:jwks.py:252 JWT verification failed: Invalid issuer
_ TestNotificationServiceLogging.test_notification_logged_when_email_disabled __

self = <backend.tests.unit.test_notifications.TestNotificationServiceLogging object at 0x75f25c482a20>
caplog = <_pytest.logging.LogCaptureFixture object at 0x75f257bba600>

    @pytest.mark.asyncio
    async def test_notification_logged_when_email_disabled(self, caplog):
        """Test that notifications are logged when email is disabled."""
        import logging
        caplog.set_level(logging.INFO)
    
        service = NotificationService(email_enabled=False)
    
        user = User(
            id=uuid4(),
            email="user@example.com",
            name="Test User",
            password_hash="hashed"
        )
    
        task = Task(
            id=1,
            user_id=user.id,
            title="Test Task",
            completed=False,
            created_at=datetime.now(timezone.utc),
            updated_at=datetime.now(timezone.utc)
        )
    
        await service.notify_task_created(task, user)
    
        # Check that notification was logged
>       assert any("NOTIFICATION" in record.message for record in caplog.records)
E       assert False
E        +  where False = any(<generator object TestNotificationServiceLogging.test_notification_logged_when_email_disabled.<locals>.<genexpr> at 0x75f25625b2a0>)

tests/unit/test_notifications.py:302: AssertionError
______________________ test_rollback_to_specific_revision ______________________

self = <sqlalchemy.engine.base.Connection object at 0x75f256843590>
dialect = <sqlalchemy.dialects.postgresql.psycopg.PGDialectAsync_psycopg object at 0x75f256840140>
context = <sqlalchemy.dialects.postgresql.psycopg.PGExecutionContext_psycopg object at 0x75f25643b290>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x75f25628c350>
parameters = [immutabledict({})]

    def _exec_single_context(
        self,
        dialect: Dialect,
        context: ExecutionContext,
        statement: Union[str, Compiled],
        parameters: Optional[_AnyMultiExecuteParams],
    ) -> CursorResult[Any]:
        """continue the _execute_context() method for a single DBAPI
        cursor.execute() or cursor.executemany() call.
    
        """
        if dialect.bind_typing is BindTyping.SETINPUTSIZES:
            generic_setinputsizes = context._prepare_set_input_sizes()
    
            if generic_setinputsizes:
                try:
                    dialect.do_set_input_sizes(
                        context.cursor, generic_setinputsizes, context
                    )
                except BaseException as e:
                    self._handle_dbapi_exception(
                        e, str(statement), parameters, None, context
                    )
    
        cursor, str_statement, parameters = (
            context.cursor,
            context.statement,
            context.parameters,
        )
    
        effective_parameters: Optional[_AnyExecuteParams]
    
        if not context.executemany:
            effective_parameters = parameters[0]
        else:
            effective_parameters = parameters
    
        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                str_statement, effective_parameters = fn(
                    self,
                    cursor,
                    str_statement,
                    effective_parameters,
                    context,
                    context.executemany,
                )
    
        if self._echo:
            self._log_info(str_statement)
    
            stats = context._get_cache_stats()
    
            if not self.engine.hide_parameters:
                self._log_info(
                    "[%s] %r",
                    stats,
                    sql_util._repr_params(
                        effective_parameters,
                        batches=10,
                        ismulti=context.executemany,
                    ),
                )
            else:
                self._log_info(
                    "[%s] [SQL parameters hidden due to hide_parameters=True]",
                    stats,
                )
    
        evt_handled: bool = False
        try:
            if context.execute_style is ExecuteStyle.EXECUTEMANY:
                effective_parameters = cast(
                    "_CoreMultiExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        str_statement,
                        effective_parameters,
                        context,
                    )
            elif not effective_parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, str_statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor, str_statement, context
                    )
            else:
                effective_parameters = cast(
                    "_CoreSingleExecuteParams", effective_parameters
                )
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(
                            cursor,
                            str_statement,
                            effective_parameters,
                            context,
                        ):
                            evt_handled = True
                            break
                if not evt_handled:
>                   self.dialect.do_execute(
                        cursor, str_statement, effective_parameters, context
                    )

.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624fad0>
query = '\nCREATE TABLE tasks (\n\tid BIGSERIAL NOT NULL, \n\tuser_id UUID NOT NULL, \n\ttitle VARCHAR(255) NOT NULL, \n\tdesc...n_length CHECK (length(description) <= 10000), \n\tFOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE\n)\n\n'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.DatatypeMismatch: foreign key constraint "tasks_user_id_fkey" cannot be implemented
E           DETAIL:  Key columns "user_id" and "id" are of incompatible types: uuid and integer.

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: DatatypeMismatch

The above exception was the direct cause of the following exception:

alembic_config = <alembic.config.Config object at 0x75f2566bc530>

    def test_rollback_to_specific_revision(alembic_config):
        """Test rolling back to a specific revision."""
        # Upgrade to head first
        command.upgrade(alembic_config, "head")
    
        # Rollback to users table creation (first migration)
        command.downgrade(alembic_config, "001")
    
        # Upgrade back to head
>       command.upgrade(alembic_config, "head")

tests/unit/test_rollback.py:48: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.12/site-packages/alembic/command.py:483: in upgrade
    script.run_env()
.venv/lib/python3.12/site-packages/alembic/script/base.py:545: in run_env
    util.load_python_file(self.dir, "env.py")
.venv/lib/python3.12/site-packages/alembic/util/pyfiles.py:116: in load_python_file
    module = load_module_py(module_id, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/alembic/util/pyfiles.py:136: in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap_external>:995: in exec_module
    ???
<frozen importlib._bootstrap>:488: in _call_with_frames_removed
    ???
alembic/env.py:94: in <module>
    run_migrations_online()
alembic/env.py:88: in run_migrations_online
    asyncio.run(run_async_migrations())
/usr/lib/python3.12/asyncio/runners.py:194: in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/runners.py:118: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
alembic/env.py:69: in run_async_migrations
    await connection.run_sync(do_run_migrations)
.venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py:888: in run_sync
    return await greenlet_spawn(
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:203: in greenlet_spawn
    result = context.switch(value)
             ^^^^^^^^^^^^^^^^^^^^^
alembic/env.py:83: in do_run_migrations
    context.run_migrations()
<string>:8: in run_migrations
    ???
.venv/lib/python3.12/site-packages/alembic/runtime/environment.py:946: in run_migrations
    self.get_context().run_migrations(**kw)
.venv/lib/python3.12/site-packages/alembic/runtime/migration.py:627: in run_migrations
    step.migration_fn(**kw)
alembic/versions/3f7554956f5b_create_tasks_table_with_indexes_and_.py:24: in upgrade
    op.create_table('tasks',
<string>:8: in create_table
    ???
<string>:3: in create_table
    ???
.venv/lib/python3.12/site-packages/alembic/operations/ops.py:1332: in create_table
    return operations.invoke(op)
           ^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/alembic/operations/base.py:454: in invoke
    return fn(self, operation)
           ^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/alembic/operations/toimpl.py:135: in create_table
    operations.impl.create_table(table, **kw)
.venv/lib/python3.12/site-packages/alembic/ddl/impl.py:423: in create_table
    self._exec(schema.CreateTable(table, **kw))
.venv/lib/python3.12/site-packages/alembic/ddl/impl.py:246: in _exec
    return conn.execute(construct, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1419: in execute
    return meth(
.venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py:187: in _execute_on_connection
    return connection._execute_ddl(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1530: in _execute_ddl
    ret = self._execute_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context
    return self._exec_single_context(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context
    self._handle_dbapi_exception(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2363: in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context
    self.dialect.do_execute(
.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: in do_execute
    cursor.execute(statement, parameters)
.venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py:673: in execute
    result = self.await_(self._cursor.execute(query, params, **kw))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only
    return current.parent.switch(awaitable)  # type: ignore[no-any-return,attr-defined] # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn
    value = await result
            ^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <psycopg.AsyncCursor [closed] [BAD] at 0x75f25624fad0>
query = '\nCREATE TABLE tasks (\n\tid BIGSERIAL NOT NULL, \n\tuser_id UUID NOT NULL, \n\ttitle VARCHAR(255) NOT NULL, \n\tdesc...n_length CHECK (length(description) <= 10000), \n\tFOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE\n)\n\n'
params = immutabledict({})

    async def execute(
        self,
        query: Query,
        params: Params | None = None,
        *,
        prepare: bool | None = None,
        binary: bool | None = None,
    ) -> Self:
        """
        Execute a query or command to the database.
        """
        try:
            async with self._conn.lock:
                await self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           sqlalchemy.exc.ProgrammingError: (psycopg.errors.DatatypeMismatch) foreign key constraint "tasks_user_id_fkey" cannot be implemented
E           DETAIL:  Key columns "user_id" and "id" are of incompatible types: uuid and integer.
E           [SQL: 
E           CREATE TABLE tasks (
E           	id BIGSERIAL NOT NULL, 
E           	user_id UUID NOT NULL, 
E           	title VARCHAR(255) NOT NULL, 
E           	description TEXT, 
E           	completed BOOLEAN NOT NULL, 
E           	created_at TIMESTAMP WITH TIME ZONE NOT NULL, 
E           	updated_at TIMESTAMP WITH TIME ZONE NOT NULL, 
E           	deleted_at TIMESTAMP WITH TIME ZONE, 
E           	priority VARCHAR(20), 
E           	due_date TIMESTAMP WITH TIME ZONE, 
E           	reminder_at TIMESTAMP WITH TIME ZONE, 
E           	recurrence_pattern VARCHAR(20), 
E           	recurrence_config JSON, 
E           	PRIMARY KEY (id), 
E           	CONSTRAINT check_priority_enum CHECK (priority IN ('low', 'medium', 'high') OR priority IS NULL), 
E           	CONSTRAINT check_recurrence_pattern_enum CHECK (recurrence_pattern IN ('daily', 'weekly', 'monthly', 'custom') OR recurrence_pattern IS NULL), 
E           	CONSTRAINT check_description_length CHECK (length(description) <= 10000), 
E           	FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE
E           )
E           
E           ]
E           (Background on this error at: https://sqlalche.me/e/20/f405)

.venv/lib/python3.12/site-packages/psycopg/cursor_async.py:117: ProgrammingError
----------------------------- Captured stdout call -----------------------------
⚠️  WARNING: Downgrading from UUID to INTEGER - DATA LOSS IMMINENT
This operation is IRREVERSIBLE and should only be used in emergencies!
⚠️  Downgrade completed - UUID → INTEGER conversion done (with data loss)
----------------------------- Captured stderr call -----------------------------
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running downgrade 999_convert_user_id_to_uuid -> 7153bd9cdab5, Convert users.id from INTEGER to UUID and update all foreign keys
INFO  [alembic.runtime.migration] Running downgrade 7153bd9cdab5 -> 60b6220ba320, add gin index for fulltext search on tasks
INFO  [alembic.runtime.migration] Running downgrade 60b6220ba320 -> 8be71e35d938, create notifications table with indexes and constraints
INFO  [alembic.runtime.migration] Running downgrade 8be71e35d938 -> 3f7554956f5b, create tags and task_tags tables with indexes and constraints
INFO  [alembic.runtime.migration] Running downgrade 3f7554956f5b -> 001, create tasks table with indexes and constraints
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 001 -> 3f7554956f5b, create tasks table with indexes and constraints
=============================== warnings summary ===============================
.venv/lib/python3.12/site-packages/sqlmodel/main.py:534
.venv/lib/python3.12/site-packages/sqlmodel/main.py:534
.venv/lib/python3.12/site-packages/sqlmodel/main.py:534
.venv/lib/python3.12/site-packages/sqlmodel/main.py:534
tests/unit/test_repositories.py::TestTagRepositoryCRUD::test_soft_delete_tag_preserves_junction_records
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/.venv/lib/python3.12/site-packages/sqlmodel/main.py:534: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/
    new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)

tests/integration/test_auth_flow.py:25
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/integration/test_auth_flow.py:25: PytestUnknownMarkWarning: Unknown pytest.mark.integration - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.integration

tests/integration/test_auth_flow.py:305
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/integration/test_auth_flow.py:305: PytestUnknownMarkWarning: Unknown pytest.mark.integration - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.integration

tests/integration/test_user_isolation.py:24
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/integration/test_user_isolation.py:24: PytestUnknownMarkWarning: Unknown pytest.mark.integration - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.integration

tests/integration/test_user_isolation.py:207
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/integration/test_user_isolation.py:207: PytestUnknownMarkWarning: Unknown pytest.mark.integration - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.integration

tests/integration/test_user_isolation.py:271
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/integration/test_user_isolation.py:271: PytestUnknownMarkWarning: Unknown pytest.mark.integration - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.integration

tests/unit/models/test_relationships.py::test_task_tag_composite_primary_key_uniqueness
  sys:1: SAWarning: New instance <TaskTag at 0x75f25489fde0> with identity key (<class 'src.models.task_tag.TaskTag'>, (1, 1), None) conflicts with persistent instance <TaskTag at 0x75f255479310>

tests/unit/test_jwks_service.py: 109 warnings
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/src/services/jwks.py:71: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    now = datetime.utcnow()

tests/unit/test_jwks_service.py::TestJWKSCache::test_cache_hit_within_ttl
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:63: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    cache._cached_at = datetime.utcnow()

tests/unit/test_jwks_service.py::TestJWKSCache::test_cache_expires_after_ttl
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:79: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    cache._cached_at = datetime.utcnow() - timedelta(seconds=11)

tests/unit/test_jwks_service.py::TestJWKSCache::test_retry_logic_with_exponential_backoff
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:102: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    call_times.append(datetime.utcnow())

tests/unit/test_jwks_service.py::TestJWTVerification::test_valid_jwt_token_verification
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:175: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    "iat": int(datetime.utcnow().timestamp()),

tests/unit/test_jwks_service.py::TestJWTVerification::test_valid_jwt_token_verification
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:176: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    "exp": int((datetime.utcnow() + timedelta(hours=1)).timestamp()),

tests/unit/test_jwks_service.py::TestPerformance::test_cache_hit_rate_above_95_percent
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/tests/unit/test_jwks_service.py:258: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
    cache._cached_at = datetime.utcnow()

tests/unit/test_migrations.py: 5 warnings
tests/unit/test_rollback.py: 9 warnings
  /mnt/e/giaic/learning/spec_kit_plus/todo_correct/backend/.venv/lib/python3.12/site-packages/alembic/config.py:598: DeprecationWarning: No path_separator found in configuration; falling back to legacy splitting on spaces, commas, and colons for prepend_sys_path.  Consider adding path_separator=os to Alembic config.
    util.warn_deprecated(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================ tests coverage ================================
_______________ coverage: platform linux, python 3.12.3-final-0 ________________

Name                             Stmts   Miss  Cover   Missing
--------------------------------------------------------------
src/__init__.py                      0      0   100%
src/api/__init__.py                  0      0   100%
src/api/auth.py                     60     36    40%   57-90, 127-161, 187-189, 212
src/api/deps.py                     51     18    65%   79, 99-111, 132-148
src/api/health.py                   18     18     0%   2-36
src/api/tags.py                     56     35    38%   39-58, 84-86, 108-117, 141-168, 190-199
src/api/task_tags.py                36     18    50%   41-59, 87-89, 111-120
src/api/tasks.py                    80     53    34%   47-56, 127-143, 165-174, 197-214, 237-254, 276-297, 319-328
src/core/__init__.py                 0      0   100%
src/core/config.py                  37      1    97%   63
src/core/database.py                48     27    44%   24, 65-71, 81-82, 87, 97-116
src/core/errors.py                  37     37     0%   2-139
src/core/logging.py                 44     20    55%   29-56, 82, 105
src/core/middleware.py              50     31    38%   27-41, 53-74, 90-91, 95-148, 160-170
src/core/monitoring.py              50     50     0%   18-161
src/core/search.py                  33     33     0%   2-207
src/core/security.py                21      0   100%
src/core/validators.py              34     13    62%   57-78
src/main.py                         76     39    49%   44-55, 73-106, 136-152, 163-179, 197-241, 260-277, 292, 305
src/models/__init__.py               6      0   100%
src/models/notification.py          22      0   100%
src/models/tag.py                   18      0   100%
src/models/task.py                  25      0   100%
src/models/task_tag.py              12      0   100%
src/models/user.py                  55      3    95%   23, 63, 79
src/notifications/__init__.py        2      2     0%   3-5
src/notifications/scheduler.py      77     77     0%   7-213
src/repositories/__init__.py         4      0   100%
src/repositories/tag.py             45      2    96%   104, 130
src/repositories/task.py            59      2    97%   121, 153
src/repositories/task_tag.py        50     36    28%   26, 47-74, 89-114, 128-148
src/schemas/__init__.py              5      0   100%
src/schemas/common.py               17      0   100%
src/schemas/tag.py                  39      2    95%   29, 54
src/schemas/task.py                 86      8    91%   92, 101-103, 122, 130-132
src/schemas/task_tag.py              9      0   100%
src/services/__init__.py             2      0   100%
src/services/jwks.py                85      9    89%   122-124, 151-152, 236-237, 244-245
src/services/notification.py        42      2    95%   146-149
src/services/query.py               40      0   100%
src/services/user.py                22      6    73%   67-69, 86-88
--------------------------------------------------------------
TOTAL                             1453    578    60%
Coverage HTML written to dir htmlcov
Coverage JSON written to file coverage.json
=========================== short test summary info ============================
FAILED tests/unit/models/test_performance.py::test_idx_tasks_due_reminders_performance
FAILED tests/unit/models/test_performance.py::test_idx_tasks_user_completed_performance
FAILED tests/unit/models/test_performance.py::test_idx_tasks_user_priority_performance
FAILED tests/unit/models/test_performance.py::test_idx_tasks_user_due_date_performance
FAILED tests/unit/models/test_performance.py::test_notification_pending_index_performance
FAILED tests/unit/models/test_performance.py::test_gin_index_fulltext_search_performance
FAILED tests/unit/models/test_performance.py::test_gin_index_prefix_search_performance
FAILED tests/unit/models/test_performance.py::test_gin_index_complex_search_performance
FAILED tests/unit/search/test_search.py::test_fulltext_search_basic_query - A...
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_valid_token_returns_user
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_expired_token_raises_401
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_tampered_token_raises_401
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_missing_sub_claim_raises_401
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_user_not_found_raises_401
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_correlation_id_logging_on_success
FAILED tests/unit/test_auth_deps.py::TestGetCurrentUser::test_correlation_id_logging_on_failure
FAILED tests/unit/test_auth_deps.py::TestCorrelationIDExtraction::test_get_correlation_id_from_context
FAILED tests/unit/test_auth_deps.py::TestCorrelationIDExtraction::test_get_correlation_id_default_empty
FAILED tests/unit/test_auth_deps.py::TestJWKSIntegration::test_jwks_cache_used_for_verification
FAILED tests/unit/test_auth_deps.py::TestJWKSIntegration::test_eddsa_algorithm_enforced_in_deps
FAILED tests/unit/test_jwks_service.py::TestJWKSCache::test_retry_logic_with_exponential_backoff
FAILED tests/unit/test_jwks_service.py::TestJWTVerification::test_expired_token_raises_error
FAILED tests/unit/test_jwks_service.py::TestJWTVerification::test_tampered_token_raises_error
FAILED tests/unit/test_jwks_service.py::TestJWTVerification::test_missing_kid_raises_error
FAILED tests/unit/test_jwks_service.py::TestJWTVerification::test_unknown_kid_raises_error
FAILED tests/unit/test_jwks_service.py::TestJWTVerification::test_wrong_issuer_raises_error
FAILED tests/unit/test_notifications.py::TestNotificationServiceLogging::test_notification_logged_when_email_disabled
FAILED tests/unit/test_rollback.py::test_rollback_to_specific_revision - sqla...
ERROR tests/unit/test_jwks_service.py::TestPerformance::test_warm_cache_verification_under_50ms
ERROR tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_assign_tag_to_task
ERROR tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_unassign_tag_from_task
ERROR tests/unit/test_repositories.py::TestTaskTagRepositoryCRUD::test_get_task_tags_excludes_soft_deleted
ERROR tests/unit/test_user_service.py::TestUserService::test_create_user - sq...
ERROR tests/unit/test_user_service.py::TestUserService::test_create_user_duplicate_email
ERROR tests/unit/test_user_service.py::TestUserService::test_get_user_by_email
ERROR tests/unit/test_user_service.py::TestUserService::test_get_user_by_email_case_insensitive
ERROR tests/unit/test_user_service.py::TestUserService::test_get_user_by_email_not_found
ERROR tests/unit/test_user_service.py::TestUserService::test_get_user_by_id
ERROR tests/unit/test_user_service.py::TestUserService::test_get_user_by_id_not_found
ERROR tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_valid_data
ERROR tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_duplicate_email
ERROR tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_invalid_email
ERROR tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_short_password
ERROR tests/integration/test_auth_endpoints.py::TestRegistrationEndpoint::test_register_missing_fields
ERROR tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_correct_credentials
ERROR tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_wrong_password
ERROR tests/integration/test_auth_endpoints.py::TestLoginEndpoint::test_login_nonexistent_email
ERROR tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_valid_token
ERROR tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_invalid_token
ERROR tests/integration/test_auth_endpoints.py::TestProtectedEndpoints::test_get_me_with_expired_token
ERROR tests/integration/test_auth_endpoints.py::TestLogoutEndpoint::test_logout_with_valid_token
ERROR tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_user_record_has_hashed_password
ERROR tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_database_email_uniqueness
ERROR tests/integration/test_auth_endpoints.py::TestDatabaseIntegration::test_updated_at_field_updates
ERROR tests/integration/test_auth_endpoints.py::TestUnicodeHandling::test_unicode_in_names
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_complete_registration_login_protected_access_flow
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_jwt_cookie_transmission_with_credentials
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_cors_with_credentials_enabled
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_session_persistence_across_requests
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_expired_token_rejected
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_missing_authorization_header_rejected
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_malformed_jwt_token_rejected
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_login_with_wrong_password_fails
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_login_with_nonexistent_email_fails
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_duplicate_email_registration_fails
ERROR tests/integration/test_auth_flow.py::TestAuthenticationFlow::test_logout_invalidates_session
ERROR tests/integration/test_auth_flow.py::TestCorrelationIDPropagation::test_correlation_id_in_response_headers
ERROR tests/integration/test_auth_flow.py::TestCorrelationIDPropagation::test_correlation_id_auto_generated_if_missing
ERROR tests/integration/test_notifications_integration.py::TestTaskCreationNotifications::test_post_task_sends_notification
ERROR tests/integration/test_notifications_integration.py::TestTaskUpdateNotifications::test_patch_task_sends_notification
ERROR tests/integration/test_notifications_integration.py::TestTaskCompletionNotifications::test_complete_task_sends_notification
ERROR tests/integration/test_notifications_integration.py::TestNotificationUserIsolation::test_notification_not_sent_on_user_mismatch
ERROR tests/integration/test_notifications_integration.py::TestReminderNotifications::test_reminder_notification_sent_when_reminder_at_reached
ERROR tests/integration/test_notifications_integration.py::TestReminderNotifications::test_reminder_not_sent_for_completed_tasks
ERROR tests/integration/test_notifications_integration.py::TestNotificationServiceIntegration::test_notification_service_with_real_task_and_user
ERROR tests/integration/test_notifications_integration.py::TestNotificationErrorHandling::test_endpoint_continues_on_notification_failure
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_create_tag_201_with_color_normalization
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_create_duplicate_tag_409_conflict
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_list_tags_200_ok
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_get_single_tag_200_ok
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_update_tag_200_ok
ERROR tests/integration/test_tags.py::TestTagCRUDEndpoints::test_delete_tag_204_no_content
ERROR tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_assign_tag_to_task_201_created
ERROR tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_assign_duplicate_tag_409_conflict
ERROR tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_list_task_tags_200_ok
ERROR tests/integration/test_task_tags.py::TestTaskTagRelationshipEndpoints::test_remove_tag_from_task_204_no_content
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_create_task_201_created
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_list_tasks_200_ok_array
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_get_single_task_200_ok_with_nested_tags
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_replace_task_200_ok_full_replacement
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_update_task_200_ok_partial
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_toggle_complete_200_ok
ERROR tests/integration/test_tasks.py::TestTaskCRUDEndpoints::test_delete_task_204_no_content
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_due_date_and_reminder
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_recurrence_pattern_and_config
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_update_task_recurrence_fields
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_validation_reminder_at_must_be_before_due_date
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_create_task_with_all_advanced_fields
ERROR tests/integration/test_tasks.py::TestAdvancedFieldsSupport::test_get_task_returns_advanced_fields
ERROR tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_access_returns_403
ERROR tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_update_returns_403
ERROR tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_task_deletion_returns_403
ERROR tests/integration/test_user_isolation.py::TestUserIsolationEnforcement::test_cross_user_tag_access_returns_403
ERROR tests/integration/test_user_isolation.py::TestUserIDMismatchDetection::test_url_path_user_id_must_match_jwt_user_id
ERROR tests/integration/test_user_isolation.py::TestUserIDMismatchDetection::test_valid_user_id_match_allows_access
ERROR tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_database_query_filters_by_user_id
ERROR tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_search_filters_respect_user_isolation
ERROR tests/integration/test_user_isolation.py::TestRowLevelSecurityEnforcement::test_authorization_bypass_attempts_fail
===== 28 failed, 195 passed, 140 warnings, 80 errors in 1691.76s (0:28:11) =====
