{-# LANGUAGE CPP                  #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE NamedFieldPuns       #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE PatternSynonyms      #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TupleSections        #-}
{-# LANGUAGE TypeApplications     #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeOperators        #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE UndecidableInstances #-}

{-# OPTIONS_GHC -Wno-missing-import-lists #-}-- for Prelude
{-# OPTIONS_GHC -Wno-orphans #-}

#include "MachDeps.h"

module Database.PostgreSQL.Pure.Internal.Parser
  ( response
  , authentication
  , authenticationOk
  , error
  , notice
  , parameterStatus
  , backendKeyData
  , readyForQuery
  , rowDescription
  , dataRow
  , dataRowRaw
  , commandComplete
  , parseComplete
  , bindComplete
  , portalSuspended
  , emptyQuery
  , closeComplete
  , noData
  , parameterDescription
  , skipUntilError
  , currentPos
  , column
  , attoparsecParser
  , valueParser
  ) where

import           Database.PostgreSQL.Pure.Internal.Data          (AuthenticationMD5Password (AuthenticationMD5Password), AuthenticationResponse (AuthenticationCleartextPasswordResponse, AuthenticationMD5PasswordResponse, AuthenticationOkResponse),
                                                                  BackendKeyData (BackendKeyData),
                                                                  ColumnInfo (ColumnInfo, typeOid),
                                                                  CommandComplete (CommandComplete),
                                                                  CommandTag (BeginTag, CommitTag, CopyTag, CreateTableTag, DeleteTag, DropTableTag, FetchTag, InsertTag, MoveTag, RollbackTag, SelectTag, SetTag, UpdateTag),
                                                                  DataRow (DataRow), DataRowRaw (DataRowRaw),
                                                                  Debug (Debug), Error (Error),
                                                                  ErrorFields (ErrorFields),
                                                                  FormatCode (BinaryFormat, TextFormat),
                                                                  FromField (fromField), FromRecord (fromRecord),
                                                                  GFromRecord (gFromRecord), Notice (Notice), Oid (Oid),
                                                                  ParameterDescription (ParameterDescription),
                                                                  ParameterStatus (ParameterStatus), Raw (Null, Value),
                                                                  ReadyForQuery (ReadyForQuery), Response (..),
                                                                  RowDescription (RowDescription),
                                                                  SqlIdentifier (SqlIdentifier), StringDecoder,
                                                                  TimeOfDayWithTimeZone (TimeOfDayWithTimeZone),
                                                                  TransactionState (Block, Failed, Idle),
                                                                  TypeLength (FixedLength, VariableLength))
import qualified Database.PostgreSQL.Pure.Internal.Data          as Data
import qualified Database.PostgreSQL.Pure.Internal.MonadFail     as MonadFail
import qualified Database.PostgreSQL.Pure.Oid                    as Oid
import qualified Database.PostgreSQL.Simple.Time.Internal.Parser as Time

import           Prelude                                         hiding (error, fail)

import           Control.Exception                               (assert)
import           Control.Monad                                   (replicateM, unless, void)
import           Control.Monad.Fail                              (MonadFail (fail))
import qualified Data.Attoparsec.ByteString                      as AP
import qualified Data.Attoparsec.ByteString.Char8                as APC
import           Data.Attoparsec.Combinator                      ((<?>))
import qualified Data.Attoparsec.Combinator                      as AP
import qualified Data.Attoparsec.Internal.Types                  as API
import qualified Data.ByteString                                 as BS
import qualified Data.ByteString.Internal                        as BSI
import qualified Data.ByteString.Short                           as BSS
import qualified Data.ByteString.UTF8                            as BSU
import           Data.Functor                                    (($>))
import           Data.Int                                        (Int16, Int32, Int64, Int8)
import           Data.Kind                                       (Type)
import           Data.Maybe                                      (fromMaybe)
import           Data.Memory.Endian                              (BE, ByteSwap, fromBE)
import           Data.Scientific                                 (Scientific, scientific)
import qualified Data.Text                                       as Text
import           Data.Time                                       (Day, DiffTime, LocalTime, TimeOfDay, UTCTime, utc)
import           Data.Tuple.Single                               (Single, pattern Single)
import           Data.Word                                       (Word16, Word32, Word64, Word8)
import           Foreign                                         (withForeignPtr)
import           Foreign.Storable                                (Storable, peekByteOff, sizeOf)
import qualified GHC.Generics                                    as Generics
import           GHC.Stack                                       (HasCallStack, callStack, prettyCallStack)
import qualified PostgreSQL.Binary.Decoding                      as BD
import           System.IO.Unsafe                                (unsafeDupablePerformIO)

#if MIN_VERSION_base(4,13,0)
import           Control.Applicative                             ((<|>))
#else
import           Control.Applicative                             ((*>), (<|>))
#endif

response :: AP.Parser Response
response =
  AuthenticationResponse <$> authentication
  <|> ErrorResponse <$> error
  <|> NoticeResponse <$> notice
  <|> ParameterStatusResponse <$> parameterStatus
  <|> BackendKeyDataResponse <$> backendKeyData
  <|> ReadyForQueryResponse <$> readyForQuery
  <|> RowDescriptionResponse <$> rowDescription
  <|> DataRowResponse <$> dataRowRaw
  <|> CommandCompleteResponse <$> commandComplete
  <|> (parseComplete >> pure ParseCompleteResponse)
  <|> (bindComplete >> pure BindCompleteResponse)
  <|> (emptyQuery >> pure EmptyQueryResponse)
  <|> DebugResponse <$> debug

responseHeader :: AP.Parser Char -> AP.Parser (Char, Int)
responseHeader identParser =
  (<?> "response header") $ do
    ident <- identParser
    len32 <- anyInt32BE
    let len = fromIntegral len32 - 4 :: Int -- minus length of "length field"
    pure (ident, len)

authentication :: AP.Parser AuthenticationResponse
authentication =
  (<?> "authentication") $ do
    (_, len) <- responseHeader $ APC.char 'R'
    checkConsumed len $ do
      method <- anyInt32BE
      case method of
        0 -> pure AuthenticationOkResponse
        3 -> pure AuthenticationCleartextPasswordResponse
        5 -> AuthenticationMD5PasswordResponse . AuthenticationMD5Password . BS.copy <$> AP.take 4
        t -> fail $ "not yet implemeted authentication type: " <> show t

authenticationOk :: AP.Parser ()
authenticationOk =
  (<?> "authentication ok") $ do
    (_, len) <- responseHeader $ APC.char 'R'
    checkConsumed len $ void $ int32BE 0

error :: AP.Parser Error
error =
  (<?> "error") $ do
    (_, len) <- responseHeader $ APC.char 'E'
    checkConsumed len $ Error . ErrorFields <$> list ((,) <$> APC.anyChar <*> (BSS.toShort <$> string))

notice :: AP.Parser Notice
notice =
  (<?> "notice") $ do
    (_, len) <- responseHeader $ APC.char 'N'
    checkConsumed len $ Notice . ErrorFields <$> list ((,) <$> APC.anyChar <*> (BSS.toShort <$> string))

parameterStatus :: AP.Parser ParameterStatus
parameterStatus =
  (<?> "parameter status") $ do
    (_, len) <- responseHeader $ APC.char 'S'
    checkConsumed len $ ParameterStatus <$> (BSS.toShort <$> string) <*> (BSS.toShort <$> string)

backendKeyData :: AP.Parser BackendKeyData
backendKeyData =
  (<?> "backend key data") $ do
    (_, len) <- responseHeader $ APC.char 'K'
    checkConsumed len $ BackendKeyData <$> anyInt32BE <*> anyInt32BE

readyForQuery :: AP.Parser ReadyForQuery
readyForQuery =
  (<?> "ready for query") $ do
    (_, len) <- responseHeader $ APC.char 'Z'
    checkConsumed len $ do
      t <- APC.anyChar
      case t of
        'I' -> pure $ ReadyForQuery Idle
        'T' -> pure $ ReadyForQuery Block
        'E' -> pure $ ReadyForQuery Failed
        _   -> fail "invalid transacion state character"

rowDescription :: AP.Parser RowDescription
rowDescription =
  (<?> "row description") $ do
    (_, len) <- responseHeader $ APC.char 'T'
    checkConsumed len $ do
      fieldCount <- anyInt16BE
      RowDescription <$>
        replicateM
          (fromIntegral fieldCount)
          (ColumnInfo <$> string <*> oid <*> anyInt16BE <*> oid <*> typeLength <*> anyInt32BE <*> formatCode)

dataRow :: FromRecord r => StringDecoder -> [ColumnInfo] -> AP.Parser (DataRow r)
dataRow decode infos =
  (<?> "data row") $ do
    (_, len) <- responseHeader $ APC.char 'D'
    checkConsumed len $ do
      void $ int16BE (fromIntegral $ length infos)
      DataRow <$> fromRecord decode infos

dataRowRaw :: AP.Parser DataRowRaw
dataRowRaw =
  (<?> "data row raw") $ do
    (_, len) <- responseHeader $ APC.char 'D'
    checkConsumed len $ do
      columnCount <- anyInt16BE
      let
        go = do
          l <- anyInt32BE
          case l of
            (-1) -> pure Null
            _    -> Value . BS.copy <$> AP.take (fromIntegral l)
      DataRowRaw <$>
        replicateM
          (fromIntegral columnCount)
          go

commandComplete :: AP.Parser CommandComplete
commandComplete =
  (<?> "command complete") $ do
    (_, len) <- responseHeader $ APC.char 'C'
    checkConsumed len $
      do
        void $ APC.string "INSERT "
        o <- Oid <$> APC.decimal
        void $ APC.char ' '
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ InsertTag o r
      <|>
      do
        void $ APC.string "DELETE "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ DeleteTag r
      <|>
      do
        void $ APC.string "UPDATE "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ UpdateTag r
      <|>
      do
        void $ APC.string "SELECT "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ SelectTag r
      <|>
      do
        void $ APC.string "MOVE "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ MoveTag r
      <|>
      do
        void $ APC.string "FETCH "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ FetchTag r
      <|>
      do
        void $ APC.string "COPY "
        r <- APC.decimal
        void $ AP.word8 0
        pure $ CommandComplete $ CopyTag r
      <|> APC.string "CREATE TABLE" *> AP.word8 0 $> CommandComplete CreateTableTag
      <|> APC.string "DROP TABLE" *> AP.word8 0 $> CommandComplete DropTableTag
      <|> APC.string "BEGIN" *> AP.word8 0 $> CommandComplete BeginTag
      <|> APC.string "COMMIT" *> AP.word8 0 $> CommandComplete CommitTag
      <|> APC.string "ROLLBACK" *> AP.word8 0 $> CommandComplete RollbackTag
      <|> APC.string "SET" *> AP.word8 0 $> CommandComplete SetTag

parseComplete :: AP.Parser ()
parseComplete =
  (<?> "parse complete") $ do
    void $ APC.char8 '1'
    void $ int32BE 4

bindComplete :: AP.Parser ()
bindComplete =
  (<?> "bind complete") $ do
    void $ APC.char8 '2'
    void $ int32BE 4

noData :: AP.Parser ()
noData =
  (<?> "no data") $ do
    void $ APC.char8 'n'
    void $ int32BE 4

parameterDescription :: AP.Parser ParameterDescription
parameterDescription =
  (<?> "parameter description") $ do
    (_, len) <- responseHeader $ APC.char 't'
    checkConsumed len $ do
      n <- anyInt16BE
      ParameterDescription <$> replicateM (fromIntegral n) oid

emptyQuery :: AP.Parser ()
emptyQuery =
  (<?> "empty query") $ do
    void $ APC.char8 'I'
    void $ int32BE 4

portalSuspended :: AP.Parser ()
portalSuspended =
  (<?> "portal suspended") $ do
    void $ APC.char8 's'
    void $ int32BE 4

closeComplete :: AP.Parser ()
closeComplete =
  (<?> "close complete") $ do
    void $ APC.char8 '3'
    void $ int32BE 4

skipUntilError :: AP.Parser Error
skipUntilError =
  (<?> "skip until error") $ do
    (ident, len) <- responseHeader APC.anyChar
    case ident of
      'E' -> checkConsumed len $ Error . ErrorFields <$> list ((,) <$> APC.anyChar <*> (BSS.toShort <$> string))
      _   -> AP.take len >> skipUntilError

debug :: AP.Parser Debug
debug = do
  ident <- AP.anyWord8
  len <- AP.lookAhead anyInt32BE
  bs <- AP.take $ fromIntegral len
  pure $ Debug $ BS.cons ident bs

satisfyN :: Int -> (BS.ByteString -> a) -> (a -> Bool) -> AP.Parser a
satisfyN l f p = do
  bs <- AP.take l
  let a = f bs
  if p a
    then pure a
    else fail "satisfy n"

satisfyStorable :: forall a. Storable a => (BS.ByteString -> a) -> (a -> Bool) -> AP.Parser a
satisfyStorable f p = satisfyN (sizeOf (undefined :: a)) f p <?> "satisfy storable"

type family Unsigned a :: Type
type instance Unsigned Word8 = Word8
type instance Unsigned Word16 = Word16
type instance Unsigned Word32 = Word32
type instance Unsigned Word64 = Word64
type instance Unsigned Int8 = Word8
type instance Unsigned Int16 = Word16
type instance Unsigned Int32 = Word32
type instance Unsigned Int64 = Word64

satisfyIntegralBE :: forall a. (Integral a, Storable a, Integral (Unsigned a), ByteSwap (Unsigned a)) => (a -> Bool) -> AP.Parser a
satisfyIntegralBE p = satisfyStorable (fromIntegral . castByteSwapBE @(Unsigned a)) p <?> "satisfy integral big endian"

anyIntegralBE :: (Integral a, Storable a, Integral (Unsigned a), ByteSwap (Unsigned a)) => AP.Parser a
anyIntegralBE = satisfyIntegralBE (const True) <?> "any integral big endian"

anyInt16BE :: AP.Parser Int16
anyInt16BE = anyIntegralBE <?> "any int16 big endian"

anyInt32BE :: AP.Parser Int32
anyInt32BE = anyIntegralBE <?> "any int32 big endian"

integralBE :: (Integral a, Storable a, Integral (Unsigned a), ByteSwap (Unsigned a)) => a -> AP.Parser a
integralBE n = satisfyIntegralBE (== n) <?> "integral big endian"

int16BE :: Int16 -> AP.Parser Int16
int16BE n = integralBE n <?> "int16 big endian"

int32BE :: Int32 -> AP.Parser Int32
int32BE n = integralBE n <?> "int32 big endian"

castByteSwapBE :: forall a. ByteSwap a => BS.ByteString -> a
castByteSwapBE (BSI.PS fptr off len) =
  assert (sizeOf (undefined :: a) == len) $
    let
      be :: BE a
      be =
        unsafeDupablePerformIO $
          withForeignPtr fptr $ \ptr ->
            peekByteOff ptr off
    in fromBE be

string :: AP.Parser BS.ByteString
string = AP.takeWhile (/= 0) <* AP.word8 0 <?> "string"

list :: AP.Parser a -> AP.Parser [a]
list p = (AP.word8 0 >> pure []) <|> (:) <$> p <*> list p <?> "list"

typeLength :: AP.Parser TypeLength
typeLength =
  (<?> "type length") $ do
    len <- anyInt16BE
    if len < 0
      then pure VariableLength
      else pure $ FixedLength len

formatCode :: AP.Parser FormatCode
formatCode =
  (<?> "format code") $ do
    code <- anyInt16BE
    case code of
      0 -> pure TextFormat
      1 -> pure BinaryFormat
      _ -> fail "invalid format code"

oid :: AP.Parser Oid
oid = Oid <$> anyInt32BE <?> "OID"

checkConsumed :: HasCallStack => Int -> AP.Parser a -> AP.Parser a
checkConsumed expected parser = do
  API.Pos startPos <- currentPos
  r <- parser
  API.Pos endPos <- currentPos
  let consumed = endPos - startPos
  unless (expected == consumed) $
    fail $ "length mismatch: expected: " <> show expected <> ", consumed: " <> show consumed <> "\n" <> prettyCallStack callStack
  pure r

currentPos :: AP.Parser API.Pos
currentPos = API.Parser $ \t pos more _lose suc -> suc t pos more pos

instance FromField Bool where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.bool
    = case formatCode of
        TextFormat | v == "t" -> pure True
                   | v == "f" -> pure False
                   | otherwise -> fail (show (BSU.toString v) <> " is not expected as bool")
        BinaryFormat -> valueParser BD.bool v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Bool"

instance FromField Int where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
#if WORD_SIZE_IN_BITS < 32 /* the width of Int is wider than 30 bits */
    | typeOid == Oid.int2
#elif WORD_SIZE_IN_BITS < 64
    | typeOid `elem` [Oid.int2, Oid.int4]
#else
    | typeOid `elem` [Oid.int2, Oid.int4, Oid.int8]
#endif
    = case formatCode of
        TextFormat   -> attoparsecParser (APC.signed APC.decimal) v
        BinaryFormat -> valueParser BD.int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Int"

instance FromField Int16 where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.int2
    = case formatCode of
        TextFormat   -> attoparsecParser (APC.signed APC.decimal) v
        BinaryFormat -> valueParser BD.int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Int16"

instance FromField Int32 where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid `elem` [Oid.int2, Oid.int4]
    = case formatCode of
        TextFormat   -> attoparsecParser (APC.signed APC.decimal) v
        BinaryFormat -> valueParser BD.int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Int32"

instance FromField Int64 where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid `elem` [Oid.int2, Oid.int4, Oid.int8]
    = case formatCode of
        TextFormat   -> attoparsecParser (APC.signed APC.decimal) v
        BinaryFormat -> valueParser BD.int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Int64"

instance FromField Scientific where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid `elem` [Oid.int2, Oid.int4, Oid.int8]
    = (flip scientific 0 <$>) $
        case formatCode of
          TextFormat   -> attoparsecParser (APC.signed APC.decimal) v
          BinaryFormat -> valueParser BD.int v
    | typeOid == Oid.numeric
    = case formatCode of
        TextFormat   -> attoparsecParser APC.scientific v
        BinaryFormat -> valueParser BD.numeric v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Scientific"

instance FromField Float where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.float4
    = case formatCode of
        TextFormat   -> attoparsecParser APC.rational v
        BinaryFormat -> valueParser BD.float4 v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Float"

instance FromField Double where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.float4
    = case formatCode of
        TextFormat   -> attoparsecParser APC.rational v
        BinaryFormat -> realToFrac <$> valueParser BD.float4 v
    | typeOid == Oid.float8
    = case formatCode of
        TextFormat   -> attoparsecParser APC.double v
        BinaryFormat -> valueParser BD.float8 v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Double"

instance FromField Oid where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.oid
    = (Oid <$>) $
        case formatCode of
          TextFormat   -> attoparsecParser APC.decimal v
          BinaryFormat -> valueParser BD.int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Oid"

instance FromField Char where
  fromField decode ColumnInfo { typeOid } (Just v)
    | typeOid == Oid.char
    = do
        str <- MonadFail.fromEither $ decode v
        case (str :: String) of
          [c] -> pure c
          _   -> fail $ "expected 1 character, actual " <> show (length str) <> " characters"
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Char"

instance FromField String where
  fromField decode ColumnInfo { typeOid } (Just v)
    | typeOid `elem` [Oid.text, Oid.bpchar, Oid.varchar, Oid.name]
    = MonadFail.fromEither $ decode v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: String"

instance FromField BS.ByteString where
  fromField _ ColumnInfo { typeOid } (Just v)
    | typeOid `elem` [Oid.text, Oid.bpchar, Oid.varchar, Oid.name, Oid.bytea] = pure v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: ByteString (strict)"

instance FromField Day where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.date
    = case formatCode of
        TextFormat   -> attoparsecParser Time.day v
        BinaryFormat -> valueParser BD.date v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: Day"

instance FromField TimeOfDay where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.time
    = case formatCode of
        TextFormat   -> attoparsecParser Time.timeOfDay v
        BinaryFormat -> valueParser BD.time_int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: TimeOfDay"

instance FromField TimeOfDayWithTimeZone where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.timetz
    = case formatCode of
        TextFormat   -> attoparsecParser (TimeOfDayWithTimeZone <$> Time.timeOfDay <*> (fromMaybe utc <$> Time.timeZone)) v
        BinaryFormat -> valueParser BD.timetz_int v >>= \(t, tz) -> pure $ TimeOfDayWithTimeZone t tz
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: TimeOfDayWithTimeZone"

instance FromField LocalTime where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.timestamp
    = case formatCode of
        TextFormat   -> attoparsecParser Time.localTime v
        BinaryFormat -> valueParser BD.timestamp_int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: LocalTime"

instance FromField UTCTime where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.timestamptz
    = case formatCode of
        TextFormat   -> attoparsecParser Time.utcTime v
        BinaryFormat -> valueParser BD.timestamptz_int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: UTCTime"

instance FromField DiffTime where
  fromField _ ColumnInfo { typeOid, Data.formatCode } (Just v)
    | typeOid == Oid.interval
    = case formatCode of
        TextFormat   -> attoparsecParser Time.diffTime v
        BinaryFormat -> valueParser BD.interval_int v
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: DiffTime"

instance FromField SqlIdentifier where
  fromField decode info@ColumnInfo { typeOid } v@(Just _)
    | typeOid == Oid.sqlIdentifier = SqlIdentifier <$> fromField decode info { typeOid = Oid.varchar } v -- pg_type.typbasetype
  fromField _ ColumnInfo { typeOid } _ = fail $ "type mismatch (FromField): OID: " <> show typeOid <> ", Haskell: SqlIdentifier"

instance FromField Raw where
  fromField _ _ (Just v) = pure $ Value v
  fromField _ _ Nothing  = pure Null

instance FromField a => FromField (Maybe a) where
  fromField decode i v@(Just _) = Just <$> fromField decode i v
  fromField _ _ Nothing         = pure Nothing

instance FromRecord Bool where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Int where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Int16 where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Int32 where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Int64 where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Scientific where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Float where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Double where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Oid where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Char where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord String where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord BS.ByteString where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Day where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord TimeOfDay where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord TimeOfDayWithTimeZone where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord LocalTime where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord UTCTime where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord DiffTime where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord SqlIdentifier where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromRecord Raw where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

instance FromField a => FromRecord (Maybe a) where
  fromRecord decode [i] = column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

-- 0 tuple
instance FromRecord () where
  fromRecord _ [] = pure ()
  fromRecord _ is = fail $ "length mismatch: expected 0: actual: " <> show (length is)

-- 1 tuple
instance {-# OVERLAPPABLE #-} (FromField a, Single c, t ~ c a) => FromRecord t where
  fromRecord decode [i] = Single <$> column decode i
  fromRecord _ is       = fail $ "length mismatch: expected 1: actual: " <> show (length is)

-- 2-tuple
instance (FromField i0, FromField i1) => FromRecord (i0, i1) where
  fromRecord decode [i0, i1] =
    (,) <$> column decode i0 <*> column decode i1
  fromRecord _ is = fail $ "length mismatch: expected 2: actual: " <> show (length is)

-- 3-tuple
instance (FromField i0, FromField i1, FromField i2) => FromRecord (i0, i1, i2) where
  fromRecord decode [i0, i1, i2] =
    (,,) <$> column decode i0 <*> column decode i1 <*> column decode i2
  fromRecord _ is = fail $ "length mismatch: expected 3: actual: " <> show (length is)

-- 4-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3) => FromRecord (i0, i1, i2, i3) where
  fromRecord decode [i0, i1, i2, i3] =
    (,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3
  fromRecord _ is = fail $ "length mismatch: expected 4: actual: " <> show (length is)

-- 5-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4) => FromRecord (i0, i1, i2, i3, i4) where
  fromRecord decode [i0, i1, i2, i3, i4] =
    (,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4
  fromRecord _ is = fail $ "length mismatch: expected 5: actual: " <> show (length is)

-- 6-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5) => FromRecord (i0, i1, i2, i3, i4, i5) where
  fromRecord decode [i0, i1, i2, i3, i4, i5] =
    (,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5
  fromRecord _ is = fail $ "length mismatch: expected 6: actual: " <> show (length is)

-- 7-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6) => FromRecord (i0, i1, i2, i3, i4, i5, i6) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6] =
    (,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6
  fromRecord _ is = fail $ "length mismatch: expected 7: actual: " <> show (length is)

-- 8-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7] =
    (,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7
  fromRecord _ is = fail $ "length mismatch: expected 8: actual: " <> show (length is)

-- 9-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8] =
    (,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8
  fromRecord _ is = fail $ "length mismatch: expected 9: actual: " <> show (length is)

-- 10-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9] =
    (,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9
  fromRecord _ is = fail $ "length mismatch: expected 10: actual: " <> show (length is)

-- 11-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10] =
    (,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10
  fromRecord _ is = fail $ "length mismatch: expected 11: actual: " <> show (length is)

-- 12-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11] =
    (,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11
  fromRecord _ is = fail $ "length mismatch: expected 12: actual: " <> show (length is)

-- 13-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12] =
    (,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12
  fromRecord _ is = fail $ "length mismatch: expected 13: actual: " <> show (length is)

-- 14-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13] =
    (,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13
  fromRecord _ is = fail $ "length mismatch: expected 14: actual: " <> show (length is)

-- 15-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14] =
    (,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14
  fromRecord _ is = fail $ "length mismatch: expected 15: actual: " <> show (length is)

-- 16-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15] =
    (,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15
  fromRecord _ is = fail $ "length mismatch: expected 16: actual: " <> show (length is)

-- 17-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16] =
    (,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16
  fromRecord _ is = fail $ "length mismatch: expected 17: actual: " <> show (length is)

-- 18-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17] =
    (,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17
  fromRecord _ is = fail $ "length mismatch: expected 18: actual: " <> show (length is)

-- 19-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18] =
    (,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18
  fromRecord _ is = fail $ "length mismatch: expected 19: actual: " <> show (length is)

-- 20-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19] =
    (,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19
  fromRecord _ is = fail $ "length mismatch: expected 20: actual: " <> show (length is)

-- 21-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20] =
    (,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20
  fromRecord _ is = fail $ "length mismatch: expected 21: actual: " <> show (length is)

-- 22-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21] =
    (,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21
  fromRecord _ is = fail $ "length mismatch: expected 22: actual: " <> show (length is)

-- 23-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22] =
    (,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22
  fromRecord _ is = fail $ "length mismatch: expected 23: actual: " <> show (length is)

-- 24-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23] =
    (,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23
  fromRecord _ is = fail $ "length mismatch: expected 24: actual: " <> show (length is)

-- 25-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24] =
    (,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24
  fromRecord _ is = fail $ "length mismatch: expected 25: actual: " <> show (length is)

-- 26-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25
  fromRecord _ is = fail $ "length mismatch: expected 26: actual: " <> show (length is)

-- 27-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26
  fromRecord _ is = fail $ "length mismatch: expected 27: actual: " <> show (length is)

-- 28-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27
  fromRecord _ is = fail $ "length mismatch: expected 28: actual: " <> show (length is)

-- 29-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28
  fromRecord _ is = fail $ "length mismatch: expected 29: actual: " <> show (length is)

-- 30-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29
  fromRecord _ is = fail $ "length mismatch: expected 30: actual: " <> show (length is)

-- 31-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30
  fromRecord _ is = fail $ "length mismatch: expected 31: actual: " <> show (length is)

-- 32-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31
  fromRecord _ is = fail $ "length mismatch: expected 32: actual: " <> show (length is)

-- 33-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32
  fromRecord _ is = fail $ "length mismatch: expected 33: actual: " <> show (length is)

-- 34-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33
  fromRecord _ is = fail $ "length mismatch: expected 34: actual: " <> show (length is)

-- 35-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34
  fromRecord _ is = fail $ "length mismatch: expected 35: actual: " <> show (length is)

-- 36-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35
  fromRecord _ is = fail $ "length mismatch: expected 36: actual: " <> show (length is)

-- 37-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36
  fromRecord _ is = fail $ "length mismatch: expected 37: actual: " <> show (length is)

-- 38-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37
  fromRecord _ is = fail $ "length mismatch: expected 38: actual: " <> show (length is)

-- 39-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38
  fromRecord _ is = fail $ "length mismatch: expected 39: actual: " <> show (length is)

-- 40-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39
  fromRecord _ is = fail $ "length mismatch: expected 40: actual: " <> show (length is)

-- 41-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40
  fromRecord _ is = fail $ "length mismatch: expected 41: actual: " <> show (length is)

-- 42-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41
  fromRecord _ is = fail $ "length mismatch: expected 42: actual: " <> show (length is)

-- 43-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42
  fromRecord _ is = fail $ "length mismatch: expected 43: actual: " <> show (length is)

-- 44-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43
  fromRecord _ is = fail $ "length mismatch: expected 44: actual: " <> show (length is)

-- 45-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44
  fromRecord _ is = fail $ "length mismatch: expected 45: actual: " <> show (length is)

-- 46-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45
  fromRecord _ is = fail $ "length mismatch: expected 46: actual: " <> show (length is)

-- 47-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46
  fromRecord _ is = fail $ "length mismatch: expected 47: actual: " <> show (length is)

-- 48-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47
  fromRecord _ is = fail $ "length mismatch: expected 48: actual: " <> show (length is)

-- 49-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48
  fromRecord _ is = fail $ "length mismatch: expected 49: actual: " <> show (length is)

-- 50-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49
  fromRecord _ is = fail $ "length mismatch: expected 50: actual: " <> show (length is)

-- 51-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50
  fromRecord _ is = fail $ "length mismatch: expected 51: actual: " <> show (length is)

-- 52-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51
  fromRecord _ is = fail $ "length mismatch: expected 52: actual: " <> show (length is)

-- 53-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52
  fromRecord _ is = fail $ "length mismatch: expected 53: actual: " <> show (length is)

-- 54-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53
  fromRecord _ is = fail $ "length mismatch: expected 54: actual: " <> show (length is)

-- 55-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54
  fromRecord _ is = fail $ "length mismatch: expected 55: actual: " <> show (length is)

-- 56-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55
  fromRecord _ is = fail $ "length mismatch: expected 56: actual: " <> show (length is)

-- 57-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56
  fromRecord _ is = fail $ "length mismatch: expected 57: actual: " <> show (length is)

-- 58-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56, FromField i57) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56 <*> column decode i57
  fromRecord _ is = fail $ "length mismatch: expected 58: actual: " <> show (length is)

-- 59-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56, FromField i57, FromField i58) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56 <*> column decode i57 <*> column decode i58
  fromRecord _ is = fail $ "length mismatch: expected 59: actual: " <> show (length is)

-- 60-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56, FromField i57, FromField i58, FromField i59) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56 <*> column decode i57 <*> column decode i58 <*> column decode i59
  fromRecord _ is = fail $ "length mismatch: expected 60: actual: " <> show (length is)

-- 61-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56, FromField i57, FromField i58, FromField i59, FromField i60) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59, i60) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59, i60] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56 <*> column decode i57 <*> column decode i58 <*> column decode i59 <*> column decode i60
  fromRecord _ is = fail $ "length mismatch: expected 61: actual: " <> show (length is)

-- 62-tuple
instance (FromField i0, FromField i1, FromField i2, FromField i3, FromField i4, FromField i5, FromField i6, FromField i7, FromField i8, FromField i9, FromField i10, FromField i11, FromField i12, FromField i13, FromField i14, FromField i15, FromField i16, FromField i17, FromField i18, FromField i19, FromField i20, FromField i21, FromField i22, FromField i23, FromField i24, FromField i25, FromField i26, FromField i27, FromField i28, FromField i29, FromField i30, FromField i31, FromField i32, FromField i33, FromField i34, FromField i35, FromField i36, FromField i37, FromField i38, FromField i39, FromField i40, FromField i41, FromField i42, FromField i43, FromField i44, FromField i45, FromField i46, FromField i47, FromField i48, FromField i49, FromField i50, FromField i51, FromField i52, FromField i53, FromField i54, FromField i55, FromField i56, FromField i57, FromField i58, FromField i59, FromField i60, FromField i61) => FromRecord (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59, i60, i61) where
  fromRecord decode [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59, i60, i61] =
    (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) <$> column decode i0 <*> column decode i1 <*> column decode i2 <*> column decode i3 <*> column decode i4 <*> column decode i5 <*> column decode i6 <*> column decode i7 <*> column decode i8 <*> column decode i9 <*> column decode i10 <*> column decode i11 <*> column decode i12 <*> column decode i13 <*> column decode i14 <*> column decode i15 <*> column decode i16 <*> column decode i17 <*> column decode i18 <*> column decode i19 <*> column decode i20 <*> column decode i21 <*> column decode i22 <*> column decode i23 <*> column decode i24 <*> column decode i25 <*> column decode i26 <*> column decode i27 <*> column decode i28 <*> column decode i29 <*> column decode i30 <*> column decode i31 <*> column decode i32 <*> column decode i33 <*> column decode i34 <*> column decode i35 <*> column decode i36 <*> column decode i37 <*> column decode i38 <*> column decode i39 <*> column decode i40 <*> column decode i41 <*> column decode i42 <*> column decode i43 <*> column decode i44 <*> column decode i45 <*> column decode i46 <*> column decode i47 <*> column decode i48 <*> column decode i49 <*> column decode i50 <*> column decode i51 <*> column decode i52 <*> column decode i53 <*> column decode i54 <*> column decode i55 <*> column decode i56 <*> column decode i57 <*> column decode i58 <*> column decode i59 <*> column decode i60 <*> column decode i61
  fromRecord _ is = fail $ "length mismatch: expected 62: actual: " <> show (length is)

-- list
instance {-# OVERLAPPABLE #-} FromField a => FromRecord [a] where
  fromRecord decode is = sequence $ column decode <$> is

-- generic
instance GFromRecord f => GFromRecord (Generics.M1 i t f) where
  gFromRecord decode infos = (\(r, is) -> (Generics.M1 r, is)) <$> gFromRecord decode infos

instance FromField c => GFromRecord (Generics.K1 i c) where
  gFromRecord decode (i:infos) = (, infos) . Generics.K1 <$> column decode i
  gFromRecord _ []             = fail "length mismatch: too few"

instance (GFromRecord f, GFromRecord g) => GFromRecord (f Generics.:*: g) where
  gFromRecord decode infos = do
    (rep, infos') <- gFromRecord decode infos
    (rep', infos'') <- gFromRecord decode infos'
    pure (rep Generics.:*: rep', infos'')

-- | For implementing 'fromRecord'.
column :: FromField a => StringDecoder -> ColumnInfo -> AP.Parser a
column decode info = do
  l <- anyInt32BE
  case l of
    (-1) -> fromField decode info Nothing
    _    -> fromField decode info . Just =<< AP.take (fromIntegral l)

attoparsecParser :: MonadFail m => AP.Parser a -> BS.ByteString -> m a
attoparsecParser parser string =
  case AP.parseOnly (parser <* AP.endOfInput) string of
    Right a -> pure a
    Left e  -> fail e

valueParser :: MonadFail m => BD.Value a -> BS.ByteString -> m a
valueParser parser string =
  case BD.valueParser parser string of
    Right a -> pure a
    Left e  -> fail $ Text.unpack e