﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
31396	Add support for bitwise XOR to expressions.	Hannes Ljungberg	Hannes Ljungberg	"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.
"	New feature	closed	Database layer (models, ORM)	dev	Normal	fixed	bitwise xor		Ready for checkin	1	0	0	0	0	0
