Skip to content

Commit 7b2fd71

Browse files
Merge branch 'main' of github.com:BaseXdb/basex
2 parents b638698 + 819f1bd commit 7b2fd71

File tree

14 files changed

+65
-14
lines changed

14 files changed

+65
-14
lines changed

basex-core/src/main/java/org/basex/io/serial/json/JsonSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ protected void atomic(final Item item) throws IOException {
178178
if(type.oneOf(BasicType.DOUBLE, BasicType.FLOAT) || canonical && type.isNumber()) {
179179
final double d = item.dbl(null);
180180
if(Double.isFinite(d)) {
181-
out.print(Dbl.string(d));
181+
final byte[] s = Dbl.string(d);
182+
out.print(canonical && s == NEGATIVE_ZERO ? token(0) : s);
182183
} else {
183184
if(canonical) throw SERNUMBER_X.getIO(d);
184185
out.print(d == Double.POSITIVE_INFINITY ? JsonConstants.INF :

basex-core/src/main/java/org/basex/query/QueryContext.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,10 @@ public final class QueryContext extends Job implements Closeable {
153153
/**
154154
* Constructor.
155155
* @param parent parent context
156+
* @param nsContext inherited namespace context (can be {@code null})
156157
*/
157-
public QueryContext(final QueryContext parent) {
158-
this(parent.context, parent, parent.info);
158+
public QueryContext(final QueryContext parent, final NSDynContext nsContext) {
159+
this(parent.context, parent, nsContext, parent.info);
159160
parent.pushJob(this);
160161
updates = parent.updates;
161162
}
@@ -165,20 +166,22 @@ public QueryContext(final QueryContext parent) {
165166
* @param context database context
166167
*/
167168
public QueryContext(final Context context) {
168-
this(context, null, null);
169+
this(context, null, null, null);
169170
}
170171

171172
/**
172173
* Constructor.
173174
* @param context database context
174175
* @param parent parent context (can be {@code null})
176+
* @param nsContext inherited namespace context (can be {@code null})
175177
* @param info query info (can be {@code null})
176178
*/
177-
public QueryContext(final Context context, final QueryContext parent, final QueryInfo info) {
179+
public QueryContext(final Context context, final QueryContext parent,
180+
final NSDynContext nsContext, final QueryInfo info) {
178181
this.context = context;
179182
this.parent = parent;
180183
this.info = info != null ? info : new QueryInfo(context);
181-
ns = parent != null ? new NSDynContext(parent.ns) : new NSDynContext(null);
184+
ns = new NSDynContext(nsContext);
182185
resources = parent != null ? parent.resources : new QueryResources(this);
183186
ftPosData = parent != null ? parent.ftPosData : null;
184187
shared = parent != null ? parent.shared : new SharedData();

basex-core/src/main/java/org/basex/query/QueryProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public QueryProcessor(final String query, final Context ctx) {
5050
public QueryProcessor(final String query, final String uri, final Context ctx,
5151
final QueryInfo info) {
5252
this.query = query;
53-
qc = pushJob(new QueryContext(ctx, null, info));
53+
qc = pushJob(new QueryContext(ctx, null, null, info));
5454
sc = new StaticContext(qc);
5555
sc.baseURI(uri != null && uri.isEmpty() ? "./" : uri);
5656
}

basex-core/src/main/java/org/basex/query/func/fn/FnLoadXQueryModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public XQMap item(final QueryContext qc, final InputInfo ii) throws QueryExcepti
9191
if(!isSupported(version)) throw MODULE_XQUERY_VERSION_X.get(info, version);
9292
}
9393

94-
final QueryContext mqc = new QueryContext(qc);
94+
final QueryContext mqc = new QueryContext(qc, null);
9595
for(final byte[] uri : qc.modDeclared) mqc.modDeclared.put(uri, qc.modDeclared.get(uri));
9696
int nParsed = 0;
9797
final Value ctx = opt.get(CONTEXT_ITEM);

basex-core/src/main/java/org/basex/query/func/xquery/XQueryEval.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ final Value eval(final IOContent query, final boolean updating, final QueryConte
7575
if(!user.has(perm)) throw XQUERY_PERMREQUIRED_X.get(info, perm);
7676

7777
Timer to = null;
78-
try(QueryContext qctx = new QueryContext(qc)) {
78+
try(QueryContext qctx = new QueryContext(qc, null)) {
7979
qctx.user = new User(user).permission(perm);
8080

8181
// limit memory consumption: enforce garbage collection and calculate usage

basex-core/src/main/java/org/basex/query/func/xquery/XQueryTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ protected Value compute() {
4545
final int size = end - start;
4646
if(size == 1) {
4747
// perform the work
48-
try(QueryContext qc = new QueryContext(tc.qc)) {
48+
try(QueryContext qc = new QueryContext(tc.qc, tc.qc.ns)) {
4949
return tc.funcs.get(start).invoke(qc, tc.info);
5050
} catch(final QueryException ex) {
5151
if(tc.errors) {

basex-core/src/main/java/org/basex/query/value/item/Dbl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public static double parse(final byte[] value, final InputInfo info) throws Quer
168168
*/
169169
public static byte[] string(final double value) {
170170
// handle known edge cases
171-
if(value == 0) return Token.token(0);
171+
if(value == 0) return 1 / value > 0 ? Token.token(0) : Token.NEGATIVE_ZERO;
172172
if(value == Double.MIN_VALUE) return Token.token("5e-324");
173173
if(value == -Double.MIN_VALUE) return Token.token("-5e-324");
174174
if(value == 1e23) return Token.token("1e+23");

basex-core/src/test/java/org/basex/io/serial/json/BaseXSerializerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public final class BaseXSerializerTest extends SandboxTest {
2222
serialize("()", "");
2323
serialize("1", "1");
2424
serialize("1, 2", "1\n2");
25+
serialize("xs:double('-0'), xs:float('-0')", "-0\n-0");
2526

2627
// nodes
2728
serialize("<x/>", "<x/>");

basex-core/src/test/java/org/basex/io/serial/json/JsonSerializerTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public final class JsonSerializerTest extends SandboxTest {
2727
final JsonFormat format = JsonFormat.DIRECT;
2828
serialize("'x'", "'x'", format);
2929
serialize("1", "1", format);
30+
serialize("xs:double('-0')", "-0", format);
31+
serialize("xs:float('-0')", "-0", format);
3032
serialize("true()", "true", format);
3133
serialize("<_/>", "'<_\\/>'", format);
3234

@@ -64,6 +66,8 @@ public final class JsonSerializerTest extends SandboxTest {
6466
final JsonFormat format = JsonFormat.ATTRIBUTES;
6567
serialize("'x'", "'x'", format);
6668
serialize("1", "1", format);
69+
serialize("xs:double('-0')", "-0", format);
70+
serialize("xs:float('-0')", "-0", format);
6771
serialize("true()", "true", format);
6872
serialize("<_/>", "'<_\\/>'", format);
6973

@@ -116,6 +120,8 @@ public final class JsonSerializerTest extends SandboxTest {
116120
serialize("{ 'A': false() }", "{'A':false}", format);
117121
serialize("{ true(): false() }", "{'true':false}", format);
118122
serialize("{ 1: 'E' }", "{'1':'E'}", format);
123+
serialize("{ 0: xs:double('-0') }", "{'0':-0}", format);
124+
serialize("{ 0: xs:float('-0') }", "{'0':-0}", format);
119125

120126
serialize("{ 'A': 1 div 0.0e0 }", "{'A':1e9999}", format);
121127
serialize("{ 'A': -1 div 0.0e0 }", "{'A':-1e9999}", format);
@@ -129,6 +135,8 @@ public final class JsonSerializerTest extends SandboxTest {
129135
serialize("[ 2 ]", "[2]", format);
130136
serialize("[ 2, 3 ]", "[2,3]", format);
131137
serialize("[ 2, (), 4 ]", "[2,null,4]", format);
138+
serialize("[ xs:double('-0') ]", "[-0]", format);
139+
serialize("[ xs:float('-0') ]", "[-0]", format);
132140

133141
error("[ (1, 2) ]", format, SERJSONSEQ);
134142

@@ -146,7 +154,8 @@ public final class JsonSerializerTest extends SandboxTest {
146154
serialize("1", "1", format);
147155

148156
serialize("0.0e0", "0", format);
149-
serialize("-0.0e0", "0", format);
157+
serialize("-0.0e0", "-0", format);
158+
serialize("xs:float('-0')", "-0", format);
150159
serialize("1e-6", "0.000001", format);
151160
serialize("1e-7", "1e-7", format);
152161
serialize("1e20", "100000000000000000000", format);

basex-core/src/test/java/org/basex/query/SerializerTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public final class SerializerTest extends SandboxTest {
262262
query(option + "1234567890e0", "1.23456789e9");
263263
query(option + "xs:double('NaN')", "NaN");
264264
query(option + "xs:double('INF')", "INF");
265+
query(option + "xs:double('-0')", "-0.0e0");
265266
query(option + "xs:byte(1)", 1);
266267
query(option + "false()", "false()");
267268
query(option + "'A'", "\"A\"");
@@ -273,6 +274,7 @@ public final class SerializerTest extends SandboxTest {
273274
query(option + "true#0", "fn:true#0");
274275
query(option + "fn() {}", "fn() as empty-sequence() { () }");
275276
query(option + "xs:float(1)", "xs:float(\"1\")");
277+
query(option + "xs:float('-0')", "xs:float(\"-0\")");
276278

277279
query(option + "[]", "[]");
278280
query(option + "[ 1 ]", "[1]");
@@ -281,6 +283,7 @@ public final class SerializerTest extends SandboxTest {
281283
query(option + "[ 1234567890e0 ]", "[1.23456789e9]");
282284
query(option + "[ xs:double('NaN') ]", "[NaN]");
283285
query(option + "[ xs:double('INF') ]", "[INF]");
286+
query(option + "[ xs:double('-0') ]", "[-0.0e0]");
284287
query(option + "[ xs:byte(1) ]", "[1]");
285288
query(option + "[ false() ]", "[false()]");
286289
query(option + "[ 'A' ]", "[\"A\"]");
@@ -292,6 +295,7 @@ public final class SerializerTest extends SandboxTest {
292295
query(option + "[ true#0 ]", "[fn:true#0]");
293296
query(option + "[ fn() {} ]", "[fn() as empty-sequence() { () }]");
294297
query(option + "[ xs:float(1) ]", "[xs:float(\"1\")]");
298+
query(option + "[ xs:float('-0')]", "[xs:float(\"-0\")]");
295299

296300
query(option + "{ 1: (), 2: 3, 4: (5, 6) }", "{1:(),2:3,4:(5,6)}");
297301
}
@@ -305,6 +309,7 @@ public final class SerializerTest extends SandboxTest {
305309
query("1234567890e0", 1234567890);
306310
query("xs:double('NaN')", "NaN");
307311
query("xs:double('INF')", "INF");
312+
query("xs:double('-0')", "-0");
308313
query("xs:byte(1)", 1);
309314
query("false()", "false");
310315
query("'A'", "A");
@@ -316,6 +321,7 @@ public final class SerializerTest extends SandboxTest {
316321
query("true#0", "fn:true#0");
317322
query("fn() {}", "fn() as empty-sequence() { () }");
318323
query("xs:float(1)", 1);
324+
query("xs:float('-0')", "-0");
319325

320326
query("[]", "[]");
321327
query("[ 1 ]", "[1]");

0 commit comments

Comments
 (0)