From 69b4be6e370cb256a50daf7417678e042b20d4c1 Mon Sep 17 00:00:00 2001 From: Tero Laitinen Date: Wed, 2 Apr 2014 17:30:28 +0300 Subject: [PATCH] unsafeSqlExtractSubField to support EXTRACT subfield FROM field-syntax --- src/Database/Esqueleto/Internal/Sql.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 660e409..7eba11f 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -29,6 +29,7 @@ module Database.Esqueleto.Internal.Sql , unsafeSqlBinOp , unsafeSqlValue , unsafeSqlFunction + , unsafeSqlExtractSubField , UnsafeSqlFunctionArgument , rawSelectSource , runSource @@ -475,6 +476,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 @@ -499,6 +511,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!