Firestore: NoSuchElementException in SQLiteIndexManager.encodeValues for a != query with a trailing orderBy when cache index auto-creation is enabled

Aperta
#8,831 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@dconeybe ci sta già lavorando.

Dal 13/11/2026.

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

api: firestore
[READ] Step 1: Are you in the right place?

Yes, this is a crash inside the Firestore SDK.

[REQUIRED] Step 2: Describe your environment
  • Android Studio version: not relevant (runtime crash)
  • Firebase Component: Firestore
  • Component version: 26.0.2 (Firebase BoM 34.5.0)
  • Devices: Pixel 9 (Android 17), Android emulator (sdk_gphone64_arm64)
[REQUIRED] Step 3: Describe the problem

After calling persistentCacheIndexManager.enableIndexAutoCreation(), the app crashes with Internal error in Cloud Firestore (26.0.2) when a snapshot listener is attached to a query that has equality filters, a != filter, and an additional orderBy after the != field.

Steps to reproduce:
  1. Enable persistent cache index auto-creation.
  2. Attach a snapshot listener to a query of the shape below, against a collection with enough cached documents for the SDK to auto-create an index for it (the query scans at least 100 local documents and more than twice the number it returns).
  3. The next time the query runs it is served from that index, and the app crashes.
java.lang.RuntimeException: Internal error in Cloud Firestore (26.0.2).
  at com.google.firebase.firestore.util.AsyncQueue.lambda$panic$3 (AsyncQueue.java:546)
Caused by: java.util.NoSuchElementException
  at java.util.LinkedHashMap$LinkedHashIterator.nextNode (LinkedHashMap.java:1062)
  at java.util.LinkedHashMap$LinkedValueIterator.next (LinkedHashMap.java:1089)
  at com.google.firebase.firestore.local.SQLiteIndexManager.encodeValues (SQLiteIndexManager.java:744)
  at com.google.firebase.firestore.local.SQLiteIndexManager.getDocumentsMatchingTarget (SQLiteIndexManager.java:540)
  at com.google.firebase.firestore.local.QueryEngine.performQueryUsingIndex (QueryEngine.java:179)
  at com.google.firebase.firestore.local.QueryEngine.getDocumentsMatchingQuery (QueryEngine.java:101)
  at com.google.firebase.firestore.local.LocalStore.executeQuery (LocalStore.java:878)
  at com.google.firebase.firestore.core.SyncEngine.initializeViewAndComputeSnapshot (SyncEngine.java:223)
  at com.google.firebase.firestore.core.SyncEngine.listen (SyncEngine.java:210)
  at com.google.firebase.firestore.core.EventManager.addQueryListener (EventManager.java:142)
  at com.google.firebase.firestore.core.FirestoreClient.lambda$listen$7 (FirestoreClient.java:176)

Analysis: Target.getNotInValues(fieldIndex) returns as soon as it reaches the != / not-in segment ("NotIn/NotEqual is always a suffix"), so the returned collection holds one value per segment up to and including that field. SQLiteIndexManager.encodeValues() then calls position.next() once for every directional segment of the index. When the index has a segment after the != field (here the second orderBy), the iterator is exhausted and next() throws.

Impact: Fatal and not catchable by the app: it is thrown on Firestore's worker thread and AsyncQueue rethrows it on the main thread. The index is persisted, so the crash repeats every time the query runs, even after index auto-creation is turned off again, until the cache indexes are deleted. 10 crashes across three installs in two days of internal testing.

Expected: the query runs, either using the index or falling back to a full scan.

Relevant Code:
Firebase.firestore.persistentCacheIndexManager?.enableIndexAutoCreation()

collection
    .whereEqualTo("a", valueA)
    .whereEqualTo("b", valueB)
    .whereEqualTo("c", valueC)
    .whereNotEqualTo("score", null)
    .orderBy("score", Query.Direction.DESCENDING)
    .orderBy("createdAt", Query.Direction.ASCENDING)
    .limit(1)
    .snapshots()
Lingua principale
Java
Stelle
2.6k
Fork
733
Merge medio
2g 15h
PR unite (30g)
72

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di firebase/firebase-android-sdk

Tutte le issue di firebase/firebase-android-sdk

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.