Change aliased val to be legal value by waiting until expr materialization in select clause before adding AS <alias>

This commit is contained in:
belevy 2021-01-20 21:28:26 -06:00
parent 2ab733fbee
commit 2d09ae1fe8
2 changed files with 10 additions and 14 deletions

View File

@ -16,15 +16,11 @@ class ToAlias a where
toAlias :: a -> SqlQuery a
instance ToAlias (SqlExpr (Value a)) where
toAlias (ERaw m f) =
case sqlExprMetaAlias m of
Just _ -> pure $ ERaw m f
Nothing -> do
ident <- newIdentFor (DBName "v")
pure $ ERaw noMeta{sqlExprMetaAlias = Just ident} $ \_ info ->
let (b, v) = f Never info
in (b <> " AS " <> useIdent info ident, v)
toAlias e@(ERaw m f)
| Just _ <- sqlExprMetaAlias m, not (sqlExprMetaIsReference m) = pure e
| otherwise = do
ident <- newIdentFor (DBName "v")
pure $ ERaw noMeta{sqlExprMetaAlias = Just ident} f
instance ToAlias (SqlExpr (Entity a)) where
toAlias (ERaw m f) = do

View File

@ -3044,11 +3044,11 @@ instance PersistField a => SqlSelect (SqlExpr (Value a)) (Value a) where
-- | Materialize a @SqlExpr (Value a)@.
materializeExpr :: IdentInfo -> SqlExpr (Value a) -> (TLB.Builder, [PersistValue])
materializeExpr info v
| ERaw m _ <- v, Just f <- sqlExprMetaCompositeFields m =
let bs = f info
in (uncommas $ map (parensM Parens) bs, [])
| ERaw _ f <- v = f Parens info
materializeExpr info (ERaw m f)
| Just fields <- sqlExprMetaCompositeFields m = (uncommas $ fmap parens $ fields info, [])
| Just alias <- sqlExprMetaAlias m
, not (sqlExprMetaIsReference m) = first (<> " AS " <> useIdent info alias) (f Parens info)
| otherwise = f Parens info
-- | You may return tuples (up to 16-tuples) and tuples of tuples