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 }"));
     }
 }

Reply via email to