aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-12-13 00:49:42 +0000
committerdrh <drh@noemail.net>2019-12-13 00:49:42 +0000
commitc4938ea2ba17cdba4bd03a23b2f3cfd783f79c0a (patch)
treee2ac0d6c5ff55d0ab7e44b6b1a62c7b7ca697812 /src
parentcbb9da337e7f8dc4e6bea59399a0394ec390f1f2 (diff)
downloadsqlite-c4938ea2ba17cdba4bd03a23b2f3cfd783f79c0a.tar.gz
sqlite-c4938ea2ba17cdba4bd03a23b2f3cfd783f79c0a.zip
Tie up the loose ends in the ExprList size reduction.
FossilOrigin-Name: 59d0f3afe5249a2a6453fe7bc810c2c7beb896d3800174c7c90f9304c0b1ad88
Diffstat (limited to 'src')
-rw-r--r--src/alter.c10
-rw-r--r--src/expr.c1
-rw-r--r--src/resolve.c21
-rw-r--r--src/select.c2
-rw-r--r--src/sqliteInt.h23
5 files changed, 38 insertions, 19 deletions
diff --git a/src/alter.c b/src/alter.c
index f3467fa09..3bc779a1e 100644
--- a/src/alter.c
+++ b/src/alter.c
@@ -764,7 +764,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){
if( ALWAYS(p->pEList) ){
ExprList *pList = p->pEList;
for(i=0; i<pList->nExpr; i++){
- if( pList->a[i].zEName ){
+ if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){
sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName);
}
}
@@ -808,7 +808,9 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){
sWalker.xExprCallback = renameUnmapExprCb;
sqlite3WalkExprList(&sWalker, pEList);
for(i=0; i<pEList->nExpr; i++){
- sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
+ if( pEList->a[i].eEName==ENAME_NAME ){
+ sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
+ }
}
}
}
@@ -947,7 +949,9 @@ static void renameColumnElistNames(
int i;
for(i=0; i<pEList->nExpr; i++){
char *zName = pEList->a[i].zEName;
- if( 0==sqlite3_stricmp(zName, zOld) ){
+ if( pEList->a[i].eEName==ENAME_NAME
+ && 0==sqlite3_stricmp(zName, zOld)
+ ){
renameTokenFind(pParse, pCtx, (void*)zName);
}
}
diff --git a/src/expr.c b/src/expr.c
index 0ca1d0407..150e34a2c 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1745,6 +1745,7 @@ void sqlite3ExprListSetName(
assert( pList->nExpr>0 );
pItem = &pList->a[pList->nExpr-1];
assert( pItem->zEName==0 );
+ assert( pItem->eEName==ENAME_NAME );
pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
if( dequote ) sqlite3Dequote(pItem->zEName);
if( IN_RENAME_OBJECT ){
diff --git a/src/resolve.c b/src/resolve.c
index cce921031..572e0a9f3 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -132,13 +132,16 @@ static int nameInUsingClause(IdList *pUsing, const char *zCol){
** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will
** match anything.
*/
-int sqlite3MatchSpanName(
- const char *zSpan,
+int sqlite3MatchEName(
+ const struct ExprList_item *pItem,
const char *zCol,
const char *zTab,
const char *zDb
){
int n;
+ const char *zSpan;
+ if( pItem->eEName!=ENAME_TAB ) return 0;
+ zSpan = pItem->zEName;
for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){}
if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){
return 0;
@@ -267,7 +270,7 @@ static int lookupName(
int hit = 0;
pEList = pItem->pSelect->pEList;
for(j=0; j<pEList->nExpr; j++){
- if( sqlite3MatchSpanName(pEList->a[j].zEName, zCol, zTab, zDb) ){
+ if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){
cnt++;
cntTab = 2;
pMatch = pItem;
@@ -448,8 +451,11 @@ static int lookupName(
pEList = pNC->uNC.pEList;
assert( pEList!=0 );
for(j=0; j<pEList->nExpr; j++){
- char *zAs = pEList->a[j].zEName;
- if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
+ char *zAs;
+ if( pEList->a[j].eEName==ENAME_NAME
+ && (zAs = pEList->a[j].zEName)!=0
+ && sqlite3StrICmp(zAs, zCol)==0
+ ){
Expr *pOrig;
assert( pExpr->pLeft==0 && pExpr->pRight==0 );
assert( pExpr->x.pList==0 );
@@ -1116,7 +1122,10 @@ static int resolveAsName(
char *zCol = pE->u.zToken;
for(i=0; i<pEList->nExpr; i++){
char *zAs = pEList->a[i].zEName;
- if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
+ if( pEList->a[i].eEName==ENAME_NAME
+ && (zAs = pEList->a[i].zEName)!=0
+ && sqlite3StrICmp(zAs, zCol)==0
+ ){
return i+1;
}
}
diff --git a/src/select.c b/src/select.c
index 57bf685ed..11c25e787 100644
--- a/src/select.c
+++ b/src/select.c
@@ -5044,7 +5044,7 @@ static int selectExpander(Walker *pWalker, Select *p){
assert( zName );
if( zTName && pSub
- && sqlite3MatchSpanName(pSub->pEList->a[j].zEName, 0, zTName, 0)==0
+ && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0
){
continue;
}
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 7425b2988..d022436d3 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -2653,16 +2653,16 @@ struct Expr {
** In order to try to keep memory usage down, the Expr.a.zEName field
** is used for multiple purposes:
**
-** bNameIsTab bNameIsSpan Usage
-** ---------- ----------- -------------------------
-** false false (1) the AS of result set column
-** (2) COLUMN= of an UPDATE
+** eEName Usage
+** ---------- -------------------------
+** ENAME_NAME (1) the AS of result set column
+** (2) COLUMN= of an UPDATE
**
-** true false DB.TABLE.NAME used to resolve names
-** of subqueries
+** ENAME_TAB DB.TABLE.NAME used to resolve names
+** of subqueries
**
-** false true Text of the original result set
-** expression.
+** ENAME_SPAN Text of the original result set
+** expression.
*/
struct ExprList {
int nExpr; /* Number of expressions on the list */
@@ -4430,7 +4430,12 @@ void sqlite3CodeRhsOfIN(Parse*, Expr*, int);
int sqlite3CodeSubselect(Parse*, Expr*);
void sqlite3SelectPrep(Parse*, Select*, NameContext*);
void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p);
-int sqlite3MatchSpanName(const char*, const char*, const char*, const char*);
+int sqlite3MatchEName(
+ const struct ExprList_item*,
+ const char*,
+ const char*,
+ const char*
+);
int sqlite3ResolveExprNames(NameContext*, Expr*);
int sqlite3ResolveExprListNames(NameContext*, ExprList*);
void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*);