mirror of
https://github.com/sqlite/sqlite.git
synced 2025-09-09 21:09:38 +03:00
Raise an error if the argument to VACUUM INTO is an identifier.
FossilOrigin-Name: 6c6fb1c6ea452c70b56fd4ac796affebee21512adba0455ae81c291b715f544f
This commit is contained in:
@@ -1662,36 +1662,45 @@ void sqlite3ResolveSelectNames(
|
||||
}
|
||||
|
||||
/*
|
||||
** Resolve names in expressions that can only reference a single table:
|
||||
** Resolve names in expressions that can only reference a single table
|
||||
** or which cannot reference any tables at all. Examples:
|
||||
**
|
||||
** * CHECK constraints
|
||||
** * WHERE clauses on partial indices
|
||||
** (1) CHECK constraints
|
||||
** (2) WHERE clauses on partial indices
|
||||
** (3) Expressions in indexes on expressions
|
||||
** (4) Expression arguments to VACUUM INTO.
|
||||
**
|
||||
** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression
|
||||
** is set to -1 and the Expr.iColumn value is set to the column number.
|
||||
** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN
|
||||
** nodes of the expression is set to -1 and the Expr.iColumn value is
|
||||
** set to the column number. In case (4), TK_COLUMN nodes cause an error.
|
||||
**
|
||||
** Any errors cause an error message to be set in pParse.
|
||||
*/
|
||||
void sqlite3ResolveSelfReference(
|
||||
int sqlite3ResolveSelfReference(
|
||||
Parse *pParse, /* Parsing context */
|
||||
Table *pTab, /* The table being referenced */
|
||||
int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */
|
||||
Table *pTab, /* The table being referenced, or NULL */
|
||||
int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr, or 0 */
|
||||
Expr *pExpr, /* Expression to resolve. May be NULL. */
|
||||
ExprList *pList /* Expression list to resolve. May be NULL. */
|
||||
){
|
||||
SrcList sSrc; /* Fake SrcList for pParse->pNewTable */
|
||||
NameContext sNC; /* Name context for pParse->pNewTable */
|
||||
int rc;
|
||||
|
||||
assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr );
|
||||
assert( type==0 || pTab!=0 );
|
||||
assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || pTab==0 );
|
||||
memset(&sNC, 0, sizeof(sNC));
|
||||
memset(&sSrc, 0, sizeof(sSrc));
|
||||
sSrc.nSrc = 1;
|
||||
sSrc.a[0].zName = pTab->zName;
|
||||
sSrc.a[0].pTab = pTab;
|
||||
sSrc.a[0].iCursor = -1;
|
||||
if( pTab ){
|
||||
sSrc.nSrc = 1;
|
||||
sSrc.a[0].zName = pTab->zName;
|
||||
sSrc.a[0].pTab = pTab;
|
||||
sSrc.a[0].iCursor = -1;
|
||||
}
|
||||
sNC.pParse = pParse;
|
||||
sNC.pSrcList = &sSrc;
|
||||
sNC.ncFlags = type;
|
||||
if( sqlite3ResolveExprNames(&sNC, pExpr) ) return;
|
||||
if( pList ) sqlite3ResolveExprListNames(&sNC, pList);
|
||||
if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc;
|
||||
if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList);
|
||||
return rc;
|
||||
}
|
||||
|
Reference in New Issue
Block a user