yesodweb / yesodweb/persistent
selectKeysList bug
Open
Nobody has claimed this yet.
bug
- Dominant language
- Haskell
- Stars
- 486
- Forks
- 306
- PR merge metrics
- No merged PRs in 30d
Description
When running selectKeysList on this table:
ThingOrder
Id UUID default=uuid_generate_v1mc()
userId UserId
thingId ThingId
UniqueThingId thingId
position Int
then we get an error:
uncaught exception: ErrorCall
selectKeysImpl: keyFromValues failed"DebitCardDisplayOrder: keyFromValues failed on: []"
Implementation:
selectKeysRes filts opts = do
conn <- ask
srcRes <- rawQueryRes (sql conn) (getFiltsValues conn filts)
return $ fmap (.| CL.mapM parse) srcRes
where
t = entityDef $ dummyFromFilts filts
cols conn = T.intercalate "," $ toList $ dbIdColumns conn t
wher conn = if null filts
then ""
else filterClause Nothing conn filts
sql conn = connLimitOffset conn (limit,offset) $ mconcat
[ "SELECT "
, cols conn
, " FROM "
, connEscapeTableName conn t
, wher conn
, ord conn
]
(limit, offset, orders) = limitOffsetOrder opts
ord conn =
case map (orderClause False conn) orders of
[] -> ""
ords -> " ORDER BY " <> T.intercalate "," ords
parse xs = do
keyvals <- case entityPrimary t of
Nothing ->
case xs of
[PersistInt64 x] -> return [PersistInt64 x]
[PersistDouble x] -> return [PersistInt64 (truncate x)] -- oracle returns Double
_ -> return xs
Just pdef ->
let pks = map fieldHaskell $ toList $ compositeFields pdef
keyvals = map snd $ filter (\(a, _) -> let ret=isJust (find (== a) pks) in ret) $ zip (map fieldHaskell $ getEntityFields t) xs
in return keyvals
case keyFromValues keyvals of
Right k -> return k
Left err -> error $ "selectKeysImpl: keyFromValues failed" <> show err
So keyvals = [] which is our problem. We have a filter there which I suspect is dodgy.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the selectKeysRes implementation in the issue and trace how getEntityFields, compositeFields, and keyFromValues produce keyvals. Reproduce the ThingOrder schema case, inspect why the filter yields an empty list, and verify that selectKeysList no longer fails while constructing the key.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- haskell
- Domain
- database
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100