diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 528d140..e13877a 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 @@ -101,6 +102,7 @@ data CompositeKeyError = | FoldHelpError | SqlCaseError | SqlBinOpError + | SqlCastAsError | MakeOnClauseError | MakeExcError | MakeSetError @@ -765,6 +767,14 @@ unsafeSqlFunctionParens name arg = uncommas' $ map (\(ERaw p f) -> first (parensM p) (f info)) $ toArgList arg in (name <> parens argsTLB, argsVals) +-- | (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 ())]