zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #21741
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
Paul J. Lucas has proposed merging lp:~zorba-coders/zorba/bug-1083006 into lp:zorba.
Commit message:
Fixed for large sequences.
Requested reviews:
Paul J. Lucas (paul-lucas)
Related bugs:
Bug #1083006 in Zorba: "subsequence: large input values"
https://bugs.launchpad.net/zorba/+bug/1083006
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/bug-1083006/+merge/162983
Fixed for large sequences.
--
https://code.launchpad.net/~zorba-coders/zorba/bug-1083006/+merge/162983
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/runtime/sequences/sequences_impl.cpp'
--- src/runtime/sequences/sequences_impl.cpp 2013-05-01 23:06:33 +0000
+++ src/runtime/sequences/sequences_impl.cpp 2013-05-08 14:17:27 +0000
@@ -470,9 +470,8 @@
bool FnSubsequenceIterator::nextImpl(store::Item_t& result, PlanState& planState) const
{
- store::Item_t startPosItem;
+ store::Item_t item;
xs_long startPos;
- store::Item_t lengthItem;
xs_double startPosDouble;
xs_double lengthDouble;
@@ -481,8 +480,8 @@
state->theIsChildReset = false;
- CONSUME(startPosItem, 1);
- startPosDouble = startPosItem->getDoubleValue();
+ CONSUME(item, 1);
+ startPosDouble = item->getDoubleValue();
//If starting position is set to +INF return empty sequence
if (startPosDouble.isPosInf() || startPosDouble.isNaN())
@@ -494,26 +493,37 @@
if (theChildren.size() == 3)
{
- CONSUME(lengthItem, 2);
- lengthDouble = lengthItem->getDoubleValue();
- if (lengthDouble.isPosInf())
- {
- //if startPos is -INF and length is +INF return empty sequence because -INF + INF = NaN
- if (startPosDouble.isNegInf())
+ CONSUME(item, 2);
+ lengthDouble = item->getDoubleValue();
+ if ( lengthDouble.isPosInf() ) {
+ if ( startPosDouble.isNegInf() ) {
+ //
+ // XQuery F&0 3.0 14.1.9: ... if $startingLoc is -INF and $length is
+ // +INF, then fn:round($startingLoc) + fn:round($length) is NaN; since
+ // position() lt NaN is always false, the result is an empty sequence.
+ //
goto done;
+ }
state->theRemaining = 1;
}
else
+ {
state->theRemaining =
static_cast<xs_long>(lengthDouble.round().getNumber());
+ if ( state->theRemaining < 0 && lengthDouble > 0 ) {
+ // overflow happened
+ state->theRemaining = numeric_limits<xs_long>::max();
+ }
+ }
}
if (startPos < 1)
{
- if (theChildren.size() >= 3)
+ if ( theChildren.size() == 3 &&
+ state->theRemaining != numeric_limits<xs_long>::max() ) {
state->theRemaining += startPos - 1;
-
+ }
startPos = 0;
}
Follow ups
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: noreply, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Paul J. Lucas, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
Re: [Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Matthias Brantner, 2013-05-08
-
Re: [Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Matthias Brantner, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
Re: [Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Zorba Build Bot, 2013-05-08
-
[Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Paul J. Lucas, 2013-05-08
-
Re: [Merge] lp:~zorba-coders/zorba/bug-1083006 into lp:zorba
From: Paul J. Lucas, 2013-05-08