bitemyapp/esqueleto

Typechecked Insertion combinators generate invalid query

Open

#91 建立於 2018年5月29日

在 GitHub 查看
 (1 留言) (0 反應) (0 負責人)Haskell (106 fork)github user discovery
bughelp wanted

倉庫指標

Star
 (395 star)
PR 合併指標
 (PR 指標待抓取)

描述

This code compiles:

{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving         #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
module Bug where

import qualified Database.Persist.MySQL as PMySQL
import Database.Persist.TH
import Database.Esqueleto
import Control.Monad.IO.Class

mkPersist sqlSettings [persistLowerCase|
  Table1 sql=table1
    col1 Int

  Table2 sql=table2
    col1 Int
    col2 Int
|]

q :: MonadIO m => SqlWriteT m ()
q = insertSelect $ from $ \t -> return (Table2 1 <# (t ^. Table1Col1))

But generates an invalid query:

INSERT INTO `table2`(`col1`, `col2`)
SELECT `table1`.`col1`
FROM `table1`
; []

*** Exception: ERRException (ERR {errCode = 1136, errState = "21S01", errMsg = "Column count doesn't match value count at row 1"})

Changing it like this works:

q = insertSelect $ from $ \t -> return (Table2 <# val 1 <&> (t ^. Table1Col1))

which generates

INSERT INTO `table2`(`col1`, `col2`)
SELECT ?, `table1`.`col1`
FROM `table1`
; [PersistInt64 1]

貢獻者指南