mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Use the sqlite3ColumnIndex() routine to look up a column in a table, rather
than using a custom loop. Performance improvement, size reduction, and complexity decrease. FossilOrigin-Name: 351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8
This commit is contained in:
26
manifest
26
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sGCC-isms\sand\scompiler\swarnings\sintroduced\sby\srecent\scheck-ins\n[c56092507c967230]\sand\s[6e57848fe1e0e2b5].
|
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-08T13:34:19.496
|
D 2025-02-08T14:15:42.707
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
|
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
|
||||||
@@ -712,7 +712,7 @@ F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d
|
|||||||
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
||||||
F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc
|
F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc
|
||||||
F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03
|
F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03
|
||||||
F src/alter.c aa93e37e4a36a0525bbb2a2aeda20d2018f0aa995542c7dc658e031375e3f532
|
F src/alter.c 1751e231d8385067fa0d0145f0d461a092db6bd3d7edbfc3172db625aceccd9a
|
||||||
F src/analyze.c 0823d2edb3ce564157e9d62714cc729027933209b712e95fbabb23e47fff0aec
|
F src/analyze.c 0823d2edb3ce564157e9d62714cc729027933209b712e95fbabb23e47fff0aec
|
||||||
F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9
|
F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9
|
||||||
F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc
|
F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc
|
||||||
@@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
|
|||||||
F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c
|
F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c
|
||||||
F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
|
F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
|
||||||
F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
|
F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
|
||||||
F src/build.c cac3aa87f3bf137e12c77194150fb05c949d36a12177fd3acccdaa3669ca9744
|
F src/build.c 48796a45299dbdf6331bc1bf2eb5319330980f469c1eaaed17d487a381cea488
|
||||||
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
|
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
|
||||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||||
F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b
|
F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b
|
||||||
@@ -730,7 +730,7 @@ F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57
|
|||||||
F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0
|
F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0
|
||||||
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
|
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
|
||||||
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
|
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
|
||||||
F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98
|
F src/expr.c 15fabfb67261e298a39fe61457f3cfa24148d9ca8d02f4dff385feb5cf523ea7
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
|
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
|
||||||
F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a
|
F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a
|
||||||
@@ -739,11 +739,11 @@ F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7
|
|||||||
F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
|
F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
|
||||||
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
|
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
|
||||||
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
||||||
F src/insert.c ccadada52dc508ab8229e343425ab2504db57cfcdf8271f0f9ce1c2c6cad97c1
|
F src/insert.c 05e04ef637cbc0dccb9a5c5d188a5a2608891e554c8ec17c7a71afe2cf896a06
|
||||||
F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22
|
F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22
|
||||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||||
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
|
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
|
||||||
F src/main.c 59bdd8d9bbdb3a746eaef14d611ddd5638aa18acef7c5e3271e815dbd215a1af
|
F src/main.c b99d15d843f7a86adbec855de77b1656dde07359722ef63a9d9393678dbb58d1
|
||||||
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
|
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
|
||||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||||
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
||||||
@@ -778,7 +778,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
|||||||
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
|
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
|
||||||
F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
|
F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
|
||||||
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||||
F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68
|
F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75
|
||||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||||
F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e
|
F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e
|
||||||
F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237
|
F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237
|
||||||
@@ -844,7 +844,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
|||||||
F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9
|
F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9
|
||||||
F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279
|
F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279
|
||||||
F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383
|
F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383
|
||||||
F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508
|
F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
|
||||||
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
|
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
|
||||||
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
|
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
|
||||||
F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850
|
F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850
|
||||||
@@ -854,7 +854,7 @@ F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89
|
|||||||
F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091
|
F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091
|
||||||
F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86
|
F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86
|
||||||
F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b
|
F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b
|
||||||
F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797
|
F src/vdbeblob.c 9166b6eb7054e5da82e35255892fb1ed551355a4716452539e8e3ac14f25fbe3
|
||||||
F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30
|
F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30
|
||||||
F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f
|
F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f
|
||||||
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
|
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
|
||||||
@@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
|
|||||||
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
||||||
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
|
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 6e57848fe1e0e2b533dd65c2bc5fbac660202cf91cb94ac5468a3434e367a087
|
P 91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636
|
||||||
R 2c411617d97350770bd64ca35d94ddfa
|
R 3617bbdf30502e1c991c0fb4581bc1ec
|
||||||
U drh
|
U drh
|
||||||
Z 8dddf39b318eaf54797fe9748f81eadf
|
Z 863c9742465b0aa338b6dd538c7f9637
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636
|
351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8
|
||||||
|
@@ -632,10 +632,8 @@ void sqlite3AlterRenameColumn(
|
|||||||
** altered. Set iCol to be the index of the column being renamed */
|
** altered. Set iCol to be the index of the column being renamed */
|
||||||
zOld = sqlite3NameFromToken(db, pOld);
|
zOld = sqlite3NameFromToken(db, pOld);
|
||||||
if( !zOld ) goto exit_rename_column;
|
if( !zOld ) goto exit_rename_column;
|
||||||
for(iCol=0; iCol<pTab->nCol; iCol++){
|
iCol = sqlite3ColumnIndex(pTab, zOld);
|
||||||
if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break;
|
if( iCol<0 ){
|
||||||
}
|
|
||||||
if( iCol==pTab->nCol ){
|
|
||||||
sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld);
|
sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld);
|
||||||
goto exit_rename_column;
|
goto exit_rename_column;
|
||||||
}
|
}
|
||||||
|
27
src/build.c
27
src/build.c
@@ -1473,7 +1473,6 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){
|
|||||||
char *zType;
|
char *zType;
|
||||||
Column *pCol;
|
Column *pCol;
|
||||||
sqlite3 *db = pParse->db;
|
sqlite3 *db = pParse->db;
|
||||||
u8 hName;
|
|
||||||
Column *aNew;
|
Column *aNew;
|
||||||
u8 eType = COLTYPE_CUSTOM;
|
u8 eType = COLTYPE_CUSTOM;
|
||||||
u8 szEst = 1;
|
u8 szEst = 1;
|
||||||
@@ -1527,13 +1526,11 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){
|
|||||||
memcpy(z, sName.z, sName.n);
|
memcpy(z, sName.z, sName.n);
|
||||||
z[sName.n] = 0;
|
z[sName.n] = 0;
|
||||||
sqlite3Dequote(z);
|
sqlite3Dequote(z);
|
||||||
hName = sqlite3StrIHash(z);
|
i = sqlite3ColumnIndex(p, z);
|
||||||
for(i=0; i<p->nCol; i++){
|
if( i>=0 ){
|
||||||
if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zCnName)==0 ){
|
sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
|
||||||
sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
|
sqlite3DbFree(db, z);
|
||||||
sqlite3DbFree(db, z);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
aNew = sqlite3DbRealloc(db,p->aCol,((i64)p->nCol+1)*sizeof(p->aCol[0]));
|
aNew = sqlite3DbRealloc(db,p->aCol,((i64)p->nCol+1)*sizeof(p->aCol[0]));
|
||||||
if( aNew==0 ){
|
if( aNew==0 ){
|
||||||
@@ -1544,7 +1541,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){
|
|||||||
pCol = &p->aCol[p->nCol];
|
pCol = &p->aCol[p->nCol];
|
||||||
memset(pCol, 0, sizeof(p->aCol[0]));
|
memset(pCol, 0, sizeof(p->aCol[0]));
|
||||||
pCol->zCnName = z;
|
pCol->zCnName = z;
|
||||||
pCol->hName = hName;
|
pCol->hName = sqlite3StrIHash(z);
|
||||||
sqlite3ColumnPropertiesFromName(p, pCol);
|
sqlite3ColumnPropertiesFromName(p, pCol);
|
||||||
|
|
||||||
if( sType.n==0 ){
|
if( sType.n==0 ){
|
||||||
@@ -1835,15 +1832,11 @@ void sqlite3AddPrimaryKey(
|
|||||||
assert( pCExpr!=0 );
|
assert( pCExpr!=0 );
|
||||||
sqlite3StringToId(pCExpr);
|
sqlite3StringToId(pCExpr);
|
||||||
if( pCExpr->op==TK_ID ){
|
if( pCExpr->op==TK_ID ){
|
||||||
const char *zCName;
|
|
||||||
assert( !ExprHasProperty(pCExpr, EP_IntValue) );
|
assert( !ExprHasProperty(pCExpr, EP_IntValue) );
|
||||||
zCName = pCExpr->u.zToken;
|
iCol = sqlite3ColumnIndex(pTab, pCExpr->u.zToken);
|
||||||
for(iCol=0; iCol<pTab->nCol; iCol++){
|
if( iCol>=0 ){
|
||||||
if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){
|
pCol = &pTab->aCol[iCol];
|
||||||
pCol = &pTab->aCol[iCol];
|
makeColumnPartOfPrimaryKey(pParse, pCol);
|
||||||
makeColumnPartOfPrimaryKey(pParse, pCol);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2966,13 +2966,7 @@ const char *sqlite3RowidAlias(Table *pTab){
|
|||||||
int ii;
|
int ii;
|
||||||
assert( VisibleRowid(pTab) );
|
assert( VisibleRowid(pTab) );
|
||||||
for(ii=0; ii<ArraySize(azOpt); ii++){
|
for(ii=0; ii<ArraySize(azOpt); ii++){
|
||||||
int iCol;
|
if( sqlite3ColumnIndex(pTab, azOpt[ii])<0 ) return azOpt[ii];
|
||||||
for(iCol=0; iCol<pTab->nCol; iCol++){
|
|
||||||
if( sqlite3_stricmp(azOpt[ii], pTab->aCol[iCol].zCnName)==0 ) break;
|
|
||||||
}
|
|
||||||
if( iCol==pTab->nCol ){
|
|
||||||
return azOpt[ii];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
36
src/insert.c
36
src/insert.c
@@ -1075,28 +1075,22 @@ void sqlite3Insert(
|
|||||||
aTabColMap = sqlite3DbMallocZero(db, pTab->nCol*sizeof(int));
|
aTabColMap = sqlite3DbMallocZero(db, pTab->nCol*sizeof(int));
|
||||||
if( aTabColMap==0 ) goto insert_cleanup;
|
if( aTabColMap==0 ) goto insert_cleanup;
|
||||||
for(i=0; i<pColumn->nId; i++){
|
for(i=0; i<pColumn->nId; i++){
|
||||||
const char *zCName = pColumn->a[i].zName;
|
j = sqlite3ColumnIndex(pTab, pColumn->a[i].zName);
|
||||||
u8 hName = sqlite3StrIHash(zCName);
|
if( j>=0 ){
|
||||||
for(j=0; j<pTab->nCol; j++){
|
if( aTabColMap[j]==0 ) aTabColMap[j] = i+1;
|
||||||
if( pTab->aCol[j].hName!=hName ) continue;
|
if( i!=j ) bIdListInOrder = 0;
|
||||||
if( sqlite3StrICmp(zCName, pTab->aCol[j].zCnName)==0 ){
|
if( j==pTab->iPKey ){
|
||||||
if( aTabColMap[j]==0 ) aTabColMap[j] = i+1;
|
ipkColumn = i; assert( !withoutRowid );
|
||||||
if( i!=j ) bIdListInOrder = 0;
|
|
||||||
if( j==pTab->iPKey ){
|
|
||||||
ipkColumn = i; assert( !withoutRowid );
|
|
||||||
}
|
|
||||||
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
|
|
||||||
if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){
|
|
||||||
sqlite3ErrorMsg(pParse,
|
|
||||||
"cannot INSERT into generated column \"%s\"",
|
|
||||||
pTab->aCol[j].zCnName);
|
|
||||||
goto insert_cleanup;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
|
||||||
if( j>=pTab->nCol ){
|
if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){
|
||||||
|
sqlite3ErrorMsg(pParse,
|
||||||
|
"cannot INSERT into generated column \"%s\"",
|
||||||
|
pTab->aCol[j].zCnName);
|
||||||
|
goto insert_cleanup;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}else{
|
||||||
if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){
|
if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){
|
||||||
ipkColumn = i;
|
ipkColumn = i;
|
||||||
bIdListInOrder = 0;
|
bIdListInOrder = 0;
|
||||||
|
@@ -3943,13 +3943,10 @@ int sqlite3_table_column_metadata(
|
|||||||
if( zColumnName==0 ){
|
if( zColumnName==0 ){
|
||||||
/* Query for existence of table only */
|
/* Query for existence of table only */
|
||||||
}else{
|
}else{
|
||||||
for(iCol=0; iCol<pTab->nCol; iCol++){
|
iCol = sqlite3ColumnIndex(pTab, zColumnName);
|
||||||
|
if( iCol>=0 ){
|
||||||
pCol = &pTab->aCol[iCol];
|
pCol = &pTab->aCol[iCol];
|
||||||
if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){
|
}else{
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( iCol==pTab->nCol ){
|
|
||||||
if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){
|
if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){
|
||||||
iCol = pTab->iPKey;
|
iCol = pTab->iPKey;
|
||||||
pCol = iCol>=0 ? &pTab->aCol[iCol] : 0;
|
pCol = iCol>=0 ? &pTab->aCol[iCol] : 0;
|
||||||
|
@@ -294,7 +294,6 @@ static int lookupName(
|
|||||||
Schema *pSchema = 0; /* Schema of the expression */
|
Schema *pSchema = 0; /* Schema of the expression */
|
||||||
int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */
|
int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */
|
||||||
Table *pTab = 0; /* Table holding the row */
|
Table *pTab = 0; /* Table holding the row */
|
||||||
Column *pCol; /* A column of pTab */
|
|
||||||
ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */
|
ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */
|
||||||
const char *zCol = pRight->u.zToken;
|
const char *zCol = pRight->u.zToken;
|
||||||
|
|
||||||
@@ -345,7 +344,6 @@ static int lookupName(
|
|||||||
|
|
||||||
if( pSrcList ){
|
if( pSrcList ){
|
||||||
for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){
|
for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){
|
||||||
u8 hCol;
|
|
||||||
pTab = pItem->pSTab;
|
pTab = pItem->pSTab;
|
||||||
assert( pTab!=0 && pTab->zName!=0 );
|
assert( pTab!=0 && pTab->zName!=0 );
|
||||||
assert( pTab->nCol>0 || pParse->nErr );
|
assert( pTab->nCol>0 || pParse->nErr );
|
||||||
@@ -433,43 +431,38 @@ static int lookupName(
|
|||||||
sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab);
|
sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hCol = sqlite3StrIHash(zCol);
|
j = sqlite3ColumnIndex(pTab, zCol);
|
||||||
for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
|
if( j>=0 ){
|
||||||
if( pCol->hName==hCol
|
if( cnt>0 ){
|
||||||
&& sqlite3StrICmp(pCol->zCnName, zCol)==0
|
if( pItem->fg.isUsing==0
|
||||||
){
|
|| sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
|
||||||
if( cnt>0 ){
|
){
|
||||||
if( pItem->fg.isUsing==0
|
/* Two or more tables have the same column name which is
|
||||||
|| sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
|
** not joined by USING. This is an error. Signal as much
|
||||||
){
|
** by clearing pFJMatch and letting cnt go above 1. */
|
||||||
/* Two or more tables have the same column name which is
|
sqlite3ExprListDelete(db, pFJMatch);
|
||||||
** not joined by USING. This is an error. Signal as much
|
pFJMatch = 0;
|
||||||
** by clearing pFJMatch and letting cnt go above 1. */
|
}else
|
||||||
sqlite3ExprListDelete(db, pFJMatch);
|
if( (pItem->fg.jointype & JT_RIGHT)==0 ){
|
||||||
pFJMatch = 0;
|
/* An INNER or LEFT JOIN. Use the left-most table */
|
||||||
}else
|
continue;
|
||||||
if( (pItem->fg.jointype & JT_RIGHT)==0 ){
|
}else
|
||||||
/* An INNER or LEFT JOIN. Use the left-most table */
|
if( (pItem->fg.jointype & JT_LEFT)==0 ){
|
||||||
continue;
|
/* A RIGHT JOIN. Use the right-most table */
|
||||||
}else
|
cnt = 0;
|
||||||
if( (pItem->fg.jointype & JT_LEFT)==0 ){
|
sqlite3ExprListDelete(db, pFJMatch);
|
||||||
/* A RIGHT JOIN. Use the right-most table */
|
pFJMatch = 0;
|
||||||
cnt = 0;
|
}else{
|
||||||
sqlite3ExprListDelete(db, pFJMatch);
|
/* For a FULL JOIN, we must construct a coalesce() func */
|
||||||
pFJMatch = 0;
|
extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
|
||||||
}else{
|
|
||||||
/* For a FULL JOIN, we must construct a coalesce() func */
|
|
||||||
extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
cnt++;
|
}
|
||||||
pMatch = pItem;
|
cnt++;
|
||||||
/* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
|
pMatch = pItem;
|
||||||
pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j;
|
/* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
|
||||||
if( pItem->fg.isNestedFrom ){
|
pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j;
|
||||||
sqlite3SrcItemColumnUsed(pItem, j);
|
if( pItem->fg.isNestedFrom ){
|
||||||
}
|
sqlite3SrcItemColumnUsed(pItem, j);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( 0==cnt && VisibleRowid(pTab) ){
|
if( 0==cnt && VisibleRowid(pTab) ){
|
||||||
@@ -559,23 +552,18 @@ static int lookupName(
|
|||||||
|
|
||||||
if( pTab ){
|
if( pTab ){
|
||||||
int iCol;
|
int iCol;
|
||||||
u8 hCol = sqlite3StrIHash(zCol);
|
|
||||||
pSchema = pTab->pSchema;
|
pSchema = pTab->pSchema;
|
||||||
cntTab++;
|
cntTab++;
|
||||||
for(iCol=0, pCol=pTab->aCol; iCol<pTab->nCol; iCol++, pCol++){
|
iCol = sqlite3ColumnIndex(pTab, zCol);
|
||||||
if( pCol->hName==hCol
|
if( iCol>=0 ){
|
||||||
&& sqlite3StrICmp(pCol->zCnName, zCol)==0
|
if( pTab->iPKey==iCol ) iCol = -1;
|
||||||
){
|
}else{
|
||||||
if( iCol==pTab->iPKey ){
|
if( sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){
|
||||||
iCol = -1;
|
iCol = -1;
|
||||||
}
|
}else{
|
||||||
break;
|
iCol = pTab->nCol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){
|
|
||||||
/* IMP: R-51414-32910 */
|
|
||||||
iCol = -1;
|
|
||||||
}
|
|
||||||
if( iCol<pTab->nCol ){
|
if( iCol<pTab->nCol ){
|
||||||
cnt++;
|
cnt++;
|
||||||
pMatch = 0;
|
pMatch = 0;
|
||||||
|
46
src/update.c
46
src/update.c
@@ -465,38 +465,32 @@ void sqlite3Update(
|
|||||||
*/
|
*/
|
||||||
chngRowid = chngPk = 0;
|
chngRowid = chngPk = 0;
|
||||||
for(i=0; i<pChanges->nExpr; i++){
|
for(i=0; i<pChanges->nExpr; i++){
|
||||||
u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName);
|
|
||||||
/* If this is an UPDATE with a FROM clause, do not resolve expressions
|
/* If this is an UPDATE with a FROM clause, do not resolve expressions
|
||||||
** here. The call to sqlite3Select() below will do that. */
|
** here. The call to sqlite3Select() below will do that. */
|
||||||
if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
|
if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
|
||||||
goto update_cleanup;
|
goto update_cleanup;
|
||||||
}
|
}
|
||||||
for(j=0; j<pTab->nCol; j++){
|
j = sqlite3ColumnIndex(pTab, pChanges->a[i].zEName);
|
||||||
if( pTab->aCol[j].hName==hCol
|
if( j>=0 ){
|
||||||
&& sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0
|
if( j==pTab->iPKey ){
|
||||||
){
|
chngRowid = 1;
|
||||||
if( j==pTab->iPKey ){
|
pRowidExpr = pChanges->a[i].pExpr;
|
||||||
chngRowid = 1;
|
iRowidExpr = i;
|
||||||
pRowidExpr = pChanges->a[i].pExpr;
|
}else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){
|
||||||
iRowidExpr = i;
|
chngPk = 1;
|
||||||
}else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){
|
|
||||||
chngPk = 1;
|
|
||||||
}
|
|
||||||
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
|
|
||||||
else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){
|
|
||||||
testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL );
|
|
||||||
testcase( pTab->aCol[j].colFlags & COLFLAG_STORED );
|
|
||||||
sqlite3ErrorMsg(pParse,
|
|
||||||
"cannot UPDATE generated column \"%s\"",
|
|
||||||
pTab->aCol[j].zCnName);
|
|
||||||
goto update_cleanup;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
aXRef[j] = i;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
|
||||||
if( j>=pTab->nCol ){
|
else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){
|
||||||
|
testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL );
|
||||||
|
testcase( pTab->aCol[j].colFlags & COLFLAG_STORED );
|
||||||
|
sqlite3ErrorMsg(pParse,
|
||||||
|
"cannot UPDATE generated column \"%s\"",
|
||||||
|
pTab->aCol[j].zCnName);
|
||||||
|
goto update_cleanup;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
aXRef[j] = i;
|
||||||
|
}else{
|
||||||
if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){
|
if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){
|
||||||
j = -1;
|
j = -1;
|
||||||
chngRowid = 1;
|
chngRowid = 1;
|
||||||
|
@@ -192,12 +192,8 @@ int sqlite3_blob_open(
|
|||||||
pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName;
|
pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName;
|
||||||
|
|
||||||
/* Now search pTab for the exact column. */
|
/* Now search pTab for the exact column. */
|
||||||
for(iCol=0; iCol<pTab->nCol; iCol++) {
|
iCol = sqlite3ColumnIndex(pTab, zColumn);
|
||||||
if( sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn)==0 ){
|
if( iCol<0 ){
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( iCol==pTab->nCol ){
|
|
||||||
sqlite3DbFree(db, zErr);
|
sqlite3DbFree(db, zErr);
|
||||||
zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn);
|
zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn);
|
||||||
rc = SQLITE_ERROR;
|
rc = SQLITE_ERROR;
|
||||||
|
Reference in New Issue
Block a user