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

オープン
#8,831 コメント 1 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@dconeybe がすでに取り組んでいます。

2026年11月13日 から。

評価

この issue はまだ評価されていません。

説明

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()
主要言語
Java
スター
2.6k
フォーク
733
平均マージ
2日 15時間
マージ済み PR(30日)
72

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

firebase/firebase-android-sdk のほかの issue

firebase/firebase-android-sdk の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。