androidx icon indicating copy to clipboard operation
androidx copied to clipboard

Support for queries with > 999 host parameters

Open mzgreen opened this issue 3 years ago • 4 comments

Proposed Changes

This change adds support for large SQLite queries. Large queries are queries with more than 999 host parameters.

Prior to this change, if someone created a query like:

@Query("DELETE * FROM user WHERE id IN (:ids)")
fun delete(ids: List<Int>)

and invoked this function passing a list larger than 999 items, the library would throw a SQLiteException.

The implementation details and codegen changes are documented in the design doc: https://docs.google.com/document/d/1tQPjWLmBS55Cu-1lxa3Nn-eUaOCT6HCnftsmOo_NEfo/edit?usp=sharing

Limitations

The solution supports everything except:

  • @RawQuery - it's not possible to support raw queries, because the implemented solution relies on query parsing which happens during compilation while raw queries are executed at runtime.
  • Cursor returning dao methods - The implemented solution uses temp tables which have to be closed as soon as the dao method finishes execution. Cursor is lazy, so the underlying query is executed when the Cursor is accessed for the first time at which point the temp table probably no longer exists.
  • Paging - it may be possible to support it, but I don't have enough experience with Paging to tell and the change got quite big already so I decided to skip this part for now.

Testing

Test: Added new large query unit tests tests and a benchmark test

Issues Fixed

Fixes: b/73634057

RelNote: Room now supports queries with more than 999 host parameters.

mzgreen avatar Jul 10 '22 12:07 mzgreen

Not sure why FTL tests are failing on CI, connectedCheck and buildOnServer are passing for me locally.

mzgreen avatar Jul 12 '22 06:07 mzgreen

Pinging @yigit @danysantiago @droid-wan-kenobi

mzgreen avatar Jul 14 '22 07:07 mzgreen

Thanks for sending this, looks promising! I am a bit busy this week but will try to take a look as soon as I can.

danysantiago avatar Jul 14 '22 13:07 danysantiago

Looks like Room is getting a huge Kotlin rewrite right now so it may not be the best time for such contribution?

mzgreen avatar Oct 18 '22 12:10 mzgreen