diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index cdde68d..f276882 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -30,6 +30,7 @@ module Database.Esqueleto.Internal.Sql , unsafeSqlBinOp , unsafeSqlValue , unsafeSqlFunction + , unsafeSqlExtractSubField , UnsafeSqlFunctionArgument , rawSelectSource , runSource @@ -479,6 +480,17 @@ unsafeSqlFunction name arg = uncommas' $ map (\(ERaw _ f) -> f info) $ toArgList arg in (name <> parens argsTLB, argsVals) +-- | (Internal) An unsafe SQL function to extract a subfield from a compound +-- field, e.g. datetime. See 'unsafeSqlBinOp' for warnings. +unsafeSqlExtractSubField :: UnsafeSqlFunctionArgument a => + TLB.Builder -> a -> SqlExpr (Value b) +unsafeSqlExtractSubField subField arg = + ERaw Never $ \info -> + let (argsTLB, argsVals) = + uncommas' $ map (\(ERaw _ f) -> f info) $ toArgList arg + in ("EXTRACT" <> parens (subField <> " FROM " <> argsTLB), argsVals) + + class UnsafeSqlFunctionArgument a where toArgList :: a -> [SqlExpr (Value ())] instance (a ~ Value b) => UnsafeSqlFunctionArgument (SqlExpr a) where @@ -503,6 +515,7 @@ instance ( UnsafeSqlFunctionArgument a toArgList = toArgList . from4 + -- | (Internal) Coerce a value's type from 'SqlExpr (Value a)' to -- 'SqlExpr (Value b)'. You should /not/ use this function -- unless you know what you're doing!