bitemyapp/esqueleto

Typechecked Insertion combinators generate invalid query

Open

#91 aperta il 29 mag 2018

Vedi su GitHub
 (1 commento) (0 reazioni) (0 assegnatari)Haskell (106 fork)github user discovery
bughelp wanted

Metriche repository

Star
 (395 star)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

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]

Guida contributor