← Back to team overview

zorba-coders team mailing list archive

[Bug 867170] Re: Overwritten variables in prolog

 

Captain James T. Kirk: Captain's log, stardate 9522.6:

Trying to solve this bug I created this Prolog and Query:

lProlog << "declare variable $A := <a>a</a>; declare variable $B := <b>b</b>; ";
lQuery << "declare variable $C := <c>c</c>; declare variable $D := <d>d</d>; $B ";

Then I printed the execution plan, giving me this:

<SequentialIterator id="0258F708">
  <SequentialIterator id="0258F778">
    <CtxVarDeclareIterator varid="2" varname="A" id="02783778">
      <ElementIterator id="02783700">
        <SingletonIterator value="xs:QName(,,a)" id="0279A900"/>
        <TextIterator id="0279A780">
          <SingletonIterator value="xs:string(a)" id="0279A720"/>
        </TextIterator>
      </ElementIterator>
    </CtxVarDeclareIterator>
    <CtxVarDeclareIterator varid="3" varname="B" id="02783FE8">
      <ElementIterator id="02783D18">
        <SingletonIterator value="xs:QName(,,b)" id="0279A6C0"/>
        <TextIterator id="0279A960">
          <SingletonIterator value="xs:string(b)" id="0279A660"/>
        </TextIterator>
      </ElementIterator>
    </CtxVarDeclareIterator>
    <FnConcatIterator id="0258F7E8"/>
  </SequentialIterator>
  <CtxVarDeclareIterator varid="2" varname="C" id="027840D8">
    <ElementIterator copyInputNodes="false" id="02784060">
      <SingletonIterator value="xs:QName(,,c)" id="0279A9C0"/>
      <TextIterator id="0279AA80">
        <SingletonIterator value="xs:string(c)" id="0279AA20"/>
      </TextIterator>
    </ElementIterator>
  </CtxVarDeclareIterator>
  <CtxVarDeclareIterator varid="3" varname="D" id="027841C8">
    <ElementIterator copyInputNodes="false" id="02784150">
      <SingletonIterator value="xs:QName(,,d)" id="0279AAE0"/>
      <TextIterator id="0279ABA0">
        <SingletonIterator value="xs:string(d)" id="0279AB40"/>
      </TextIterator>
    </ElementIterator>
  </CtxVarDeclareIterator>
  <CtxVarIterator varid="3" varname="B" varkind="global" id="00A9D3E8"/>
</SequentialIterator>

So, I can see that the Iterators have variables with duplicated varids,
digging into the code, I found that to process the prolog an XQueryImpl
object is created, so for every XQueryImpl created on xqueryimpl.cpp:586
the line:

  ulong nextDynamicVarId = 2;

initializes the "unique" varid to 2, so, after the prolog is processed when the real query starts it starts again from two... but why?
because on plan_visitor.cpp:605 the lines:

  if (varExpr->get_unique_id() == 0)
    varExpr->set_unique_id(theNextDynamicVarId++);

increment the varid only if it exists. So a quick fix could be to increment the varid out this verification, and everytime a new query is created the varid will be incremented correctly.
But this fix looks dirty, a better approach should be to initialize in xqueryimpl the nextDynamicVarId considering the number of variables that the prolog/staticContext has.
I tried to do that on staticContext, but it was very difficult, I tried putting this value on StaticContext, but after a while I realize that XQueryImpl uses static_context and this is different than StaticContext class.
So... my time went out and couldn't figure out how to pass this variable accross the classes...

Markos, hope this helps to fix this quickly....
:)
-Rodolfo

-- 
You received this bug notification because you are a member of Zorba
Coders, which is the registrant for Zorba.
https://bugs.launchpad.net/bugs/867170

Title:
  Overwritten variables in prolog

Status in Zorba - The XQuery Processor:
  Confirmed

Bug description:
  Variables declared in Prolog are Overwritten inside the query.
  example attached

To manage notifications about this bug go to:
https://bugs.launchpad.net/zorba/+bug/867170/+subscriptions


Follow ups