From 566c6fe53fb6ba591f8f354c246554b70f6cc13a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 15 Dec 2022 13:51:51 -0500 Subject: [PATCH] correct bad null filter restriction When embedding using the column name. Also make related order similarly strict to avoid the same kind of issues. --- src/PostgREST/Plan.hs | 4 ++-- test/spec/Feature/Query/RelatedQueriesSpec.hs | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/PostgREST/Plan.hs b/src/PostgREST/Plan.hs index 3d5b42596..36f82e5f5 100644 --- a/src/PostgREST/Plan.hs +++ b/src/PostgREST/Plan.hs @@ -322,7 +322,7 @@ addRelatedOrders (Node rp@ReadPlan{order,from} forest) = do where getRelOrder ot@OrderTerm{} = Right ot getRelOrder ot@OrderRelationTerm{otRelation} = - let foundRP = rootLabel <$> find (\(Node ReadPlan{relName, relAlias} _) -> Just otRelation `elem` [Just relName, relAlias] ) forest in + let foundRP = rootLabel <$> find (\(Node ReadPlan{relName, relAlias} _) -> otRelation == fromMaybe relName relAlias) forest in case foundRP of Just ReadPlan{relName,relAlias,relAggAlias,relToParent} -> let isToOne = relIsToOne <$> relToParent @@ -345,7 +345,7 @@ addNullEmbedFilters (Node rp@ReadPlan{where_=oldLogic} forest) = do getFilters :: [ReadPlan] -> LogicTree -> Either ApiRequestError LogicTree getFilters rPlans (Expr b lOp trees) = Expr b lOp <$> (getFilters rPlans `traverse` trees) getFilters rPlans flt@(Stmnt (Filter (fld, []) opExpr)) = - let foundRP = find (\ReadPlan{relName, relAlias} -> Just fld `elem` [Just relName, relAlias]) rPlans in + let foundRP = find (\ReadPlan{relName, relAlias} -> fld == fromMaybe relName relAlias) rPlans in case (foundRP, opExpr) of (Just ReadPlan{relAggAlias}, OpExpr b (Is TriNull)) -> Right $ Stmnt $ FilterNullEmbed b relAggAlias (Just ReadPlan{relName}, _) -> Left $ UnacceptableFilter relName diff --git a/test/spec/Feature/Query/RelatedQueriesSpec.hs b/test/spec/Feature/Query/RelatedQueriesSpec.hs index 7e0f013ac..9763e23f0 100644 --- a/test/spec/Feature/Query/RelatedQueriesSpec.hs +++ b/test/spec/Feature/Query/RelatedQueriesSpec.hs @@ -244,3 +244,13 @@ spec = describe "related queries" $ do { matchStatus = 400 , matchHeaders = [matchContentTypeJson] } + + it "doesn't interfere filtering when embedding using the column name" $ + get "/projects?select=name,client_id,client:client_id(name)&client_id=eq.2" `shouldRespondWith` + [json|[ + {"name":"IOS","client_id":2,"client":{"name":"Apple"}}, + {"name":"OSX","client_id":2,"client":{"name":"Apple"}} + ]|] + { matchStatus = 200 + , matchHeaders = [matchContentTypeJson] + }