#31396: Add support for bitwise XOR
-------------------------------------+-------------------------------------
               Reporter:  Hannes     |          Owner:  Hannes Ljungberg
  Ljungberg                          |
                   Type:  New        |         Status:  assigned
  feature                            |
              Component:  Database   |        Version:  master
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:  bitwise xor
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 It would be nice to get support for performing bitwise XOR on expressions.
 I'm aware of #29865 but from my understanding this ticket is about logical
 `XOR` and not bitwise `XOR`. Let me know if that ticket should be used
 instead.

 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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.e05a5bfc362583657aefa47227302d6b%40djangoproject.com.

Reply via email to