Merge pull request #1127 from afs/xloader

Xloader (more)
diff --git a/apache-jena/bin/tdb2.xloader b/apache-jena/bin/tdb2.xloader
index 2c23e62..bfd304c 100755
--- a/apache-jena/bin/tdb2.xloader
+++ b/apache-jena/bin/tdb2.xloader
@@ -132,7 +132,7 @@
 Usage: ${TDB_CMD} --loc <Directory> [--tmpdir=DIR] FILE ...
 
 Bulk loader for TDB2.
-See https://jena.apache/org/documentation/tdb/tdb-xloader.html
+See https://jena.apache.org/documentation/tdb/tdb-xloader.html
 
 Environment variables:
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java b/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
index 1febb92..bc2e5e2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
@@ -36,6 +36,7 @@
 import org.apache.jena.sparql.algebra.OpAsQuery ;
 import org.apache.jena.sparql.algebra.op.OpService ;
 import org.apache.jena.sparql.engine.QueryIterator ;
+import org.apache.jena.sparql.engine.Rename;
 import org.apache.jena.sparql.engine.http.HttpParams;
 import org.apache.jena.sparql.engine.http.QueryExceptionHTTP;
 import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper;
@@ -124,8 +125,23 @@
                 query.setQueryPattern(el);
                 query.setResultVars();
             }
-        } else
-            query = OpAsQuery.asQuery(opRemote);
+        } else {
+            // This relies on the observation that the query was originally correct,
+            // so reversing the scope renaming is safe (it merely restores the
+            // algebra expression).
+            //
+            // Any variables that reappear should be internal ones that were hidden
+            // by renaming in the first place.
+            //
+            // Any substitution is also safe because it replaces variables by
+            // values.
+            //
+            // It is safer to rename/unrename than skipping SERVICE during rename
+            // to avoid substituting hidden variables.
+
+            Op opRestored = Rename.reverseVarRename(opRemote, true);
+            query = OpAsQuery.asQuery(opRestored);
+        }
 
         // -- Setup
         //boolean withCompression = context.isTrueOrUndef(httpQueryCompression);
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
index d0209b3..34e2f06 100644
--- a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
@@ -436,6 +436,14 @@
         }
     }
 
+    // JENA-2207
+    // The inner query involves a rename of variables ?p ?o. This should be undone by Service.exec.
+    @Test public void service_query_nested_select_1() {
+        String innerQuery = "SELECT ?s { ?s ?p ?o }";
+        String queryString = "ASK { SERVICE <"+SERVICE+ "> { "+innerQuery+" } }";
+        QueryExec.dataset(localDataset()).query(queryString).ask();
+    }
+
     private static void runWithModifier(String key, HttpRequestModifier modifier, Runnable action) {
         RegistryRequestModifier.get().add(SERVICE, modifier);
         try {
diff --git a/pom.xml b/pom.xml
index d47c456..118848d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,7 @@
     <ver.junit>4.13.2</ver.junit>  
 
     <ver.slf4j>1.7.32</ver.slf4j>
-    <ver.log4j2>2.14.1</ver.log4j2>
+    <ver.log4j2>2.15.0</ver.log4j2>
     <ver.shade-plugin>3.2.4</ver.shade-plugin>
 
     <ver.jetty>10.0.7</ver.jetty>