Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions basex-core/src/main/java/org/basex/query/QueryContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,10 @@ public final class QueryContext extends Job implements Closeable {
/**
* Constructor.
* @param parent parent context
* @param nsContext inherited namespace context (can be {@code null})
*/
public QueryContext(final QueryContext parent) {
this(parent.context, parent, parent.info);
public QueryContext(final QueryContext parent, final NSDynContext nsContext) {
this(parent.context, parent, nsContext, parent.info);
parent.pushJob(this);
updates = parent.updates;
}
Expand All @@ -165,20 +166,22 @@ public QueryContext(final QueryContext parent) {
* @param context database context
*/
public QueryContext(final Context context) {
this(context, null, null);
this(context, null, null, null);
}

/**
* Constructor.
* @param context database context
* @param parent parent context (can be {@code null})
* @param nsContext inherited namespace context (can be {@code null})
* @param info query info (can be {@code null})
*/
public QueryContext(final Context context, final QueryContext parent, final QueryInfo info) {
public QueryContext(final Context context, final QueryContext parent,
final NSDynContext nsContext, final QueryInfo info) {
this.context = context;
this.parent = parent;
this.info = info != null ? info : new QueryInfo(context);
ns = parent != null ? new NSDynContext(parent.ns) : new NSDynContext(null);
ns = new NSDynContext(nsContext);
resources = parent != null ? parent.resources : new QueryResources(this);
ftPosData = parent != null ? parent.ftPosData : null;
shared = parent != null ? parent.shared : new SharedData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public QueryProcessor(final String query, final Context ctx) {
public QueryProcessor(final String query, final String uri, final Context ctx,
final QueryInfo info) {
this.query = query;
qc = pushJob(new QueryContext(ctx, null, info));
qc = pushJob(new QueryContext(ctx, null, null, info));
sc = new StaticContext(qc);
sc.baseURI(uri != null && uri.isEmpty() ? "./" : uri);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public XQMap item(final QueryContext qc, final InputInfo ii) throws QueryExcepti
if(!isSupported(version)) throw MODULE_XQUERY_VERSION_X.get(info, version);
}

final QueryContext mqc = new QueryContext(qc);
final QueryContext mqc = new QueryContext(qc, null);
for(final byte[] uri : qc.modDeclared) mqc.modDeclared.put(uri, qc.modDeclared.get(uri));
int nParsed = 0;
final Value ctx = opt.get(CONTEXT_ITEM);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ final Value eval(final IOContent query, final boolean updating, final QueryConte
if(!user.has(perm)) throw XQUERY_PERMREQUIRED_X.get(info, perm);

Timer to = null;
try(QueryContext qctx = new QueryContext(qc)) {
try(QueryContext qctx = new QueryContext(qc, null)) {
qctx.user = new User(user).permission(perm);

// limit memory consumption: enforce garbage collection and calculate usage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ protected Value compute() {
final int size = end - start;
if(size == 1) {
// perform the work
try(QueryContext qc = new QueryContext(tc.qc)) {
try(QueryContext qc = new QueryContext(tc.qc, tc.qc.ns)) {
return tc.funcs.get(start).invoke(qc, tc.info);
} catch(final QueryException ex) {
if(tc.errors) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2003,6 +2003,13 @@ public final class FnModuleTest extends SandboxTest {
query(func.args("x", " { 'content': 'module namespace x=\"x\";\ndeclare variable $x:x := 1;', "
+ "'xquery-version': 4.0 }") + "?variables?#Q{x}x", 1);

// GH-2640
error("<e xmlns:p='p'>{\n"
+ " load-xquery-module(\"m\", {\n"
+ " 'content': ``[module namespace m='m'; declare function m:f() {<p:x/>};]``\n"
+ " })?functions?#Q{m}f?0()\n"
+ "}</e>", MODULE_STATIC_ERROR_X_X);

error(func.args(""), MODULE_URI_EMPTY);
error(func.args("x"), MODULE_NOT_FOUND_X);
error(func.args("x", " { 'content': '%@?$' }"), MODULE_STATIC_ERROR_X_X);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ public final class XQueryModuleTest extends SandboxTest {
// GH-2332
query("try {" + func.args("declare function local:f() { local:f() }; local:f()") +
"} catch xquery:error { 'STOP' }", "STOP");

// GH-2640
query("element e { attribute { QName('', 'a') } {}, " + func.args("true()") + " }",
"<e a=\"\">true</e>");
query("<e xmlns:p='p'\n"
+ " p:a='{\n"
+ " map:keys(in-scope-namespaces(<x/>))\n"
+ " }'\n"
+ " p:b='{xquery:eval('\n"
+ " map:keys(in-scope-namespaces(<x/>))\n"
+ " ')}'/>", "<e xmlns:p=\"p\" p:a=\"p xml\" p:b=\"xml\"/>");
}

/** Test method. */
Expand Down Expand Up @@ -183,6 +194,15 @@ public final class XQueryModuleTest extends SandboxTest {
+ " }")
+ "=> distinct-values()", "a b c d e");

// GH-2640: fork-join inherits parent dynamic namespace context
query("<e xmlns:p='p'\n"
+ " p:a='{\n"
+ " " + func.args(" \n"
+ " (1 to 100) ! fn() {map:keys(in-scope-namespaces(<x/>))}\n"
+ " ") + "[. = 'p'] => count()\n"
+ " }'\n"
+ "/>", "<e xmlns:p=\"p\" p:a=\"100\"/>");

// optimizations
check(func.args(" ()"), "", empty());
check(func.args(" false#0"), false, root(DynFuncCall.class));
Expand Down
Loading