Merge pull request #774 from afs/jena1935-subquery

JENA-1935: No prologue for subquery
diff --git a/jena-arq/src/main/java/org/apache/jena/query/Query.java b/jena-arq/src/main/java/org/apache/jena/query/Query.java
index 933b85b..d9b4029 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/Query.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/Query.java
@@ -127,7 +127,10 @@
     public Query(Prologue prologue)
     {
         this() ;
-        usePrologueFrom(prologue) ;
+        Prologue p2 = prologue.copy();
+        prefixMap = p2.getPrefixMapping();
+        seenBaseURI = false ;
+        resolver = p2.getResolver();
     }
 
     // Allocate variables that are unique to this query.
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
index 7f80b76..2f405e4 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
@@ -34,7 +34,7 @@
     
     @Override
     public NodeValue evalSpecial(Binding binding, FunctionEnv env) { 
-        // See alse ExprLib.evalOrNull.
+        // See also ExprLib.evalOrNull.
         // This code predates that; it handles exceptions 
         // slightly differently (VariableNotBoundException not
         // a general ExprEvalException).
@@ -50,7 +50,7 @@
             return NodeValue.booleanReturn(binding.contains(expr.asVar())) ; 
         
         // General expression. This case can't be written in SPARQL
-        // but we keep the code general in case some optimziation rewrite
+        // but we keep the code general in case some optimization rewrite
         // or algebra expression uses the generalized feature.
 		try {
 			expr.eval(binding, env) ;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
index 47ef0ad..13f62fb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
@@ -226,9 +226,11 @@
     
     protected Query newSubQuery(Prologue progloue)
     {
-        return new Query(getPrologue());
+        // The parser uses the same prologue throughout the parsing process.
+        // For printing purposes, the subquery must not have a prologue of its own.
+        return new Query();
     }
-    
+
     protected void popQuery()
     {
         query = stack.pop();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/serializer/FormatterElement.java b/jena-arq/src/main/java/org/apache/jena/sparql/serializer/FormatterElement.java
index ac68e43..4715d73 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/serializer/FormatterElement.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/serializer/FormatterElement.java
@@ -433,7 +433,7 @@
         out.incIndent(INDENT);
         Query q = el.getQuery();
 
-        // Serialize with respect to the existing context
+        // Serialize with respect to the existing context.
         QuerySerializerFactory factory = SerializerRegistry.get().getQuerySerializerFactory(Syntax.syntaxARQ);
         QueryVisitor serializer = factory.create(Syntax.syntaxARQ, context, out);
         q.visit(serializer);
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
index 6afb894..bc97ac6 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
@@ -79,7 +79,7 @@
         if (q2.getOrderBy() != null) {
             mutateSortConditions(q2.getOrderBy(), exprTransform);
         }
-        
+
         Element el = q2.getQueryPattern();
 
         // Explicit null check to prevent warning in ElementTransformer
@@ -184,7 +184,6 @@
         return varExprList2;
     }
 
-
     static class QueryShallowCopy implements QueryVisitor {
         final Query newQuery = new Query();
 
@@ -334,5 +333,4 @@
         Query q2 = copy.newQuery;
         return q2;
     }
-
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestQueryCloningEssentials.java b/jena-arq/src/test/java/org/apache/jena/query/TestQueryCloningEssentials.java
index 07d6bb5..b028613 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestQueryCloningEssentials.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestQueryCloningEssentials.java
@@ -46,15 +46,20 @@
     /**
      * Assert whether cloning using the old print-parse approach
      * yields the same result as the one using the syntax transform
-     * machinery
+     * machinery.
      *
      * @param query
      */
     public static Query checkedClone(Query query) {
         Query expected = slowClone(query);
         Query actual = query.cloneQuery();
-
+        Assert.assertEquals(query, actual);
         Assert.assertEquals(expected, actual);
+
+        // Check that the cloned query is OK. 
+        Query again = slowClone(actual);
+        Assert.assertEquals(query, again);
+        
         return actual;
     }