Firestore: NoSuchElementException in SQLiteIndexManager.encodeValues for a != query with a trailing orderBy when cache index auto-creation is enabled
メンテナーはふだん 1 日以内に返信
@dconeybe がすでに取り組んでいます。
2026年11月13日 から。
評価
この issue はまだ評価されていません。
説明
[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()
- 主要言語
- Java
- スター
- 2.6k
- フォーク
- 733
- 平均マージ
- 2日 15時間
- マージ済み PR(30日)
- 72
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
firebase/firebase-android-sdk のほかの issue
-
api: remoteconfig
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
firebase/firebase-android-sdk#8827 ·
メンテナーはふだん 1 日以内に返信
-
Crashlytics plugin writes build ID lists in directory listing order, so APKs can differ between machines対応中かも @mrober が 8 日前に担当しました。 オープンapi: crashlytics
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
firebase/firebase-android-sdk#8789 · コメント 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
api: auth
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
firebase/firebase-android-sdk#8505 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 15/100
firebase/firebase-android-sdk#8835 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
firebase/firebase-android-sdk#8832 ·
メンテナーはふだん 1 日以内に返信
firebase/firebase-android-sdk の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
NationalSecurityAgency/ghidra#10220 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
メンテナーはふだん 1 日以内に返信
-
RIS export splits an organization name containing “and” into multiple authors対応中かも @Gautam-aman が今日担当しました。 オープンstatus: needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
JabRef/jabref#17821 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
FailureContext.java rounds down thresholds in lastedAtLeast()対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信