My proposal is to implement this just like the other bitwise-functions,
i.e `Combinable.bitxor(other)`.
The connector defined by `Combinable` could be `#` , this is what
PostgresSQL use, see https://www.postgresql.org/docs/current/functions-
bitstring.html. I guess a more natural choice would’ve been `^` but this
connector is already in use by `Combinable.POW`:
https://github.com/django/django/blob/291539a85c8461456ab728fe6820a86de54294b6/django/db/models/expressions.py#L42
Bitwise XOR is supported by all backends except sqlite. It could be
implemented on sqlite as something like `((%(lhs)s | %(rhs)s) - (%(lhs)s &
%(rhs)s))` but the way `CombinedExpression.as_sql` is implemented makes it
a bit tricky to repeat the right-hand side binding:
`((“left_hand_side_expr" | %s) - ("left_hand_side_expr" & %s)) % (rhs,)` .
Maybe it could be OK to set
`django.db.backends.sqlite3.features.DatabaseFeatures.supports_bitwise_xor
= False`
I have a proof-of-concept ready if this would be accepted.
--
Ticket URL: <https://code.djangoproject.com/ticket/31396>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* stage: Unreviewed => Accepted
Comment:
Replying to [ticket:31396 Hannes Ljungberg]:
> Bitwise XOR is supported by all backends except sqlite. It could be
implemented on sqlite as something like `((%(lhs)s | %(rhs)s) - (%(lhs)s &
%(rhs)s))` but the way `CombinedExpression.as_sql` is implemented makes it
a bit tricky to repeat the right-hand side binding:
> `((“left_hand_side_expr" | %s) - ("left_hand_side_expr" & %s)) % (rhs,)`
.
You can override a `bitxor` operator (e.g. `#`) in
`DatabaseOperations.combine_expression()` for each backend.
--
Ticket URL: <https://code.djangoproject.com/ticket/31396#comment:1>
* has_patch: 0 => 1
Comment:
PR: https://github.com/django/django/pull/12617
--
Ticket URL: <https://code.djangoproject.com/ticket/31396#comment:2>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/31396#comment:3>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"f3da09df0f4147223ab76a00a841586ccf11005d" f3da09df]:
{{{
#!CommitTicketReference repository=""
revision="f3da09df0f4147223ab76a00a841586ccf11005d"
Fixed #31396 -- Added binary XOR operator to F expressions.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31396#comment:4>