From aef4b1dfff520f2eb84a833e4d7c98f00fff2102 Mon Sep 17 00:00:00 2001 From: Rik van Toor Date: Mon, 14 Aug 2023 14:43:37 +0200 Subject: [PATCH 1/3] Alias CTEs upon initialising --- .../Esqueleto/Experimental/From/CommonTableExpression.hs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs index a0d72b9f0..163d7bff7 100644 --- a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs +++ b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs @@ -53,7 +53,10 @@ with query = do let clause = CommonTableExpressionClause NormalCommonTableExpression ident (\info -> toRawSql SELECT info aliasedQuery) Q $ W.tell mempty{sdCteClause = [clause]} ref <- toAliasReference ident aliasedValue - pure $ From $ pure (ref, (\_ info -> (useIdent info ident, mempty))) + pure $ From $ do + newIdent <- newIdentFor (DBName "cte") + localRef <- toAliasReference newIdent ref + pure (localRef, (\_ info -> (useIdent info ident <> " AS " <> useIdent info newIdent, mempty))) -- | @WITH@ @RECURSIVE@ allows one to make a recursive subquery, which can -- reference itself. Like @WITH@, this is supported in most modern SQL engines. From 44e9edae271589b60051250c81cfb8fd618df15b Mon Sep 17 00:00:00 2001 From: Rik van Toor Date: Mon, 14 Aug 2023 14:57:40 +0200 Subject: [PATCH 2/3] Bump version, adhere to style guide --- esqueleto.cabal | 2 +- .../Esqueleto/Experimental/From/CommonTableExpression.hs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/esqueleto.cabal b/esqueleto.cabal index 3262eb58e..d8802dc7f 100644 --- a/esqueleto.cabal +++ b/esqueleto.cabal @@ -2,7 +2,7 @@ cabal-version: 1.12 name: esqueleto -version: 3.5.10.1 +version: 3.5.10.2 synopsis: Type-safe EDSL for SQL queries on persistent backends. description: @esqueleto@ is a bare bones, type-safe EDSL for SQL queries that works with unmodified @persistent@ SQL backends. Its language closely resembles SQL, so you don't have to learn new concepts, just new syntax, and it's fairly easy to predict the generated SQL and optimize it for your backend. Most kinds of errors committed when writing SQL are caught as compile-time errors---although it is possible to write type-checked @esqueleto@ queries that fail at runtime. . diff --git a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs index 163d7bff7..d1a1f7a57 100644 --- a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs +++ b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs @@ -54,9 +54,10 @@ with query = do Q $ W.tell mempty{sdCteClause = [clause]} ref <- toAliasReference ident aliasedValue pure $ From $ do - newIdent <- newIdentFor (DBName "cte") - localRef <- toAliasReference newIdent ref - pure (localRef, (\_ info -> (useIdent info ident <> " AS " <> useIdent info newIdent, mempty))) + newIdent <- newIdentFor (DBName "cte") + localRef <- toAliasReference newIdent ref + let lh = useIdent info ident <> " AS " <> useIdent info newIdent + pure (localRef, (\_ info -> (lh, mempty))) -- | @WITH@ @RECURSIVE@ allows one to make a recursive subquery, which can -- reference itself. Like @WITH@, this is supported in most modern SQL engines. From f92378d40b310b43951c12f9e077b6851ab5bb9c Mon Sep 17 00:00:00 2001 From: Rik van Toor Date: Mon, 14 Aug 2023 15:09:27 +0200 Subject: [PATCH 3/3] Update changelog --- changelog.md | 6 ++++++ .../Esqueleto/Experimental/From/CommonTableExpression.hs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index a70c9b7cc..ed2aa0fb7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,9 @@ +3.5.10.2 +======== +- @RikvanToor + - [#373](https://github.com/bitemyapp/esqueleto/pull/373) + - Fix name clashes when using CTEs multiple times + 3.5.10.1 ======== - @9999years diff --git a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs index d1a1f7a57..2a7898b97 100644 --- a/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs +++ b/src/Database/Esqueleto/Experimental/From/CommonTableExpression.hs @@ -56,8 +56,8 @@ with query = do pure $ From $ do newIdent <- newIdentFor (DBName "cte") localRef <- toAliasReference newIdent ref - let lh = useIdent info ident <> " AS " <> useIdent info newIdent - pure (localRef, (\_ info -> (lh, mempty))) + let makeLH info = useIdent info ident <> " AS " <> useIdent info newIdent + pure (localRef, (\_ info -> (makeLH info, mempty))) -- | @WITH@ @RECURSIVE@ allows one to make a recursive subquery, which can -- reference itself. Like @WITH@, this is supported in most modern SQL engines.