Skip to content

Commit

Permalink
remove LIMIT from EXISTS queries
Browse files Browse the repository at this point in the history
  • Loading branch information
timgraham committed Apr 3, 2024
1 parent 453fb52 commit e3e8b16
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 65 deletions.
2 changes: 2 additions & 0 deletions django_snowflake/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

check_django_compatability()

from .expressions import register_expressions # noqa
from .functions import register_functions # noqa
from .lookups import register_lookups # noqa

register_expressions()
register_functions()
register_lookups()
12 changes: 12 additions & 0 deletions django_snowflake/expressions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.db.models.expressions import Exists


def exists(self, compiler, connection):
# Snowflake doesn't support LIMIT in EXISTS()
# https://docs.snowflake.com/en/user-guide/querying-subqueries#limitations
self.query.clear_limits()
return self.as_sql(compiler, connection)


def register_expressions():
Exists.as_snowflake = exists
67 changes: 2 additions & 65 deletions django_snowflake/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_indexes = False
supports_index_column_ordering = False
supports_json_field_contains = False
# This feature is specific to the Django fork used for testing.
supports_limit_in_exists = False
supports_over_clause = True
supports_partial_indexes = False
# https://docs.snowflake.com/en/sql-reference/functions-regexp.html#backreferences
Expand Down Expand Up @@ -207,105 +209,40 @@ class DatabaseFeatures(BaseDatabaseFeatures):
'model_fields.test_integerfield.PositiveIntegerFieldTests.test_negative_values',
},
'Snowflake: Unsupported subquery type cannot be evaluated.': {
'admin_changelist.tests.ChangeListTests.test_multiple_search_fields',
'admin_filters.tests.ListFiltersTests.test_emptylistfieldfilter_genericrelation',
'admin_filters.tests.ListFiltersTests.test_emptylistfieldfilter_reverse_relationships',
'admin_filters.tests.ListFiltersTests.test_listfilter_genericrelation',
'admin_filters.tests.ListFiltersTests.test_relatedfieldlistfilter_manytomany',
'admin_filters.tests.ListFiltersTests.test_relatedfieldlistfilter_reverse_relationships',
'admin_views.tests.AdminSearchTest.test_exact_matches',
'admin_views.tests.AdminSearchTest.test_no_total_count',
'admin_views.tests.AdminSearchTest.test_search_on_sibling_models',
'admin_views.tests.AdminViewBasicTest.test_relation_spanning_filters',
'admin_views.tests.LimitChoicesToInAdminTest.test_limit_choices_to_as_callable',
'aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_on_exists',
'aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_ref_multiple_subquery_annotation', # noqa
'aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_ref_subquery_annotation',
'aggregation.tests.AggregateAnnotationPruningTests.test_referenced_composed_subquery_requires_wrapping',
'aggregation.tests.AggregateAnnotationPruningTests.test_referenced_subquery_requires_wrapping',
'aggregation.tests.AggregateTestCase.test_aggregation_exists_multivalued_outeref',
'aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation',
'aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values',
'aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values_collision',
'aggregation_regress.tests.AggregationTests.test_annotate_and_join',
'annotations.tests.NonAggregateAnnotationTestCase.test_annotation_exists_aggregate_values_chaining',
'annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery',
'annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform',
'auth_tests.test_models.UserWithPermTestCase.test_basic',
'auth_tests.test_models.UserWithPermTestCase.test_nonexistent_permission',
'db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_outerref',
'db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_subquery_with_parameters',
'db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_outerref',
'expressions.tests.BasicExpressionsTests.test_aggregate_subquery_annotation',
'expressions.tests.BasicExpressionsTests.test_annotation_with_deeply_nested_outerref',
'expressions.tests.BasicExpressionsTests.test_annotation_with_nested_outerref',
'expressions.tests.BasicExpressionsTests.test_annotation_with_outerref',
'expressions.tests.BasicExpressionsTests.test_annotations_within_subquery',
'expressions.tests.BasicExpressionsTests.test_boolean_expression_combined',
'expressions.tests.BasicExpressionsTests.test_boolean_expression_combined_with_empty_Q',
'expressions.tests.BasicExpressionsTests.test_boolean_expression_in_Q',
'expressions.tests.BasicExpressionsTests.test_case_in_filter_if_boolean_output_field',
'expressions.tests.BasicExpressionsTests.test_exists_in_filter',
'expressions.tests.BasicExpressionsTests.test_nested_outerref_with_function',
'expressions.tests.BasicExpressionsTests.test_nested_subquery',
'expressions.tests.BasicExpressionsTests.test_nested_subquery_join_outer_ref',
'expressions.tests.BasicExpressionsTests.test_nested_subquery_outer_ref_2',
'expressions.tests.BasicExpressionsTests.test_nested_subquery_outer_ref_with_autofield',
'expressions.tests.BasicExpressionsTests.test_order_by_exists',
'expressions.tests.BasicExpressionsTests.test_slicing_of_outerref',
'expressions.tests.BasicExpressionsTests.test_subquery',
'expressions.tests.BasicExpressionsTests.test_subquery_filter_by_lazy',
'expressions.tests.BasicExpressionsTests.test_subquery_in_filter',
'expressions.tests.FTimeDeltaTests.test_date_subquery_subtraction',
'expressions.tests.FTimeDeltaTests.test_datetime_subquery_subtraction',
'expressions_window.tests.WindowFunctionTests.test_subquery_row_range_rank',
'filtered_relation.tests.FilteredRelationTests.test_with_exclude',
'generic_relations.tests.GenericRelationsTests.test_queries_content_type_restriction',
'generic_relations_regress.tests.GenericRelationTests.test_ticket_20378',
'generic_relations_regress.tests.GenericRelationTests.test_ticket_20564',
'generic_relations_regress.tests.GenericRelationTests.test_ticket_20564_nullable_fk',
'lookup.tests.LookupQueryingTests.test_filter_subquery_lhs',
'lookup.tests.LookupTests.test_nested_outerref_lhs',
'many_to_many.tests.ManyToManyTests.test_selects',
'model_fields.test_jsonfield.TestQuerying.test_nested_key_transform_on_subquery',
'model_fields.test_jsonfield.TestQuerying.test_obj_subquery_lookup',
'model_forms.tests.LimitChoicesToTests.test_fields_for_model_applies_limit_choices_to',
'model_forms.tests.LimitChoicesToTests.test_limit_choices_to_callable_for_fk_rel',
'model_forms.tests.LimitChoicesToTests.test_limit_choices_to_callable_for_m2m_rel',
'model_forms.tests.LimitChoicesToTests.test_limit_choices_to_m2m_through',
'model_forms.tests.LimitChoicesToTests.test_limit_choices_to_no_duplicates',
'queries.test_qs_combinators.QuerySetSetOperationTests.test_union_in_subquery',
'queries.test_qs_combinators.QuerySetSetOperationTests.test_union_in_subquery_related_outerref',
'queries.test_qs_combinators.QuerySetSetOperationTests.test_union_with_values_list_on_annotated_and_unannotated', # noqa
'queries.tests.ExcludeTest17600.test_exclude_plain',
'queries.tests.ExcludeTest17600.test_exclude_plain_distinct',
'queries.tests.ExcludeTest17600.test_exclude_with_q_is_equal_to_plain_exclude',
'queries.tests.ExcludeTest17600.test_exclude_with_q_is_equal_to_plain_exclude_variation',
'queries.tests.ExcludeTest17600.test_exclude_with_q_object_distinct',
'queries.tests.ExcludeTest17600.test_exclude_with_q_object_no_distinct',
'queries.tests.ExcludeTests.test_exclude_multivalued_exists',
'queries.tests.ExcludeTests.test_exclude_subquery',
'queries.tests.ExcludeTests.test_subquery_exclude_outerref',
'queries.tests.ExcludeTests.test_exclude_m2m_through',
'queries.tests.ExcludeTests.test_to_field',
'queries.tests.ForeignKeyToBaseExcludeTests.test_ticket_21787',
'queries.tests.JoinReuseTest.test_inverted_q_across_relations',
'queries.tests.ManyToManyExcludeTest.test_exclude_many_to_many',
'queries.tests.ManyToManyExcludeTest.test_ticket_12823',
'queries.tests.Queries1Tests.test_combining_does_not_mutate',
'queries.tests.Queries1Tests.test_double_exclude',
'queries.tests.Queries1Tests.test_exclude',
'queries.tests.Queries1Tests.test_exclude_in',
'queries.tests.Queries1Tests.test_nested_exclude',
'queries.tests.Queries1Tests.test_ticket7096',
'queries.tests.Queries1Tests.test_tickets_5324_6704',
'queries.tests.Queries4Tests.test_ticket24525',
'queries.tests.Queries6Tests.test_tickets_8921_9188',
'queries.tests.Queries6Tests.test_xor_subquery',
'queries.tests.TestTicket24605.test_ticket_24605',
'queries.tests.Ticket20788Tests.test_ticket_20788',
'queries.tests.Ticket22429Tests.test_ticket_22429',
'queries.tests.Ticket23605Tests.test_ticket_23605',
},
'Snowflake: Window function type [ROW_NUMBER] requires ORDER BY in '
'window specification.': {
Expand Down

0 comments on commit e3e8b16

Please sign in to comment.