# HG changeset patch # User Sylvain Thénault # Date 1509717723 -3600 # Node ID 8fa3131583ecf6bef499233e463d49ac7290e241 # Parent 6ab1793f6f831d50dc74f6649bd878b13df438bf [querier] Allow usage of computed relation into WHERE clause of write queries This used to crash because of an attempt to access unexisting table. Closes #17113286 diff -r 6ab1793f6f83 -r 8fa3131583ec cubicweb/server/ssplanner.py --- a/cubicweb/server/ssplanner.py Mon Oct 30 09:04:34 2017 +0100 +++ b/cubicweb/server/ssplanner.py Fri Nov 03 15:02:03 2017 +0100 @@ -24,7 +24,7 @@ from cubicweb import QueryError from cubicweb.schema import VIRTUAL_RTYPES -from cubicweb.rqlrewrite import add_types_restriction +from cubicweb.rqlrewrite import add_types_restriction, RQLRelationRewriter from cubicweb.server.edition import EditedEntity READ_ONLY_RTYPES = set(('eid', 'has_text', 'is', 'is_instance_of', 'identity')) @@ -296,6 +296,9 @@ union.append(select) select.clean_solutions(solutions) add_types_restriction(self.schema, select) + # Rewrite computed relations + rewriter = RQLRelationRewriter(plan.cnx) + rewriter.rewrite(union, plan.args) self.rqlhelper.annotate(union) return self.build_select_plan(plan, union) diff -r 6ab1793f6f83 -r 8fa3131583ec cubicweb/server/test/unittest_querier.py --- a/cubicweb/server/test/unittest_querier.py Mon Oct 30 09:04:34 2017 +0100 +++ b/cubicweb/server/test/unittest_querier.py Fri Nov 03 15:02:03 2017 +0100 @@ -1399,6 +1399,16 @@ self.assertEqual(len(rset.rows), 1) self.assertEqual(rset.description, [('CWUser',)]) + # computed relation tests ################################################## + + def test_computed_relation_write_queries(self): + """Ensure we can use computed relation in WHERE clause of write queries""" + with self.admin_access.cnx() as cnx: + cnx.execute('INSERT Personne P: P nom "user", P login_user U WHERE NOT U user_login P') + cnx.execute('DELETE P login_user U WHERE U user_login P') + cnx.execute('DELETE Personne P WHERE U user_login P') + cnx.execute('SET U login "people" WHERE U user_login P') + # ZT datetime tests ######################################################## def test_tz_datetime(self):