diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index e62eade..bc02410 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -8,6 +8,7 @@ , OverloadedStrings , UndecidableInstances , ScopedTypeVariables + , InstanceSigs #-} -- | This is an internal module, anything exported by this module -- may change without a major version bump. Please use only @@ -60,7 +61,8 @@ import Data.Monoid (Monoid(..), (<>)) import Data.Proxy (Proxy(..)) import Database.Esqueleto.Internal.PersistentImport import Database.Persist.Sql.Util ( - entityColumnNames, entityColumnCount, parseEntityValues) + entityColumnNames, entityColumnCount, parseEntityValues, isIdField + , hasCompositeKey) import qualified Control.Monad.Trans.State as S import qualified Control.Monad.Trans.Writer as W import qualified Data.Conduit as C @@ -336,8 +338,16 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where sub_select = sub SELECT sub_selectDistinct = sub SELECT_DISTINCT - EEntity ident ^. field = - ERaw Never $ \info -> (useIdent info ident <> ("." <> fieldName info field), []) + (^.) :: forall val typ. (PersistEntity val, PersistField typ) => + SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ) + EEntity ident ^. field + | isIdField field && hasCompositeKey ed + = ERaw Parens $ + \info@(conn,_) -> (uncommas (map (\a -> useIdent info ident <> "." <> TLB.fromText (connEscapeName conn (fieldDB a))) (compositeFields pdef)), []) + | otherwise = ERaw Never $ \info -> (useIdent info ident <> ("." <> fieldName info field), []) + where + ed = entityDef $ getEntityVal $ (Proxy :: Proxy (SqlExpr (Entity val))) + Just pdef = entityPrimary ed EMaybe r ?. field = maybelize (r ^. field) where