From 94ba8b9c711e3e90bb5ca436b417b00d8e921ca3 Mon Sep 17 00:00:00 2001
From: Julian Rother <julian@cccv.de>
Date: Mon, 18 Mar 2024 17:52:45 +0100
Subject: [PATCH] Fix ORM cartesian product warnings

SQLAlchemy v1.4 (Debian Bookworm) annoyingly warns about select statements
that result in a cartesion product of multiple tables. We actually want
cartesion products in all affected cases, so we change "SELECT FROM a,b" to
the equivalent "SELECT FROM a JOIN b ON TRUE".

See https://docs.sqlalchemy.org/en/14/changelog/migration_14.html
---
 uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py | 5 ++++-
 uffd/models/service.py                                   | 4 ++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py b/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py
index 2440efa2..2ee336c5 100644
--- a/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py
+++ b/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py
@@ -23,7 +23,10 @@ def upgrade():
 	)
 	service = sa.table('service', sa.column('id'))
 	user = sa.table('user', sa.column('id'))
-	op.execute(service_user.insert().from_select(['service_id', 'user_id'], sa.select([service.c.id, user.c.id])))
+	op.execute(service_user.insert().from_select(
+		['service_id', 'user_id'],
+		sa.select([service.c.id, user.c.id]).select_from(sa.join(service, user, sa.true()))
+	))
 
 def downgrade():
 	op.drop_table('service_user')
diff --git a/uffd/models/service.py b/uffd/models/service.py
index 7aa928d4..1bed5cfc 100644
--- a/uffd/models/service.py
+++ b/uffd/models/service.py
@@ -178,7 +178,7 @@ def create_service_users(session, flush_context): # pylint: disable=unused-argum
 		return
 	db.session.execute(db.insert(ServiceUser).from_select(
 		['service_id', 'user_id'],
-		db.select([Service.id, User.id]).where(db.or_(
+		db.select([Service.id, User.id]).select_from(db.join(Service, User, db.true())).where(db.or_(
 			Service.id.in_(new_service_ids),
 			User.id.in_(new_user_ids),
 		))
@@ -193,7 +193,7 @@ def create_missing_service_users():
 	# pylint: disable=no-member
 	db.session.execute(db.insert(ServiceUser).from_select(
 		['service_id', 'user_id'],
-		db.select([Service.id, User.id]).where(db.not_(
+		db.select([Service.id, User.id]).select_from(db.join(Service, User, db.true())).where(db.not_(
 			ServiceUser.query.filter(
 				ServiceUser.service_id == Service.id,
 				ServiceUser.user_id == User.id
-- 
GitLab