[
https://issues.apache.org/jira/browse/TINKERPOP-3269?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stephen Mallette closed TINKERPOP-3269.
---------------------------------------
Resolution: Duplicate
This seems to be a duplicate of TINKERPOP-3270 - closing in favor of that one.
> Invalid non-string predicate in where(P) throws an internal
> ClassCastException instead of a validation error
> ------------------------------------------------------------------------------------------------------------
>
> Key: TINKERPOP-3269
> URL: https://issues.apache.org/jira/browse/TINKERPOP-3269
> Project: TinkerPop
> Issue Type: Bug
> Reporter: Lei Shu
> Priority: Major
>
> h3. TinkerPop version
> Originally observed on:
>
> {{Apache TinkerPop 3.7.0
> Gremlin Server with TinkerGraph
> Interface: WebSocket}}
> Please note that the issue should also be retested on a currently maintained
> release before triage.
> h3. Environment
> * Deployment: Docker
> * Image: {{tinkerpop/gremlin-server}}
> * Graph implementation: TinkerGraph
> * Query language: Gremlin-Groovy
> * Interface: Gremlin Server over WebSocket
> h3. Description
> Passing a predicate with a non-string value to {{where(P)}} causes an
> internal {{ClassCastException}} in {{{}WherePredicateStep.getSelectKey(){}}}.
> For example:
>
> {{g.inject(10).where(gt(5)).fold()}}
> fails with:
>
> {{java.lang.ClassCastException:
> class java.lang.Integer cannot be cast to class java.lang.String
> at WherePredicateStep.getSelectKey(...)}}
> {{where(P)}} uses the predicate value as the name of a path label, map key,
> or side-effect binding. Therefore, {{where(gt(5))}} is not the correct way to
> test whether the current scalar value is greater than {{{}5{}}}.
> The correct scalar-filtering form is:
>
> {{g.inject(10).is(gt(5)).fold()}}
> which returns:
>
> {{[10]}}
> The invalid traversal may reasonably be rejected, but it should produce a
> descriptive validation or argument error rather than exposing an internal
> Java type cast.
> h3. Minimal reproduction
>
> {{g.inject(10).where(gt(5)).fold()}}
> h3. Expected behavior
> The traversal should be rejected with a descriptive error explaining that the
> predicate value supplied to {{where(P)}} must identify a string scope key or
> variable binding.
> For example:
>
> {{where(P) requires the predicate value to be a String scope key;
> use is(P) to filter the current scalar value}}
> The exact wording is not important, but the engine should not expose an
> internal {{{}ClassCastException{}}}.
> h3. Actual behavior
> The traversal fails with an internal exception:
>
> {{ClassCastException: Integer cannot be cast to String
> at WherePredicateStep.getSelectKey(...)}}
> h3. Additional reproduction through {{values()}}
>
> {{g.V().drop().iterate()
> g.addV('X').property('v', 10).iterate()
> g.addV('X').property('v', 20).iterate()
> g.V().
> hasLabel('X').
> where(__.values('v').where(gt(5))).
> values('v').
> fold()}}
> Actual result:
>
> {{ClassCastException: Integer cannot be cast to String}}
> The equivalent valid traversal works:
>
> {{g.V().
> hasLabel('X').
> where(__.values('v').is(gt(5))).
> values('v').
> fold()}}
> Result:
>
> {{[10, 20]}}
> h3. Additional reproduction after {{select()}}
>
> {{g.V().
> hasLabel('X').
> as('x').
> where(
> __.select('x').
> values('v').
> where(gt(5))
> ).
> values('v').
> fold()}}
> Actual result:
>
> {{ClassCastException: Integer cannot be cast to String}}
> Valid form:
>
> {{g.V().
> hasLabel('X').
> as('x').
> where(
> __.select('x').
> values('v').
> is(gt(5))
> ).
> values('v').
> fold()}}
> Result:
>
> {{[10, 20]}}
> h3. Why this appears to be a bug
> The traversal itself uses the wrong step for scalar filtering:
>
> {{where(gt(5))}}
> instead of:
>
> {{is(gt(5))}}
> However, the invalid predicate reaches
> {{{}WherePredicateStep.getSelectKey(){}}}, where its integer value is cast
> directly to {{{}String{}}}.
> This exposes an internal implementation exception rather than reporting an
> invalid {{where(P)}} argument.
> The issue is therefore error validation and diagnostics, not incorrect
> filtering semantics. {{where(P)}} does not need to support numeric literal
> predicates, but it should reject them cleanly.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)