From 4dc186624c0e805c9f48a7194a2a86621940e7ba Mon Sep 17 00:00:00 2001 From: Marc Scholten Date: Thu, 10 Aug 2023 12:34:54 -0700 Subject: [PATCH] Fixed another bug in migration generator --- IHP/IDE/CodeGen/MigrationGenerator.hs | 4 ++-- Test/IDE/CodeGeneration/MigrationGenerator.hs | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/IHP/IDE/CodeGen/MigrationGenerator.hs b/IHP/IDE/CodeGen/MigrationGenerator.hs index c3e4c5294..4992ff368 100644 --- a/IHP/IDE/CodeGen/MigrationGenerator.hs +++ b/IHP/IDE/CodeGen/MigrationGenerator.hs @@ -544,8 +544,8 @@ unqualifyExpression scope expression = doUnqualify expression doUnqualify (TypeCastExpression a b) = TypeCastExpression (doUnqualify a) b doUnqualify e@(SelectExpression Select { columns, from, whereClause, alias }) = let recurse = case from of - VarExpression fromName -> unqualifyExpression fromName - DotExpression (VarExpression "public") fromName -> unqualifyExpression fromName + VarExpression fromName -> doUnqualify . unqualifyExpression fromName + DotExpression (VarExpression "public") fromName -> doUnqualify . unqualifyExpression fromName _ -> doUnqualify in SelectExpression Select { columns = (recurse <$> columns), from = from, whereClause = recurse whereClause, alias } diff --git a/Test/IDE/CodeGeneration/MigrationGenerator.hs b/Test/IDE/CodeGeneration/MigrationGenerator.hs index 4dcc5c3b6..f639ebbfb 100644 --- a/Test/IDE/CodeGeneration/MigrationGenerator.hs +++ b/Test/IDE/CodeGeneration/MigrationGenerator.hs @@ -1389,6 +1389,26 @@ CREATE POLICY "Users can read and edit their own record" ON public.users USING ( let migration = [] diffSchemas targetSchema actualSchema `shouldBe` migration + + it "should deal with complex nested SELECT expressions inside a policy" do + -- Tricky part is the `projects.id = ads.project_id` here + -- It needs to be unwrapped to `id = project_id` correctly + let actualSchema = sql $ cs [plain| + CREATE POLICY "Users can manage ads if they can access the project" ON public.ads USING ((EXISTS ( SELECT projects.id + FROM public.projects + WHERE (projects.id = ads.project_id)))) WITH CHECK ((EXISTS ( SELECT projects.id + FROM public.projects + WHERE (projects.id = ads.project_id)))); + |] + let targetSchema = sql $ cs [plain| + CREATE POLICY "Users can manage ads if they can access the project" ON ads USING (EXISTS (SELECT id FROM projects WHERE id = project_id)) WITH CHECK (EXISTS (SELECT id FROM projects WHERE id = project_id)); + |] + let migration = [] + + putStrLn $ tshow (normalizeSchema targetSchema) + putStrLn $ tshow (normalizeSchema actualSchema) + + diffSchemas targetSchema actualSchema `shouldBe` migration sql :: Text -> [Statement] sql code = case Megaparsec.runParser Parser.parseDDL "" code of