Skip to content

Commit 88825ee

Browse files
committedJan 25, 2014
[FIX] XQuery: check nested transform expressions for inconsistencies
1 parent c2533bc commit 88825ee

File tree

14 files changed

+37
-42
lines changed

14 files changed

+37
-42
lines changed
 

‎basex-core/src/main/java/org/basex/query/expr/Arr.java

+5-13
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected Arr(final InputInfo ii, final Expr... e) {
3131

3232
@Override
3333
public void checkUp() throws QueryException {
34-
checkNoUp();
34+
checkNoneUp(expr);
3535
}
3636

3737
@Override
@@ -59,8 +59,8 @@ public VarUsage count(final Var v) {
5959
}
6060

6161
@Override
62-
public Expr inline(final QueryContext ctx, final VarScope scp,
63-
final Var v, final Expr e) throws QueryException {
62+
public Expr inline(final QueryContext ctx, final VarScope scp, final Var v, final Expr e)
63+
throws QueryException {
6464
return inlineAll(ctx, scp, expr, v, e) ? optimize(ctx, scp) : null;
6565
}
6666

@@ -74,8 +74,8 @@ public Expr inline(final QueryContext ctx, final VarScope scp,
7474
* @return deep copy of the array
7575
*/
7676
@SuppressWarnings("unchecked")
77-
public static <T extends Expr> T[] copyAll(final QueryContext ctx,
78-
final VarScope scp, final IntObjMap<Var> vs, final T[] arr) {
77+
public static <T extends Expr> T[] copyAll(final QueryContext ctx, final VarScope scp,
78+
final IntObjMap<Var> vs, final T[] arr) {
7979
final T[] copy = arr.clone();
8080
for(int i = 0; i < copy.length; i++) copy[i] = (T) copy[i].copy(ctx, scp, vs);
8181
return copy;
@@ -106,14 +106,6 @@ final boolean oneIsEmpty() {
106106
return false;
107107
}
108108

109-
/**
110-
* Checks if none of the expressions are updating expressions.
111-
* @throws QueryException query exception
112-
*/
113-
final void checkNoUp() throws QueryException {
114-
checkNoneUp(expr);
115-
}
116-
117109
@Override
118110
public void plan(final FElem plan) {
119111
addPlan(plan, planElem(), expr);

‎basex-core/src/main/java/org/basex/query/expr/CComm.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* @author BaseX Team 2005-13, BSD License
1818
* @author Christian Gruen
1919
*/
20-
public final class CComm extends CFrag {
20+
public final class CComm extends CNode {
2121
/**
2222
* Constructor.
2323
* @param sctx static context

‎basex-core/src/main/java/org/basex/query/expr/CDoc.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* @author BaseX Team 2005-13, BSD License
1717
* @author Christian Gruen
1818
*/
19-
public final class CDoc extends CFrag {
19+
public final class CDoc extends CNode {
2020
/**
2121
* Constructor.
2222
* @param sctx static context

‎basex-core/src/main/java/org/basex/query/expr/CName.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* @author BaseX Team 2005-13, BSD License
1818
* @author Christian Gruen
1919
*/
20-
public abstract class CName extends CFrag {
20+
public abstract class CName extends CNode {
2121
/** Description. */
2222
private final String desc;
2323
/** QName. */

‎basex-core/src/main/java/org/basex/query/expr/CFrag.java ‎basex-core/src/main/java/org/basex/query/expr/CNode.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
import org.basex.util.*;
88

99
/**
10-
* Fragment constructor.
10+
* Node constructor.
1111
*
1212
* @author BaseX Team 2005-13, BSD License
1313
* @author Christian Gruen
1414
*/
15-
public abstract class CFrag extends Arr {
15+
public abstract class CNode extends Arr {
1616
/** Static context. */
1717
final StaticContext sc;
1818
/**
@@ -21,7 +21,7 @@ public abstract class CFrag extends Arr {
2121
* @param ii input info
2222
* @param n name
2323
*/
24-
CFrag(final StaticContext sctx, final InputInfo ii, final Expr... n) {
24+
CNode(final StaticContext sctx, final InputInfo ii, final Expr... n) {
2525
super(ii, n);
2626
sc = sctx;
2727
size = 1;

‎basex-core/src/main/java/org/basex/query/expr/CTxt.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* @author BaseX Team 2005-13, BSD License
1818
* @author Christian Gruen
1919
*/
20-
public final class CTxt extends CFrag {
20+
public final class CTxt extends CNode {
2121
/**
2222
* Constructor.
2323
* @param sctx static context

‎basex-core/src/main/java/org/basex/query/expr/Catch.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ public Expr copy(final QueryContext ctx, final VarScope scp, final IntObjMap<Var
9393
}
9494

9595
@Override
96-
public Catch inline(final QueryContext ctx, final VarScope scp, final Var v,
97-
final Expr e) {
96+
public Catch inline(final QueryContext ctx, final VarScope scp, final Var v, final Expr e) {
9897
try {
9998
final Expr sub = expr.inline(ctx, scp, v, e);
10099
if(sub == null) return null;

‎basex-core/src/main/java/org/basex/query/expr/ParseExpr.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -153,26 +153,32 @@ protected static Expr compBln(final Expr e, final InputInfo ii) {
153153
/**
154154
* Ensures that the specified expression performs no updates.
155155
* Otherwise, throws an exception.
156-
* @param e expression (may be {@code null})
156+
* @param expr expression (may be {@code null})
157157
* @throws QueryException query exception
158158
*/
159-
protected void checkNoUp(final Expr e) throws QueryException {
160-
if(e != null && e.has(Flag.UPD)) throw UPNOT.get(info, description());
159+
protected void checkNoUp(final Expr expr) throws QueryException {
160+
if(expr == null) return;
161+
expr.checkUp();
162+
if(expr.has(Flag.UPD)) throw UPNOT.get(info, description());
161163
}
162164

163165
/**
164166
* Ensures that none of the specified expressions performs an update.
165167
* Otherwise, throws an exception.
166-
* @param expr expressions (may contain {@code null} references)
168+
* @param expr expressions (may be {@code null}, and may contain {@code null} references)
167169
* @throws QueryException query exception
168170
*/
169171
protected final void checkNoneUp(final Expr... expr) throws QueryException {
170-
if(expr != null) for(final Expr e : expr) checkNoUp(e);
172+
if(expr == null) return;
173+
checkAllUp(expr);
174+
for(final Expr e : expr) {
175+
if(e != null && e.has(Flag.UPD)) throw UPNOT.get(info, description());
176+
}
171177
}
172178

173179
/**
174-
* Ensures that all specified expressions are either updating and vacuous or
175-
* non-updating. Otherwise, throws an exception.
180+
* Ensures that all specified expressions are vacuous or either updating or non-updating.
181+
* Otherwise, throws an exception.
176182
* @param expr expressions to be checked
177183
* @throws QueryException query exception
178184
*/

‎basex-core/src/main/java/org/basex/query/expr/Single.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public VarUsage count(final Var v) {
5353
}
5454

5555
@Override
56-
public Expr inline(final QueryContext ctx, final VarScope scp,
57-
final Var v, final Expr e) throws QueryException {
56+
public Expr inline(final QueryContext ctx, final VarScope scp, final Var v, final Expr e)
57+
throws QueryException {
5858
final Expr sub = expr.inline(ctx, scp, v, e);
5959
if(sub == null) return null;
6060
expr = sub;

‎basex-core/src/main/java/org/basex/query/expr/Try.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public Try(final InputInfo ii, final Expr t, final Catch[] c) {
3333

3434
@Override
3535
public void checkUp() throws QueryException {
36-
// check if none or all try/catch expressions are updating
36+
// check if no or all try/catch expressions are updating
3737
final Expr[] tmp = new Expr[ctch.length + 1];
3838
tmp[0] = expr;
3939
for(int c = 0; c < ctch.length; ++c) tmp[c + 1] = ctch[c].expr;

‎basex-core/src/main/java/org/basex/query/gflwor/OrderBy.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,15 @@ public VarUsage count(final Var v) {
167167
}
168168

169169
@Override
170-
public GFLWOR.Clause inline(final QueryContext ctx, final VarScope scp,
171-
final Var v, final Expr e) throws QueryException {
170+
public GFLWOR.Clause inline(final QueryContext ctx, final VarScope scp, final Var v,
171+
final Expr e) throws QueryException {
172172
for(int i = refs.length; --i >= 0;)
173173
if(v.is(refs[i].var)) refs = Array.delete(refs, i);
174174
return inlineAll(ctx, scp, keys, v, e) ? optimize(ctx, scp) : null;
175175
}
176176

177177
@Override
178-
public OrderBy copy(final QueryContext ctx, final VarScope scp,
179-
final IntObjMap<Var> vs) {
178+
public OrderBy copy(final QueryContext ctx, final VarScope scp, final IntObjMap<Var> vs) {
180179
return new OrderBy(Arr.copyAll(ctx, scp, vs, refs),
181180
Arr.copyAll(ctx, scp, vs, keys), info);
182181
}

‎basex-core/src/main/java/org/basex/query/up/expr/Rename.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public Item item(final QueryContext ctx, final InputInfo ii) throws QueryExcepti
4444
if(i == null) throw UPSEQEMP.get(info, Util.className(this));
4545
if(t.next() != null) throw UPWRTRGTYP.get(info);
4646

47-
final CFrag ex;
47+
final CNode ex;
4848
if(i.type == NodeType.ELM) {
4949
ex = new CElem(sc, info, expr[1], null);
5050
} else if(i.type == NodeType.ATT) {

‎basex-core/src/test/java/org/basex/query/up/UpdateTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,10 @@ public void evalFItem() {
11021102
public void modifyCheck() {
11031103
error("copy $c:= <a>X</a> modify 'a' return $c", Err.UPMODIFY);
11041104
error("copy $c:= <a>X</a> modify(delete node $c/text(),'a') return $c", Err.UPALL);
1105+
1106+
error("text { <a/> update (delete node <a/>,<b/>) }", Err.UPALL);
1107+
error("1[<a/> update (delete node <a/>,<b/>)]", Err.UPALL);
1108+
error("for $i in 1 order by (<a/> update (delete node <a/>,<b/>)) return $i", Err.UPALL);
11051109
}
11061110

11071111
/** Tests adding an attribute and thus crossing the {@link IO#MAXATTS} line (GH-752). */

‎pom.xml

-5
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,6 @@
124124
<artifactId>commons-fileupload</artifactId>
125125
<version>1.2.2</version>
126126
</dependency>
127-
<dependency>
128-
<groupId>org.slf4j</groupId>
129-
<artifactId>slf4j-nop</artifactId>
130-
<version>1.7.5</version>
131-
</dependency>
132127
<dependency>
133128
<groupId>com.vividsolutions</groupId>
134129
<artifactId>jts</artifactId>

0 commit comments

Comments
 (0)
Please sign in to comment.