Use zero for undefined fields in where expressions

This commit fixes an issue where expressions were
silently failing when encountering undefined fields.
Instead they should be treating the undefined field like
the number zero. This is required to stay compatible with
how Tile38 handles zeros.
https://tile38.com/commands/intersects/#fields

Fixes #754
This commit is contained in:
tidwall 2024-11-05 13:58:55 -07:00
parent 1ef53941b2
commit aa1caa6131
2 changed files with 13 additions and 1 deletions

View File

@ -91,6 +91,7 @@ func newExprPool(s *Server) *exprPool {
return resultToValue(r), nil return resultToValue(r), nil
} }
} }
return expr.Number(0), nil
} else { } else {
switch v := info.Value.Value().(type) { switch v := info.Value.Value().(type) {
case gjson.Result: case gjson.Result:
@ -102,8 +103,8 @@ func newExprPool(s *Server) *exprPool {
return expr.Function("match"), nil return expr.Function("match"), nil
} }
} }
return expr.Undefined, nil
} }
return expr.Undefined, nil
}, },
// call // call
func(info expr.CallInfo, ctx *expr.Context) (expr.Value, error) { func(info expr.CallInfo, ctx *expr.Context) (expr.Value, error) {

View File

@ -600,6 +600,17 @@ func keys_FIELDS_test(mc *mockServer) error {
Do("SCAN", "fleet", "WHERE", "props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`), Do("SCAN", "fleet", "WHERE", "props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),
Do("SCAN", "fleet", "WHERE", "Props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`), Do("SCAN", "fleet", "WHERE", "Props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),
Do("SCAN", "fleet", "WHERE", "Props.Speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`), Do("SCAN", "fleet", "WHERE", "Props.Speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),
Do("DROP", "fleet").JSON().OK(),
Do("SET", "fleet", "1", "field", "teamId", "1", "field", "optionalId", "999", "point", "0", "0").JSON().OK(),
Do("SET", "fleet", "2", "field", "teamId", "1", "point", "0", "0").JSON().OK(),
Do("SCAN", "fleet", "COUNT").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "COUNT").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "!optionalId || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "!!!optionalId || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "optionalId == 0 || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "1 == 1 || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
) )
} }