[ 
https://issues.apache.org/jira/browse/TINKERPOP-3272?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stephen Mallette updated TINKERPOP-3272:
----------------------------------------
          Component/s: process
    Affects Version/s: 3.7.6
             Priority: Minor  (was: Major)

I don't think there is much point making updates to the {{match()}} step - it 
is being entirely redeveloped for 4.0 to be a much more useful step.

> Labeled `or()`/`and()` pattern inside `match()` causes unhandled 
> IndexOutOfBoundsException
> ------------------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-3272
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3272
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: process
>    Affects Versions: 3.7.6
>            Reporter: Lei Shu
>            Priority: Minor
>
> ### Environment
> - TinkerPop 3.7.0 — Docker `tinkerpop/gremlin-server:3.7.0`
> - TinkerPop 3.8.1 — Docker `tinkerpop/gremlin-server:latest`
> - Query interface: WebSocket Gremlin protocol
>  
> Both versions reproduce.
>  
> ### Description
> Placing a labeled `or()` or `and()` connective step inside a `match()` 
> pattern triggers an unhandled `IndexOutOfBoundsException` in 
> `InlineFilterStrategy`. The `.as()` label on the outer connective causes 
> `MatchStep$Helper.computeStartLabel` to access an empty list during strategy 
> application.
>  
> ### To Reproduce
>  
> ```groovy
> g.V().drop()
> g.addV('A').property('id',1).as('a').addV('B').property('id',2).addE('R').from('a').iterate()
> g.addV('A').property('id',3).as('a').addV('B').property('id',4).addE('R').from('a').iterate()
>  
> // Crash: or() inside match() with .as('b')
> g.V().match(
>   __.as('a').hasLabel('A'),
>   __.or(
>     __.as('a').out('R').has('id',2),
>     __.as('a').out('R').has('id',4)
>   ).as('b')
> ).select('a','b').by('id').fold()
>  
> // Also crashes: and() inside match() with .as()
> g.V().match(
>   __.as('a').hasLabel('A'),
>   __.and(
>     __.as('a').out('R'),
>     __.as('a').out('R')
>   ).as('b')
> ).select('a','b').by('id').fold()
> ```
>  
> ### Expected
> The optimizer should either handle the pattern correctly or produce a 
> descriptive traversal-validation error rather than an internal 
> `IndexOutOfBoundsException`.
>  
> ### Actual behavior
>  
> ```
> java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
>   at MatchStep$Helper.computeStartLabel(MatchStep.java:701)
>   at InlineFilterStrategy.processMatchStep(InlineFilterStrategy.java:294)
> ```
>  
> ### Workaround
> Place `.as('b')` inside each `or()` branch:
>  
> ```groovy
> g.V().match(
>   __.as('a').hasLabel('A'),
>   __.or(
>     __.as('a').out('R').has('id',2).as('b'),
>     __.as('a').out('R').has('id',4).as('b')
>   )
> ).select('a','b').by('id').fold()
> ```
>  
> Alternatively, move the connective into a `where()` after `match()`.
>  
> ### Trigger matrix
>  
> | Pattern | Result |
> |---------|--------|
> | `match(__.as('a').hasLabel('A'), __.as('a').out('R').as('b'))` | OK |
> | `match(..., __.or(...,...).as('b'))` | CRASH |
> | `match(..., __.and(...,...).as('b'))` | CRASH |
> | `or()` standalone (no match) | OK |
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to