This is an automated email from the ASF dual-hosted git repository. afs pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit f53338005c36b5c6d7b81da807cdbd252c9e3a2d Author: Andy Seaborne <[email protected]> AuthorDate: Tue Oct 6 12:59:10 2026 +0100 GH-4308: Trailing VALUES happens before SELECT expression --- .../jena/sparql/algebra/AlgebraGenerator.java | 25 +++++++++++----------- .../apache/jena/sparql/lang/SyntaxVarScope.java | 6 ++++++ .../org/apache/jena/sparql/lang/TestVarScope.java | 8 ++++--- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java index 00c9681719..b155808942 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java @@ -506,7 +506,8 @@ public class AlgebraGenerator op = OpGroup.create(op, query.getGroupBy(), query.getAggregators()); } - // ---- Assignments from SELECT and other places (so available to ORDER and + // ---- Assignments from SELECT and other places + // (so available to ORDER and // HAVING) // Now do assignments from expressions // Must be after "group by" has introduced it's variables. @@ -529,8 +530,17 @@ public class AlgebraGenerator } } - // ---- Assignments from SELECT and other places (so available to ORDER and - // HAVING) + // ---- VALUES + if ( query.hasValues() ) { + Table table = TableFactory.create(query.getValuesVariables()); + for ( Binding binding : query.getValuesData() ) + table.addBinding(binding); + OpTable opTable = OpTable.create(table); + op = OpJoin.create(op, opTable); + } + + // ---- Assignments from SELECT and other places + // (so available to ORDER and HAVING) for ( Var v : exprs.getVars() ) { Expr e = exprs.getExpr(v); op = OpExtend.create(op, v, e); @@ -544,15 +554,6 @@ public class AlgebraGenerator op = OpFilter.filter(expr2, op); } } - // ---- VALUES - if ( query.hasValues() ) { - Table table = TableFactory.create(query.getValuesVariables()); - for ( Binding binding : query.getValuesData() ) - table.addBinding(binding); - OpTable opTable = OpTable.create(table); - op = OpJoin.create(op, opTable); - } - // ---- ToList if ( context.isTrue(ARQ.generateToList) ) // Listify it. diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java index 9d263763a7..7bdbc0f869 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java @@ -147,6 +147,12 @@ public class SyntaxVarScope { VarExprList groupKey = query.getGroupBy(); // Mutated so copy. List<Var> inScopeVars = new ArrayList<>(groupKey.getVars()); + // and trailing VALUES + if ( query.hasValues() ) { + List<Var> x = query.getValuesVariables(); + inScopeVars.addAll(x); + } + VarExprList exprList = query.getProject(); // Look in the SELECT expressions diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/lang/TestVarScope.java b/jena-arq/src/test/java/org/apache/jena/sparql/lang/TestVarScope.java index d7ae2d875b..c8e2c8dd30 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/lang/TestVarScope.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/lang/TestVarScope.java @@ -155,7 +155,7 @@ public class TestVarScope @Test public void scope_66() { assertThrows(QueryException.class, - ()-> scope("SELECT ( (?x+1) AS ?y) (2 AS ?x) {}")); + ()->scope("SELECT ( (?x+1) AS ?y) (2 AS ?x) {}")); } // GH-3164 @@ -165,10 +165,12 @@ public class TestVarScope GROUP BY ?s VALUES ?min { 2 5 } """; - scope(qsVarScope); + assertThrows(QueryException.class, + ()->scope(qsVarScope)); } @Test public void scope_71() { - scope("SELECT (MIN(?v) as ?min) WHERE {} VALUES ?min { 2 5 }"); + assertThrows(QueryException.class, + ()->scope("SELECT (MIN(?v) as ?min) WHERE {} VALUES ?min { 2 5 }")); } }
