1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-05 15:55:57 +03:00

Make use of the flexible-array feature of C99, when available, to try to

pacify -fsanitize=strict-bounds.  This check-in fixes the core. There is
more yet to do in FTS3, RTREE, and in FTS5.

FossilOrigin-Name: 6fd6b32d06bd6a705e5140cd613af823b8183a6f6a9ceeeedfcf5e8b50821d68
This commit is contained in:
drh
2025-03-14 18:10:02 +00:00
parent dae87df198
commit cebf06c798
17 changed files with 175 additions and 108 deletions

View File

@@ -1,5 +1,5 @@
C Fix\san\sinternal\sdoc\stypo\sreported\sin\s[forum:e25e581f917|forum\spost\se25e581f917]. C Make\suse\sof\sthe\sflexible-array\sfeature\sof\sC99,\swhen\savailable,\sto\stry\sto\npacify\s-fsanitize=strict-bounds.\s\sThis\scheck-in\sfixes\sthe\score.\sThere\sis\nmore\syet\sto\sdo\sin\sFTS3,\sRTREE,\sand\sin\sFTS5.
D 2025-03-14T12:37:36.487 D 2025-03-14T18:10:02.673
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
@@ -725,14 +725,14 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea
F src/btree.c 00fcee37947641f48d4b529d96143e74d056b7afa8f26d61292c90ee59c056b2 F src/btree.c 00fcee37947641f48d4b529d96143e74d056b7afa8f26d61292c90ee59c056b2
F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
F src/build.c 20793695ef64d2d0c147501e37f344f828f09f16d346a987b516316186030996 F src/build.c 3fe9b9d0f411cc2139a2d5ffa1c9b555417f89332f4dbf7f8e311c2e69e40c81
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/date.c 9db4d604e699a73e10b8e85a44db074a1f04c0591a77e2abfd77703f50dce1e9 F src/date.c 9db4d604e699a73e10b8e85a44db074a1f04c0591a77e2abfd77703f50dce1e9
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 f27e2692e65f0600cf4c989ec2af36bdfab52ada6365c0cc0f434630157b877f F src/expr.c 61c3baab38f1b50eb4696e1f37c8f7ae1d1ecbfc1a35d446cfd1886624784131
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
F src/func.c 7686ea382b20e8bfe2ab9de76150c99ee7b6e83523561f3c7787e0f68cb435c2 F src/func.c 7686ea382b20e8bfe2ab9de76150c99ee7b6e83523561f3c7787e0f68cb435c2
@@ -745,7 +745,7 @@ F src/insert.c a5f0366266be993ebf533808f22cb7a788624805b55bc45424ceed3f48c54a16
F src/json.c 81e2012796a0e139b18c50ee3444c8ef86a020ab360511882216f5b610657e0c F src/json.c 81e2012796a0e139b18c50ee3444c8ef86a020ab360511882216f5b610657e0c
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
F src/main.c 5102588cbe7668d5ee19fd9945546e4f1fd99e41815432decf5dd29f01f55597 F src/main.c 07f78d917ffcdf327982840cfd8e855fd000527a2ea5ace372ce4febcbd0bf97
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
@@ -779,14 +779,14 @@ F src/pragma.c 30b535d0a66348df844ee36f890617b4cf45e9a22dcbc47ec3ca92909c50aaf1
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126 F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
F src/printf.c 33fc0d7643c848a098afdcb6e1db6de12379d47084b1cd0912cfce1d09345e44 F src/printf.c 33fc0d7643c848a098afdcb6e1db6de12379d47084b1cd0912cfce1d09345e44
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75 F src/resolve.c 20e1fbe8f840ffc0cd835e33f68a802a22e34faa918d7a269f3de242fda02f99
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c df63f64ef91c132dd12d37c876653f8b5493d2d5cf330a27158912ee5a065451 F src/select.c 8c273248e38a8a7286abe3f41c1931cc65eff602fef128acc0cc0484e1b7abb3
F src/shell.c.in 248050551cad788f8bb4b4728e00d8e36a10130d2d101e55cd51cfee03df91ff F src/shell.c.in 248050551cad788f8bb4b4728e00d8e36a10130d2d101e55cd51cfee03df91ff
F src/sqlite.h.in fd70afd92948cf7cc93f687ac960bad1b0b6fbc436752419eff2fd65a1809380 F src/sqlite.h.in fd70afd92948cf7cc93f687ac960bad1b0b6fbc436752419eff2fd65a1809380
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
F src/sqliteInt.h 130217107c0425ab43d098c6eadf8aa2e1a037e26d79384127e2d950b27eec77 F src/sqliteInt.h 79d0f2705e62a1acaa11c10ac723749726ebbd96fb9be9f93c31fb44bdd4da1f
F src/sqliteLimit.h 6d817c28a8f19af95e6f4921933b7fbbca48a962bce0eb0ec81e8bb3ef38e68b F src/sqliteLimit.h 6d817c28a8f19af95e6f4921933b7fbbca48a962bce0eb0ec81e8bb3ef38e68b
F src/status.c 0e72e4f6be6ccfde2488eb63210297e75f569f3ce9920f6c3d77590ec6ce5ffd F src/status.c 0e72e4f6be6ccfde2488eb63210297e75f569f3ce9920f6c3d77590ec6ce5ffd
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -844,30 +844,30 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c 3e37ac2b6cbb9b0abe33827b0153c27595269afd7152b48019808974481aca2c F src/tokenize.c 3e37ac2b6cbb9b0abe33827b0153c27595269afd7152b48019808974481aca2c
F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279
F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383 F src/trigger.c 3ffb8ed6b64dbcc0ccae6e82435d01be3bf547e13b814e2d46f7df9bef84748e
F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c d4d55ca95106a2029ec1cdbd2497a34e69ea1d338f1a9d80ef15ebf4ff01690d F src/utf.c d4d55ca95106a2029ec1cdbd2497a34e69ea1d338f1a9d80ef15ebf4ff01690d
F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3 F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3
F src/vacuum.c fbfc3e074c865d2b5b10b8a65a3783275b80c152653590690747a102bb6cc770 F src/vacuum.c fbfc3e074c865d2b5b10b8a65a3783275b80c152653590690747a102bb6cc770
F src/vdbe.c 014769c8f7e528d59f5a8e25d0035258396cc2c755673dee29885b6049725ee6 F src/vdbe.c b5deed01000b3970cfca089dc531cf9342afd96d00cc8b4ad26d303f088116ee
F src/vdbe.h 31eddcffc1d14c76c2a20fe4e137e1ee43d44f370896fae14a067052801a3625 F src/vdbe.h 31eddcffc1d14c76c2a20fe4e137e1ee43d44f370896fae14a067052801a3625
F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeInt.h 11041d559992165651413e5868a907f698a2ec7af169fb2d20eb058a9ccd2313
F src/vdbeapi.c cb8eb9e41a16f5fa3ce5b8f3910edfbba336d10156cfb7a79f92cf7bf443977b F src/vdbeapi.c cb8eb9e41a16f5fa3ce5b8f3910edfbba336d10156cfb7a79f92cf7bf443977b
F src/vdbeaux.c d7ef1a0a7233589d789eda1ba9ffa4b0ea61fca9651e4f47fb4250d03d62bcaf F src/vdbeaux.c 932105750c15378176980288daea80008ffdac360716ae4e7c7f85bf462d272d
F src/vdbeblob.c b1b4032cac46b41e44b957c4d00aee9851f862dfd85ecb68116ba49884b03dfd F src/vdbeblob.c b1b4032cac46b41e44b957c4d00aee9851f862dfd85ecb68116ba49884b03dfd
F src/vdbemem.c 571ae3116dbf840a62c4aaa6bc09d577dfef8ad4d3978cf37275bb5f9653217b F src/vdbemem.c 571ae3116dbf840a62c4aaa6bc09d577dfef8ad4d3978cf37275bb5f9653217b
F src/vdbesort.c f7ce6eb4c0e8b0273329d2f43b8b6e5ebe8f2d853fc323d5787dada702ea0b66 F src/vdbesort.c 49e366d0216c782eba287bf602384e4330d2526a22f1275492d2785ce103c79b
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859 F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 2c69a5f92270429db72d853691b0640c76c671d5b2465396dadb9d9873e1efce F src/wal.c 554a6b1afaaecb98cb47bb598bccf1374c9d3b624e5c4c3c4eb2ad364cc579f8
F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
F src/where.c 12cca5dfbe96e2589f951c43c0720fc58e52611787c37d85a0d9c10376202e8b F src/where.c e80177e452b4e436abc6ece0cb0249631000434f2a7425cc1df709015fce74ad
F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/whereInt.h 8373791e8dfbef3ca0d4ad7eab350be860b2740c44d94d0c54d2a8d36209c41a
F src/wherecode.c 5baa06f0daae7d38aca1d4814030b82ad4f127fe6bad18f0644776a474f6088b F src/wherecode.c 0d3de258d7922aede028841c6e0060633c50be26737c92cc62ce8be280535430
F src/whereexpr.c 2415c8eee5ff89a8b709d7d83d71c1ff986cd720d0520057e1d8a5371339012a F src/whereexpr.c 2415c8eee5ff89a8b709d7d83d71c1ff986cd720d0520057e1d8a5371339012a
F src/window.c d01227141f622f24fbe36ca105fbe6ef023f9fd98f1ccd65da95f88886565db5 F src/window.c d01227141f622f24fbe36ca105fbe6ef023f9fd98f1ccd65da95f88886565db5
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -2213,8 +2213,11 @@ 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 f786de8d1873cd27b1bf83273a1e100e9d481144674888ccf65974e003a3caad P fa6f6ccdffc50024624306900efd2538c7415d8bdd0f02835b2e9c05adab3cf1
R d7baa5b59cd39b651d61c163fdc55c15 R a7f539cde629f0570849a89a860ffc9d
U stephan T *branch * flex-array
Z bd2d36d9f3639b6b3b36c30d817df77d T *sym-flex-array *
T -sym-trunk *
U drh
Z ea27c767023e4b4e578a073476796f47
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
fa6f6ccdffc50024624306900efd2538c7415d8bdd0f02835b2e9c05adab3cf1 6fd6b32d06bd6a705e5140cd613af823b8183a6f6a9ceeeedfcf5e8b50821d68

View File

@@ -3633,7 +3633,7 @@ void sqlite3CreateForeignKey(
}else{ }else{
nCol = pFromCol->nExpr; nCol = pFromCol->nExpr;
} }
nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; nByte = SZ_FKEY(nCol) + pTo->n + 1;
if( pToCol ){ if( pToCol ){
for(i=0; i<pToCol->nExpr; i++){ for(i=0; i<pToCol->nExpr; i++){
nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1;
@@ -4692,12 +4692,11 @@ IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){
sqlite3 *db = pParse->db; sqlite3 *db = pParse->db;
int i; int i;
if( pList==0 ){ if( pList==0 ){
pList = sqlite3DbMallocZero(db, sizeof(IdList) ); pList = sqlite3DbMallocZero(db, SZ_IDLIST(1));
if( pList==0 ) return 0; if( pList==0 ) return 0;
}else{ }else{
IdList *pNew; IdList *pNew;
pNew = sqlite3DbRealloc(db, pList, pNew = sqlite3DbRealloc(db, pList, SZ_IDLIST(pList->nId+1));
sizeof(IdList) + pList->nId*sizeof(pList->a));
if( pNew==0 ){ if( pNew==0 ){
sqlite3IdListDelete(db, pList); sqlite3IdListDelete(db, pList);
return 0; return 0;
@@ -4796,8 +4795,7 @@ SrcList *sqlite3SrcListEnlarge(
return 0; return 0;
} }
if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST;
pNew = sqlite3DbRealloc(db, pSrc, pNew = sqlite3DbRealloc(db, pSrc, SZ_SRCLIST(nAlloc));
sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) );
if( pNew==0 ){ if( pNew==0 ){
assert( db->mallocFailed ); assert( db->mallocFailed );
return 0; return 0;
@@ -4872,7 +4870,7 @@ SrcList *sqlite3SrcListAppend(
assert( pParse->db!=0 ); assert( pParse->db!=0 );
db = pParse->db; db = pParse->db;
if( pList==0 ){ if( pList==0 ){
pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); pList = sqlite3DbMallocRawNN(pParse->db, SZ_SRCLIST(1));
if( pList==0 ) return 0; if( pList==0 ) return 0;
pList->nAlloc = 1; pList->nAlloc = 1;
pList->nSrc = 1; pList->nSrc = 1;
@@ -5758,10 +5756,9 @@ With *sqlite3WithAdd(
} }
if( pWith ){ if( pWith ){
sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); pNew = sqlite3DbRealloc(db, pWith, SZ_WITH(pWith->nCte+1));
pNew = sqlite3DbRealloc(db, pWith, nByte);
}else{ }else{
pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); pNew = sqlite3DbMallocZero(db, SZ_WITH(1));
} }
assert( (pNew!=0 && zName!=0) || db->mallocFailed ); assert( (pNew!=0 && zName!=0) || db->mallocFailed );

View File

@@ -1738,7 +1738,7 @@ static Expr *exprDup(
With *sqlite3WithDup(sqlite3 *db, With *p){ With *sqlite3WithDup(sqlite3 *db, With *p){
With *pRet = 0; With *pRet = 0;
if( p ){ if( p ){
sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); sqlite3_int64 nByte = SZ_WITH(p->nCte);
pRet = sqlite3DbMallocZero(db, nByte); pRet = sqlite3DbMallocZero(db, nByte);
if( pRet ){ if( pRet ){
int i; int i;
@@ -1865,11 +1865,9 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){
SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){ SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){
SrcList *pNew; SrcList *pNew;
int i; int i;
int nByte;
assert( db!=0 ); assert( db!=0 );
if( p==0 ) return 0; if( p==0 ) return 0;
nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); pNew = sqlite3DbMallocRawNN(db, SZ_SRCLIST(p->nSrc) );
pNew = sqlite3DbMallocRawNN(db, nByte );
if( pNew==0 ) return 0; if( pNew==0 ) return 0;
pNew->nSrc = pNew->nAlloc = p->nSrc; pNew->nSrc = pNew->nAlloc = p->nSrc;
for(i=0; i<p->nSrc; i++){ for(i=0; i<p->nSrc; i++){
@@ -1931,7 +1929,7 @@ IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){
int i; int i;
assert( db!=0 ); assert( db!=0 );
if( p==0 ) return 0; if( p==0 ) return 0;
pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) ); pNew = sqlite3DbMallocRawNN(db, SZ_IDLIST(p->nId));
if( pNew==0 ) return 0; if( pNew==0 ) return 0;
pNew->nId = p->nId; pNew->nId = p->nId;
for(i=0; i<p->nId; i++){ for(i=0; i<p->nId; i++){
@@ -2015,7 +2013,7 @@ SQLITE_NOINLINE ExprList *sqlite3ExprListAppendNew(
struct ExprList_item *pItem; struct ExprList_item *pItem;
ExprList *pList; ExprList *pList;
pList = sqlite3DbMallocRawNN(db, sizeof(ExprList)+sizeof(pList->a[0])*4 ); pList = sqlite3DbMallocRawNN(db, SZ_EXPRLIST(4));
if( pList==0 ){ if( pList==0 ){
sqlite3ExprDelete(db, pExpr); sqlite3ExprDelete(db, pExpr);
return 0; return 0;
@@ -2035,8 +2033,7 @@ SQLITE_NOINLINE ExprList *sqlite3ExprListAppendGrow(
struct ExprList_item *pItem; struct ExprList_item *pItem;
ExprList *pNew; ExprList *pNew;
pList->nAlloc *= 2; pList->nAlloc *= 2;
pNew = sqlite3DbRealloc(db, pList, pNew = sqlite3DbRealloc(db, pList, SZ_EXPRLIST(pList->nAlloc));
sizeof(*pList)+(pList->nAlloc-1)*sizeof(pList->a[0]));
if( pNew==0 ){ if( pNew==0 ){
sqlite3ExprListDelete(db, pList); sqlite3ExprListDelete(db, pList);
sqlite3ExprDelete(db, pExpr); sqlite3ExprDelete(db, pExpr);

View File

@@ -3845,7 +3845,7 @@ int sqlite3_set_clientdata(
return SQLITE_OK; return SQLITE_OK;
}else{ }else{
size_t n = strlen(zName); size_t n = strlen(zName);
p = sqlite3_malloc64( sizeof(DbClientData)+n+1 ); p = sqlite3_malloc64( SZ_DBCLIENTDATA(n+1) );
if( p==0 ){ if( p==0 ){
if( xDestructor ) xDestructor(pData); if( xDestructor ) xDestructor(pData);
sqlite3_mutex_leave(db->mutex); sqlite3_mutex_leave(db->mutex);

View File

@@ -2277,20 +2277,22 @@ int sqlite3ResolveSelfReference(
Expr *pExpr, /* Expression to resolve. May be NULL. */ Expr *pExpr, /* Expression to resolve. May be NULL. */
ExprList *pList /* Expression list to resolve. May be NULL. */ ExprList *pList /* Expression list to resolve. May be NULL. */
){ ){
SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ SrcList *pSrc; /* Fake SrcList for pParse->pNewTable */
NameContext sNC; /* Name context for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */
int rc; int rc;
u8 srcSpace[SZ_SRCLIST_1]; /* Memory space for the fake SrcList */
assert( type==0 || pTab!=0 ); assert( type==0 || pTab!=0 );
assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr
|| type==NC_GenCol || pTab==0 ); || type==NC_GenCol || pTab==0 );
memset(&sNC, 0, sizeof(sNC)); memset(&sNC, 0, sizeof(sNC));
memset(&sSrc, 0, sizeof(sSrc)); pSrc = (SrcList*)srcSpace;
memset(pSrc, 0, SZ_SRCLIST_1);
if( pTab ){ if( pTab ){
sSrc.nSrc = 1; pSrc->nSrc = 1;
sSrc.a[0].zName = pTab->zName; pSrc->a[0].zName = pTab->zName;
sSrc.a[0].pSTab = pTab; pSrc->a[0].pSTab = pTab;
sSrc.a[0].iCursor = -1; pSrc->a[0].iCursor = -1;
if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){
/* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP
** schema elements */ ** schema elements */
@@ -2298,7 +2300,7 @@ int sqlite3ResolveSelfReference(
} }
} }
sNC.pParse = pParse; sNC.pParse = pParse;
sNC.pSrcList = &sSrc; sNC.pSrcList = pSrc;
sNC.ncFlags = type | NC_IsDDL; sNC.ncFlags = type | NC_IsDDL;
if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc;
if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList);

View File

@@ -154,7 +154,7 @@ Select *sqlite3SelectNew(
pNew->addrOpenEphm[0] = -1; pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[1] = -1; pNew->addrOpenEphm[1] = -1;
pNew->nSelectRow = 0; pNew->nSelectRow = 0;
if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, SZ_SRCLIST_1);
pNew->pSrc = pSrc; pNew->pSrc = pSrc;
pNew->pWhere = pWhere; pNew->pWhere = pWhere;
pNew->pGroupBy = pGroupBy; pNew->pGroupBy = pGroupBy;
@@ -1537,8 +1537,8 @@ static void selectInnerLoop(
** X extra columns. ** X extra columns.
*/ */
KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); int nExtra = (N+X)*(sizeof(CollSeq*)+1);
KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); KeyInfo *p = sqlite3DbMallocRawNN(db, SZ_KEYINFO(0) + nExtra);
if( p ){ if( p ){
p->aSortFlags = (u8*)&p->aColl[N+X]; p->aSortFlags = (u8*)&p->aColl[N+X];
p->nKeyField = (u16)N; p->nKeyField = (u16)N;
@@ -1546,7 +1546,7 @@ KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
p->enc = ENC(db); p->enc = ENC(db);
p->db = db; p->db = db;
p->nRef = 1; p->nRef = 1;
memset(&p[1], 0, nExtra); memset(p->aColl, 0, nExtra);
}else{ }else{
return (KeyInfo*)sqlite3OomFault(db); return (KeyInfo*)sqlite3OomFault(db);
} }
@@ -6062,7 +6062,7 @@ static int selectExpander(Walker *pWalker, Select *p){
pEList = p->pEList; pEList = p->pEList;
if( pParse->pWith && (p->selFlags & SF_View) ){ if( pParse->pWith && (p->selFlags & SF_View) ){
if( p->pWith==0 ){ if( p->pWith==0 ){
p->pWith = (With*)sqlite3DbMallocZero(db, sizeof(With)); p->pWith = (With*)sqlite3DbMallocZero(db, SZ_WITH(1) );
if( p->pWith==0 ){ if( p->pWith==0 ){
return WRC_Abort; return WRC_Abort;
} }
@@ -7250,7 +7250,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){
pExpr = 0; pExpr = 0;
pSub = sqlite3SubqueryDetach(db, pFrom); pSub = sqlite3SubqueryDetach(db, pFrom);
sqlite3SrcListDelete(db, p->pSrc); sqlite3SrcListDelete(db, p->pSrc);
p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); p->pSrc = sqlite3DbMallocZero(pParse->db, SZ_SRCLIST_1);
while( pSub ){ while( pSub ){
Expr *pTerm; Expr *pTerm;
pPrior = pSub->pPrior; pPrior = pSub->pPrior;

View File

@@ -768,6 +768,16 @@
#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) #define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
#endif #endif
/*
** Work around C99 "flex-array" syntax for pre-C99 compilers, so as
** to avoid complaints from -fsanitize=strict-bounds.
*/
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
# define FLEXARRAY
#else
# define FLEXARRAY 1
#endif
/* /*
** Macros to compute minimum and maximum of two numbers. ** Macros to compute minimum and maximum of two numbers.
*/ */
@@ -2577,9 +2587,13 @@ struct FKey {
struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ struct sColMap { /* Mapping of columns in pFrom to columns in zTo */
int iFrom; /* Index of column in pFrom */ int iFrom; /* Index of column in pFrom */
char *zCol; /* Name of column in zTo. If NULL use PRIMARY KEY */ char *zCol; /* Name of column in zTo. If NULL use PRIMARY KEY */
} aCol[1]; /* One entry for each of nCol columns */ } aCol[FLEXARRAY]; /* One entry for each of nCol columns */
}; };
/* The size (in bytes) of an FKey object holding N columns. The answer
** does NOT include space to hold the zTo name. */
#define SZ_FKEY(N) (offsetof(FKey,aCol)+(N)*sizeof(struct sColMap))
/* /*
** SQLite supports many different ways to resolve a constraint ** SQLite supports many different ways to resolve a constraint
** error. ROLLBACK processing means that a constraint violation ** error. ROLLBACK processing means that a constraint violation
@@ -2641,9 +2655,12 @@ struct KeyInfo {
u16 nAllField; /* Total columns, including key plus others */ u16 nAllField; /* Total columns, including key plus others */
sqlite3 *db; /* The database connection */ sqlite3 *db; /* The database connection */
u8 *aSortFlags; /* Sort order for each column. */ u8 *aSortFlags; /* Sort order for each column. */
CollSeq *aColl[1]; /* Collating sequence for each term of the key */ CollSeq *aColl[FLEXARRAY]; /* Collating sequence for each term of the key */
}; };
/* The size (in bytes) of a KeyInfo object with up to N fields */
#define SZ_KEYINFO(N) (offsetof(KeyInfo,aColl) + (N)*sizeof(CollSeq*))
/* /*
** Allowed bit values for entries in the KeyInfo.aSortFlags[] array. ** Allowed bit values for entries in the KeyInfo.aSortFlags[] array.
*/ */
@@ -3216,9 +3233,14 @@ struct ExprList {
int iConstExprReg; /* Register in which Expr value is cached. Used only int iConstExprReg; /* Register in which Expr value is cached. Used only
** by Parse.pConstExpr */ ** by Parse.pConstExpr */
} u; } u;
} a[1]; /* One slot for each expression in the list */ } a[FLEXARRAY]; /* One slot for each expression in the list */
}; };
/* The size (in bytes) of an ExprList object that is big enough to hold
** as many as N expressions. */
#define SZ_EXPRLIST(N) \
(offsetof(ExprList,a) + (N)*sizeof(struct ExprList_item))
/* /*
** Allowed values for Expr.a.eEName ** Allowed values for Expr.a.eEName
*/ */
@@ -3246,9 +3268,12 @@ struct IdList {
int nId; /* Number of identifiers on the list */ int nId; /* Number of identifiers on the list */
struct IdList_item { struct IdList_item {
char *zName; /* Name of the identifier */ char *zName; /* Name of the identifier */
} a[1]; } a[FLEXARRAY];
}; };
/* The size (in bytes) of an IdList object that can hold up to N IDs. */
#define SZ_IDLIST(N) (offsetof(IdList,a)+(N)*sizeof(struct IdList_item))
/* /*
** Allowed values for IdList.eType, which determines which value of the a.u4 ** Allowed values for IdList.eType, which determines which value of the a.u4
** is valid. ** is valid.
@@ -3368,11 +3393,19 @@ struct OnOrUsing {
** **
*/ */
struct SrcList { struct SrcList {
int nSrc; /* Number of tables or subqueries in the FROM clause */ int nSrc; /* Number of tables or subqueries in the FROM clause */
u32 nAlloc; /* Number of entries allocated in a[] below */ u32 nAlloc; /* Number of entries allocated in a[] below */
SrcItem a[1]; /* One entry for each identifier on the list */ SrcItem a[FLEXARRAY]; /* One entry for each identifier on the list */
}; };
/* Size (in bytes) of a SrcList object that can hold as many as N
** SrcItem objects. */
#define SZ_SRCLIST(N) (offsetof(SrcList,a)+(N)*sizeof(SrcItem))
/* Size (in bytes( of a SrcList object that holds 1 SrcItem. This is a
** special case of SZ_SRCITEM(1) that comes up often. */
#define SZ_SRCLIST_1 (offsetof(SrcList,a)+sizeof(SrcItem))
/* /*
** Permitted values of the SrcList.a.jointype field ** Permitted values of the SrcList.a.jointype field
*/ */
@@ -4436,9 +4469,13 @@ struct With {
int nCte; /* Number of CTEs in the WITH clause */ int nCte; /* Number of CTEs in the WITH clause */
int bView; /* Belongs to the outermost Select of a view */ int bView; /* Belongs to the outermost Select of a view */
With *pOuter; /* Containing WITH clause, or NULL */ With *pOuter; /* Containing WITH clause, or NULL */
Cte a[1]; /* For each CTE in the WITH clause.... */ Cte a[FLEXARRAY]; /* For each CTE in the WITH clause.... */
}; };
/* The size (in bytes) of a With object that can hold as many
** as N different CTEs. */
#define SZ_WITH(N) (offsetof(With,a) + (N)*sizeof(Cte))
/* /*
** The Cte object is not guaranteed to persist for the entire duration ** The Cte object is not guaranteed to persist for the entire duration
** of code generation. (The query flattener or other parser tree ** of code generation. (The query flattener or other parser tree
@@ -4467,9 +4504,13 @@ struct DbClientData {
DbClientData *pNext; /* Next in a linked list */ DbClientData *pNext; /* Next in a linked list */
void *pData; /* The data */ void *pData; /* The data */
void (*xDestructor)(void*); /* Destructor. Might be NULL */ void (*xDestructor)(void*); /* Destructor. Might be NULL */
char zName[1]; /* Name of this client data. MUST BE LAST */ char zName[FLEXARRAY]; /* Name of this client data. MUST BE LAST */
}; };
/* The size (in bytes) of a DbClientData object that can has a name
** that is N bytes long, including the zero-terminator. */
#define SZ_DBCLIENTDATA(N) (offsetof(DbClientData,zName)+(N))
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
/* /*
** An instance of the TreeView object is used for printing the content of ** An instance of the TreeView object is used for printing the content of

View File

@@ -1039,7 +1039,8 @@ static void codeReturningTrigger(
ExprList *pNew; ExprList *pNew;
Returning *pReturning; Returning *pReturning;
Select sSelect; Select sSelect;
SrcList sFrom; SrcList *pFrom;
u8 fromSpace[SZ_SRCLIST_1];
assert( v!=0 ); assert( v!=0 );
if( !pParse->bReturning ){ if( !pParse->bReturning ){
@@ -1055,13 +1056,14 @@ static void codeReturningTrigger(
return; return;
} }
memset(&sSelect, 0, sizeof(sSelect)); memset(&sSelect, 0, sizeof(sSelect));
memset(&sFrom, 0, sizeof(sFrom)); pFrom = (SrcList*)fromSpace;
memset(pFrom, 0, SZ_SRCLIST_1);
sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0); sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0);
sSelect.pSrc = &sFrom; sSelect.pSrc = pFrom;
sFrom.nSrc = 1; pFrom->nSrc = 1;
sFrom.a[0].pSTab = pTab; pFrom->a[0].pSTab = pTab;
sFrom.a[0].zName = pTab->zName; /* tag-20240424-1 */ pFrom->a[0].zName = pTab->zName; /* tag-20240424-1 */
sFrom.a[0].iCursor = -1; pFrom->a[0].iCursor = -1;
sqlite3SelectPrep(pParse, &sSelect, 0); sqlite3SelectPrep(pParse, &sSelect, 0);
if( pParse->nErr==0 ){ if( pParse->nErr==0 ){
assert( db->mallocFailed==0 ); assert( db->mallocFailed==0 );

View File

@@ -278,9 +278,9 @@ static VdbeCursor *allocateCursor(
i64 nByte; i64 nByte;
VdbeCursor *pCx = 0; VdbeCursor *pCx = 0;
nByte = nByte = SZ_VDBECURSOR(nField);
ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + assert( ROUND8(nByte)==nByte );
(eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); if( eCurType==CURTYPE_BTREE ) nByte += sqlite3BtreeCursorSize();
assert( iCur>=0 && iCur<p->nCursor ); assert( iCur>=0 && iCur<p->nCursor );
if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/
@@ -313,8 +313,8 @@ static VdbeCursor *allocateCursor(
pCx->nField = nField; pCx->nField = nField;
pCx->aOffset = &pCx->aType[nField]; pCx->aOffset = &pCx->aType[nField];
if( eCurType==CURTYPE_BTREE ){ if( eCurType==CURTYPE_BTREE ){
pCx->uc.pCursor = (BtCursor*) assert( ROUND8(SZ_VDBECURSOR(nField))==SZ_VDBECURSOR(nField) );
&pMem->z[ROUND8P(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; pCx->uc.pCursor = (BtCursor*)&pMem->z[SZ_VDBECURSOR(nField)];
sqlite3BtreeCursorZero(pCx->uc.pCursor); sqlite3BtreeCursorZero(pCx->uc.pCursor);
} }
return pCx; return pCx;
@@ -7705,7 +7705,7 @@ case OP_AggStep: {
** **
** Note: We could avoid this by using a regular memory cell from aMem[] for ** Note: We could avoid this by using a regular memory cell from aMem[] for
** the accumulator, instead of allocating one here. */ ** the accumulator, instead of allocating one here. */
nAlloc = ROUND8P( sizeof(pCtx[0]) + (n-1)*sizeof(sqlite3_value*) ); nAlloc = ROUND8P( SZ_CONTEXT(n) );
pCtx = sqlite3DbMallocRawNN(db, nAlloc + sizeof(Mem)); pCtx = sqlite3DbMallocRawNN(db, nAlloc + sizeof(Mem));
if( pCtx==0 ) goto no_mem; if( pCtx==0 ) goto no_mem;
pCtx->pOut = (Mem*)((u8*)pCtx + nAlloc); pCtx->pOut = (Mem*)((u8*)pCtx + nAlloc);

View File

@@ -133,12 +133,18 @@ struct VdbeCursor {
#endif #endif
VdbeTxtBlbCache *pCache; /* Cache of large TEXT or BLOB values */ VdbeTxtBlbCache *pCache; /* Cache of large TEXT or BLOB values */
/* 2*nField extra array elements allocated for aType[], beyond the one /* Space is allocated for aType to hold at least 2*nField+1 entries:
** static element declared in the structure. nField total array slots for ** nField slots for aType[] and nField+1 array slots for aOffset[] */
** aType[] and nField+1 array slots for aOffset[] */ u32 aType[FLEXARRAY]; /* Type values record decode. MUST BE LAST */
u32 aType[1]; /* Type values record decode. MUST BE LAST */
}; };
/*
** The size (in bytes) of a VdbeCursor object that has an nField value of N
** or less. The value of SZ_VDBECURSOR(n) is guaranteed to be a multiple
** of 8.
*/
#define SZ_VDBECURSOR(N) (offsetof(VdbeCursor,aType) + ((N)+1)*sizeof(u64))
/* Return true if P is a null-only cursor /* Return true if P is a null-only cursor
*/ */
#define IsNullCursor(P) \ #define IsNullCursor(P) \
@@ -395,9 +401,16 @@ struct sqlite3_context {
u8 enc; /* Encoding to use for results */ u8 enc; /* Encoding to use for results */
u8 skipFlag; /* Skip accumulator loading if true */ u8 skipFlag; /* Skip accumulator loading if true */
u16 argc; /* Number of arguments */ u16 argc; /* Number of arguments */
sqlite3_value *argv[1]; /* Argument set */ sqlite3_value *argv[FLEXARRAY]; /* Argument set */
}; };
/*
** The size (in bytes) of an sqlite3_context object that holds N
** argv[] arguments.
*/
#define SZ_CONTEXT(N) \
(offsetof(sqlite3_context,argv)+(N)*sizeof(sqlite3_value*))
/* The ScanStatus object holds a single value for the /* The ScanStatus object holds a single value for the
** sqlite3_stmt_scanstatus() interface. ** sqlite3_stmt_scanstatus() interface.

View File

@@ -445,12 +445,10 @@ int sqlite3VdbeAddFunctionCall(
int eCallCtx /* Calling context */ int eCallCtx /* Calling context */
){ ){
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
int nByte;
int addr; int addr;
sqlite3_context *pCtx; sqlite3_context *pCtx;
assert( v ); assert( v );
nByte = sizeof(*pCtx) + (nArg-1)*sizeof(sqlite3_value*); pCtx = sqlite3DbMallocRawNN(pParse->db, SZ_CONTEXT(nArg));
pCtx = sqlite3DbMallocRawNN(pParse->db, nByte);
if( pCtx==0 ){ if( pCtx==0 ){
assert( pParse->db->mallocFailed ); assert( pParse->db->mallocFailed );
freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); freeEphemeralFunction(pParse->db, (FuncDef*)pFunc);

View File

@@ -332,9 +332,12 @@ struct VdbeSorter {
u8 iPrev; /* Previous thread used to flush PMA */ u8 iPrev; /* Previous thread used to flush PMA */
u8 nTask; /* Size of aTask[] array */ u8 nTask; /* Size of aTask[] array */
u8 typeMask; u8 typeMask;
SortSubtask aTask[1]; /* One or more subtasks */ SortSubtask aTask[FLEXARRAY]; /* One or more subtasks */
}; };
/* Size (in bytes) of a VdbeSorter object that works with N or fewer subtasks */
#define SZ_VDBESORTER(N) (offsetof(VdbeSorter,aTask)+(N)*sizeof(SortSubtask))
#define SORTER_TYPE_INTEGER 0x01 #define SORTER_TYPE_INTEGER 0x01
#define SORTER_TYPE_TEXT 0x02 #define SORTER_TYPE_TEXT 0x02
@@ -966,8 +969,8 @@ int sqlite3VdbeSorterInit(
assert( pCsr->eCurType==CURTYPE_SORTER ); assert( pCsr->eCurType==CURTYPE_SORTER );
assert( sizeof(KeyInfo) + UMXV(pCsr->pKeyInfo->nKeyField)*sizeof(CollSeq*) assert( sizeof(KeyInfo) + UMXV(pCsr->pKeyInfo->nKeyField)*sizeof(CollSeq*)
< 0x7fffffff ); < 0x7fffffff );
szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); szKeyInfo = SZ_KEYINFO(pCsr->pKeyInfo->nKeyField+1);
sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); sz = SZ_VDBESORTER(nWorker+1);
pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo);
pCsr->uc.pSorter = pSorter; pCsr->uc.pSorter = pSorter;

View File

@@ -597,9 +597,13 @@ struct WalIterator {
u32 *aPgno; /* Array of page numbers. */ u32 *aPgno; /* Array of page numbers. */
int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */ int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */
int iZero; /* Frame number associated with aPgno[0] */ int iZero; /* Frame number associated with aPgno[0] */
} aSegment[1]; /* One for every 32KB page in the wal-index */ } aSegment[FLEXARRAY]; /* One for every 32KB page in the wal-index */
}; };
/* Size (in bytes) of a WalIterator object suitable for N or fewer segments */
#define SZ_WALITERATOR(N) \
(offsetof(WalIterator,aSegment)*(N)*sizeof(struct WalSegment))
/* /*
** Define the parameters of the hash tables in the wal-index file. There ** Define the parameters of the hash tables in the wal-index file. There
** is a hash-table following every HASHTABLE_NPAGE page numbers in the ** is a hash-table following every HASHTABLE_NPAGE page numbers in the
@@ -1960,8 +1964,7 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){
/* Allocate space for the WalIterator object. */ /* Allocate space for the WalIterator object. */
nSegment = walFramePage(iLast) + 1; nSegment = walFramePage(iLast) + 1;
nByte = sizeof(WalIterator) nByte = SZ_WALITERATOR(nSegment)
+ (nSegment-1)*sizeof(struct WalSegment)
+ iLast*sizeof(ht_slot); + iLast*sizeof(ht_slot);
p = (WalIterator *)sqlite3_malloc64(nByte p = (WalIterator *)sqlite3_malloc64(nByte
+ sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) + sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast)

View File

@@ -35,11 +35,16 @@ struct HiddenIndexInfo {
int eDistinct; /* Value to return from sqlite3_vtab_distinct() */ int eDistinct; /* Value to return from sqlite3_vtab_distinct() */
u32 mIn; /* Mask of terms that are <col> IN (...) */ u32 mIn; /* Mask of terms that are <col> IN (...) */
u32 mHandleIn; /* Terms that vtab will handle as <col> IN (...) */ u32 mHandleIn; /* Terms that vtab will handle as <col> IN (...) */
sqlite3_value *aRhs[1]; /* RHS values for constraints. MUST BE LAST sqlite3_value *aRhs[FLEXARRAY]; /* RHS values for constraints. MUST BE LAST
** because extra space is allocated to hold up ** Extra space is allocated to hold up
** to nTerm such values */ ** to nTerm such values */
}; };
/* Size (in bytes) of a HiddenIndeInfo object sufficient to hold as
** many as N constraints */
#define SZ_HIDDENINDEXINFO(N) \
(offsetof(HiddenIndexInfo,aRhs) + (N)*sizeof(sqlite3_value*))
/* Forward declaration of methods */ /* Forward declaration of methods */
static int whereLoopResize(sqlite3*, WhereLoop*, int); static int whereLoopResize(sqlite3*, WhereLoop*, int);
@@ -1517,8 +1522,8 @@ static sqlite3_index_info *allocateIndexInfo(
*/ */
pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
+ (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
+ sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) + sizeof(*pIdxOrderBy)*nOrderBy
+ sizeof(sqlite3_value*)*nTerm ); + SZ_HIDDENINDEXINFO(nTerm) );
if( pIdxInfo==0 ){ if( pIdxInfo==0 ){
sqlite3ErrorMsg(pParse, "out of memory"); sqlite3ErrorMsg(pParse, "out of memory");
return 0; return 0;
@@ -6712,10 +6717,7 @@ WhereInfo *sqlite3WhereBegin(
** field (type Bitmask) it must be aligned on an 8-byte boundary on ** field (type Bitmask) it must be aligned on an 8-byte boundary on
** some architectures. Hence the ROUND8() below. ** some architectures. Hence the ROUND8() below.
*/ */
nByteWInfo = ROUND8P(sizeof(WhereInfo)); nByteWInfo = SZ_WHEREINFO(nTabList);
if( nTabList>1 ){
nByteWInfo = ROUND8P(nByteWInfo + (nTabList-1)*sizeof(WhereLevel));
}
pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop));
if( db->mallocFailed ){ if( db->mallocFailed ){
sqlite3DbFree(db, pWInfo); sqlite3DbFree(db, pWInfo);

View File

@@ -501,9 +501,14 @@ struct WhereInfo {
Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */
WhereClause sWC; /* Decomposition of the WHERE clause */ WhereClause sWC; /* Decomposition of the WHERE clause */
WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */
WhereLevel a[1]; /* Information about each nest loop in WHERE */ WhereLevel a[FLEXARRAY]; /* Information about each nest loop in WHERE */
}; };
/*
** The size (in bytes) of a WhereInfo object that holds N WhereLevels.
*/
#define SZ_WHEREINFO(N) (offsetof(WhereInfo,a)+(N)*sizeof(WhereLevel))
/* /*
** Private interfaces - callable only by other where.c routines. ** Private interfaces - callable only by other where.c routines.
** **

View File

@@ -2313,8 +2313,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
int nNotReady; /* The number of notReady tables */ int nNotReady; /* The number of notReady tables */
SrcItem *origSrc; /* Original list of tables */ SrcItem *origSrc; /* Original list of tables */
nNotReady = pWInfo->nLevel - iLevel - 1; nNotReady = pWInfo->nLevel - iLevel - 1;
pOrTab = sqlite3DbMallocRawNN(db, pOrTab = sqlite3DbMallocRawNN(db, SZ_SRCLIST(nNotReady+1));
sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0]));
if( pOrTab==0 ) return notReady; if( pOrTab==0 ) return notReady;
pOrTab->nAlloc = (u8)(nNotReady + 1); pOrTab->nAlloc = (u8)(nNotReady + 1);
pOrTab->nSrc = pOrTab->nAlloc; pOrTab->nSrc = pOrTab->nAlloc;
@@ -2857,7 +2856,8 @@ SQLITE_NOINLINE void sqlite3WhereRightJoinLoop(
WhereInfo *pSubWInfo; WhereInfo *pSubWInfo;
WhereLoop *pLoop = pLevel->pWLoop; WhereLoop *pLoop = pLevel->pWLoop;
SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
SrcList sFrom; SrcList *pFrom;
u8 fromSpace[SZ_SRCLIST_1];
Bitmask mAll = 0; Bitmask mAll = 0;
int k; int k;
@@ -2901,13 +2901,14 @@ SQLITE_NOINLINE void sqlite3WhereRightJoinLoop(
sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); sqlite3ExprDup(pParse->db, pTerm->pExpr, 0));
} }
} }
sFrom.nSrc = 1; pFrom = (SrcList*)fromSpace;
sFrom.nAlloc = 1; pFrom->nSrc = 1;
memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem)); pFrom->nAlloc = 1;
sFrom.a[0].fg.jointype = 0; memcpy(&pFrom->a[0], pTabItem, sizeof(SrcItem));
pFrom->a[0].fg.jointype = 0;
assert( pParse->withinRJSubrtn < 100 ); assert( pParse->withinRJSubrtn < 100 );
pParse->withinRJSubrtn++; pParse->withinRJSubrtn++;
pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0, pSubWInfo = sqlite3WhereBegin(pParse, pFrom, pSubWhere, 0, 0, 0,
WHERE_RIGHT_JOIN, 0); WHERE_RIGHT_JOIN, 0);
if( pSubWInfo ){ if( pSubWInfo ){
int iCur = pLevel->iTabCur; int iCur = pLevel->iTabCur;