Firestore: NoSuchElementException in SQLiteIndexManager.encodeValues for a != query with a trailing orderBy when cache index auto-creation is enabled
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
[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:
- Enable persistent cache index auto-creation.
- 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).
- 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
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di firebase/firebase-android-sdk
-
api: remoteconfig
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
firebase/firebase-android-sdk#8827 ·
I maintainer di solito rispondono entro 1 giorno
-
Crashlytics plugin writes build ID lists in directory listing order, so APKs can differ between machinesForse già presa @mrober l’ha presa 8 giorni fa. Apertaapi: crashlytics
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
firebase/firebase-android-sdk#8789 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
api: auth
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
firebase/firebase-android-sdk#8505 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 15/100
firebase/firebase-android-sdk#8835 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
firebase/firebase-android-sdk#8832 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di firebase/firebase-android-sdk
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
NationalSecurityAgency/ghidra#10220 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
I maintainer di solito rispondono entro 1 giorno
-
RIS export splits an organization name containing “and” into multiple authorsForse già presa @Gautam-aman l’ha presa oggi. Apertastatus: needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
JabRef/jabref#17821 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
FailureContext.java rounds down thresholds in lastedAtLeast()Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno