Skip to content

[cloud_firestore]: Query is broken when using where and startAfterDocument #17386

Open
@EArminjon

Description

@EArminjon

Is there an existing issue for this?

  • I have searched the existing issues.

Which plugins are affected?

Database

Which platforms are affected?

Android

Description

When using quey.where with isGreaterThan and startAfterDocument, query is broken.

I've tested all where filters :

  • [isNotEqualTo, greaterThan, lowerThan, whereNotIn, isGreaterThanOrEqualTo, isLessThanOrEqualTo, isNull] are broken.
  • [isEqualTo, whereIn] works.

Reproducing the issue

Demo project https://github.com/EArminjon/firestore-issue-query

  1. Run app
  2. Click on "Fetch with game.dates.from"
  3. See no issue
  4. Click again on "Fetch with game.dates.from"
  5. See the issue

Firebase Core version

3.13.1

Flutter Version

3.32.0

Relevant Log Output

Performing hot restart...
Syncing files to device sdk gphone64 x86 64...
Restarted application in 1 073ms.
I/Firestore( 5907): (25.1.3) [FirestoreClient]: Initializing. user=null
W/DynamiteModule( 5907): Local module descriptor class for com.google.android.gms.providerinstaller.dynamite not found.
I/DynamiteModule( 5907): Considering local module com.google.android.gms.providerinstaller.dynamite:0 and remote module com.google.android.gms.providerinstaller.dynamite:0
W/ProviderInstaller( 5907): Failed to load providerinstaller module: No acceptable module com.google.android.gms.providerinstaller.dynamite found. Local version is 0 and remote version is 0.
W/ProviderInstaller( 5907): Failed to report request stats: com.google.android.gms.common.security.ProviderInstallerImpl.reportRequestStats [class android.content.Context, long, long]
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Channel successfully reset.
I/Firestore( 5907): (25.1.3) [SQLiteSchema]: Migration from version 0 to 17 took 13 milliseconds
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: build overlays
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Start IndexManager
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Start MutationQueue
I/Firestore( 5907): (25.1.3) [RemoteStore]: Shutting down
E/libEGL  ( 5907): called unimplemented OpenGL ES API
D/EGL_emulation( 5907): app_time_stats: avg=20873.55ms min=290.34ms max=41456.77ms count=2
E/libEGL  ( 5907): called unimplemented OpenGL ES API
I/Firestore( 5907): (25.1.3) [FirestoreClient]: Initializing. user=null
W/DynamiteModule( 5907): Local module descriptor class for com.google.android.gms.providerinstaller.dynamite not found.
I/DynamiteModule( 5907): Considering local module com.google.android.gms.providerinstaller.dynamite:0 and remote module com.google.android.gms.providerinstaller.dynamite:0
W/ProviderInstaller( 5907): Failed to load providerinstaller module: No acceptable module com.google.android.gms.providerinstaller.dynamite found. Local version is 0 and remote version is 0.
W/ProviderInstaller( 5907): Failed to report request stats: com.google.android.gms.common.security.ProviderInstallerImpl.reportRequestStats [class android.content.Context, long, long]
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Channel successfully reset.
I/Firestore( 5907): (25.1.3) [SQLiteSchema]: Migration from version 0 to 17 took 13 milliseconds
D/EGL_emulation( 5907): app_time_stats: avg=1146.99ms min=274.96ms max=2019.02ms count=2
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: build overlays
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Start IndexManager
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Start MutationQueue
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Allocate target
I/Firestore( 5907): (25.1.3) [QueryEngine]: Using full collection scan to execute query: Query(target=Query(bookings where game.dates.from>0 order by game.dates.from, __name__);limitType=LIMIT_TO_FIRST)
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Current gRPC connectivity state: IDLE
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream is open
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream sending: # com.google.firestore.v1.ListenRequest@efe48e71
I/Firestore( 5907): add_target {
I/Firestore( 5907):   query {
I/Firestore( 5907):     parent: "projects/fir-issue-public/databases/(default)/documents"
I/Firestore( 5907):     structured_query {
I/Firestore( 5907):       from {
I/Firestore( 5907):         collection_id: "bookings"
I/Firestore( 5907):       }
I/Firestore( 5907):       limit {
I/Firestore( 5907):         value: 1
I/Firestore( 5907):       }
I/Firestore( 5907):       order_by {
I/Firestore( 5907):         direction: ASCENDING
I/Firestore( 5907):         direction_value: 1
I/Firestore( 5907):         field {
I/Firestore( 5907):           field_path: "game.dates.from"
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):       order_by {
I/Firestore( 5907):         direction: ASCENDING
I/Firestore( 5907):         direction_value: 1
I/Firestore( 5907):         field {
I/Firestore( 5907):           field_path: "__name__"
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):       where {
I/Firestore( 5907):         field_filter {
I/Firestore( 5907):           field {
I/Firestore( 5907):             field_path: "game.dates.from"
I/Firestore( 5907):           }
I/Firestore( 5907):           op: GREATER_THAN
I/Firestore( 5907):           op_value: 3
I/Firestore( 5907):           value {
I/Firestore( 5907):             integer_value: 0
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: ""
I/Firestore( 5907):   target_id: 2
I/Firestore( 5907): }
I/Firestore( 5907): database: "projects/fir-issue-public/databases/(default)"
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Current gRPC connectivity state: CONNECTING
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Setting the connectivityAttemptTimer
D/TrafficStats( 5907): tagSocket(78) with statsTag=0xffffffff, statsUid=-1
I/Firestore( 5907): (25.1.3) [FirestoreCallCredentials]: Firebase Auth API not available, not using authentication.
I/Firestore( 5907): (25.1.3) [FirestoreCallCredentials]: Firebase AppCheck API not available.
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Current gRPC connectivity state: READY
I/Firestore( 5907): (25.1.3) [GrpcCallProvider]: Clearing the connectivityAttemptTimer
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received headers: {date=Sun, 25 May 2025 13:59:20 GMT}
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (1): # com.google.firestore.v1.ListenResponse@72b7dc77
I/Firestore( 5907): target_change {
I/Firestore( 5907):   target_change_type: ADD
I/Firestore( 5907):   target_change_type_value: 1
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (2): # com.google.firestore.v1.ListenResponse@6b99e04c
I/Firestore( 5907): document_change {
I/Firestore( 5907):   document {
I/Firestore( 5907):     create_time {
I/Firestore( 5907):       nanos: 799205000
I/Firestore( 5907):       seconds: 1748178964
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "status"
I/Firestore( 5907):       value {
I/Firestore( 5907):         string_value: "banana"
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "user"
I/Firestore( 5907):       value {
I/Firestore( 5907):         map_value {
I/Firestore( 5907):           fields {
I/Firestore( 5907):             key: "id"
I/Firestore( 5907):             value {
I/Firestore( 5907):               string_value: "123456789"
I/Firestore( 5907):             }
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "created"
I/Firestore( 5907):       value {
I/Firestore( 5907):         integer_value: 0
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "game"
I/Firestore( 5907):       value {
I/Firestore( 5907):         map_value {
I/Firestore( 5907):           fields {
I/Firestore( 5907):             key: "dates"
I/Firestore( 5907):             value {
I/Firestore( 5907):               map_value {
I/Firestore( 5907):                 fields {
I/Firestore( 5907):                   key: "to"
I/Firestore( 5907):                   value {
I/Firestore( 5907):                     integer_value: 50
I/Firestore( 5907):                   }
I/Firestore( 5907):                 }
I/Firestore( 5907):                 fields {
I/Firestore( 5907):                   key: "from"
I/Firestore( 5907):                   value {
I/Firestore( 5907):                     integer_value: 42
I/Firestore( 5907):                   }
I/Firestore( 5907):                 }
I/Firestore( 5907):               }
I/Firestore( 5907):             }
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     name: "projects/fir-issue-public/databases/(default)/documents/bookings/Jhv2BLgbA6IDGPKEoI1X"
I/Firestore( 5907):     update_time {
I/Firestore( 5907):       nanos: 348739000
I/Firestore( 5907):       seconds: 1748179250
I/Firestore( 5907):     }
I/Firestore( 5907):   }
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (3): # com.google.firestore.v1.ListenResponse@9637972c
I/Firestore( 5907): target_change {
I/Firestore( 5907):   read_time {
I/Firestore( 5907):     nanos: 251751000
I/Firestore( 5907):     seconds: 1748181560
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: "\n\t\b\347\252\233\347\343\276\215\003"
I/Firestore( 5907):   target_change_type: CURRENT
I/Firestore( 5907):   target_change_type_value: 3
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (4): # com.google.firestore.v1.ListenResponse@fd46a391
I/Firestore( 5907): target_change {
I/Firestore( 5907):   read_time {
I/Firestore( 5907):     nanos: 251751000
I/Firestore( 5907):     seconds: 1748181560
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: "\n\t\b\347\252\233\347\343\276\215\003"
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Apply remote event
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: notifyLocalViewChanges
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (5): # com.google.firestore.v1.ListenResponse@1cfeb3d
I/Firestore( 5907): target_change {
I/Firestore( 5907):   resume_token: "\n\000"
I/Firestore( 5907):   target_change_type: RESET
I/Firestore( 5907):   target_change_type_value: 4
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (6): # com.google.firestore.v1.ListenResponse@6b99e04c
I/Firestore( 5907): document_change {
I/Firestore( 5907):   document {
I/Firestore( 5907):     create_time {
I/Firestore( 5907):       nanos: 799205000
I/Firestore( 5907):       seconds: 1748178964
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "status"
I/Firestore( 5907):       value {
I/Firestore( 5907):         string_value: "banana"
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "created"
I/Firestore( 5907):       value {
I/Firestore( 5907):         integer_value: 0
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "user"
I/Firestore( 5907):       value {
I/Firestore( 5907):         map_value {
I/Firestore( 5907):           fields {
I/Firestore( 5907):             key: "id"
I/Firestore( 5907):             value {
I/Firestore( 5907):               string_value: "123456789"
I/Firestore( 5907):             }
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     fields {
I/Firestore( 5907):       key: "game"
I/Firestore( 5907):       value {
I/Firestore( 5907):         map_value {
I/Firestore( 5907):           fields {
I/Firestore( 5907):             key: "dates"
I/Firestore( 5907):             value {
I/Firestore( 5907):               map_value {
I/Firestore( 5907):                 fields {
I/Firestore( 5907):                   key: "to"
I/Firestore( 5907):                   value {
I/Firestore( 5907):                     integer_value: 50
I/Firestore( 5907):                   }
I/Firestore( 5907):                 }
I/Firestore( 5907):                 fields {
I/Firestore( 5907):                   key: "from"
I/Firestore( 5907):                   value {
I/Firestore( 5907):                     integer_value: 42
I/Firestore( 5907):                   }
I/Firestore( 5907):                 }
I/Firestore( 5907):               }
I/Firestore( 5907):             }
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):     name: "projects/fir-issue-public/databases/(default)/documents/bookings/Jhv2BLgbA6IDGPKEoI1X"
I/Firestore( 5907):     update_time {
I/Firestore( 5907):       nanos: 348739000
I/Firestore( 5907):       seconds: 1748179250
I/Firestore( 5907):     }
I/Firestore( 5907):   }
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (7): # com.google.firestore.v1.ListenResponse@f4cdc928
I/Firestore( 5907): target_change {
I/Firestore( 5907):   read_time {
I/Firestore( 5907):     nanos: 292891000
I/Firestore( 5907):     seconds: 1748181560
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: "\n\t\b\233\354\235\347\343\276\215\003"
I/Firestore( 5907):   target_change_type: CURRENT
I/Firestore( 5907):   target_change_type_value: 3
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (8): # com.google.firestore.v1.ListenResponse@5bdcd58d
I/Firestore( 5907): target_change {
I/Firestore( 5907):   read_time {
I/Firestore( 5907):     nanos: 292891000
I/Firestore( 5907):     seconds: 1748181560
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: "\n\t\b\233\354\235\347\343\276\215\003"
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Apply remote event
I/Firestore( 5907): (25.1.3) [LocalStore]: Ignoring outdated watch update for bookings/Jhv2BLgbA6IDGPKEoI1X.Current version: SnapshotVersion(seconds=1748179250, nanos=348739000)  Watch version: SnapshotVersion(seconds=1748179250, nanos=348739000)
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: notifyLocalViewChanges
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Release target
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream sending: # com.google.firestore.v1.ListenRequest@cc3f8593
I/Firestore( 5907): database: "projects/fir-issue-public/databases/(default)"
I/Firestore( 5907): remove_target: 2
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (9): # com.google.firestore.v1.ListenResponse@9bd12c20
I/Firestore( 5907): target_change {
I/Firestore( 5907):   target_change_type: REMOVE
I/Firestore( 5907):   target_change_type_value: 2
I/Firestore( 5907):   target_ids: 2
I/Firestore( 5907): }
E/libEGL  ( 5907): called unimplemented OpenGL ES API
D/EGL_emulation( 5907): app_time_stats: avg=120.35ms min=9.55ms max=1297.80ms count=15
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Allocate target
I/Firestore( 5907): (25.1.3) [QueryEngine]: Using full collection scan to execute query: Query(target=Query(bookings where game.dates.from>0 order by __name__, game.dates.from);limitType=LIMIT_TO_FIRST)
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream sending: # com.google.firestore.v1.ListenRequest@6682448
I/Firestore( 5907): add_target {
I/Firestore( 5907):   query {
I/Firestore( 5907):     parent: "projects/fir-issue-public/databases/(default)/documents"
I/Firestore( 5907):     structured_query {
I/Firestore( 5907):       from {
I/Firestore( 5907):         collection_id: "bookings"
I/Firestore( 5907):       }
I/Firestore( 5907):       limit {
I/Firestore( 5907):         value: 1
I/Firestore( 5907):       }
I/Firestore( 5907):       order_by {
I/Firestore( 5907):         direction: ASCENDING
I/Firestore( 5907):         direction_value: 1
I/Firestore( 5907):         field {
I/Firestore( 5907):           field_path: "__name__"
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):       order_by {
I/Firestore( 5907):         direction: ASCENDING
I/Firestore( 5907):         direction_value: 1
I/Firestore( 5907):         field {
I/Firestore( 5907):           field_path: "game.dates.from"
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):       start_at {
I/Firestore( 5907):         values {
I/Firestore( 5907):           reference_value: "projects/fir-issue-public/databases/(default)/documents/bookings/Jhv2BLgbA6IDGPKEoI1X"
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):       where {
I/Firestore( 5907):         field_filter {
I/Firestore( 5907):           field {
I/Firestore( 5907):             field_path: "game.dates.from"
I/Firestore( 5907):           }
I/Firestore( 5907):           op: GREATER_THAN
I/Firestore( 5907):           op_value: 3
I/Firestore( 5907):           value {
I/Firestore( 5907):             integer_value: 0
I/Firestore( 5907):           }
I/Firestore( 5907):         }
I/Firestore( 5907):       }
I/Firestore( 5907):     }
I/Firestore( 5907):   }
I/Firestore( 5907):   resume_token: ""
I/Firestore( 5907):   target_id: 4
I/Firestore( 5907): }
I/Firestore( 5907): database: "projects/fir-issue-public/databases/(default)"
I/Firestore( 5907): (25.1.3) [WatchStream]: (161c2d4) Stream received (10): # com.google.firestore.v1.ListenResponse@42b8a5cc
I/Firestore( 5907): target_change {
I/Firestore( 5907):   cause {
I/Firestore( 5907):     code: 3
I/Firestore( 5907):     message: "Order by clause cannot contain more fields after the key game.dates.`from`"
I/Firestore( 5907):   }
I/Firestore( 5907):   target_change_type: REMOVE
I/Firestore( 5907):   target_change_type_value: 2
I/Firestore( 5907):   target_ids: 4
I/Firestore( 5907): }
I/Firestore( 5907): (25.1.3) [Persistence]: Starting transaction: Release target
[log] [cloud_firestore/invalid-argument] Client specified an invalid argument. Note that this differs from failed-precondition. invalid-argument indicates arguments that are problematic regardless of the state of the system (e.g., an invalid field name).

Flutter dependencies

Expand Flutter dependencies snippet
dependencies:
- cloud_firestore 5.6.8 [cloud_firestore_platform_interface cloud_firestore_web collection firebase_core firebase_core_platform_interface flutter meta]
- cupertino_icons 1.0.8
- firebase_core 3.13.1 [firebase_core_platform_interface firebase_core_web flutter meta]                                              
- flutter 0.0.0 [characters collection material_color_utilities meta vector_math sky_engine]                                          

dev dependencies:
- flutter_lints 5.0.0 [lints]                                                                                                         
- flutter_test 0.0.0 [flutter test_api matcher path fake_async clock stack_trace vector_math leak_tracker_flutter_testing async boolea
n_selector characters collection leak_tracker leak_tracker_testing material_color_utilities meta source_span stream_channel string_scanner term_glyph vm_service]

transitive dependencies:
- _flutterfire_internals 1.3.55 [collection firebase_core firebase_core_platform_interface flutter meta]                              
- async 2.13.0 [collection meta]                                                                                                      
- boolean_selector 2.1.2 [source_span string_scanner]                                                                                 
- characters 1.4.0
- clock 1.1.2
- cloud_firestore_platform_interface 6.6.8 [_flutterfire_internals collection firebase_core flutter meta plugin_platform_interface]   
- cloud_firestore_web 4.4.8 [_flutterfire_internals cloud_firestore_platform_interface collection firebase_core firebase_core_web flutter flutter_web_plugins]
- collection 1.19.1
- fake_async 1.3.3 [clock collection]                                                                                                 
- firebase_core_platform_interface 5.4.0 [collection flutter flutter_test meta plugin_platform_interface]                             
- firebase_core_web 2.23.0 [firebase_core_platform_interface flutter flutter_web_plugins meta web]                                    
- flutter_web_plugins 0.0.0 [flutter characters collection material_color_utilities meta vector_math]                                 
- leak_tracker 10.0.9 [clock collection meta path vm_service]                                                                         
- leak_tracker_flutter_testing 3.0.9 [flutter leak_tracker leak_tracker_testing matcher meta]                                         
- leak_tracker_testing 3.0.1 [leak_tracker matcher meta]                                                                              
- lints 5.1.1
- matcher 0.12.17 [async meta stack_trace term_glyph test_api]                                                                        
- material_color_utilities 0.11.1 [collection]                                                                                        
- meta 1.16.0
- path 1.9.1
- plugin_platform_interface 2.1.8 [meta]                                                                                              
- sky_engine 0.0.0
- source_span 1.10.1 [collection path term_glyph]                                                                                     
- stack_trace 1.12.1 [path]                                                                                                           
- stream_channel 2.1.4 [async]                                                                                                        
- string_scanner 1.4.1 [source_span]                                                                                                  
- term_glyph 1.2.2
- test_api 0.7.4 [async boolean_selector collection meta source_span stack_trace stream_channel string_scanner term_glyph]            
- vector_math 2.1.4
- vm_service 15.0.0
- web 1.1.1

Additional context and comments

My firestore :

Enregistrement.2025-05-25.161338.mp4

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions