From f22a11d989a7017c13147ba15b5857fc49652d20 Mon Sep 17 00:00:00 2001 From: Andreas Herrmann Date: Fri, 27 Feb 2015 23:00:43 +0100 Subject: [PATCH] Fix coalesce/coalesceDefault for sub-queries If COALESCE has a sub-query as an argument, then this sub-query needs to remain wrapped in an extra pair of parentheses. --- src/Database/Esqueleto/Internal/Sql.hs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 342b69e..6844d28 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -376,8 +376,8 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where min_ = unsafeSqlFunction "MIN" max_ = unsafeSqlFunction "MAX" - coalesce = unsafeSqlFunction "COALESCE" - coalesceDefault exprs = unsafeSqlFunction "COALESCE" . (exprs ++) . return . just + coalesce = unsafeSqlFunctionParens "COALESCE" + coalesceDefault exprs = unsafeSqlFunctionParens "COALESCE" . (exprs ++) . return . just like = unsafeSqlBinOp " LIKE " (%) = unsafeSqlValue "'%'" @@ -524,6 +524,16 @@ unsafeSqlExtractSubField subField arg = uncommas' $ map (\(ERaw _ f) -> f info) $ toArgList arg in ("EXTRACT" <> parens (subField <> " FROM " <> argsTLB), argsVals) +-- | (Internal) A raw SQL function. Preserves parentheses around arguments. +-- See 'unsafeSqlBinOp' for warnings. +unsafeSqlFunctionParens :: UnsafeSqlFunctionArgument a => + TLB.Builder -> a -> SqlExpr (Value b) +unsafeSqlFunctionParens name arg = + ERaw Never $ \info -> + let (argsTLB, argsVals) = + uncommas' $ map (\(ERaw p f) -> first (parensM p) (f info)) $ toArgList arg + in (name <> parens argsTLB, argsVals) + class UnsafeSqlFunctionArgument a where toArgList :: a -> [SqlExpr (Value ())]