本文整理汇总了C#中AggInfo类的典型用法代码示例。如果您正苦于以下问题:C# AggInfo类的具体用法?C# AggInfo怎么用?C# AggInfo使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
AggInfo类属于命名空间,在下文中一共展示了AggInfo类的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: updateAccumulator
/*
** Update the accumulator memory cells for an aggregate based on
** the current cursor position.
*/
static void updateAccumulator( Parse pParse, AggInfo pAggInfo )
{
Vdbe v = pParse.pVdbe;
int i;
AggInfo_func pF;
AggInfo_col pC;
pAggInfo.directMode = 1;
sqlite3ExprCacheClear( pParse );
for ( i = 0; i < pAggInfo.nFunc; i++ )
{//, pF++){
pF = pAggInfo.aFunc[i];
int nArg;
int addrNext = 0;
int regAgg;
Debug.Assert( !ExprHasProperty( pF.pExpr, EP_xIsSelect ) );
ExprList pList = pF.pExpr.x.pList;
if ( pList != null )
{
nArg = pList.nExpr;
regAgg = sqlite3GetTempRange( pParse, nArg );
sqlite3ExprCodeExprList( pParse, pList, regAgg, true );
}
else
{
nArg = 0;
regAgg = 0;
}
if ( pF.iDistinct >= 0 )
{
addrNext = sqlite3VdbeMakeLabel( v );
Debug.Assert( nArg == 1 );
codeDistinct( pParse, pF.iDistinct, addrNext, 1, regAgg );
}
if ( ( pF.pFunc.flags & SQLITE_FUNC_NEEDCOLL ) != 0 )
{
CollSeq pColl = null;
ExprList_item pItem;
int j;
Debug.Assert( pList != null ); /* pList!=0 if pF->pFunc has NEEDCOLL */
for ( j = 0; pColl == null && j < nArg; j++ )
{//, pItem++){
pItem = pList.a[j];
pColl = sqlite3ExprCollSeq( pParse, pItem.pExpr );
}
if ( pColl == null )
{
pColl = pParse.db.pDfltColl;
}
sqlite3VdbeAddOp4( v, OP_CollSeq, 0, 0, 0, pColl, P4_COLLSEQ );
}
sqlite3VdbeAddOp4( v, OP_AggStep, 0, regAgg, pF.iMem,
pF.pFunc, P4_FUNCDEF );
sqlite3VdbeChangeP5( v, (u8)nArg );
sqlite3ExprCacheAffinityChange( pParse, regAgg, nArg );
sqlite3ReleaseTempRange( pParse, regAgg, nArg );
if ( addrNext != 0 )
{
sqlite3VdbeResolveLabel( v, addrNext );
sqlite3ExprCacheClear( pParse );
}
}
/* Before populating the accumulator registers, clear the column cache.
** Otherwise, if any of the required column values are already present
** in registers, sqlite3ExprCode() may use OP_SCopy to copy the value
** to pC->iMem. But by the time the value is used, the original register
** may have been used, invalidating the underlying buffer holding the
** text or blob value. See ticket [883034dcb5].
**
** Another solution would be to change the OP_SCopy used to copy cached
** values to an OP_Copy.
*/
sqlite3ExprCacheClear( pParse );
for ( i = 0; i < pAggInfo.nAccumulator; i++ )//, pC++)
{
pC = pAggInfo.aCol[i];
sqlite3ExprCode( pParse, pC.pExpr, pC.iMem );
}
pAggInfo.directMode = 0;
sqlite3ExprCacheClear( pParse );
}
示例2: sqlite3Select
static int sqlite3Select(
Parse pParse, /* The parser context */
Select p, /* The SELECT statement being coded. */
ref SelectDest pDest /* What to do with the query results */
)
{
int i, j; /* Loop counters */
WhereInfo pWInfo; /* Return from sqlite3WhereBegin() */
Vdbe v; /* The virtual machine under construction */
bool isAgg; /* True for select lists like "count()" */
ExprList pEList = new ExprList(); /* List of columns to extract. */
SrcList pTabList = new SrcList(); /* List of tables to select from */
Expr pWhere; /* The WHERE clause. May be NULL */
ExprList pOrderBy; /* The ORDER BY clause. May be NULL */
ExprList pGroupBy; /* The GROUP BY clause. May be NULL */
Expr pHaving; /* The HAVING clause. May be NULL */
bool isDistinct; /* True if the DISTINCT keyword is present */
int distinct; /* Table to use for the distinct set */
int rc = 1; /* Value to return from this function */
int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */
AggInfo sAggInfo; /* Information used by aggregate queries */
int iEnd; /* Address of the end of the query */
sqlite3 db; /* The database connection */
#if !SQLITE_OMIT_EXPLAIN
int iRestoreSelectId = pParse.iSelectId;
pParse.iSelectId = pParse.iNextSelectId++;
#endif
db = pParse.db;
if ( p == null /*|| db.mallocFailed != 0 */ || pParse.nErr != 0 )
{
return 1;
}
#if !SQLITE_OMIT_AUTHORIZATION
if (sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0)) return 1;
#endif
sAggInfo = new AggInfo();// memset(sAggInfo, 0, sAggInfo).Length;
if ( pDest.eDest <= SRT_Discard ) //IgnorableOrderby(pDest))
{
Debug.Assert( pDest.eDest == SRT_Exists || pDest.eDest == SRT_Union ||
pDest.eDest == SRT_Except || pDest.eDest == SRT_Discard );
/* If ORDER BY makes no difference in the output then neither does
** DISTINCT so it can be removed too. */
sqlite3ExprListDelete( db, ref p.pOrderBy );
p.pOrderBy = null;
p.selFlags = (u16)( p.selFlags & ~SF_Distinct );
}
sqlite3SelectPrep( pParse, p, null );
pOrderBy = p.pOrderBy;
pTabList = p.pSrc;
pEList = p.pEList;
if ( pParse.nErr != 0 /*|| db.mallocFailed != 0 */ )
{
goto select_end;
}
isAgg = ( p.selFlags & SF_Aggregate ) != 0;
Debug.Assert( pEList != null );
/* Begin generating code.
*/
v = sqlite3GetVdbe( pParse );
if ( v == null )
goto select_end;
/* If writing to memory or generating a set
** only a single column may be output.
*/
#if !SQLITE_OMIT_SUBQUERY
if ( checkForMultiColumnSelectError( pParse, pDest, pEList.nExpr ) )
{
goto select_end;
}
#endif
/* Generate code for all sub-queries in the FROM clause
*/
#if !SQLITE_OMIT_SUBQUERY || !SQLITE_OMIT_VIEW
for ( i = 0; p.pPrior == null && i < pTabList.nSrc; i++ )
{
SrcList_item pItem = pTabList.a[i];
SelectDest dest = new SelectDest();
Select pSub = pItem.pSelect;
bool isAggSub;
if ( pSub == null || pItem.isPopulated != 0 )
continue;
/* Increment Parse.nHeight by the height of the largest expression
** tree refered to by this, the parent select. The child select
** may contain expression trees of at most
** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit
** more conservative than necessary, but much easier than enforcing
** an exact limit.
*/
pParse.nHeight += sqlite3SelectExprHeight( p );
/* Check to see if the subquery can be absorbed into the parent. */
isAggSub = ( pSub.selFlags & SF_Aggregate ) != 0;
//.........这里部分代码省略.........
示例3: resetAccumulator
/*
** Reset the aggregate accumulator.
**
** The aggregate accumulator is a set of memory cells that hold
** intermediate results while calculating an aggregate. This
** routine simply stores NULLs in all of those memory cells.
*/
static void resetAccumulator( Parse pParse, AggInfo pAggInfo )
{
Vdbe v = pParse.pVdbe;
int i;
AggInfo_func pFunc;
if ( pAggInfo.nFunc + pAggInfo.nColumn == 0 )
{
return;
}
for ( i = 0; i < pAggInfo.nColumn; i++ )
{
sqlite3VdbeAddOp2( v, OP_Null, 0, pAggInfo.aCol[i].iMem );
}
for ( i = 0; i < pAggInfo.nFunc; i++ )
{//, pFunc++){
pFunc = pAggInfo.aFunc[i];
sqlite3VdbeAddOp2( v, OP_Null, 0, pFunc.iMem );
if ( pFunc.iDistinct >= 0 )
{
Expr pE = pFunc.pExpr;
Debug.Assert( !ExprHasProperty( pE, EP_xIsSelect ) );
if ( pE.x.pList == null || pE.x.pList.nExpr != 1 )
{
sqlite3ErrorMsg( pParse, "DISTINCT aggregates must have exactly one " +
"argument" );
pFunc.iDistinct = -1;
}
else
{
KeyInfo pKeyInfo = keyInfoFromExprList( pParse, pE.x.pList );
sqlite3VdbeAddOp4( v, OP_OpenEphemeral, pFunc.iDistinct, 0, 0,
pKeyInfo, P4_KEYINFO_HANDOFF );
}
}
}
}
示例4: finalizeAggFunctions
/*
** Invoke the OP_AggFinalize opcode for every aggregate function
** in the AggInfo structure.
*/
static void finalizeAggFunctions( Parse pParse, AggInfo pAggInfo )
{
Vdbe v = pParse.pVdbe;
int i;
AggInfo_func pF;
for ( i = 0; i < pAggInfo.nFunc; i++ )
{//, pF++){
pF = pAggInfo.aFunc[i];
ExprList pList = pF.pExpr.x.pList;
Debug.Assert( !ExprHasProperty( pF.pExpr, EP_xIsSelect ) );
sqlite3VdbeAddOp4( v, OP_AggFinal, pF.iMem, pList != null ? pList.nExpr : 0, 0,
pF.pFunc, P4_FUNCDEF );
}
}
示例5: isSimpleCount
/*
** The select statement passed as the first argument is an aggregate query.
** The second argment is the associated aggregate-info object. This
** function tests if the SELECT is of the form:
**
** SELECT count() FROM <tbl>
**
** where table is a database table, not a sub-select or view. If the query
** does match this pattern, then a pointer to the Table object representing
** <tbl> is returned. Otherwise, 0 is returned.
*/
static Table isSimpleCount( Select p, AggInfo pAggInfo )
{
Table pTab;
Expr pExpr;
Debug.Assert( null == p.pGroupBy );
if ( p.pWhere != null || p.pEList.nExpr != 1
|| p.pSrc.nSrc != 1 || p.pSrc.a[0].pSelect != null
)
{
return null;
}
pTab = p.pSrc.a[0].pTab;
pExpr = p.pEList.a[0].pExpr;
Debug.Assert( pTab != null && null == pTab.pSelect && pExpr != null );
if ( IsVirtual( pTab ) )
return null;
if ( pExpr.op != TK_AGG_FUNCTION )
return null;
if ( ( pAggInfo.aFunc[0].pFunc.flags & SQLITE_FUNC_COUNT ) == 0 )
return null;
if ( ( pExpr.flags & EP_Distinct ) != 0 )
return null;
return pTab;
}
示例6: addAggInfoFunc
/*
** Add a new element to the pAggInfo.aFunc[] array. Return the index of
** the new element. Return a negative number if malloc fails.
*/
static int addAggInfoFunc( sqlite3 db, AggInfo pInfo )
{
int i = 0;
pInfo.aFunc = sqlite3ArrayAllocate(
db,
pInfo.aFunc,
-1,//sizeof(pInfo.aFunc[0]),
3,
ref pInfo.nFunc,
ref pInfo.nFuncAlloc,
ref i
);
return i;
}
示例7: addAggInfoColumn
/*
** Add a new element to the pAggInfo.aCol[] array. Return the index of
** the new element. Return a negative number if malloc fails.
*/
static int addAggInfoColumn( sqlite3 db, AggInfo pInfo )
{
int i = 0;
pInfo.aCol = sqlite3ArrayAllocate(
db,
pInfo.aCol,
-1,//sizeof(pInfo.aCol[0]),
3,
ref pInfo.nColumn,
ref pInfo.nColumnAlloc,
ref i
);
return i;
}
示例8: updateAccumulator
/*
** Update the accumulator memory cells for an aggregate based on
** the current cursor position.
*/
static void updateAccumulator( Parse pParse, AggInfo pAggInfo )
{
Vdbe v = pParse.pVdbe;
int i;
AggInfo_func pF;
AggInfo_col pC;
pAggInfo.directMode = 1;
sqlite3ExprCacheClear( pParse );
for ( i = 0; i < pAggInfo.nFunc; i++ )
{//, pF++){
pF = pAggInfo.aFunc[i];
int nArg;
int addrNext = 0;
int regAgg;
Debug.Assert( !ExprHasProperty( pF.pExpr, EP_xIsSelect ) );
ExprList pList = pF.pExpr.x.pList;
if ( pList != null )
{
nArg = pList.nExpr;
regAgg = sqlite3GetTempRange( pParse, nArg );
sqlite3ExprCodeExprList( pParse, pList, regAgg, false );
}
else
{
nArg = 0;
regAgg = 0;
}
if ( pF.iDistinct >= 0 )
{
addrNext = sqlite3VdbeMakeLabel( v );
Debug.Assert( nArg == 1 );
codeDistinct( pParse, pF.iDistinct, addrNext, 1, regAgg );
}
if ( ( pF.pFunc.flags & SQLITE_FUNC_NEEDCOLL ) != 0 )
{
CollSeq pColl = null;
ExprList_item pItem;
int j;
Debug.Assert( pList != null ); /* pList!=0 if pF->pFunc has NEEDCOLL */
for ( j = 0; pColl == null && j < nArg; j++ )
{//, pItem++){
pItem = pList.a[j];
pColl = sqlite3ExprCollSeq( pParse, pItem.pExpr );
}
if ( pColl == null )
{
pColl = pParse.db.pDfltColl;
}
sqlite3VdbeAddOp4( v, OP_CollSeq, 0, 0, 0, pColl, P4_COLLSEQ );
}
sqlite3VdbeAddOp4( v, OP_AggStep, 0, regAgg, pF.iMem,
pF.pFunc, P4_FUNCDEF );
sqlite3VdbeChangeP5( v, (u8)nArg );
sqlite3ExprCacheAffinityChange( pParse, regAgg, nArg );
sqlite3ReleaseTempRange( pParse, regAgg, nArg );
if ( addrNext != 0 )
{
sqlite3VdbeResolveLabel( v, addrNext );
sqlite3ExprCacheClear( pParse );
}
}
for ( i = 0; i < pAggInfo.nAccumulator; i++ )//, pC++)
{
pC = pAggInfo.aCol[i];
sqlite3ExprCode( pParse, pC.pExpr, pC.iMem );
}
pAggInfo.directMode = 0;
sqlite3ExprCacheClear( pParse );
}
示例9: CopyFrom
public ITable pZombieTab; // List of Table objects to delete after code gen
#endif
#endregion
public void CopyFrom(Expr cf)
{
op = cf.op;
affinity = cf.affinity;
flags = cf.flags;
u = cf.u;
pColl = (cf.pColl == null ? null : cf.pColl.Copy());
iTable = cf.iTable;
iColumn = cf.iColumn;
pAggInfo = (cf.pAggInfo == null ? null : cf.pAggInfo.Copy());
iAgg = cf.iAgg;
iRightJoinTable = cf.iRightJoinTable;
flags2 = cf.flags2;
pTab = (cf.pTab == null ? null : cf.pTab);
#if SQLITE_MAX_EXPR_DEPTH
nHeight = cf.nHeight;
pZombieTab = cf.pZombieTab;
#endif
pLeft = (cf.pLeft == null ? null : cf.pLeft.Copy());
pRight = (cf.pRight == null ? null : cf.pRight.Copy());
x.pList = (cf.x.pList == null ? null : cf.x.pList.Copy());
x.pSelect = (cf.x.pSelect == null ? null : cf.x.pSelect.Copy());
}