]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Tie up the loose ends in the ExprList size reduction. exprlist-size-reduction
authordrh <drh@noemail.net>
Fri, 13 Dec 2019 00:49:42 +0000 (00:49 +0000)
committerdrh <drh@noemail.net>
Fri, 13 Dec 2019 00:49:42 +0000 (00:49 +0000)
FossilOrigin-Name: 59d0f3afe5249a2a6453fe7bc810c2c7beb896d3800174c7c90f9304c0b1ad88

manifest
manifest.uuid
src/alter.c
src/expr.c
src/resolve.c
src/select.c
src/sqliteInt.h

index e886d85f407afe1b4ee21b827957d6eb034e8304..e65f7b1b680b755c16a4f40fa521077ca05d805f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Work\stoward\sreducing\sthe\sincremental\ssize\sof\san\sExprList\sobject\sto\s24-byte\nper\sentry,\sfrom\s32-bytes\s(on\sa\s64-bit\smachine).\s\sThis\shelps\sthe\snew\nmini-lookaside\sallocator\sto\srun\sbetter\sby\savoiding\sexcessive\sreallocs.\nThe\scurrent\schange\smostly\sworks,\sbut\sstill\shas\sa\sfew\sloose\sends\sto\stie\sup.\nThis\scheck-in\sis\smerely\sa\ssnapshot\sto\ssave\smy\swork.
-D 2019-12-12T22:11:33.445
+C Tie\sup\sthe\sloose\sends\sin\sthe\sExprList\ssize\sreduction.
+D 2019-12-13T00:49:42.494
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c 27aaf1045f52876320b431f4b45d9c1e5786899de41cec2bea39620095ab9aa7
+F src/alter.c accee2f80a2db2cb0ca253a62704ab9fad0e8355b0e4b372f0d3bfdf7737a8e3
 F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c
 F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80
 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06
@@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa
 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4
-F src/expr.c 828bc6ae0c15e60a5b0a5fb17ddf98fb3f9a52752fb34cbbdc15ea4868afcf90
+F src/expr.c a4c16d4eed1508377bb8aba71471f3f023edb2ebd79fb7ba3bf379b1e54a6cb7
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847
 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12
@@ -525,14 +525,14 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04
 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
-F src/resolve.c fc7bed8f23355db3af73859b4af42af4ee2f7cf3467aa5e242321575203e2896
+F src/resolve.c 347c0624f83451803530668055665f770afa851a35a09cb429a7a4749c61706f
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c b5702ca6b2f215bb8bee27f591d72dfd52250a680b5fa11871a1a7be69dff758
+F src/select.c 3590f0641817f0d3af4211315ff91abd197f7c03ba8d20129388af8dcdb707f3
 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded
 F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
-F src/sqliteInt.h 5be56f6523e0980b4ab66d6420e11dbe66c060c7b2e20aa28344fd67457cbe32
+F src/sqliteInt.h 344e090acc6491b86c4e4368dbac3b679ecf169be0675f567c6e72e71895cadf
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -1852,10 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f
-R 162199bc809f1616aa82013813cc7e3c
-T *branch * exprlist-size-reduction
-T *sym-exprlist-size-reduction *
-T -sym-mini-lookaside-take-2 *
+P fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b
+R 1f0ba04ae14155cebfb37c7f11e00a7b
 U drh
-Z 2404f597cd0a4292958003b4ec4cbb04
+Z 64cc739752f0df56bd4f170960481f66
index fe20eceadf7c892f918d07ed855a09b090649b0c..c0090acd671b57693bb909b86a853d7ce453bac3 100644 (file)
@@ -1 +1 @@
-fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b
\ No newline at end of file
+59d0f3afe5249a2a6453fe7bc810c2c7beb896d3800174c7c90f9304c0b1ad88
\ No newline at end of file
index f3467fa09eb92c4b3bbefe446d9b0f898219e95b..3bc779a1e948d5ad94a063a813b797e92df9e802 100644 (file)
@@ -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);
       }
     }
index 0ca1d0407767b81570f26bfb7515060b989e08f3..150e34a2c1538f1407b755867fbe1c5b18499028 100644 (file)
@@ -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 ){
index cce92103138e02a53355c24dd04cf6a766638f09..572e0a9f3c8c8d4d592a431d6d279d56cf48e70c 100644 (file)
@@ -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;
       }
     }
index 57bf685ede2e68465403459a9bdd5a2e76299cc9..11c25e78762f6ec625ce32953a0f124bb79160c7 100644 (file)
@@ -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;
             }
index 7425b29887626812b48756f10bd79aaaf16a404a..d022436d3864a9494ee46fa95c05112819e4b345 100644 (file)
@@ -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*);