It is correct in the sense it is what I intended it to be. You are
proposing a change of behavior. I see where you are coming from. Please
open a ticket about this.
I would like to have some more opinions about this. Should None in
is_active be treated as True?
On Friday, 21 December 2012 14:02:25 UTC-6, Cliff Kachinske wrote:
>
> SQL is incorrect.
>
> is: "AND supplier_contacts.is_active = 'T'"
> should be "AND (supplier_contacts.is_active = 'T' OR
> supplier_contacts.is_active IS NULL)"
>
> On Friday, December 21, 2012 1:05:16 PM UTC-5, Massimo Di Pierro wrote:
>>
>> It looks to be the generated SQL is correct. It is possible you enabled
>> record versioning and that added the common_filter is_active==True. Yet
>> perhaps you have records with is_active=None and therefore they showed up
>> before and not now.
>>
>> On Friday, 21 December 2012 10:50:13 UTC-6, Cliff Kachinske wrote:
>>>
>>> Salient details from two tables:
>>>
>>> db.define_table(
>>> 'suppliers',
>>> Field('name', length=256, required=True, notnull=True),
>>> ....
>>>
>>>
>>> db.define_table(
>>> 'supplier_contacts',
>>> Field('supplier_id', db.suppliers),
>>> Field('first_name', length=32, required=True, notnull=True),
>>>
>>>
>>>
>>> The code below worked in 1.99.7. If the supplier had two contacts, it
>>> would return two rows as expected, both with the same supplier data but
>>> each with individual contact data.
>>>
>>> In 2.2.1 it returns no rows.
>>>
>>> def get_approved_suppliers(product_id):
>>>
>>> return db(
>>> (db.product_suppliers.product_id==product_id) &
>>> (db.product_suppliers.supplier_id==db.suppliers.id)
>>> ).select(
>>> db.suppliers.id,
>>> db.suppliers.name,
>>> # more supplier details omitted for brevity,
>>> db.supplier_contacts.id,
>>> db.supplier_contacts.first_name,
>>> # contact details omitted for brevity.
>>> left = db.supplier_contacts.on(
>>> db.supplier_contacts.supplier_id==db.suppliers.
>>> id
>>> )
>>> )
>>>
>>>
>>> This is the query as shown by db._lastsql. (Broken into chunks for
>>> readability)
>>>
>>> SELECT suppliers.id, suppliers.name, suppliers.address, suppliers.
>>> address_2, suppliers.city, suppliers.state, suppliers.zip, suppliers.
>>> land_line, suppliers.fax, suppliers.email,
>>> suppliers.website,supplier_contacts
>>> .id, supplier_contacts.first_name,
>>> supplier_contacts.middle_name,supplier_contacts
>>> .last_name, supplier_contacts.generation,
>>> supplier_contacts.email,supplier_contacts
>>> .mobile, supplier_contacts.land_line, supplier_contacts.fax
>>>
>>> FROM product_suppliers, suppliers
>>>
>>> LEFT JOIN supplier_contacts ON (supplier_contacts.supplier_id =suppliers
>>> .id)
>>>
>>> WHERE (((((product_suppliers.product_id = 340) AND
>>> (product_suppliers.supplier_id
>>> = suppliers.id)) AND (product_suppliers.is_active = 'T')) AND (suppliers
>>> .is_active = 'T')) AND (supplier_contacts.is_active = 'T'));
>>>
>>>
>>>
>>>
>>>
--