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:
45
manifest
45
manifest
@@ -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.
|
||||||
|
@@ -1 +1 @@
|
|||||||
fa6f6ccdffc50024624306900efd2538c7415d8bdd0f02835b2e9c05adab3cf1
|
6fd6b32d06bd6a705e5140cd613af823b8183a6f6a9ceeeedfcf5e8b50821d68
|
||||||
|
17
src/build.c
17
src/build.c
@@ -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 );
|
||||||
|
|
||||||
|
13
src/expr.c
13
src/expr.c
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
12
src/select.c
12
src/select.c
@@ -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;
|
||||||
|
@@ -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.
|
||||||
@@ -3370,9 +3395,17 @@ 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
|
||||||
|
@@ -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 );
|
||||||
|
12
src/vdbe.c
12
src/vdbe.c
@@ -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);
|
||||||
|
@@ -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.
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
|
18
src/where.c
18
src/where.c
@@ -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);
|
||||||
|
@@ -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.
|
||||||
**
|
**
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user