]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Put a 16-byte hash table for column names on each Table object, to speed
authordrh <>
Sat, 8 Feb 2025 16:16:08 +0000 (16:16 +0000)
committerdrh <>
Sat, 8 Feb 2025 16:16:08 +0000 (16:16 +0000)
up column name lookups.

FossilOrigin-Name: 11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f

manifest
manifest.uuid
src/build.c
src/select.c
src/sqliteInt.h

index adfd9058d88054a35419f17ae51aa79bca2ba367..66664febfff1ecb2286f15555f55c0426729051e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Use\sthe\ssqlite3ColumnIndex()\sroutine\sto\slook\sup\sa\scolumn\sin\sa\stable,\srather\nthan\susing\sa\scustom\sloop.\s\sPerformance\simprovement,\ssize\sreduction,\sand\ncomplexity\sdecrease.
-D 2025-02-08T14:15:42.707
+C Put\sa\s16-byte\shash\stable\sfor\scolumn\snames\son\seach\sTable\sobject,\sto\sspeed\nup\scolumn\sname\slookups.
+D 2025-02-08T16:16:08.621
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c
 F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
-F src/build.c 48796a45299dbdf6331bc1bf2eb5319330980f469c1eaaed17d487a381cea488
+F src/build.c 83c43ddb517a15673d1dc17f88ea8cd1db06e0d277e6dc666ac8985017a99ac5
 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b
@@ -780,12 +780,12 @@ F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e
+F src/select.c 5c8ac3f0b7dd72745719f0137119a6f9016a9c2633a7351ef11c00a43b4c0944
 F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237
 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h 7585b45f585c82f803ab89ccd475819c6dfb9eae0dc2afcae62c9d894137e0e8
+F src/sqliteInt.h 8cbfef6c26efd539eb93011905f4d3ce7fdb77475d1280764d86f9e7954c464b
 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523
 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636
-R 3617bbdf30502e1c991c0fb4581bc1ec
+P 351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8
+R cda99bdc5b1dd85ef2acf18a1826a5a1
 U drh
-Z 863c9742465b0aa338b6dd538c7f9637
+Z c5517dc029ab4cf78c2ac97792e86679
 # Remove this line to create a well-formed Fossil manifest.
index a40ac617bb374a1198a53f1288e65591fd9e24ab..c62113f3d69454f214c9224240a50eff959ea125 100644 (file)
@@ -1 +1 @@
-351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8
+11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f
index 2e28af2d1ffcd440f2a6622f8f66f495f90f33c1..7b80425291ae8f9629f7901a15ae55a1985028c2 100644 (file)
@@ -1565,6 +1565,10 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){
     pCol->affinity = sqlite3AffinityType(zType, pCol);
     pCol->colFlags |= COLFLAG_HASTYPE;
   }
+  if( p->nCol<=0xff ){
+    u8 h = pCol->hName % sizeof(p->aHx);
+    p->aHx[h] = p->nCol;
+  }
   p->nCol++;
   p->nNVCol++;
   assert( pParse->isCreate );
index cf25c8e678e7b82777e4f613b3e6da930a0f6bf9..e848c46a39c25a807b97b8c3d1760d6499c79f52 100644 (file)
@@ -319,10 +319,32 @@ int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){
 */
 int sqlite3ColumnIndex(Table *pTab, const char *zCol){
   int i;
-  u8 h = sqlite3StrIHash(zCol);
+  u8 h;
   Column *pCol;
-  for(pCol=pTab->aCol, i=0; i<pTab->nCol; pCol++, i++){
-    if( pCol->hName==h && sqlite3StrICmp(pCol->zCnName, zCol)==0 ) return i;
+
+  if( pTab->nCol==0 ){
+    return -1;
+  }
+  h = sqlite3StrIHash(zCol);
+
+  i = pTab->aHx[h % sizeof(pTab->aHx)];
+  assert( i<pTab->nCol );
+  if( pTab->aCol[i].hName==h
+   && sqlite3StrICmp(pTab->aCol[i].zCnName, zCol)==0
+  ){
+    return i;
+  }
+  pCol = pTab->aCol;
+  i = 0;
+  while( 1 /*exit-by-break*/ ){
+    if( pCol->hName==h
+     && sqlite3StrICmp(pCol->zCnName, zCol)==0
+    ){
+      return i;
+    }
+    i++;
+    if( i>=pTab->nCol ) break;
+    pCol++;
   }
   return -1;
 }
index e46744a129e0f706abf77e6eb003900cb24902cb..c8ecaf85712e3f819cb6a282b732fb6befde7552 100644 (file)
@@ -2431,6 +2431,7 @@ struct Table {
   } u;
   Trigger *pTrigger;   /* List of triggers on this object */
   Schema *pSchema;     /* Schema that contains this table */
+  u8 aHx[16];          /* Column aHt[K%sizeof(aHt)] might have hash K */
 };
 
 /*