Fix a bug concerning the use of row values within triggers (see ticket 8c9458e7) that was in version 3.15.0 but was not reported until moments after the 3.16.0 release was published.
This commit is contained in:
parent
cf935b5882
commit
7618cbffc2
1 changed files with 56 additions and 12 deletions
68
3rdparty/sqlite3/sqlite3.c
vendored
68
3rdparty/sqlite3/sqlite3.c
vendored
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
** This file is an amalgamation of many separate C source files from SQLite
|
** This file is an amalgamation of many separate C source files from SQLite
|
||||||
** version 3.16.0. By combining all the individual C code files into this
|
** version 3.16.1. By combining all the individual C code files into this
|
||||||
** single large file, the entire code can be compiled as a single translation
|
** single large file, the entire code can be compiled as a single translation
|
||||||
** unit. This allows many compilers to do optimizations that would not be
|
** unit. This allows many compilers to do optimizations that would not be
|
||||||
** possible if the files were compiled separately. Performance improvements
|
** possible if the files were compiled separately. Performance improvements
|
||||||
|
@ -381,9 +381,9 @@ extern "C" {
|
||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.16.0"
|
#define SQLITE_VERSION "3.16.1"
|
||||||
#define SQLITE_VERSION_NUMBER 3016000
|
#define SQLITE_VERSION_NUMBER 3016001
|
||||||
#define SQLITE_SOURCE_ID "2017-01-02 11:57:58 04ac0b75b1716541b2b97704f4809cb7ef19cccf"
|
#define SQLITE_SOURCE_ID "2017-01-03 18:27:03 979f04392853b8053817a3eea2fc679947b437fd"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
|
@ -90663,9 +90663,10 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(
|
||||||
assert( pVector->flags & EP_xIsSelect );
|
assert( pVector->flags & EP_xIsSelect );
|
||||||
/* The TK_SELECT_COLUMN Expr node:
|
/* The TK_SELECT_COLUMN Expr node:
|
||||||
**
|
**
|
||||||
** pLeft: pVector containing TK_SELECT
|
** pLeft: pVector containing TK_SELECT. Not deleted.
|
||||||
** pRight: not used. But recursively deleted.
|
** pRight: not used. But recursively deleted.
|
||||||
** iColumn: Index of a column in pVector
|
** iColumn: Index of a column in pVector
|
||||||
|
** iTable: 0 or the number of columns on the LHS of an assignment
|
||||||
** pLeft->iTable: First in an array of register holding result, or 0
|
** pLeft->iTable: First in an array of register holding result, or 0
|
||||||
** if the result is not yet computed.
|
** if the result is not yet computed.
|
||||||
**
|
**
|
||||||
|
@ -91337,7 +91338,7 @@ static int dupedExprStructSize(Expr *p, int flags){
|
||||||
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
|
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
|
||||||
assert( EXPR_FULLSIZE<=0xfff );
|
assert( EXPR_FULLSIZE<=0xfff );
|
||||||
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
|
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
|
||||||
if( 0==flags ){
|
if( 0==flags || p->op==TK_SELECT_COLUMN ){
|
||||||
nSize = EXPR_FULLSIZE;
|
nSize = EXPR_FULLSIZE;
|
||||||
}else{
|
}else{
|
||||||
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
|
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
|
||||||
|
@ -91480,6 +91481,8 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
|
||||||
if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
|
if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
|
||||||
if( pNew->op==TK_SELECT_COLUMN ){
|
if( pNew->op==TK_SELECT_COLUMN ){
|
||||||
pNew->pLeft = p->pLeft;
|
pNew->pLeft = p->pLeft;
|
||||||
|
assert( p->iColumn==0 || p->pRight==0 );
|
||||||
|
assert( p->pRight==0 || p->pRight==p->pLeft );
|
||||||
}else{
|
}else{
|
||||||
pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0);
|
pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0);
|
||||||
}
|
}
|
||||||
|
@ -91542,6 +91545,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
|
||||||
ExprList *pNew;
|
ExprList *pNew;
|
||||||
struct ExprList_item *pItem, *pOldItem;
|
struct ExprList_item *pItem, *pOldItem;
|
||||||
int i;
|
int i;
|
||||||
|
Expr *pPriorSelectCol = 0;
|
||||||
assert( db!=0 );
|
assert( db!=0 );
|
||||||
if( p==0 ) return 0;
|
if( p==0 ) return 0;
|
||||||
pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) );
|
pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) );
|
||||||
|
@ -91556,7 +91560,24 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
|
||||||
pOldItem = p->a;
|
pOldItem = p->a;
|
||||||
for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
|
for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
|
||||||
Expr *pOldExpr = pOldItem->pExpr;
|
Expr *pOldExpr = pOldItem->pExpr;
|
||||||
|
Expr *pNewExpr;
|
||||||
pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
|
pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
|
||||||
|
if( pOldExpr
|
||||||
|
&& pOldExpr->op==TK_SELECT_COLUMN
|
||||||
|
&& (pNewExpr = pItem->pExpr)!=0
|
||||||
|
){
|
||||||
|
assert( pNewExpr->iColumn==0 || i>0 );
|
||||||
|
if( pNewExpr->iColumn==0 ){
|
||||||
|
assert( pOldExpr->pLeft==pOldExpr->pRight );
|
||||||
|
pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight;
|
||||||
|
}else{
|
||||||
|
assert( i>0 );
|
||||||
|
assert( pItem[-1].pExpr!=0 );
|
||||||
|
assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 );
|
||||||
|
assert( pPriorSelectCol==pItem[-1].pExpr->pLeft );
|
||||||
|
pNewExpr->pLeft = pPriorSelectCol;
|
||||||
|
}
|
||||||
|
}
|
||||||
pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
|
pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
|
||||||
pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan);
|
pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan);
|
||||||
pItem->sortOrder = pOldItem->sortOrder;
|
pItem->sortOrder = pOldItem->sortOrder;
|
||||||
|
@ -91748,13 +91769,19 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(
|
||||||
** exit prior to this routine being invoked */
|
** exit prior to this routine being invoked */
|
||||||
if( NEVER(pColumns==0) ) goto vector_append_error;
|
if( NEVER(pColumns==0) ) goto vector_append_error;
|
||||||
if( pExpr==0 ) goto vector_append_error;
|
if( pExpr==0 ) goto vector_append_error;
|
||||||
n = sqlite3ExprVectorSize(pExpr);
|
|
||||||
if( pColumns->nId!=n ){
|
/* If the RHS is a vector, then we can immediately check to see that
|
||||||
|
** the size of the RHS and LHS match. But if the RHS is a SELECT,
|
||||||
|
** wildcards ("*") in the result set of the SELECT must be expanded before
|
||||||
|
** we can do the size check, so defer the size check until code generation.
|
||||||
|
*/
|
||||||
|
if( pExpr->op!=TK_SELECT && pColumns->nId!=(n=sqlite3ExprVectorSize(pExpr)) ){
|
||||||
sqlite3ErrorMsg(pParse, "%d columns assigned %d values",
|
sqlite3ErrorMsg(pParse, "%d columns assigned %d values",
|
||||||
pColumns->nId, n);
|
pColumns->nId, n);
|
||||||
goto vector_append_error;
|
goto vector_append_error;
|
||||||
}
|
}
|
||||||
for(i=0; i<n; i++){
|
|
||||||
|
for(i=0; i<pColumns->nId; i++){
|
||||||
Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i);
|
Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i);
|
||||||
pList = sqlite3ExprListAppend(pParse, pList, pSubExpr);
|
pList = sqlite3ExprListAppend(pParse, pList, pSubExpr);
|
||||||
if( pList ){
|
if( pList ){
|
||||||
|
@ -91763,11 +91790,20 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(
|
||||||
pColumns->a[i].zName = 0;
|
pColumns->a[i].zName = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pExpr->op==TK_SELECT ){
|
if( pExpr->op==TK_SELECT ){
|
||||||
if( pList && pList->a[iFirst].pExpr ){
|
if( pList && pList->a[iFirst].pExpr ){
|
||||||
assert( pList->a[iFirst].pExpr->op==TK_SELECT_COLUMN );
|
Expr *pFirst = pList->a[iFirst].pExpr;
|
||||||
pList->a[iFirst].pExpr->pRight = pExpr;
|
assert( pFirst->op==TK_SELECT_COLUMN );
|
||||||
|
|
||||||
|
/* Store the SELECT statement in pRight so it will be deleted when
|
||||||
|
** sqlite3ExprListDelete() is called */
|
||||||
|
pFirst->pRight = pExpr;
|
||||||
pExpr = 0;
|
pExpr = 0;
|
||||||
|
|
||||||
|
/* Remember the size of the LHS in iTable so that we can check that
|
||||||
|
** the RHS and LHS sizes match during code generation. */
|
||||||
|
pFirst->iTable = pColumns->nId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93961,9 +93997,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_SELECT_COLUMN: {
|
case TK_SELECT_COLUMN: {
|
||||||
|
int n;
|
||||||
if( pExpr->pLeft->iTable==0 ){
|
if( pExpr->pLeft->iTable==0 ){
|
||||||
pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0);
|
pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0);
|
||||||
}
|
}
|
||||||
|
assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT );
|
||||||
|
if( pExpr->iTable
|
||||||
|
&& pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft))
|
||||||
|
){
|
||||||
|
sqlite3ErrorMsg(pParse, "%d columns assigned %d values",
|
||||||
|
pExpr->iTable, n);
|
||||||
|
}
|
||||||
return pExpr->pLeft->iTable + pExpr->iColumn;
|
return pExpr->pLeft->iTable + pExpr->iColumn;
|
||||||
}
|
}
|
||||||
case TK_IN: {
|
case TK_IN: {
|
||||||
|
@ -196772,7 +196816,7 @@ static void fts5SourceIdFunc(
|
||||||
){
|
){
|
||||||
assert( nArg==0 );
|
assert( nArg==0 );
|
||||||
UNUSED_PARAM2(nArg, apUnused);
|
UNUSED_PARAM2(nArg, apUnused);
|
||||||
sqlite3_result_text(pCtx, "fts5: 2017-01-02 11:57:58 04ac0b75b1716541b2b97704f4809cb7ef19cccf", -1, SQLITE_TRANSIENT);
|
sqlite3_result_text(pCtx, "fts5: 2017-01-03 18:27:03 979f04392853b8053817a3eea2fc679947b437fd", -1, SQLITE_TRANSIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fts5Init(sqlite3 *db){
|
static int fts5Init(sqlite3 *db){
|
||||||
|
|
Loading…
Reference in a new issue