Files
odoo_source/odoo/addons/test_new_api/security/ir.model.access.csv
T
Raphael ColletandDidier Debondt 036ef5b96d [FIX] core: use EXISTS in domain conditions on many2many fields
This fixes two problems that occur with conditions on many2many fields:
the subtle bug caused by NULL values that are returned by subqueries,
and the performance of those subqueries.

The problem with NULL values returned by subqueries is the fact that
they make the SQL condition undetermined instead of false, and this
discards some of the results returned by a query.  Simply consider:

    id NOT IN (1, 2, 3)

The value id=3 makes the condition false, while i=4 makes it true.  Now
consider that the set also includes a NULL value, like:

    id NOT IN (1, 2, 3, NULL)

The value id=3 makes the condition false, but the value id=4 makes it
undetermined.  Therefore this condition is actually undetermined for all
possible values of id, and a query containing that condition simply
returns nothing!

Regarding performance, consider a domain like [('tag_ids', '=', False)].
It is currently translated in SQL as

    "model".id NOT IN (
        SELECT "model_id"
        FROM "model_tag_rel"
        WHERE "model_id" IS NOT NULL
    )

PostgreSQL does not handle well this "NOT IN" expression when the
relation table is large, and uses some very inefficient query plan in
that case.  The inefficient query plan is possibly related to the
special handling of NULL values, by the way.  This commit changes the
above expression to a "NOT EXISTS" expression (as below), which is
executed with a much more efficient query plan, even with large tables.

    NOT EXISTS (
        SELECT 1
        FROM "model_tag_rel"
        WHERE "model_tag_rel"."model_id" = "model".id
    )

This change was motivated by a use-case with 2.7M account moves, 11M
account move lines and a many2many relation table with 2.3M lines
(`account_move_line_account_tax_rel`).  The query was timing out (15
minutes), and it now takes 15 seconds.

We have replaced all the conditions on many2many fields to use the
relational operators EXISTS and NOT EXISTS.

A test has been added to reflect a case where the many2many table
contains NULL values, like the one for channel_partner in regards to
partner_id and guest_id.

task-2753782

X-original-commit: 334b2aa2aa437d2ed86130f2ed426025f8fe4b86
Part-of: odoo/odoo#87285
Co-authored-by: Didier Debondt <did@odoo.com>
2022-03-25 17:47:43 +01:00

10 KiB

1idnamemodel_id:idgroup_id:idperm_readperm_writeperm_createperm_unlink
2access_categorytest_new_api_categorytest_new_api.model_test_new_api_category1111
3access_decimal_precision_test_alldecimal.precision.testmodel_decimal_precision_test1111
4access_discussiontest_new_api_discussiontest_new_api.model_test_new_api_discussion1111
5access_messagetest_new_api_messagetest_new_api.model_test_new_api_message1111
6access_emailmessagetest_new_api_emailmessagetest_new_api.model_test_new_api_emailmessage1111
7access_multitest_new_api_multitest_new_api.model_test_new_api_multi1111
8access_multi_linetest_new_api_multi_linetest_new_api.model_test_new_api_multi_line1111
9access_multi_line2test_new_api_multi_line2test_new_api.model_test_new_api_multi_line21111
10access_multi_tagtest_new_api_multi_tagtest_new_api.model_test_new_api_multi_tag1111
11access_creativework_editiontest_new_api_creativework_editionmodel_test_new_api_creativework_edition1111
12access_creativework_booktest_new_api_creativework_bookmodel_test_new_api_creativework_book1111
13access_creativework_movietest_new_api_creativework_moviemodel_test_new_api_creativework_movie1111
14access_mixedtest_new_api_mixedtest_new_api.model_test_new_api_mixed1111
15access_domain_boolaccess_domain_boolmodel_domain_bool1111
16access_test_new_api_fooaccess_test_new_api_foomodel_test_new_api_foo1111
17access_test_new_api_baraccess_test_new_api_barmodel_test_new_api_bar1111
18access_test_new_api_relatedaccess_test_new_api_relatedmodel_test_new_api_related1111
19access_test_new_api_companyaccess_test_new_api_companymodel_test_new_api_company1111
20access_test_new_api_company_attraccess_test_new_api_company_attrmodel_test_new_api_company_attr1111
21access_test_new_api_compute_inverseaccess_test_new_api_compute_inversemodel_test_new_api_compute_inverse1111
22access_test_new_api_compute_readonlyaccess_test_new_api_compute_readonlymodel_test_new_api_compute_readonly1111
23access_test_new_api_multi_compute_inverseaccess_test_new_api_multi_compute_inversemodel_test_new_api_multi_compute_inverse1111
24access_test_new_api_recursiveaccess_test_new_api_recursivemodel_test_new_api_recursive1111
25access_test_new_api_recursive_treeaccess_test_new_api_recursive_treemodel_test_new_api_recursive_tree1111
26access_test_new_api_cascadeaccess_test_new_api_cascademodel_test_new_api_cascade1111
27access_test_new_api_compute_readwriteaccess_test_new_api_compute_readwritemodel_test_new_api_compute_readwrite1111
28access_test_new_api_compute_onchangeaccess_test_new_api_compute_onchangemodel_test_new_api_compute_onchange1111
29access_test_new_api_compute_onchange_lineaccess_test_new_api_compute_onchange_linemodel_test_new_api_compute_onchange_line1111
30access_test_new_api_compute_dynamic_dependsaccess_test_new_api_compute_dynamic_dependsmodel_test_new_api_compute_dynamic_depends1111
31access_test_new_api_compute_unassignedaccess_test_new_api_compute_unassignedmodel_test_new_api_compute_unassigned1111
32access_test_new_api_one2manyaccess_test_new_api_one2manymodel_test_new_api_one2many1111
33access_test_new_api_one2many_lineaccess_test_new_api_one2many_linemodel_test_new_api_one2many_line1111
34access_test_new_api_binary_svgaccess_test_new_api_binary_svgmodel_test_new_api_binary_svg1111
35access_test_new_api_monetary_baseaccess_test_new_api_monetary_basemodel_test_new_api_monetary_base1111
36access_test_new_api_monetary_relatedaccess_test_new_api_monetary_relatedmodel_test_new_api_monetary_related1111
37access_test_new_api_monetary_customaccess_test_new_api_monetary_custommodel_test_new_api_monetary_custom1111
38access_test_new_api_monetary_inheritsaccess_test_new_api_monetary_inheritsmodel_test_new_api_monetary_inherits1111
39access_test_new_api_field_with_capsaccess_test_new_api_field_with_capsmodel_test_new_api_field_with_caps1111
40access_test_new_api_req_m2oaccess_test_new_api_req_m2omodel_test_new_api_req_m2o1111
41access_test_new_api_selectionaccess_test_new_api_selectionmodel_test_new_api_selection1111
42access_test_new_api_attachmentaccess_test_new_api_attachmentmodel_test_new_api_attachment1111
43access_test_new_api_attachment_hostaccess_test_new_api_attachment_hostmodel_test_new_api_attachment_host1111
44access_test_new_api_model_imageaccess_test_new_api_model_imagemodel_test_new_api_model_image1111
45access_test_new_api_model_aaccess_test_new_api_model_amodel_test_new_api_model_a1111
46access_test_new_api_model_baccess_test_new_api_model_bmodel_test_new_api_model_b1111
47access_test_new_api_model_parentaccess_test_new_api_model_parentmodel_test_new_api_model_parent1111
48access_test_new_api_model_childaccess_test_new_api_model_childmodel_test_new_api_model_child1111
49access_test_new_api_model_child_nocheckaccess_test_new_api_model_child_nocheckmodel_test_new_api_model_child_nocheck1111
50access_test_new_api_displayaccess_test_new_api_displaymodel_test_new_api_display1111
51access_test_new_api_model_active_fieldaccess_test_new_api_model_active_fieldmodel_test_new_api_model_active_field1111
52access_test_new_api_model_many2one_referenceaccess_test_new_api_model_many2one_referencemodel_test_new_api_model_many2one_reference1111
53access_test_new_api_inverse_m2o_refaccess_test_new_api_inverse_m2o_refmodel_test_new_api_inverse_m2o_ref1111
54access_test_new_api_model_binaryaccess_test_new_api_model_binarymodel_test_new_api_model_binary1111
55access_test_new_api_model_child_m2oaccess_test_new_api_model_child_m2omodel_test_new_api_model_child_m2o1111
56access_test_new_api_model_parent_m2oaccess_test_new_api_model_parent_m2omodel_test_new_api_model_parent_m2o1111
57access_test_new_api_model_private_address_onchangeaccess_test_new_api_model_private_address_onchangemodel_test_new_api_model_private_address_onchangebase.group_user1111
58access_test_new_api_req_m2o_transientaccess_test_new_api_req_m2o_transientmodel_test_new_api_req_m2o_transient0000
59access_test_new_api_countryaccess_test_new_api_countrymodel_test_new_api_countrybase.group_user1111
60access_test_new_api_cityaccess_test_new_api_citymodel_test_new_api_citybase.group_user1111
61access_test_new_api_monetary_orderaccess_test_new_api_monetary_ordermodel_test_new_api_monetary_order1111
62access_test_new_api_monetary_order_lineaccess_test_new_api_monetary_order_linemodel_test_new_api_monetary_order_line1111
63access_test_new_api_model_selection_baseaccess_test_new_api_model_selection_basemodel_test_new_api_model_selection_base1111
64access_test_new_api_model_selection_requiredaccess_test_new_api_model_selection_requiredmodel_test_new_api_model_selection_required1111
65access_test_new_api_model_selection_non_storedaccess_test_new_api_model_selection_non_storedmodel_test_new_api_model_selection_non_stored1111
66access_test_new_api_model_selection_required_for_write_overrideaccess_test_new_api_model_selection_required_for_write_overridemodel_test_new_api_model_selection_required_for_write_override1111
67access_test_new_api_model_selection_relatedaccess_test_new_api_model_selection_relatedtest_new_api.model_test_new_api_model_selection_relatedbase.group_user1111
68access_test_new_api_model_selection_related_updatableaccess_test_new_api_model_selection_related_updatabletest_new_api.model_test_new_api_model_selection_related_updatablebase.group_user1111
69access_test_new_api_moveaccess_test_new_api_movemodel_test_new_api_move1111
70access_test_new_api_move_lineaccess_test_new_api_move_linemodel_test_new_api_move_line1111
71access_test_new_api_paymentaccess_test_new_api_paymentmodel_test_new_api_payment1111
72access_test_new_api_orderaccess_test_new_api_ordermodel_test_new_api_order1111
73access_test_new_api_order_lineaccess_test_new_api_order_linemodel_test_new_api_order_line1111
74access_test_new_api_model_shared_cache_compute_parentaccess_test_new_api.model_shared_cache_compute_parentmodel_test_new_api_model_shared_cache_compute_parent1111
75access_test_new_api_model_shared_cache_compute_lineaccess_test_new_api.model_shared_cache_compute_linemodel_test_new_api_model_shared_cache_compute_line1111
76access_test_new_api_compute_containeraccess_test_new_api_compute_containermodel_test_new_api_compute_container1111
77access_test_new_api_compute_memberaccess_test_new_api_compute_membermodel_test_new_api_compute_member1111
78access_test_new_api_compute_editableaccess_test_new_api_compute_editablemodel_test_new_api_compute_editable1111
79access_test_new_api_compute_editable_lineaccess_test_new_api_compute_editable_linemodel_test_new_api_compute_editable_line1111
80access_test_new_api_model_constrained_unlinksaccess_test_new_api_model_constrained_unlinksmodel_test_new_api_model_constrained_unlinks1111
81access_test_new_api_trigger_leftaccess_test_new_api_trigger_leftmodel_test_new_api_trigger_left1111
82access_test_new_api_trigger_middleaccess_test_new_api_trigger_middlemodel_test_new_api_trigger_middle1111
83access_test_new_api_trigger_rightaccess_test_new_api_trigger_rightmodel_test_new_api_trigger_right1111
84access_test_new_api_crewaccess_test_new_api_crewmodel_test_new_api_crewbase.group_user1111
85access_test_new_api_shipaccess_test_new_api_shipmodel_test_new_api_shipbase.group_user1111
86access_test_new_api_pirateaccess_test_new_api_piratemodel_test_new_api_piratebase.group_user1111
87access_test_new_api_prisoneraccess_test_new_api_prisonermodel_test_new_api_prisonerbase.group_user1111
88access_test_new_api_precomputeaccess_test_new_api_precomputemodel_test_new_api_precompute1000
89access_test_new_api_precompute_lineaccess_test_new_api_precompute_linemodel_test_new_api_precompute_line1000
90access_test_new_api_precompute_comboaccess_test_new_api_precompute_combomodel_test_new_api_precompute_combo1000
91access_test_new_api_precompute_editableaccess_test_new_api_precompute_editablemodel_test_new_api_precompute_editable1000
92access_test_new_api_precompute_requiredaccess_test_new_api_precompute_requiredmodel_test_new_api_precompute_required1000
93access_test_new_api_precompute_monetaryaccess_test_new_api_precompute_monetarymodel_test_new_api_precompute_monetary1000
94access_test_new_api_prefetchaccess_test_new_api_prefetchmodel_test_new_api_prefetch1000