本文整理汇总了C#中SelectDest类的典型用法代码示例。如果您正苦于以下问题:C# SelectDest类的具体用法?C# SelectDest怎么用?C# SelectDest使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
SelectDest类属于命名空间,在下文中一共展示了SelectDest类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: sqlite3SelectDestInit
/*
** Initialize a SelectDest structure.
*/
static void sqlite3SelectDestInit( SelectDest pDest, int eDest, int iParm )
{
pDest.eDest = (u8)eDest;
pDest.iParm = iParm;
pDest.affinity = '\0';
pDest.iMem = 0;
pDest.nMem = 0;
}
示例2: DestInit
static void DestInit(SelectDest dest, SRT dest2, int parmId)
{
dest.Dest = dest2;
dest.SDParmId = parmId;
dest.AffSdst = '\0';
dest.SdstId = 0;
dest.Sdsts = 0;
}
示例3: 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;
//.........这里部分代码省略.........
示例4: multiSelectOrderBy
/*
** Alternative compound select code generator for cases when there
** is an ORDER BY clause.
**
** We assume a query of the following form:
**
** <selectA> <operator> <selectB> ORDER BY <orderbylist>
**
** <operator> is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea
** is to code both <selectA> and <selectB> with the ORDER BY clause as
** co-routines. Then run the co-routines in parallel and merge the results
** into the output. In addition to the two coroutines (called selectA and
** selectB) there are 7 subroutines:
**
** outA: Move the output of the selectA coroutine into the output
** of the compound query.
**
** outB: Move the output of the selectB coroutine into the output
** of the compound query. (Only generated for UNION and
** UNION ALL. EXCEPT and INSERTSECT never output a row that
** appears only in B.)
**
** AltB: Called when there is data from both coroutines and A<B.
**
** AeqB: Called when there is data from both coroutines and A==B.
**
** AgtB: Called when there is data from both coroutines and A>B.
**
** EofA: Called when data is exhausted from selectA.
**
** EofB: Called when data is exhausted from selectB.
**
** The implementation of the latter five subroutines depend on which
** <operator> is used:
**
**
** UNION ALL UNION EXCEPT INTERSECT
** ------------- ----------------- -------------- -----------------
** AltB: outA, nextA outA, nextA outA, nextA nextA
**
** AeqB: outA, nextA nextA nextA outA, nextA
**
** AgtB: outB, nextB outB, nextB nextB nextB
**
** EofA: outB, nextB outB, nextB halt halt
**
** EofB: outA, nextA outA, nextA outA, nextA halt
**
** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA
** causes an immediate jump to EofA and an EOF on B following nextB causes
** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or
** following nextX causes a jump to the end of the select processing.
**
** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled
** within the output subroutine. The regPrev register set holds the previously
** output value. A comparison is made against this value and the output
** is skipped if the next results would be the same as the previous.
**
** The implementation plan is to implement the two coroutines and seven
** subroutines first, then put the control logic at the bottom. Like this:
**
** goto Init
** coA: coroutine for left query (A)
** coB: coroutine for right query (B)
** outA: output one row of A
** outB: output one row of B (UNION and UNION ALL only)
** EofA: ...
** EofB: ...
** AltB: ...
** AeqB: ...
** AgtB: ...
** Init: initialize coroutine registers
** yield coA
** if eof(A) goto EofA
** yield coB
** if eof(B) goto EofB
** Cmpr: Compare A, B
** Jump AltB, AeqB, AgtB
** End: ...
**
** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not
** actually called using Gosub and they do not Return. EofA and EofB loop
** until all data is exhausted then jump to the "end" labe. AltB, AeqB,
** and AgtB jump to either L2 or to one of EofA or EofB.
*/
#if !SQLITE_OMIT_COMPOUND_SELECT
static int multiSelectOrderBy(
Parse pParse, /* Parsing context */
Select p, /* The right-most of SELECTs to be coded */
SelectDest pDest /* What to do with query results */
)
{
int i, j; /* Loop counters */
Select pPrior; /* Another SELECT immediately to our left */
Vdbe v; /* Generate code to this VDBE */
SelectDest destA = new SelectDest(); /* Destination for coroutine A */
SelectDest destB = new SelectDest(); /* Destination for coroutine B */
int regAddrA; /* Address register for select-A coroutine */
int regEofA; /* Flag to indicate when select-A is complete */
int regAddrB; /* Address register for select-B coroutine */
//.........这里部分代码省略.........
示例5: generateOutputSubroutine
/*
** Code an output subroutine for a coroutine implementation of a
** SELECT statment.
**
** The data to be output is contained in pIn.iMem. There are
** pIn.nMem columns to be output. pDest is where the output should
** be sent.
**
** regReturn is the number of the register holding the subroutine
** return address.
**
** If regPrev>0 then it is the first register in a vector that
** records the previous output. mem[regPrev] is a flag that is false
** if there has been no previous output. If regPrev>0 then code is
** generated to suppress duplicates. pKeyInfo is used for comparing
** keys.
**
** If the LIMIT found in p.iLimit is reached, jump immediately to
** iBreak.
*/
static int generateOutputSubroutine(
Parse pParse, /* Parsing context */
Select p, /* The SELECT statement */
SelectDest pIn, /* Coroutine supplying data */
SelectDest pDest, /* Where to send the data */
int regReturn, /* The return address register */
int regPrev, /* Previous result register. No uniqueness if 0 */
KeyInfo pKeyInfo, /* For comparing with previous entry */
int p4type, /* The p4 type for pKeyInfo */
int iBreak /* Jump here if we hit the LIMIT */
)
{
Vdbe v = pParse.pVdbe;
int iContinue;
int addr;
addr = sqlite3VdbeCurrentAddr( v );
iContinue = sqlite3VdbeMakeLabel( v );
/* Suppress duplicates for UNION, EXCEPT, and INTERSECT
*/
if ( regPrev != 0 )
{
int j1, j2;
j1 = sqlite3VdbeAddOp1( v, OP_IfNot, regPrev );
j2 = sqlite3VdbeAddOp4( v, OP_Compare, pIn.iMem, regPrev + 1, pIn.nMem,
pKeyInfo, p4type );
sqlite3VdbeAddOp3( v, OP_Jump, j2 + 2, iContinue, j2 + 2 );
sqlite3VdbeJumpHere( v, j1 );
sqlite3ExprCodeCopy( pParse, pIn.iMem, regPrev + 1, pIn.nMem );
sqlite3VdbeAddOp2( v, OP_Integer, 1, regPrev );
}
//if ( pParse.db.mallocFailed != 0 ) return 0;
/* Suppress the the first OFFSET entries if there is an OFFSET clause
*/
codeOffset( v, p, iContinue );
switch ( pDest.eDest )
{
/* Store the result as data using a unique key.
*/
case SRT_Table:
case SRT_EphemTab:
{
int r1 = sqlite3GetTempReg( pParse );
int r2 = sqlite3GetTempReg( pParse );
testcase( pDest.eDest == SRT_Table );
testcase( pDest.eDest == SRT_EphemTab );
sqlite3VdbeAddOp3( v, OP_MakeRecord, pIn.iMem, pIn.nMem, r1 );
sqlite3VdbeAddOp2( v, OP_NewRowid, pDest.iParm, r2 );
sqlite3VdbeAddOp3( v, OP_Insert, pDest.iParm, r1, r2 );
sqlite3VdbeChangeP5( v, OPFLAG_APPEND );
sqlite3ReleaseTempReg( pParse, r2 );
sqlite3ReleaseTempReg( pParse, r1 );
break;
}
#if !SQLITE_OMIT_SUBQUERY
/* If we are creating a set for an "expr IN (SELECT ...)" construct,
** then there should be a single item on the stack. Write this
** item into the set table with bogus data.
*/
case SRT_Set:
{
int r1;
Debug.Assert( pIn.nMem == 1 );
p.affinity =
sqlite3CompareAffinity( p.pEList.a[0].pExpr, pDest.affinity );
r1 = sqlite3GetTempReg( pParse );
sqlite3VdbeAddOp4( v, OP_MakeRecord, pIn.iMem, 1, r1, p.affinity, 1 );
sqlite3ExprCacheAffinityChange( pParse, pIn.iMem, 1 );
sqlite3VdbeAddOp2( v, OP_IdxInsert, pDest.iParm, r1 );
sqlite3ReleaseTempReg( pParse, r1 );
break;
}
#if FALSE //* Never occurs on an ORDER BY query */
/* If any row exist in the result set, record that fact and abort.
*/
//.........这里部分代码省略.........
示例6: multiSelect
/* Forward reference */
//static int multiSelectOrderBy(
// Parse* pParse, /* Parsing context */
// Select* p, /* The right-most of SELECTs to be coded */
// SelectDest* pDest /* What to do with query results */
//);
#if !SQLITE_OMIT_COMPOUND_SELECT
/*
** This routine is called to process a compound query form from
** two or more separate queries using UNION, UNION ALL, EXCEPT, or
** INTERSECT
**
** "p" points to the right-most of the two queries. the query on the
** left is p.pPrior. The left query could also be a compound query
** in which case this routine will be called recursively.
**
** The results of the total query are to be written into a destination
** of type eDest with parameter iParm.
**
** Example 1: Consider a three-way compound SQL statement.
**
** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3
**
** This statement is parsed up as follows:
**
** SELECT c FROM t3
** |
** `----. SELECT b FROM t2
** |
** `-----. SELECT a FROM t1
**
** The arrows in the diagram above represent the Select.pPrior pointer.
** So if this routine is called with p equal to the t3 query, then
** pPrior will be the t2 query. p.op will be TK_UNION in this case.
**
** Notice that because of the way SQLite parses compound SELECTs, the
** individual selects always group from left to right.
*/
static int multiSelect(
Parse pParse, /* Parsing context */
Select p, /* The right-most of SELECTs to be coded */
SelectDest pDest /* What to do with query results */
)
{
int rc = SQLITE_OK; /* Success code from a subroutine */
Select pPrior; /* Another SELECT immediately to our left */
Vdbe v; /* Generate code to this VDBE */
SelectDest dest = new SelectDest(); /* Alternative data destination */
Select pDelete = null; /* Chain of simple selects to delete */
sqlite3 db; /* Database connection */
#if !SQLITE_OMIT_EXPLAIN
int iSub1 = 0; /* EQP id of left-hand query */
int iSub2 = 0; /* EQP id of right-hand query */
#endif
/* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.
*/
Debug.Assert( p != null && p.pPrior != null ); /* Calling function guarantees this much */
db = pParse.db;
pPrior = p.pPrior;
Debug.Assert( pPrior.pRightmost != pPrior );
Debug.Assert( pPrior.pRightmost == p.pRightmost );
dest = pDest;
if ( pPrior.pOrderBy != null )
{
sqlite3ErrorMsg( pParse, "ORDER BY clause should come after %s not before",
selectOpName( p.op ) );
rc = 1;
goto multi_select_end;
}
if ( pPrior.pLimit != null )
{
sqlite3ErrorMsg( pParse, "LIMIT clause should come after %s not before",
selectOpName( p.op ) );
rc = 1;
goto multi_select_end;
}
v = sqlite3GetVdbe( pParse );
Debug.Assert( v != null ); /* The VDBE already created by calling function */
/* Create the destination temporary table if necessary
*/
if ( dest.eDest == SRT_EphemTab )
{
Debug.Assert( p.pEList != null );
sqlite3VdbeAddOp2( v, OP_OpenEphemeral, dest.iParm, p.pEList.nExpr );
sqlite3VdbeChangeP5( v, BTREE_UNORDERED );
dest.eDest = SRT_Table;
}
/* Make sure all SELECTs in the statement have the same number of elements
** in their result sets.
*/
Debug.Assert( p.pEList != null && pPrior.pEList != null );
if ( p.pEList.nExpr != pPrior.pEList.nExpr )
{
sqlite3ErrorMsg( pParse, "SELECTs to the left and right of %s" +
//.........这里部分代码省略.........
示例7: CodeTriggerProgram
static int CodeTriggerProgram(Parse parse, TriggerStep stepList, OE orconf)
{
Vdbe v = parse.V;
Context ctx = parse.Ctx;
Debug.Assert(parse.TriggerTab != null && parse.Toplevel != null);
Debug.Assert(stepList != null);
Debug.Assert(v != null);
for (TriggerStep step = stepList; step != null; step = step.Next)
{
// Figure out the ON CONFLICT policy that will be used for this step of the trigger program. If the statement that caused this trigger
// to fire had an explicit ON CONFLICT, then use it. Otherwise, use the ON CONFLICT policy that was specified as part of the trigger
// step statement. Example:
//
// CREATE TRIGGER AFTER INSERT ON t1 BEGIN;
// INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);
// END;
//
// INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy
// INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy
parse.Orconf = (orconf == OE.Default ? step.Orconf : orconf);
switch (step.OP)
{
case TK.UPDATE:
Update(parse,
TargetSrcList(parse, step),
Expr.ListDup(ctx, step.ExprList, 0),
Expr.Dup(ctx, step.Where, 0),
parse.Orconf);
break;
case TK.INSERT:
Insert(parse,
TargetSrcList(parse, step),
Expr.ListDup(ctx, step.ExprList, 0),
Select.Dup(ctx, step.Select, 0),
Expr.IdListDup(ctx, step.IdList),
parse.Orconf);
break;
case TK.DELETE:
DeleteFrom(parse,
TargetSrcList(parse, step),
Expr.Dup(ctx, step.Where, 0));
break;
default:
Debug.Assert(step.OP == TK.SELECT);
SelectDest sDest = new SelectDest();
Select select = Expr.SelectDup(ctx, step.Select, 0);
Select.DestInit(sDest, SRT.Discard, 0);
Select.Select_(parse, select, ref sDest);
Select.Delete(ctx, ref select);
break;
}
if (step.OP != TK.SELECT)
v.AddOp0(OP.ResetCount);
}
return 0;
}
示例8: codeTriggerProgram
/*
** Generate VDBE code for the statements inside the body of a single
** trigger.
*/
static int codeTriggerProgram(
Parse pParse, /* The parser context */
TriggerStep pStepList, /* List of statements inside the trigger body */
int orconf /* Conflict algorithm. (OE_Abort, etc) */
)
{
TriggerStep pStep;
Vdbe v = pParse.pVdbe;
sqlite3 db = pParse.db;
Debug.Assert( pParse.pTriggerTab != null && pParse.pToplevel != null );
Debug.Assert( pStepList != null );
Debug.Assert( v != null );
for ( pStep = pStepList; pStep != null; pStep = pStep.pNext )
{
/* Figure out the ON CONFLICT policy that will be used for this step
** of the trigger program. If the statement that caused this trigger
** to fire had an explicit ON CONFLICT, then use it. Otherwise, use
** the ON CONFLICT policy that was specified as part of the trigger
** step statement. Example:
**
** CREATE TRIGGER AFTER INSERT ON t1 BEGIN;
** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);
** END;
**
** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy
** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy
*/
pParse.eOrconf = ( orconf == OE_Default ) ? pStep.orconf : (u8)orconf;
switch ( pStep.op )
{
case TK_UPDATE:
{
sqlite3Update( pParse,
targetSrcList( pParse, pStep ),
sqlite3ExprListDup( db, pStep.pExprList, 0 ),
sqlite3ExprDup( db, pStep.pWhere, 0 ),
pParse.eOrconf
);
break;
}
case TK_INSERT:
{
sqlite3Insert( pParse,
targetSrcList( pParse, pStep ),
sqlite3ExprListDup( db, pStep.pExprList, 0 ),
sqlite3SelectDup( db, pStep.pSelect, 0 ),
sqlite3IdListDup( db, pStep.pIdList ),
pParse.eOrconf
);
break;
}
case TK_DELETE:
{
sqlite3DeleteFrom( pParse,
targetSrcList( pParse, pStep ),
sqlite3ExprDup( db, pStep.pWhere, 0 )
);
break;
}
default:
Debug.Assert( pStep.op == TK_SELECT );
{
SelectDest sDest = new SelectDest();
Select pSelect = sqlite3SelectDup( db, pStep.pSelect, 0 );
sqlite3SelectDestInit( sDest, SRT_Discard, 0 );
sqlite3Select( pParse, pSelect, ref sDest );
sqlite3SelectDelete( db, ref pSelect );
break;
}
}
if ( pStep.op != TK_SELECT )
{
sqlite3VdbeAddOp0( v, OP_ResetCount );
}
}
return 0;
}
示例9: SelectInnerLoop
static void SelectInnerLoop(Parse parse, Select p, ExprList list, int srcTable, int columns, ExprList orderBy, DistinctCtx distinct, SelectDest dest, int continueId, int breakId)
{
Vdbe v = parse.V;
Debug.Assert(v != null);
if (C._NEVER(v == null)) return;
Debug.Assert(list != null);
WHERE_DISTINCT hasDistinct = (distinct != null ? distinct.TnctType : WHERE_DISTINCT.NOOP); // True if the DISTINCT keyword is present
if (orderBy == null && hasDistinct == (WHERE_DISTINCT)0)
CodeOffset(v, p, continueId);
// Pull the requested columns.
int resultCols = (columns > 0 ? columns : list.Exprs); // Number of result columns
if (dest.Sdsts == 0)
{
dest.SdstId = parse.Mems + 1;
dest.Sdsts = resultCols;
parse.Mems += resultCols;
}
else
Debug.Assert(dest.Sdsts == resultCols);
int regResult = dest.SdstId; // Start of memory holding result set
SRT dest2 = dest.Dest; // How to dispose of results
int i;
if (columns > 0)
for (i = 0; i < columns; i++)
v.AddOp3(OP.Column, srcTable, i, regResult + i);
else if (dest2 != SRT.Exists)
{
// If the destination is an EXISTS(...) expression, the actual values returned by the SELECT are not required.
Expr.CacheClear(parse);
Expr.CodeExprList(parse, list, regResult, dest2 == SRT.Output);
}
columns = resultCols;
// If the DISTINCT keyword was present on the SELECT statement and this row has been seen before, then do not make this row part of the result.
if (hasDistinct != 0)
{
Debug.Assert(list != null);
Debug.Assert(list.Exprs == columns);
switch (distinct.TnctType)
{
case WHERE_DISTINCT.ORDERED:
{
// Allocate space for the previous row
int regPrev = parse.Mems + 1; // Previous row content
parse.Mems += columns;
// Change the OP_OpenEphemeral coded earlier to an OP_Null sets the MEM_Cleared bit on the first register of the
// previous value. This will cause the OP_Ne below to always fail on the first iteration of the loop even if the first
// row is all NULLs.
v.ChangeToNoop(distinct.AddrTnct);
Vdbe.VdbeOp op = v.GetOp(distinct.AddrTnct); // No longer required OpenEphemeral instr.
op.Opcode = OP.Null;
op.P1 = 1;
op.P2 = regPrev;
int jumpId = v.CurrentAddr() + columns; // Jump destination
for (i = 0; i < columns; i++)
{
CollSeq coll = list.Ids[i].Expr.CollSeq(parse);
if (i < columns - 1)
v.AddOp3(OP.Ne, regResult + i, jumpId, regPrev + i);
else
v.AddOp3(OP.Eq, regResult + i, continueId, regPrev + i);
v.ChangeP4(-1, coll, Vdbe.P4T.COLLSEQ);
v.ChangeP5(AFF.BIT_NULLEQ);
}
Debug.Assert(v.CurrentAddr() == jumpId);
v.AddOp3(OP.Copy, regResult, regPrev, columns - 1);
break;
}
case WHERE_DISTINCT.UNIQUE:
{
v.ChangeToNoop(distinct.AddrTnct);
break;
}
default:
{
Debug.Assert(distinct.TnctType == WHERE_DISTINCT.UNORDERED);
CodeDistinct(parse, distinct.TableTnct, continueId, columns, regResult);
break;
}
}
if (orderBy != null)
CodeOffset(v, p, continueId);
}
int paramId = dest.SDParmId; // First argument to disposal method
switch (dest2)
{
#if !OMIT_COMPOUND_SELECT
case SRT.Union:
{
// In this mode, write each query result to the key of the temporary table iParm.
int r1 = Expr.GetTempReg(parse);
v.AddOp3(OP.MakeRecord, regResult, columns, r1);
v.AddOp2(OP.IdxInsert, paramId, r1);
Expr.ReleaseTempReg(parse, r1);
break;
//.........这里部分代码省略.........
示例10: CheckForMultiColumnSelectError
static bool CheckForMultiColumnSelectError(Parse parse, SelectDest dest, int exprs)
{
SRT dest2 = dest.Dest;
if (exprs > 1 && (dest2 == SRT.Mem || dest2 == SRT.Set))
{
parse.ErrorMsg("only a single result allowed for a SELECT that is part of an expression");
return true;
}
return false;
}
示例11: sqlite3CodeSubselect
//.........这里部分代码省略.........
{
sqlite3VdbeAddOp2( v, OP_Null, 0, rMayHaveNull );
}
affinity = sqlite3ExprAffinity( pLeft );
/* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
** expression it is handled the same way. An ephemeral table is
** filled with single-field index keys representing the results
** from the SELECT or the <exprlist>.
**
** If the 'x' expression is a column value, or the SELECT...
** statement returns a column value, then the affinity of that
** column is used to build the index keys. If both 'x' and the
** SELECT... statement are columns, then numeric affinity is used
** if either column has NUMERIC or INTEGER affinity. If neither
** 'x' nor the SELECT... statement are columns, then numeric affinity
** is used.
*/
pExpr.iTable = pParse.nTab++;
addr = sqlite3VdbeAddOp2( v, OP_OpenEphemeral, (int)pExpr.iTable, !isRowid );
if ( rMayHaveNull == 0 )
sqlite3VdbeChangeP5( v, BTREE_UNORDERED );
keyInfo = new KeyInfo();// memset( &keyInfo, 0, sizeof(keyInfo ));
keyInfo.nField = 1;
if ( ExprHasProperty( pExpr, EP_xIsSelect ) )
{
/* Case 1: expr IN (SELECT ...)
**
** Generate code to write the results of the select into the temporary
** table allocated and opened above.
*/
SelectDest dest = new SelectDest();
ExprList pEList;
Debug.Assert( !isRowid );
sqlite3SelectDestInit( dest, SRT_Set, pExpr.iTable );
dest.affinity = (char)affinity;
Debug.Assert( ( pExpr.iTable & 0x0000FFFF ) == pExpr.iTable );
pExpr.x.pSelect.iLimit = 0;
if ( sqlite3Select( pParse, pExpr.x.pSelect, ref dest ) != 0 )
{
return 0;
}
pEList = pExpr.x.pSelect.pEList;
if ( ALWAYS( pEList != null ) && pEList.nExpr > 0 )
{
keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq( pParse, pExpr.pLeft,
pEList.a[0].pExpr );
}
}
else if ( ALWAYS( pExpr.x.pList != null ) )
{
/* Case 2: expr IN (exprlist)
**
** For each expression, build an index key from the evaluation and
** store it in the temporary table. If <expr> is a column, then use
** that columns affinity when building index keys. If <expr> is not
** a column, use numeric affinity.
*/
int i;
ExprList pList = pExpr.x.pList;
ExprList_item pItem;
int r1, r2, r3;
示例12: sqlite3MaterializeView
/*
** Evaluate a view and store its result in an ephemeral table. The
** pWhere argument is an optional WHERE clause that restricts the
** set of rows in the view that are to be added to the ephemeral table.
*/
static void sqlite3MaterializeView(
Parse pParse, /* Parsing context */
Table pView, /* View definition */
Expr pWhere, /* Optional WHERE clause to be added */
int iCur /* VdbeCursor number for ephemerial table */
)
{
SelectDest dest = new SelectDest();
Select pDup;
sqlite3 db = pParse.db;
pDup = sqlite3SelectDup( db, pView.pSelect, 0 );
if ( pWhere != null )
{
SrcList pFrom;
pWhere = sqlite3ExprDup( db, pWhere, 0 );
pFrom = sqlite3SrcListAppend( db, null, null, null );
//if ( pFrom != null )
//{
Debug.Assert( pFrom.nSrc == 1 );
pFrom.a[0].zAlias = pView.zName;// sqlite3DbStrDup( db, pView.zName );
pFrom.a[0].pSelect = pDup;
Debug.Assert( pFrom.a[0].pOn == null );
Debug.Assert( pFrom.a[0].pUsing == null );
//}
//else
//{
// sqlite3SelectDelete( db, ref pDup );
//}
pDup = sqlite3SelectNew( pParse, null, pFrom, pWhere, null, null, null, 0, null, null );
}
sqlite3SelectDestInit( dest, SRT_EphemTab, iCur );
sqlite3Select( pParse, pDup, ref dest );
sqlite3SelectDelete( db, ref pDup );
}
示例13: sqlite3Insert
static void sqlite3Insert(
Parse pParse, /* Parser context */
SrcList pTabList, /* Name of table into which we are inserting */
ExprList pList, /* List of values to be inserted */
Select pSelect, /* A SELECT statement to use as the data source */
IdList pColumn, /* Column names corresponding to IDLIST. */
int onError /* How to handle constraint errors */
)
{
sqlite3 db; /* The main database structure */
Table pTab; /* The table to insert into. aka TABLE */
string zTab; /* Name of the table into which we are inserting */
string zDb; /* Name of the database holding this table */
int i = 0;
int j = 0;
int idx = 0; /* Loop counters */
Vdbe v; /* Generate code into this virtual machine */
Index pIdx; /* For looping over indices of the table */
int nColumn; /* Number of columns in the data */
int nHidden = 0; /* Number of hidden columns if TABLE is virtual */
int baseCur = 0; /* VDBE VdbeCursor number for pTab */
int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */
int endOfLoop = 0; /* Label for the end of the insertion loop */
bool useTempTable = false; /* Store SELECT results in intermediate table */
int srcTab = 0; /* Data comes from this temporary cursor if >=0 */
int addrInsTop = 0; /* Jump to label "D" */
int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */
int addrSelect = 0; /* Address of coroutine that implements the SELECT */
SelectDest dest; /* Destination for SELECT on rhs of INSERT */
int iDb; /* Index of database holding TABLE */
Db pDb; /* The database containing table being inserted into */
bool appendFlag = false; /* True if the insert is likely to be an append */
/* Register allocations */
int regFromSelect = 0; /* Base register for data coming from SELECT */
int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */
int regRowCount = 0; /* Memory cell used for the row counter */
int regIns; /* Block of regs holding rowid+data being inserted */
int regRowid; /* registers holding insert rowid */
int regData; /* register holding first column to insert */
int regEof = 0; /* Register recording end of SELECT data */
int[] aRegIdx = null; /* One register allocated to each index */
#if !SQLITE_OMIT_TRIGGER
bool isView = false; /* True if attempting to insert into a view */
Trigger pTrigger; /* List of triggers on pTab, if required */
int tmask = 0; /* Mask of trigger times */
#endif
db = pParse.db;
dest = new SelectDest();// memset( &dest, 0, sizeof( dest ) );
if ( pParse.nErr != 0 /*|| db.mallocFailed != 0 */ )
{
goto insert_cleanup;
}
/* Locate the table into which we will be inserting new information.
*/
Debug.Assert( pTabList.nSrc == 1 );
zTab = pTabList.a[0].zName;
if ( NEVER( zTab == null ) )
goto insert_cleanup;
pTab = sqlite3SrcListLookup( pParse, pTabList );
if ( pTab == null )
{
goto insert_cleanup;
}
iDb = sqlite3SchemaToIndex( db, pTab.pSchema );
Debug.Assert( iDb < db.nDb );
pDb = db.aDb[iDb];
zDb = pDb.zName;
#if NO_SQLITE_OMIT_AUTHORIZATION //#if !SQLITE_OMIT_AUTHORIZATION
if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab.zName, 0, zDb) ){
goto insert_cleanup;
}
#endif
/* Figure out if we have any triggers and if the table being
** inserted into is a view
*/
#if !SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist( pParse, pTab, TK_INSERT, null, out tmask );
isView = pTab.pSelect != null;
#else
Trigger pTrigger = null; //# define pTrigger 0
int tmask = 0; //# define tmask 0
bool isView = false;
#endif
#if SQLITE_OMIT_VIEW
//# undef isView
isView = false;
#endif
#if !SQLITE_OMIT_TRIGGER
Debug.Assert( ( pTrigger != null && tmask != 0 ) || ( pTrigger == null && tmask == 0 ) );
#endif
#if !SQLITE_OMIT_VIEW
/* If pTab is really a view, make sure it has been initialized.
** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual
//.........这里部分代码省略.........
示例14: sqlite3EndTable
//.........这里部分代码省略.........
/*
** Initialize zType for the new view or table.
*/
if (p.pSelect == null)
{
/* A regular table */
zType = "table";
zType2 = "TABLE";
#if !SQLITE_OMIT_VIEW
}
else
{
/* A view */
zType = "view";
zType2 = "VIEW";
#endif
}
/* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
** statement to populate the new table. The root-page number for the
** new table is in register pParse->regRoot.
**
** Once the SELECT has been coded by sqlite3Select(), it is in a
** suitable state to query for the column names and types to be used
** by the new table.
**
** A shared-cache write-lock is not required to write to the new table,
** as a schema-lock must have already been obtained to create it. Since
** a schema-lock excludes all other database users, the write-lock would
** be redundant.
*/
if (pSelect != null)
{
SelectDest dest = new SelectDest();
Table pSelTab;
Debug.Assert(pParse.nTab == 1);
sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse.regRoot, iDb);
sqlite3VdbeChangeP5(v, 1);
pParse.nTab = 2;
sqlite3SelectDestInit(dest, SRT_Table, 1);
sqlite3Select(pParse, pSelect, ref dest);
sqlite3VdbeAddOp1(v, OP_Close, 1);
if (pParse.nErr == 0)
{
pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
if (pSelTab == null)
return;
Debug.Assert(p.aCol == null);
p.nCol = pSelTab.nCol;
p.aCol = pSelTab.aCol;
pSelTab.nCol = 0;
pSelTab.aCol = null;
sqlite3DeleteTable(db, ref pSelTab);
}
}
/* Compute the complete text of the CREATE statement */
if (pSelect != null)
{
zStmt = createTableStmt(db, p);
}
else
{
n = (int)(pParse.sNameToken.z.Length - pEnd.z.Length) + 1;
zStmt = sqlite3MPrintf(db,
示例15: checkForMultiColumnSelectError
/*
** Generate an error message when a SELECT is used within a subexpression
** (example: "a IN (SELECT * FROM table)") but it has more than 1 result
** column. We do this in a subroutine because the error used to occur
** in multiple places. (The error only occurs in one place now, but we
** retain the subroutine to minimize code disruption.)
*/
static bool checkForMultiColumnSelectError(
Parse pParse, /* Parse context. */
SelectDest pDest, /* Destination of SELECT results */
int nExpr /* Number of result columns returned by SELECT */
)
{
int eDest = pDest.eDest;
if ( nExpr > 1 && ( eDest == SRT_Mem || eDest == SRT_Set ) )
{
sqlite3ErrorMsg( pParse, "only a single result allowed for " +
"a SELECT that is part of an expression" );
return true;
}
else
{
return false;
}
}