From c9ff21d30a2d4b0b9d7b6c6586bd64bd53b60c91 Mon Sep 17 00:00:00 2001 From: Harpo Reder Date: Sun, 15 Jul 2018 05:47:50 +0000 Subject: [PATCH 1/2] cherrypick unsafeSqlCastAs --- src/Database/Esqueleto/Internal/Sql.hs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 528d140..63c801c 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -33,6 +33,7 @@ module Database.Esqueleto.Internal.Sql , unsafeSqlBinOp , unsafeSqlBinOpComposite , unsafeSqlValue + , unsafeSqlCastAs , unsafeSqlFunction , unsafeSqlExtractSubField , UnsafeSqlFunctionArgument @@ -766,6 +767,13 @@ unsafeSqlFunctionParens name arg = in (name <> parens argsTLB, argsVals) +-- | explicit cast using CAST(value as type) +unsafeSqlCastAs :: T.Text -> SqlExpr (Value a) -> SqlExpr (Value b) +unsafeSqlCastAs t (ERaw p f) = + ERaw Never $ \info -> + let (b, v) = f info + in ("CAST" <> parens ( parensM p b <> " AS " <> TLB.fromText t), v ) + class UnsafeSqlFunctionArgument a where toArgList :: a -> [SqlExpr (Value ())] instance (a ~ Value b) => UnsafeSqlFunctionArgument (SqlExpr a) where From 2e16c72154d8c2200afeea0f295e935967bd8f4b Mon Sep 17 00:00:00 2001 From: Harpo Reder Date: Sun, 15 Jul 2018 06:08:23 +0000 Subject: [PATCH 2/2] add SqlCast composite key error --- src/Database/Esqueleto/Internal/Sql.hs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 63c801c..e13877a 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -102,6 +102,7 @@ data CompositeKeyError = | FoldHelpError | SqlCaseError | SqlBinOpError + | SqlCastAsError | MakeOnClauseError | MakeExcError | MakeSetError @@ -766,13 +767,14 @@ unsafeSqlFunctionParens name arg = uncommas' $ map (\(ERaw p f) -> first (parensM p) (f info)) $ toArgList arg in (name <> parens argsTLB, argsVals) - --- | explicit cast using CAST(value as type) +-- | (Internal) An explicit SQL type cast using CAST(value as type). +-- See 'unsafeSqlBinOp' for warnings. unsafeSqlCastAs :: T.Text -> SqlExpr (Value a) -> SqlExpr (Value b) unsafeSqlCastAs t (ERaw p f) = ERaw Never $ \info -> let (b, v) = f info in ("CAST" <> parens ( parensM p b <> " AS " <> TLB.fromText t), v ) +unsafeSqlCastAs _ (ECompositeKey _) = throw (CompositeKeyErr SqlCastAsError) class UnsafeSqlFunctionArgument a where toArgList :: a -> [SqlExpr (Value ())]