Scan: ExpressionAttributeValues without an expression answers with a ": FilterExpression is null" suffix the service does not send

Abierto Apto para principiantes
#722 0 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 4 días

@LeeroyHannigan ya está trabajando en esto.

Desde el 2/11/2026.

  • #765 de @LeeroyHannigan — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
70/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust, sqlite
Área
database

Línea de trabajo

Empieza en validate_expression_param_usage en crates/core/src/expression/resolver.rs (alrededor de la línea 223), que construye el sufijo a partir de la lista de parámetros capaces de contener valores que recibe. Luego revisa handle_scan en crates/engine/src/scan.rs (líneas 109 a 115), que pasa [ExpressionKind::Filter]. Está terminado cuando un Scan con ExpressionAttributeValues y sin FilterExpression devuelve el mensaje sin el sufijo : FilterExpression is null, mientras que el comportamiento de los demás llamadores no cambia. Consulta las pruebas de validación de Scan existentes para ver el texto esperado.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

A Scan that carries ExpressionAttributeValues and no FilterExpression answers ExpressionAttributeValues can only be specified when using expressions: FilterExpression is null. The service's message ends after expressions.

Measured against Amazon DynamoDB in us-east-1 on 31 October 2026, each request twice, both answers identical. Table pk S HASH, sk S RANGE with three items. Eight Scan requests, each with "ExpressionAttributeValues": {":d": v} and no FilterExpression:

v Other fields Service ExtendDB main f49c5f823 (SQLite, release build)
{"N": "1"} none ValidationException: ExpressionAttributeValues can only be specified when using expressions ValidationException: ExpressionAttributeValues can only be specified when using expressions: FilterExpression is null
{"N": "1"} inside 1, 2, 10, 30 and 31 nested L values (five requests) none the same the same
{"M": {"k": {"N": "1"}}} none the same the same
{"N": "1"} "ProjectionExpression": "a" the same the same

The service sends no suffix in any of the eight. A ninth request with 32 nested L values answers the nesting text on the service (#564), so the service checks nesting before it checks for values without an expression.

Where the suffix comes from

validate_expression_param_usage in crates/core/src/expression/resolver.rs (line 223) builds the message from the value_expr_params list its caller passes: no suffix for an empty list, : <param> is null for one entry, : <a> and <b> are null for more. Its doc comment states that the service lists the value-capable expression parameters of the API and that the empty list matches Query. handle_scan passes &[ExpressionKind::Filter] (crates/engine/src/scan.rs, line 109 to 115), so Scan gets the FilterExpression is null suffix. The other callers:

Caller List passed Suffix produced
Scan (scan.rs 109) [Filter] : FilterExpression is null
Query (query.rs 222) [] none
PutItem (put_item.rs 112) [Condition] : ConditionExpression is null
DeleteItem (delete_item.rs 71) [Condition] : ConditionExpression is null
UpdateItem (update_item.rs 126) [Update, Condition] : UpdateExpression and ConditionExpression are null
GetItem (get_item.rs 45), BatchGetItem (batch_get_item.rs 73) [] (names only) none

The 31 October measurement covers Scan only. Query's no-suffix answer on main (ExpressionAttributeValues can only be specified when using expressions, sent with KeyConditions and no expression) was not measured on the service on that date; the doc comment states it matches the service. The PutItem, DeleteItem and UpdateItem suffixes were not measured on 31 October, so this issue makes no claim about them. The suffix text was added in d4b60e0be (3 June 2026) with the Scan caller in 006cc6e13.

Lenguaje dominante
Rust
Estrellas
517
Forks
60
Merge medio
4 d 19 h
PR fusionados (30 d)
50

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de ExtendDB/extenddb

Todos los issues de ExtendDB/extenddb

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.