Opened 6 years ago
Closed 6 years ago
#31396 closed New feature (fixed)
Add support for bitwise XOR to expressions.
| Reported by: | Hannes Ljungberg | Owned by: | Hannes Ljungberg |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | bitwise xor |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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.
Change History (4)
comment:1 by , 6 years ago
| Summary: | Add support for bitwise XOR → Add support for bitwise XOR to expressions. |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:3 by , 6 years ago
| Triage Stage: | Accepted → Ready for checkin |
|---|
Replying to Hannes Ljungberg:
You can override a
bitxoroperator (e.g.#) inDatabaseOperations.combine_expression()for each backend.