module Rel8.Expr.Default
  ( unsafeDefault
  )
where

-- base
import Prelude ()

-- opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye

-- rel8
import Rel8.Expr ( Expr )
import Rel8.Expr.Opaleye ( fromPrimExpr )


-- | Corresponds to the SQL @DEFAULT@ expression.
--
-- This 'Expr' is unsafe for numerous reasons, and should be used with care:
--
-- 1. This 'Expr' only makes sense in an @INSERT@ or @UPDATE@ statement.
--
-- 2. Rel8 is not able to verify that a particular column actually has a
-- @DEFAULT@ value. Trying to use @unsafeDefault@ where there is no default
-- will cause a runtime crash
--
-- 3. @DEFAULT@ values can not be transformed. For example, the innocuous Rel8
-- code @unsafeDefault + 1@ will crash, despite type checking.
--
-- Given all these caveats, we suggest avoiding the use of default values where
-- possible, instead being explicit. A common scenario where default values are
-- used is with auto-incrementing identifier columns. In this case, we suggest
-- using 'Rel8.nextval' instead.
unsafeDefault :: Expr a
unsafeDefault :: Expr a
unsafeDefault = PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr PrimExpr
Opaleye.DefaultInsertExpr