diff --git a/Database/Beam/Sqlite.hs b/Database/Beam/Sqlite.hs
--- a/Database/Beam/Sqlite.hs
+++ b/Database/Beam/Sqlite.hs
@@ -9,8 +9,11 @@
   , SqliteUpdateSyntax, SqliteDeleteSyntax
 
   , fromSqliteCommand, sqliteRenderSyntaxScript
+
+  ,  module Database.Beam.Sqlite.SqliteSpecific
   ) where
 
 import Database.Beam.Sqlite.Syntax
+import Database.Beam.Sqlite.SqliteSpecific
 import Database.Beam.Sqlite.Connection
 import Database.Beam.Sqlite.Migrate (sqliteText, sqliteBlob, sqliteBigInt)
diff --git a/Database/Beam/Sqlite/Connection.hs b/Database/Beam/Sqlite/Connection.hs
--- a/Database/Beam/Sqlite/Connection.hs
+++ b/Database/Beam/Sqlite/Connection.hs
@@ -37,6 +37,7 @@
 
 import           Control.Exception (bracket_, onException, mask)
 import           Control.Monad (forM_, replicateM_)
+import           Control.Monad.Fail (MonadFail)
 import           Control.Monad.Free.Church
 import           Control.Monad.IO.Class (MonadIO(..))
 import           Control.Monad.Identity (Identity)
@@ -143,7 +144,7 @@
   { runSqliteM :: ReaderT (String -> IO (), Connection) IO a
     -- ^ Run an IO action with access to a SQLite connection and a debug logging
     -- function, called or each query submitted on the connection.
-  } deriving (Monad, Functor, Applicative, MonadIO)
+  } deriving (Monad, Functor, Applicative, MonadIO, MonadFail)
 
 newtype BeamSqliteParams = BeamSqliteParams [SQLData]
 instance ToRow BeamSqliteParams where
diff --git a/Database/Beam/Sqlite/SqliteSpecific.hs b/Database/Beam/Sqlite/SqliteSpecific.hs
new file mode 100644
--- /dev/null
+++ b/Database/Beam/Sqlite/SqliteSpecific.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Postgres-specific types, functions, and operators
+module Database.Beam.Sqlite.SqliteSpecific
+    ( -- * Sqlite functions and aggregates
+      sqliteGroupConcat
+    , sqliteGroupConcatOver
+    )
+where
+
+import           Database.Beam
+import           Database.Beam.Backend.SQL
+import           Database.Beam.Query.Internal
+import           Database.Beam.Sqlite.Syntax
+#if !MIN_VERSION_base(4, 11, 0)
+import           Data.Semigroup
+#endif
+
+-- | The SQLite @group_concat@ function.
+-- Joins the value in each row of the first argument, using the second
+-- argument as a delimiter. See 'sqliteGroupConcatOver' if you want to provide
+-- explicit quantification.
+sqliteGroupConcat 
+    :: ( HasSqlValueSyntax SqliteValueSyntax a
+       , IsSqlExpressionSyntaxStringType SqliteExpressionSyntax str 
+       , IsSqlExpressionSyntaxStringType SqliteExpressionSyntax str2
+       )
+    => QExpr SqliteExpressionSyntax s a
+    -> QExpr SqliteExpressionSyntax s str
+    -> QAgg SqliteExpressionSyntax s (Maybe str2)
+sqliteGroupConcat v delim = _sqliteGroupConcatOver allInGroup_ v (Just delim)
+
+
+-- | The SQLite @group_concat@ function.
+-- Joins the value in each row of the first argument using ','.
+-- See 'sqliteGroupConcat' if you want to change the delimiter.
+-- Choosing a custom delimiter and quantification isn't allowed by SQLite.
+sqliteGroupConcatOver 
+    :: ( HasSqlValueSyntax SqliteValueSyntax a
+        , IsSqlExpressionSyntaxStringType SqliteExpressionSyntax str 
+        )
+    => Maybe SqliteAggregationSetQuantifierSyntax
+    -> QExpr SqliteExpressionSyntax s a
+    -> QAgg SqliteExpressionSyntax s (Maybe str)
+sqliteGroupConcatOver quantifier v = _sqliteGroupConcatOver quantifier v Nothing
+
+-- SQLite doesn't allow DISTINCT and a custom delimiter
+_sqliteGroupConcatOver 
+    :: ( HasSqlValueSyntax SqliteValueSyntax a
+        , IsSqlExpressionSyntaxStringType SqliteExpressionSyntax str
+        )
+    => Maybe SqliteAggregationSetQuantifierSyntax
+    -> QExpr SqliteExpressionSyntax s a
+    -> Maybe (QExpr SqliteExpressionSyntax s str2)
+    -> QAgg SqliteExpressionSyntax s (Maybe str)
+_sqliteGroupConcatOver quantifier (QExpr v) delim =
+    QExpr $ \tbl -> SqliteExpressionSyntax $
+    emit "group_concat" <>
+    parens ( maybe mempty (\q -> fromSqliteAggregationSetQuantifier q <> emit " ") quantifier <>
+             fromSqliteExpression (v tbl) <> 
+             maybe mempty (\(QExpr d) -> emit ", " <> fromSqliteExpression (d tbl)) delim)
diff --git a/Database/Beam/Sqlite/Syntax.hs b/Database/Beam/Sqlite/Syntax.hs
--- a/Database/Beam/Sqlite/Syntax.hs
+++ b/Database/Beam/Sqlite/Syntax.hs
@@ -21,7 +21,10 @@
   , SqliteInsertValuesSyntax(..)
   , SqliteColumnSchemaSyntax(..)
   , SqliteExpressionSyntax(..), SqliteValueSyntax(..)
+  , SqliteAggregationSetQuantifierSyntax(..)
 
+  , fromSqliteExpression
+
     -- * SQLite data type syntax
   , SqliteDataTypeSyntax(..)
   , sqliteTextType, sqliteBlobType
@@ -30,7 +33,7 @@
     -- * Building and consuming 'SqliteSyntax'
   , fromSqliteCommand, formatSqliteInsert
 
-  , emit, emitValue
+  , emit, emitValue, parens
 
   , sqliteEscape, withPlaceholders
   , sqliteRenderSyntaxScript
diff --git a/beam-sqlite.cabal b/beam-sqlite.cabal
--- a/beam-sqlite.cabal
+++ b/beam-sqlite.cabal
@@ -1,6 +1,6 @@
 
 name:                beam-sqlite
-version:             0.3.2.3
+version:             0.3.2.4
 synopsis:            Beam driver for SQLite
 description:         Beam driver for the <https://sqlite.org/ SQLite> embedded database.
                      See <http://tathougies.github.io/beam/user-guide/backends/beam-sqlite/ here>
@@ -23,6 +23,7 @@
                       Database.Beam.Sqlite.Syntax
                       Database.Beam.Sqlite.Connection
                       Database.Beam.Sqlite.Migrate
+  other-modules:      Database.Beam.Sqlite.SqliteSpecific
   build-depends:      base          >=4.7  && <5,
 
                       beam-core     >=0.7  && <0.8,
