#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 django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.e05a5bfc362583657aefa47227302d6b%40djangoproject.com.

Reply via email to