Github user linwen commented on a diff in the pull request:

    https://github.com/apache/incubator-hawq/pull/1350#discussion_r178483577
  
    --- Diff: contrib/vexecutor/ao_reader.c ---
    @@ -0,0 +1,78 @@
    +#include "ao_reader.h"
    +#include "tuplebatch.h"
    +#include "utils/datum.h"
    +
    +
    +void
    +BeginVScanAppendOnlyRelation(ScanState *scanState)
    +{
    +    BeginScanAppendOnlyRelation(scanState);
    +    VectorizedState* vs = (VectorizedState*)scanState->ps.vectorized;
    +    TupleBatch tb = scanState->ss_ScanTupleSlot->PRIVATE_tb;
    +    vs->proj = palloc0(sizeof(bool) * tb->ncols);
    +    GetNeededColumnsForScan((Node* 
)scanState->ps.plan->targetlist,vs->proj,tb->ncols);
    +    GetNeededColumnsForScan((Node* 
)scanState->ps.plan->qual,vs->proj,tb->ncols);
    +
    +}
    +
    +void
    +EndVScanAppendOnlyRelation(ScanState *scanState)
    +{
    +    VectorizedState* vs = (VectorizedState*)scanState->ps.vectorized;
    +    pfree(vs->proj);
    +    EndScanAppendOnlyRelation(scanState);
    +}
    +
    +TupleTableSlot *
    +AppendOnlyVScanNext(ScanState *scanState)
    +{
    +    TupleTableSlot *slot = scanState->ss_ScanTupleSlot;
    +    TupleBatch tb = (TupleBatch)slot->PRIVATE_tb;
    +    TupleDesc td = scanState->ss_ScanTupleSlot->tts_tupleDescriptor;
    +    VectorizedState* vs = scanState->ps.vectorized;
    +    int row = 0;
    +
    +    for(;row < tb->batchsize;row ++)
    +    {
    +        AppendOnlyScanNext(scanState);
    +
    +        slot = scanState->ss_ScanTupleSlot;
    +        if(TupIsNull(slot))
    +            break;
    +
    +        for(int i = 0;i < tb->ncols ; i ++)
    +        {
    +
    +           if(vs->proj[i])
    +            {
    +                Oid hawqTypeID = 
slot->tts_tupleDescriptor->attrs[i]->atttypid;
    +                Oid hawqVTypeID = GetVtype(hawqTypeID);
    +                if(!tb->datagroup[i])
    +                    tbCreateColumn(tb,i,hawqVTypeID);
    +
    +                Datum *ptr = 
GetVFunc(hawqVTypeID)->gettypeptr(tb->datagroup[i],row);
    +                *ptr = slot_getattr(slot,i + 1, 
&(tb->datagroup[i]->isnull[row]));
    +
    +                /* if attribute is a reference, deep copy the data out to 
prevent ao table buffer free before vectorized scan batch done */
    +                if(!slot->tts_mt_bind->tupdesc->attrs[i]->attbyval)
    +                    *ptr = 
datumCopy(*ptr,slot->tts_mt_bind->tupdesc->attrs[i]->attbyval,slot->tts_mt_bind->tupdesc->attrs[i]->attlen);
    +            }
    +        }
    +
    +        AppendOnlyScanDesc scanDesc = 
((AppendOnlyScanState*)scanState)->aos_ScanDesc;
    +        VarBlockHeader *header = 
scanDesc->executorReadBlock.varBlockReader.header;
    +
    +        //if(row + 1 == VarBlockGet_itemCount(header))
    --- End diff --
    
    Please remove useless codes.


---

Reply via email to