zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #01225
[Merge] lp:~zorba-coders/zorba/markos1 into lp:zorba
Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos1 into lp:zorba.
Requested reviews:
Matthias Brantner (matthias-brantner)
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/markos1/+merge/79746
Memory optimization: udf-call iterator deallocates the udf plan state immediately after it gets the last result from the udf. Do this for recursive functions only.
--
https://code.launchpad.net/~zorba-coders/zorba/markos1/+merge/79746
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/functions/udf.cpp'
--- src/functions/udf.cpp 2011-10-18 17:37:41 +0000
+++ src/functions/udf.cpp 2011-10-18 22:55:31 +0000
@@ -318,7 +318,7 @@
/*******************************************************************************
********************************************************************************/
- PlanIter_t user_function::getPlan(CompilerCB* ccb, uint32_t& planStateSize)
+PlanIter_t user_function::getPlan(CompilerCB* ccb, uint32_t& planStateSize)
{
if (thePlan == NULL)
{
@@ -353,7 +353,7 @@
ulong nextVarId = 1;
const store::Item* lName = getName();
- //lName may be null of inlined functions
+ //lName may be null for inlined functions
thePlan = zorba::codegen((lName == 0 ?
"inline function" :
lName->getStringValue().c_str()),
=== modified file 'src/runtime/core/fncall_iterator.cpp'
--- src/runtime/core/fncall_iterator.cpp 2011-10-18 17:37:41 +0000
+++ src/runtime/core/fncall_iterator.cpp 2011-10-18 22:55:31 +0000
@@ -121,7 +121,11 @@
{
thePlan = udf->getPlan(planState.theCompilerCB, thePlanStateSize).getp();
- thePlanStateSize = thePlan->getStateSizeOfSubtree();
+ if (thePlanStateSize == 0)
+ {
+ thePlanStateSize = thePlan->getStateSizeOfSubtree();
+ udf->setPlaneStateSize(thePlanStateSize);
+ }
// Must allocate new dctx, as child of the "current" dctx, because the udf
// may be a recursive udf with local block vars, all of which have the same
@@ -149,7 +153,27 @@
{
PlanIteratorState::reset(planState);
- if (thePlanOpen)
+ if (!thePlanOpen)
+ {
+ if (theLocalDCtx == NULL)
+ theLocalDCtx = new dynamic_context(planState.theGlobalDynCtx);
+
+ if (thePlanState == NULL)
+ {
+ thePlanState = new PlanState(planState.theGlobalDynCtx,
+ theLocalDCtx,
+ thePlanStateSize,
+ planState.theStackDepth + 1,
+ planState.theMaxStackDepth);
+
+ thePlanState->theCompilerCB = planState.theCompilerCB;
+#ifdef ZORBA_WITH_DEBUGGER
+ thePlanState->theDebuggerCommons = planState.theDebuggerCommons;
+#endif
+ thePlanState->theQuery = planState.theQuery;
+ }
+ }
+ else
{
thePlan->reset(*thePlanState);
}
@@ -363,6 +387,19 @@
DEBUGGER_POP_FRAME;
#endif
+ if (!theIsDynamic && theUDF->isRecursive())
+ {
+ state->thePlan->close(*state->thePlanState);
+
+ delete state->thePlanState;
+ state->thePlanState = NULL;
+
+ delete state->theLocalDCtx;
+ state->theLocalDCtx = NULL;
+
+ state->thePlanOpen = false;
+ }
+
STACK_END(state);
}
=== modified file 'test/rbkt/Queries/zorba/xmark/q12.xq'
--- test/rbkt/Queries/zorba/xmark/q12.xq 2011-06-24 19:58:33 +0000
+++ test/rbkt/Queries/zorba/xmark/q12.xq 2011-10-18 22:55:31 +0000
@@ -1,10 +1,12 @@
declare variable $input-context external;
-let $auction := doc($input-context) return
+
+let $auction := doc($input-context)
+return
for $p in $auction/site/people/person
let $l :=
-for $i in $auction/site/open_auctions/open_auction/initial
-where $p/profile/@income > 5000 * exactly-one($i/text())
-return $i
+ for $i in $auction/site/open_auctions/open_auction/initial
+ where $p/profile/@income > 5000 * exactly-one($i/text())
+ return $i
where $p/profile/@income > 50000
return <items person="{$p/profile/@income}">{count($l)}</items>
=== modified file 'test/rbkt/Queries/zorba/xray/raytracer.xqlib'
--- test/rbkt/Queries/zorba/xray/raytracer.xqlib 2011-06-03 16:14:19 +0000
+++ test/rbkt/Queries/zorba/xray/raytracer.xqlib 2011-10-18 22:55:31 +0000
@@ -1,6 +1,7 @@
module namespace raytracer="http://www.xqsharp.com/raytracer";
declare namespace math="http://www.w3.org/2005/xpath-functions/math";
+
import module namespace vector="http://www.xqsharp.com/raytracer/vector" at "vector.xqlib";
import module namespace shapes="http://www.xqsharp.com/raytracer/shapes" at "shapes.xqlib";
import module namespace materials="http://www.xqsharp.com/raytracer/materials" at "materials.xqlib";
=== modified file 'test/rbkt/Queries/zorba/xray/shapes.xqlib'
--- test/rbkt/Queries/zorba/xray/shapes.xqlib 2011-06-03 16:14:19 +0000
+++ test/rbkt/Queries/zorba/xray/shapes.xqlib 2011-10-18 22:55:31 +0000
@@ -1,6 +1,7 @@
module namespace shapes="http://www.xqsharp.com/raytracer/shapes";
declare namespace math="http://www.w3.org/2005/xpath-functions/math";
+
import module namespace vector="http://www.xqsharp.com/raytracer/vector"
at "vector.xqlib";
Follow ups