mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Merge all recent enhancements and fixes from trunk.
FossilOrigin-Name: 199bfb67fdf642cca6cd5d460fa4dc602b94837a
This commit is contained in:
@@ -246,6 +246,7 @@ static const sqlite3_tokenizer_module icuTokenizerModule = {
|
|||||||
icuOpen, /* xOpen */
|
icuOpen, /* xOpen */
|
||||||
icuClose, /* xClose */
|
icuClose, /* xClose */
|
||||||
icuNext, /* xNext */
|
icuNext, /* xNext */
|
||||||
|
0, /* xLanguageid */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -83,7 +83,6 @@ static int icuLikeCompare(
|
|||||||
/* Read (and consume) the next character from the input pattern. */
|
/* Read (and consume) the next character from the input pattern. */
|
||||||
UChar32 uPattern;
|
UChar32 uPattern;
|
||||||
U8_NEXT_UNSAFE(zPattern, iPattern, uPattern);
|
U8_NEXT_UNSAFE(zPattern, iPattern, uPattern);
|
||||||
assert(uPattern!=0);
|
|
||||||
|
|
||||||
/* There are now 4 possibilities:
|
/* There are now 4 possibilities:
|
||||||
**
|
**
|
||||||
@@ -422,6 +421,7 @@ static void icuLoadCollation(
|
|||||||
int rc; /* Return code from sqlite3_create_collation_x() */
|
int rc; /* Return code from sqlite3_create_collation_x() */
|
||||||
|
|
||||||
assert(nArg==2);
|
assert(nArg==2);
|
||||||
|
(void)nArg; /* Unused parameter */
|
||||||
zLocale = (const char *)sqlite3_value_text(apArg[0]);
|
zLocale = (const char *)sqlite3_value_text(apArg[0]);
|
||||||
zName = (const char *)sqlite3_value_text(apArg[1]);
|
zName = (const char *)sqlite3_value_text(apArg[1]);
|
||||||
|
|
||||||
|
60
manifest
60
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Merge\srecent\strunk\senhancements\sand\sfixes.
|
C Merge\sall\srecent\senhancements\sand\sfixes\sfrom\strunk.
|
||||||
D 2015-06-11T18:01:29.396
|
D 2015-06-17T18:18:51.003
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 5f56f6186fdbd0fb33226e9d2279acde3b3fa88b
|
F Makefile.in 5f56f6186fdbd0fb33226e9d2279acde3b3fa88b
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -85,7 +85,7 @@ F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1
|
|||||||
F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb
|
F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb
|
||||||
F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
|
F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
|
||||||
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
|
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
|
||||||
F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5
|
F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652
|
||||||
F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
|
F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
|
||||||
F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e
|
F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e
|
||||||
F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7
|
F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7
|
||||||
@@ -104,7 +104,7 @@ F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c
|
|||||||
F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
|
F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
|
||||||
F ext/fts3/unicode/mkunicode.tcl a2567f9d6ad6779879a2e394c120ad8718557e65
|
F ext/fts3/unicode/mkunicode.tcl a2567f9d6ad6779879a2e394c120ad8718557e65
|
||||||
F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43
|
F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43
|
||||||
F ext/icu/icu.c d415ccf984defeb9df2c0e1afcfaa2f6dc05eacb
|
F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413
|
||||||
F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37
|
F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37
|
||||||
F ext/misc/amatch.c 27b9b601fb1453084e18a3432ea0240d7af8decb
|
F ext/misc/amatch.c 27b9b601fb1453084e18a3432ea0240d7af8decb
|
||||||
F ext/misc/closure.c 636024302cde41b2bf0c542f81c40c624cfb7012
|
F ext/misc/closure.c 636024302cde41b2bf0c542f81c40c624cfb7012
|
||||||
@@ -211,20 +211,20 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240
|
|||||||
F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3
|
F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3
|
||||||
F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d
|
F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d
|
||||||
F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79
|
F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79
|
||||||
F src/btree.c 5166c27883c24768c2f7f53479714f03ef34c612
|
F src/btree.c 02caf39192ed1f5c7157a1aac0b2ff23389233de
|
||||||
F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1
|
F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1
|
||||||
F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4
|
F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4
|
||||||
F src/build.c 6770b74ccb51cb485e81057c625f77455d5ddc06
|
F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70
|
||||||
F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
|
F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
|
||||||
F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575
|
F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575
|
||||||
F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b
|
F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b
|
||||||
F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac
|
F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac
|
||||||
F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a
|
F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a
|
||||||
F src/delete.c b998fbc3c55e8331a5f40aa7ff80972254de8de1
|
F src/delete.c b998fbc3c55e8331a5f40aa7ff80972254de8de1
|
||||||
F src/expr.c 710c764c1974b15a0e56b004ff9f5e6ceab3a854
|
F src/expr.c fbde754df3fa10bbd3a1dcea08e77b0f1684d188
|
||||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||||
F src/fkey.c c9b63a217d86582c22121699a47f22f524608869
|
F src/fkey.c c9b63a217d86582c22121699a47f22f524608869
|
||||||
F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6
|
F src/func.c a98ea5880dc50e9ca6dd6f57079a37b9cfcdecf1
|
||||||
F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e
|
F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e
|
||||||
F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
|
F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
|
||||||
F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
|
F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
|
||||||
@@ -233,8 +233,8 @@ F src/insert.c a81d4454051c92d058d79cd77099e700e36a74f6
|
|||||||
F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
|
F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
|
||||||
F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
|
F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
|
||||||
F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
|
F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
|
||||||
F src/loadext.c 29255bbe1cfb2ce9bbff2526a5ecfddcb49b9271
|
F src/loadext.c e722f4b832f923744788365df5fb8515c0bc8a47
|
||||||
F src/main.c 1659e2e8deee8b4ce7c0be8cd37739b13bbfa2bd
|
F src/main.c 949e2096a9375cbff11e4835c7b99c813ea2f610
|
||||||
F src/malloc.c 908c780fdddd472163c2d1b1820ae4081f01ad20
|
F src/malloc.c 908c780fdddd472163c2d1b1820ae4081f01ad20
|
||||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||||
F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987
|
F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987
|
||||||
@@ -243,7 +243,7 @@ F src/mem3.c 61c9d47b792908c532ca3a62b999cf21795c6534
|
|||||||
F src/mem5.c 61eeb90134f9a5be6c2e68d8daae7628b25953fb
|
F src/mem5.c 61eeb90134f9a5be6c2e68d8daae7628b25953fb
|
||||||
F src/memjournal.c 3eb2c0b51adbd869cb6a44780323f05fa904dc85
|
F src/memjournal.c 3eb2c0b51adbd869cb6a44780323f05fa904dc85
|
||||||
F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495
|
F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495
|
||||||
F src/mutex.c 19bf9acba69ca2f367c3761080f8a9f0cf4670a8
|
F src/mutex.c 529e95739f815300a33c73fd8a7d6bdf0c24bd18
|
||||||
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
|
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
|
||||||
F src/mutex_noop.c 529bab0743c3321c940f32c3464de494fd38cfa9
|
F src/mutex_noop.c 529bab0743c3321c940f32c3464de494fd38cfa9
|
||||||
F src/mutex_unix.c 5cf676464bd19e0a866297515d146e8bf1669dfb
|
F src/mutex_unix.c 5cf676464bd19e0a866297515d146e8bf1669dfb
|
||||||
@@ -261,7 +261,7 @@ F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77
|
|||||||
F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8
|
F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8
|
||||||
F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4
|
F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4
|
||||||
F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8
|
F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8
|
||||||
F src/pcache1.c 69d137620a305f814398bd29a0c998038c0695e9
|
F src/pcache1.c 8e3799b33c41d517d86444d4abefc80d4f02adca
|
||||||
F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7
|
F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7
|
||||||
F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc
|
F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc
|
||||||
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
||||||
@@ -270,11 +270,11 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
|
|||||||
F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708
|
F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708
|
||||||
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
|
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
|
||||||
F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d
|
F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d
|
||||||
F src/shell.c f26cca96f7dadab5efb5e655edf548f4b91695c5
|
F src/shell.c 09565d8e9a2604e503f3d4e39b55ceaaea3446c7
|
||||||
F src/sqlite.h.in f61a45445596dc9fe4cdc84a2c042fb310653bef
|
F src/sqlite.h.in 876ad21b9a6bb5034db7c44cdebd5df2292a5336
|
||||||
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
|
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
|
||||||
F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd
|
F src/sqlite3ext.h be1a718b7d2ce40ceba725ae92c8eb5f18003066
|
||||||
F src/sqliteInt.h eb4d0375eb9fdfcc95c58f7b4c3f6f738ba42850
|
F src/sqliteInt.h 152c1a4cf6858d9724aa79d8cf2e42377ee58194
|
||||||
F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
|
F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
|
||||||
F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179
|
F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179
|
||||||
F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e
|
F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e
|
||||||
@@ -325,20 +325,20 @@ F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283
|
|||||||
F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
|
F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
|
||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481
|
F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481
|
||||||
F src/tokenize.c baa0e550dfa76a8d781732a7bfb1f0aa094942f2
|
F src/tokenize.c 57cb3720f53f84d811def2069c2b169b6be539a5
|
||||||
F src/treeview.c 84aa2d2ed26627ccc8dd3a2becfa18dc86ee4607
|
F src/treeview.c 84aa2d2ed26627ccc8dd3a2becfa18dc86ee4607
|
||||||
F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f
|
F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f
|
||||||
F src/update.c 24dd6a45b8b3470e62702128ebf11be1f2693145
|
F src/update.c 24dd6a45b8b3470e62702128ebf11be1f2693145
|
||||||
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
|
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
|
||||||
F src/util.c a6431c92803b975b7322724a7b433e538d243539
|
F src/util.c a6431c92803b975b7322724a7b433e538d243539
|
||||||
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
|
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
|
||||||
F src/vdbe.c c4fc60e18ec234d88f47f59f89f294f2af2436ea
|
F src/vdbe.c abef10c8329ae4a29f56e0f2d23e15cf6e8c5677
|
||||||
F src/vdbe.h 01d8c35cb877faca74331bb690f0327493c2cb50
|
F src/vdbe.h 218e957540f5e0866501d2b546ded647c86b8d84
|
||||||
F src/vdbeInt.h 50e298245b66b320c8930219c8aeab492c9a4cce
|
F src/vdbeInt.h 571977048ae46b947fb8bbbd1332e5d98f1ca845
|
||||||
F src/vdbeapi.c a5d2e8afd53b4f81934f5ca59c04465cd1a6d50d
|
F src/vdbeapi.c a5d2e8afd53b4f81934f5ca59c04465cd1a6d50d
|
||||||
F src/vdbeaux.c 9b50d9248b54a9961fdd4d5a9ec5c05f93045a7b
|
F src/vdbeaux.c 73788765a2d43514822fbcb2a69068fb48f4dcdd
|
||||||
F src/vdbeblob.c ab33f9b57cfce7dddb23853090186da614be4846
|
F src/vdbeblob.c ab33f9b57cfce7dddb23853090186da614be4846
|
||||||
F src/vdbemem.c 794bba184f95cc64c7e089f01ca9789624c14a61
|
F src/vdbemem.c 05e4f9302fb183c37373908bc33c04c8859015b5
|
||||||
F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b
|
F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b
|
||||||
F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0
|
F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0
|
||||||
F src/vtab.c c535e80259ebe616467181a83a4263555b97c694
|
F src/vtab.c c535e80259ebe616467181a83a4263555b97c694
|
||||||
@@ -346,7 +346,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb
|
|||||||
F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113
|
F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113
|
||||||
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
|
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
|
||||||
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
|
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
|
||||||
F src/where.c 95c0fbfff7aef890b5da7293f6d85cd9a5f99af8
|
F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb
|
||||||
F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047
|
F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047
|
||||||
F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40
|
F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40
|
||||||
F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652
|
F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652
|
||||||
@@ -663,7 +663,7 @@ F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891
|
|||||||
F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7
|
F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7
|
||||||
F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
|
F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
|
||||||
F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849
|
F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849
|
||||||
F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36
|
F test/fts4unicode.test 27378af76394542cf490cf001d8d1505fe55f6a9
|
||||||
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
|
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
|
||||||
F test/func.test ae97561957aba6ca9e3a7b8a13aac41830d701ef
|
F test/func.test ae97561957aba6ca9e3a7b8a13aac41830d701ef
|
||||||
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
|
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
|
||||||
@@ -679,7 +679,7 @@ F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26
|
|||||||
F test/fuzzcheck.c a60f926e3fa86c8d33908406d75eec868c22b9ca
|
F test/fuzzcheck.c a60f926e3fa86c8d33908406d75eec868c22b9ca
|
||||||
F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f
|
F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f
|
||||||
F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973
|
F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973
|
||||||
F test/fuzzdata3.db a6e9bf75b8bfad0b7e60e57038908f4237b9c5d2
|
F test/fuzzdata3.db f4ca6fa92973501cec63ac5d1992ef88f6a78e7f
|
||||||
F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
|
F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
|
||||||
F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
|
F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
|
||||||
F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
|
F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
|
||||||
@@ -963,7 +963,7 @@ F test/superlock.test 1cde669f68d2dd37d6c9bd35eee1d95491ae3fc2
|
|||||||
F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85
|
F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85
|
||||||
F test/syscall.test d2fdaad713f103ac611fe7ef9b724c7b69f8149c
|
F test/syscall.test d2fdaad713f103ac611fe7ef9b724c7b69f8149c
|
||||||
F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6
|
F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6
|
||||||
F test/table.test bd841e8df69b99172ce9c7d53587463913d711ca
|
F test/table.test 33bf0d1fd07f304582695184b8e6feb017303816
|
||||||
F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
|
F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
|
||||||
F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
|
F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
|
||||||
F test/tclsqlite.test 7179b4e0bf236ddf0bfa6bfaefa76fbe0a23c28a
|
F test/tclsqlite.test 7179b4e0bf236ddf0bfa6bfaefa76fbe0a23c28a
|
||||||
@@ -1304,9 +1304,9 @@ F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003
|
|||||||
F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c
|
F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c
|
||||||
F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 0c1a901cd60e557fc676b97625243163dfe9be9d afc6db9b105f32110112b877f06091757888a5f2
|
P c39cb0e2571f58c87053de009e2c135d71b2c3af fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016
|
||||||
R badb2019580fc793add1b23514b50992
|
R b0895354eaa33e80f7f008da5f4f3c57
|
||||||
U drh
|
U drh
|
||||||
Z f08b8b4c812a9cba111c95cd9b9fc9e3
|
Z 0081592a2aae788aeca7ea387179f084
|
||||||
|
@@ -1 +1 @@
|
|||||||
c39cb0e2571f58c87053de009e2c135d71b2c3af
|
199bfb67fdf642cca6cd5d460fa4dc602b94837a
|
27
src/btree.c
27
src/btree.c
@@ -1441,7 +1441,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
|
|||||||
|
|
||||||
/* At this point:
|
/* At this point:
|
||||||
** iFreeBlk: First freeblock after iStart, or zero if none
|
** iFreeBlk: First freeblock after iStart, or zero if none
|
||||||
** iPtr: The address of a pointer iFreeBlk
|
** iPtr: The address of a pointer to iFreeBlk
|
||||||
**
|
**
|
||||||
** Check to see if iFreeBlk should be coalesced onto the end of iStart.
|
** Check to see if iFreeBlk should be coalesced onto the end of iStart.
|
||||||
*/
|
*/
|
||||||
@@ -1449,6 +1449,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
|
|||||||
nFrag = iFreeBlk - iEnd;
|
nFrag = iFreeBlk - iEnd;
|
||||||
if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_BKPT;
|
if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_BKPT;
|
||||||
iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]);
|
iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]);
|
||||||
|
if( iEnd > pPage->pBt->usableSize ) return SQLITE_CORRUPT_BKPT;
|
||||||
iSize = iEnd - iStart;
|
iSize = iEnd - iStart;
|
||||||
iFreeBlk = get2byte(&data[iFreeBlk]);
|
iFreeBlk = get2byte(&data[iFreeBlk]);
|
||||||
}
|
}
|
||||||
@@ -3984,13 +3985,6 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){
|
|||||||
**
|
**
|
||||||
** BtCursor.info is a cache of the information in the current cell.
|
** BtCursor.info is a cache of the information in the current cell.
|
||||||
** Using this cache reduces the number of calls to btreeParseCell().
|
** Using this cache reduces the number of calls to btreeParseCell().
|
||||||
**
|
|
||||||
** 2007-06-25: There is a bug in some versions of MSVC that cause the
|
|
||||||
** compiler to crash when getCellInfo() is implemented as a macro.
|
|
||||||
** But there is a measureable speed advantage to using the macro on gcc
|
|
||||||
** (when less compiler optimizations like -Os or -O0 are used and the
|
|
||||||
** compiler is not doing aggressive inlining.) So we use a real function
|
|
||||||
** for MSVC and a macro for everything else. Ticket #2457.
|
|
||||||
*/
|
*/
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
static void assertCellInfo(BtCursor *pCur){
|
static void assertCellInfo(BtCursor *pCur){
|
||||||
@@ -4003,28 +3997,15 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){
|
|||||||
#else
|
#else
|
||||||
#define assertCellInfo(x)
|
#define assertCellInfo(x)
|
||||||
#endif
|
#endif
|
||||||
#ifdef _MSC_VER
|
static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){
|
||||||
/* Use a real function in MSVC to work around bugs in that compiler. */
|
|
||||||
static void getCellInfo(BtCursor *pCur){
|
|
||||||
if( pCur->info.nSize==0 ){
|
if( pCur->info.nSize==0 ){
|
||||||
int iPage = pCur->iPage;
|
int iPage = pCur->iPage;
|
||||||
btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
|
|
||||||
pCur->curFlags |= BTCF_ValidNKey;
|
pCur->curFlags |= BTCF_ValidNKey;
|
||||||
|
btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
|
||||||
}else{
|
}else{
|
||||||
assertCellInfo(pCur);
|
assertCellInfo(pCur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else /* if not _MSC_VER */
|
|
||||||
/* Use a macro in all other compilers so that the function is inlined */
|
|
||||||
#define getCellInfo(pCur) \
|
|
||||||
if( pCur->info.nSize==0 ){ \
|
|
||||||
int iPage = pCur->iPage; \
|
|
||||||
btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \
|
|
||||||
pCur->curFlags |= BTCF_ValidNKey; \
|
|
||||||
}else{ \
|
|
||||||
assertCellInfo(pCur); \
|
|
||||||
}
|
|
||||||
#endif /* _MSC_VER */
|
|
||||||
|
|
||||||
#ifndef NDEBUG /* The next routine used only within assert() statements */
|
#ifndef NDEBUG /* The next routine used only within assert() statements */
|
||||||
/*
|
/*
|
||||||
|
@@ -976,7 +976,7 @@ void sqlite3StartTable(
|
|||||||
int j1;
|
int j1;
|
||||||
int fileFormat;
|
int fileFormat;
|
||||||
int reg1, reg2, reg3;
|
int reg1, reg2, reg3;
|
||||||
sqlite3BeginWriteOperation(pParse, 0, iDb);
|
sqlite3BeginWriteOperation(pParse, 1, iDb);
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||||
if( isVirtual ){
|
if( isVirtual ){
|
||||||
@@ -1924,6 +1924,7 @@ void sqlite3EndTable(
|
|||||||
regRec = ++pParse->nMem;
|
regRec = ++pParse->nMem;
|
||||||
regRowid = ++pParse->nMem;
|
regRowid = ++pParse->nMem;
|
||||||
assert(pParse->nTab==1);
|
assert(pParse->nTab==1);
|
||||||
|
sqlite3MayAbort(pParse);
|
||||||
sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
|
sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
|
||||||
sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG);
|
sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG);
|
||||||
pParse->nTab = 2;
|
pParse->nTab = 2;
|
||||||
|
19
src/expr.c
19
src/expr.c
@@ -2208,17 +2208,6 @@ static void sqlite3ExprCodeIN(
|
|||||||
}
|
}
|
||||||
#endif /* SQLITE_OMIT_SUBQUERY */
|
#endif /* SQLITE_OMIT_SUBQUERY */
|
||||||
|
|
||||||
/*
|
|
||||||
** Duplicate an 8-byte value
|
|
||||||
*/
|
|
||||||
static char *dup8bytes(Vdbe *v, const char *in){
|
|
||||||
char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8);
|
|
||||||
if( out ){
|
|
||||||
memcpy(out, in, 8);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||||
/*
|
/*
|
||||||
** Generate an instruction that will put the floating point
|
** Generate an instruction that will put the floating point
|
||||||
@@ -2231,12 +2220,10 @@ static char *dup8bytes(Vdbe *v, const char *in){
|
|||||||
static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
|
static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
|
||||||
if( ALWAYS(z!=0) ){
|
if( ALWAYS(z!=0) ){
|
||||||
double value;
|
double value;
|
||||||
char *zV;
|
|
||||||
sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
|
sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
|
||||||
assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
|
assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
|
||||||
if( negateFlag ) value = -value;
|
if( negateFlag ) value = -value;
|
||||||
zV = dup8bytes(v, (char*)&value);
|
sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL);
|
||||||
sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2262,10 +2249,8 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
|
|||||||
assert( z!=0 );
|
assert( z!=0 );
|
||||||
c = sqlite3DecOrHexToI64(z, &value);
|
c = sqlite3DecOrHexToI64(z, &value);
|
||||||
if( c==0 || (c==2 && negFlag) ){
|
if( c==0 || (c==2 && negFlag) ){
|
||||||
char *zV;
|
|
||||||
if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; }
|
if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; }
|
||||||
zV = dup8bytes(v, (char*)&value);
|
sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64);
|
||||||
sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64);
|
|
||||||
}else{
|
}else{
|
||||||
#ifdef SQLITE_OMIT_FLOATING_POINT
|
#ifdef SQLITE_OMIT_FLOATING_POINT
|
||||||
sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
|
sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
|
||||||
|
23
src/func.c
23
src/func.c
@@ -575,17 +575,15 @@ struct compareInfo {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** For LIKE and GLOB matching on EBCDIC machines, assume that every
|
** For LIKE and GLOB matching on EBCDIC machines, assume that every
|
||||||
** character is exactly one byte in size. Also, all characters are
|
** character is exactly one byte in size. Also, provde the Utf8Read()
|
||||||
** able to participate in upper-case-to-lower-case mappings in EBCDIC
|
** macro for fast reading of the next character in the common case where
|
||||||
** whereas only characters less than 0x80 do in ASCII.
|
** the next character is ASCII.
|
||||||
*/
|
*/
|
||||||
#if defined(SQLITE_EBCDIC)
|
#if defined(SQLITE_EBCDIC)
|
||||||
# define sqlite3Utf8Read(A) (*((*A)++))
|
# define sqlite3Utf8Read(A) (*((*A)++))
|
||||||
# define GlobUpperToLower(A) A = sqlite3UpperToLower[A]
|
# define Utf8Read(A) (*(A++))
|
||||||
# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A]
|
|
||||||
#else
|
#else
|
||||||
# define GlobUpperToLower(A) if( A<=0x7f ){ A = sqlite3UpperToLower[A]; }
|
# define Utf8Read(A) (A[0]<0x80?*(A++):sqlite3Utf8Read(&A))
|
||||||
# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A]
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct compareInfo globInfo = { '*', '?', '[', 0 };
|
static const struct compareInfo globInfo = { '*', '?', '[', 0 };
|
||||||
@@ -627,7 +625,7 @@ static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
|
|||||||
** Ec Where E is the "esc" character and c is any other
|
** Ec Where E is the "esc" character and c is any other
|
||||||
** character, including '%', '_', and esc, match exactly c.
|
** character, including '%', '_', and esc, match exactly c.
|
||||||
**
|
**
|
||||||
** The comments through this routine usually assume glob matching.
|
** The comments within this routine usually assume glob matching.
|
||||||
**
|
**
|
||||||
** This routine is usually quick, but can be N**2 in the worst case.
|
** This routine is usually quick, but can be N**2 in the worst case.
|
||||||
*/
|
*/
|
||||||
@@ -651,13 +649,12 @@ static int patternCompare(
|
|||||||
*/
|
*/
|
||||||
matchOther = esc ? esc : pInfo->matchSet;
|
matchOther = esc ? esc : pInfo->matchSet;
|
||||||
|
|
||||||
while( (c = sqlite3Utf8Read(&zPattern))!=0 ){
|
while( (c = Utf8Read(zPattern))!=0 ){
|
||||||
if( c==matchAll ){ /* Match "*" */
|
if( c==matchAll ){ /* Match "*" */
|
||||||
/* Skip over multiple "*" characters in the pattern. If there
|
/* Skip over multiple "*" characters in the pattern. If there
|
||||||
** are also "?" characters, skip those as well, but consume a
|
** are also "?" characters, skip those as well, but consume a
|
||||||
** single character of the input string for each "?" skipped */
|
** single character of the input string for each "?" skipped */
|
||||||
while( (c=sqlite3Utf8Read(&zPattern)) == matchAll
|
while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){
|
||||||
|| c == matchOne ){
|
|
||||||
if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){
|
if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -702,7 +699,7 @@ static int patternCompare(
|
|||||||
if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
|
if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
while( (c2 = sqlite3Utf8Read(&zString))!=0 ){
|
while( (c2 = Utf8Read(zString))!=0 ){
|
||||||
if( c2!=c ) continue;
|
if( c2!=c ) continue;
|
||||||
if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
|
if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
|
||||||
}
|
}
|
||||||
@@ -748,7 +745,7 @@ static int patternCompare(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c2 = sqlite3Utf8Read(&zString);
|
c2 = Utf8Read(zString);
|
||||||
if( c==c2 ) continue;
|
if( c==c2 ) continue;
|
||||||
if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){
|
if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){
|
||||||
continue;
|
continue;
|
||||||
|
@@ -402,7 +402,10 @@ static const sqlite3_api_routines sqlite3Apis = {
|
|||||||
sqlite3_reset_auto_extension,
|
sqlite3_reset_auto_extension,
|
||||||
sqlite3_result_blob64,
|
sqlite3_result_blob64,
|
||||||
sqlite3_result_text64,
|
sqlite3_result_text64,
|
||||||
sqlite3_strglob
|
sqlite3_strglob,
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
(sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup,
|
||||||
|
sqlite3_value_free
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -2103,9 +2103,11 @@ int sqlite3TempInMemory(const sqlite3 *db){
|
|||||||
return ( db->temp_store!=1 );
|
return ( db->temp_store!=1 );
|
||||||
#endif
|
#endif
|
||||||
#if SQLITE_TEMP_STORE==3
|
#if SQLITE_TEMP_STORE==3
|
||||||
|
UNUSED_PARAMETER(db);
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3
|
#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3
|
||||||
|
UNUSED_PARAMETER(db);
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -3377,7 +3379,9 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){
|
|||||||
*/
|
*/
|
||||||
int sqlite3_test_control(int op, ...){
|
int sqlite3_test_control(int op, ...){
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
#ifndef SQLITE_OMIT_BUILTIN_TEST
|
#ifdef SQLITE_OMIT_BUILTIN_TEST
|
||||||
|
UNUSED_PARAMETER(op);
|
||||||
|
#else
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, op);
|
va_start(ap, op);
|
||||||
switch( op ){
|
switch( op ){
|
||||||
|
11
src/mutex.c
11
src/mutex.c
@@ -45,9 +45,14 @@ int sqlite3MutexInit(void){
|
|||||||
}else{
|
}else{
|
||||||
pFrom = sqlite3NoopMutex();
|
pFrom = sqlite3NoopMutex();
|
||||||
}
|
}
|
||||||
memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
|
pTo->xMutexInit = pFrom->xMutexInit;
|
||||||
memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
|
pTo->xMutexEnd = pFrom->xMutexEnd;
|
||||||
sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
|
pTo->xMutexFree = pFrom->xMutexFree;
|
||||||
|
pTo->xMutexEnter = pFrom->xMutexEnter;
|
||||||
|
pTo->xMutexTry = pFrom->xMutexTry;
|
||||||
|
pTo->xMutexLeave = pFrom->xMutexLeave;
|
||||||
|
pTo->xMutexHeld = pFrom->xMutexHeld;
|
||||||
|
pTo->xMutexNotheld = pFrom->xMutexNotheld;
|
||||||
pTo->xMutexAlloc = pFrom->xMutexAlloc;
|
pTo->xMutexAlloc = pFrom->xMutexAlloc;
|
||||||
}
|
}
|
||||||
rc = sqlite3GlobalConfig.mutex.xMutexInit();
|
rc = sqlite3GlobalConfig.mutex.xMutexInit();
|
||||||
|
@@ -148,8 +148,15 @@ static SQLITE_WSD struct PCacheGlobal {
|
|||||||
/*
|
/*
|
||||||
** Macros to enter and leave the PCache LRU mutex.
|
** Macros to enter and leave the PCache LRU mutex.
|
||||||
*/
|
*/
|
||||||
|
#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0
|
||||||
|
# define pcache1EnterMutex(X) assert((X)->mutex==0)
|
||||||
|
# define pcache1LeaveMutex(X) assert((X)->mutex==0)
|
||||||
|
# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0
|
||||||
|
#else
|
||||||
# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex)
|
# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex)
|
||||||
# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex)
|
# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex)
|
||||||
|
# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/
|
/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/
|
||||||
@@ -425,31 +432,30 @@ static void pcache1ResizeHash(PCache1 *p){
|
|||||||
**
|
**
|
||||||
** The PGroup mutex must be held when this function is called.
|
** The PGroup mutex must be held when this function is called.
|
||||||
*/
|
*/
|
||||||
static void pcache1PinPage(PgHdr1 *pPage){
|
static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){
|
||||||
PCache1 *pCache;
|
PCache1 *pCache;
|
||||||
PGroup *pGroup;
|
|
||||||
|
|
||||||
assert( pPage!=0 );
|
assert( pPage!=0 );
|
||||||
assert( pPage->isPinned==0 );
|
assert( pPage->isPinned==0 );
|
||||||
pCache = pPage->pCache;
|
pCache = pPage->pCache;
|
||||||
pGroup = pCache->pGroup;
|
assert( pPage->pLruNext || pPage==pCache->pGroup->pLruTail );
|
||||||
assert( pPage->pLruNext || pPage==pGroup->pLruTail );
|
assert( pPage->pLruPrev || pPage==pCache->pGroup->pLruHead );
|
||||||
assert( pPage->pLruPrev || pPage==pGroup->pLruHead );
|
assert( sqlite3_mutex_held(pCache->pGroup->mutex) );
|
||||||
assert( sqlite3_mutex_held(pGroup->mutex) );
|
|
||||||
if( pPage->pLruPrev ){
|
if( pPage->pLruPrev ){
|
||||||
pPage->pLruPrev->pLruNext = pPage->pLruNext;
|
pPage->pLruPrev->pLruNext = pPage->pLruNext;
|
||||||
}else{
|
}else{
|
||||||
pGroup->pLruHead = pPage->pLruNext;
|
pCache->pGroup->pLruHead = pPage->pLruNext;
|
||||||
}
|
}
|
||||||
if( pPage->pLruNext ){
|
if( pPage->pLruNext ){
|
||||||
pPage->pLruNext->pLruPrev = pPage->pLruPrev;
|
pPage->pLruNext->pLruPrev = pPage->pLruPrev;
|
||||||
}else{
|
}else{
|
||||||
pGroup->pLruTail = pPage->pLruPrev;
|
pCache->pGroup->pLruTail = pPage->pLruPrev;
|
||||||
}
|
}
|
||||||
pPage->pLruNext = 0;
|
pPage->pLruNext = 0;
|
||||||
pPage->pLruPrev = 0;
|
pPage->pLruPrev = 0;
|
||||||
pPage->isPinned = 1;
|
pPage->isPinned = 1;
|
||||||
pCache->nRecyclable--;
|
pCache->nRecyclable--;
|
||||||
|
return pPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -530,10 +536,12 @@ static int pcache1Init(void *NotUsed){
|
|||||||
UNUSED_PARAMETER(NotUsed);
|
UNUSED_PARAMETER(NotUsed);
|
||||||
assert( pcache1.isInit==0 );
|
assert( pcache1.isInit==0 );
|
||||||
memset(&pcache1, 0, sizeof(pcache1));
|
memset(&pcache1, 0, sizeof(pcache1));
|
||||||
|
#if SQLITE_THREADSAFE
|
||||||
if( sqlite3GlobalConfig.bCoreMutex ){
|
if( sqlite3GlobalConfig.bCoreMutex ){
|
||||||
pcache1.grp.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU);
|
pcache1.grp.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU);
|
||||||
pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PMEM);
|
pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PMEM);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
pcache1.grp.mxPinned = 10;
|
pcache1.grp.mxPinned = 10;
|
||||||
pcache1.isInit = 1;
|
pcache1.isInit = 1;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
@@ -729,9 +737,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2(
|
|||||||
** attempt to allocate a new one.
|
** attempt to allocate a new one.
|
||||||
*/
|
*/
|
||||||
if( !pPage ){
|
if( !pPage ){
|
||||||
if( createFlag==1 ) sqlite3BeginBenignMalloc();
|
if( createFlag==1 ){ sqlite3BeginBenignMalloc(); }
|
||||||
pPage = pcache1AllocPage(pCache);
|
pPage = pcache1AllocPage(pCache);
|
||||||
if( createFlag==1 ) sqlite3EndBenignMalloc();
|
if( createFlag==1 ){ sqlite3EndBenignMalloc(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pPage ){
|
if( pPage ){
|
||||||
@@ -805,8 +813,13 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2(
|
|||||||
** proceed to step 5.
|
** proceed to step 5.
|
||||||
**
|
**
|
||||||
** 5. Otherwise, allocate and return a new page buffer.
|
** 5. Otherwise, allocate and return a new page buffer.
|
||||||
|
**
|
||||||
|
** There are two versions of this routine. pcache1FetchWithMutex() is
|
||||||
|
** the general case. pcache1FetchNoMutex() is a faster implementation for
|
||||||
|
** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper
|
||||||
|
** invokes the appropriate routine.
|
||||||
*/
|
*/
|
||||||
static sqlite3_pcache_page *pcache1Fetch(
|
static PgHdr1 *pcache1FetchNoMutex(
|
||||||
sqlite3_pcache *p,
|
sqlite3_pcache *p,
|
||||||
unsigned int iKey,
|
unsigned int iKey,
|
||||||
int createFlag
|
int createFlag
|
||||||
@@ -814,28 +827,63 @@ static sqlite3_pcache_page *pcache1Fetch(
|
|||||||
PCache1 *pCache = (PCache1 *)p;
|
PCache1 *pCache = (PCache1 *)p;
|
||||||
PgHdr1 *pPage = 0;
|
PgHdr1 *pPage = 0;
|
||||||
|
|
||||||
assert( offsetof(PgHdr1,page)==0 );
|
|
||||||
assert( pCache->bPurgeable || createFlag!=1 );
|
|
||||||
assert( pCache->bPurgeable || pCache->nMin==0 );
|
|
||||||
assert( pCache->bPurgeable==0 || pCache->nMin==10 );
|
|
||||||
assert( pCache->nMin==0 || pCache->bPurgeable );
|
|
||||||
assert( pCache->nHash>0 );
|
|
||||||
pcache1EnterMutex(pCache->pGroup);
|
|
||||||
|
|
||||||
/* Step 1: Search the hash table for an existing entry. */
|
/* Step 1: Search the hash table for an existing entry. */
|
||||||
pPage = pCache->apHash[iKey % pCache->nHash];
|
pPage = pCache->apHash[iKey % pCache->nHash];
|
||||||
while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; }
|
while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; }
|
||||||
|
|
||||||
/* Step 2: Abort if no existing page is found and createFlag is 0 */
|
/* Step 2: Abort if no existing page is found and createFlag is 0 */
|
||||||
if( pPage ){
|
if( pPage ){
|
||||||
if( !pPage->isPinned ) pcache1PinPage(pPage);
|
if( !pPage->isPinned ){
|
||||||
|
return pcache1PinPage(pPage);
|
||||||
|
}else{
|
||||||
|
return pPage;
|
||||||
|
}
|
||||||
}else if( createFlag ){
|
}else if( createFlag ){
|
||||||
/* Steps 3, 4, and 5 implemented by this subroutine */
|
/* Steps 3, 4, and 5 implemented by this subroutine */
|
||||||
pPage = pcache1FetchStage2(pCache, iKey, createFlag);
|
return pcache1FetchStage2(pCache, iKey, createFlag);
|
||||||
|
}else{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#if PCACHE1_MIGHT_USE_GROUP_MUTEX
|
||||||
|
static PgHdr1 *pcache1FetchWithMutex(
|
||||||
|
sqlite3_pcache *p,
|
||||||
|
unsigned int iKey,
|
||||||
|
int createFlag
|
||||||
|
){
|
||||||
|
PCache1 *pCache = (PCache1 *)p;
|
||||||
|
PgHdr1 *pPage;
|
||||||
|
|
||||||
|
pcache1EnterMutex(pCache->pGroup);
|
||||||
|
pPage = pcache1FetchNoMutex(p, iKey, createFlag);
|
||||||
assert( pPage==0 || pCache->iMaxKey>=iKey );
|
assert( pPage==0 || pCache->iMaxKey>=iKey );
|
||||||
pcache1LeaveMutex(pCache->pGroup);
|
pcache1LeaveMutex(pCache->pGroup);
|
||||||
return (sqlite3_pcache_page*)pPage;
|
return pPage;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
static sqlite3_pcache_page *pcache1Fetch(
|
||||||
|
sqlite3_pcache *p,
|
||||||
|
unsigned int iKey,
|
||||||
|
int createFlag
|
||||||
|
){
|
||||||
|
#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG)
|
||||||
|
PCache1 *pCache = (PCache1 *)p;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert( offsetof(PgHdr1,page)==0 );
|
||||||
|
assert( pCache->bPurgeable || createFlag!=1 );
|
||||||
|
assert( pCache->bPurgeable || pCache->nMin==0 );
|
||||||
|
assert( pCache->bPurgeable==0 || pCache->nMin==10 );
|
||||||
|
assert( pCache->nMin==0 || pCache->bPurgeable );
|
||||||
|
assert( pCache->nHash>0 );
|
||||||
|
#if PCACHE1_MIGHT_USE_GROUP_MUTEX
|
||||||
|
if( pCache->pGroup->mutex ){
|
||||||
|
return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag);
|
||||||
|
}else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
24
src/shell.c
24
src/shell.c
@@ -1348,7 +1348,10 @@ static void display_scanstats(
|
|||||||
sqlite3 *db, /* Database to query */
|
sqlite3 *db, /* Database to query */
|
||||||
ShellState *pArg /* Pointer to ShellState */
|
ShellState *pArg /* Pointer to ShellState */
|
||||||
){
|
){
|
||||||
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
|
#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
|
||||||
|
UNUSED_PARAMETER(db);
|
||||||
|
UNUSED_PARAMETER(pArg);
|
||||||
|
#else
|
||||||
int i, k, n, mx;
|
int i, k, n, mx;
|
||||||
fprintf(pArg->out, "-------- scanstats --------\n");
|
fprintf(pArg->out, "-------- scanstats --------\n");
|
||||||
mx = 0;
|
mx = 0;
|
||||||
@@ -1910,6 +1913,7 @@ static void readfileFunc(
|
|||||||
long nIn;
|
long nIn;
|
||||||
void *pBuf;
|
void *pBuf;
|
||||||
|
|
||||||
|
UNUSED_PARAMETER(argc);
|
||||||
zName = (const char*)sqlite3_value_text(argv[0]);
|
zName = (const char*)sqlite3_value_text(argv[0]);
|
||||||
if( zName==0 ) return;
|
if( zName==0 ) return;
|
||||||
in = fopen(zName, "rb");
|
in = fopen(zName, "rb");
|
||||||
@@ -1942,6 +1946,7 @@ static void writefileFunc(
|
|||||||
sqlite3_int64 rc;
|
sqlite3_int64 rc;
|
||||||
const char *zFile;
|
const char *zFile;
|
||||||
|
|
||||||
|
UNUSED_PARAMETER(argc);
|
||||||
zFile = (const char*)sqlite3_value_text(argv[0]);
|
zFile = (const char*)sqlite3_value_text(argv[0]);
|
||||||
if( zFile==0 ) return;
|
if( zFile==0 ) return;
|
||||||
out = fopen(zFile, "wb");
|
out = fopen(zFile, "wb");
|
||||||
@@ -2666,7 +2671,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
|
|||||||
fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
|
fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
|
||||||
fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
|
fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
|
||||||
fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
|
fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
|
||||||
for(i=0; i<sizeof(aField)/sizeof(aField[0]); i++){
|
for(i=0; i<ArraySize(aField); i++){
|
||||||
int ofst = aField[i].ofst;
|
int ofst = aField[i].ofst;
|
||||||
unsigned int val = get4byteInt(aHdr + ofst);
|
unsigned int val = get4byteInt(aHdr + ofst);
|
||||||
fprintf(p->out, "%-20s %u", aField[i].zName, val);
|
fprintf(p->out, "%-20s %u", aField[i].zName, val);
|
||||||
@@ -2686,7 +2691,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
|
|||||||
}else{
|
}else{
|
||||||
zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
|
zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
|
||||||
}
|
}
|
||||||
for(i=0; i<sizeof(aQuery)/sizeof(aQuery[0]); i++){
|
for(i=0; i<ArraySize(aQuery); i++){
|
||||||
char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
|
char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
|
||||||
int val = db_int(p, zSql);
|
int val = db_int(p, zSql);
|
||||||
sqlite3_free(zSql);
|
sqlite3_free(zSql);
|
||||||
@@ -3317,7 +3322,7 @@ static int do_meta_command(char *zLine, ShellState *p){
|
|||||||
int i, n2;
|
int i, n2;
|
||||||
open_db(p, 0);
|
open_db(p, 0);
|
||||||
if( nArg==1 ){
|
if( nArg==1 ){
|
||||||
for(i=0; i<sizeof(aLimit)/sizeof(aLimit[0]); i++){
|
for(i=0; i<ArraySize(aLimit); i++){
|
||||||
printf("%20s %d\n", aLimit[i].zLimitName,
|
printf("%20s %d\n", aLimit[i].zLimitName,
|
||||||
sqlite3_limit(p->db, aLimit[i].limitCode, -1));
|
sqlite3_limit(p->db, aLimit[i].limitCode, -1));
|
||||||
}
|
}
|
||||||
@@ -3328,7 +3333,7 @@ static int do_meta_command(char *zLine, ShellState *p){
|
|||||||
}else{
|
}else{
|
||||||
int iLimit = -1;
|
int iLimit = -1;
|
||||||
n2 = strlen30(azArg[1]);
|
n2 = strlen30(azArg[1]);
|
||||||
for(i=0; i<sizeof(aLimit)/sizeof(aLimit[0]); i++){
|
for(i=0; i<ArraySize(aLimit); i++){
|
||||||
if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
|
if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
|
||||||
if( iLimit<0 ){
|
if( iLimit<0 ){
|
||||||
iLimit = i;
|
iLimit = i;
|
||||||
@@ -3438,9 +3443,8 @@ static int do_meta_command(char *zLine, ShellState *p){
|
|||||||
const char *zSavedFilename = p->zDbFilename;
|
const char *zSavedFilename = p->zDbFilename;
|
||||||
char *zNewFilename = 0;
|
char *zNewFilename = 0;
|
||||||
p->db = 0;
|
p->db = 0;
|
||||||
if( nArg>=2 ){
|
if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
|
||||||
p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
|
p->zDbFilename = zNewFilename;
|
||||||
}
|
|
||||||
open_db(p, 1);
|
open_db(p, 1);
|
||||||
if( p->db!=0 ){
|
if( p->db!=0 ){
|
||||||
session_close_all(p);
|
session_close_all(p);
|
||||||
@@ -4096,7 +4100,7 @@ static int do_meta_command(char *zLine, ShellState *p){
|
|||||||
/* convert testctrl text option to value. allow any unique prefix
|
/* convert testctrl text option to value. allow any unique prefix
|
||||||
** of the option name, or a numerical value. */
|
** of the option name, or a numerical value. */
|
||||||
n2 = strlen30(azArg[1]);
|
n2 = strlen30(azArg[1]);
|
||||||
for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
|
for(i=0; i<ArraySize(aCtrl); i++){
|
||||||
if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
|
if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
|
||||||
if( testctrl<0 ){
|
if( testctrl<0 ){
|
||||||
testctrl = aCtrl[i].ctrlCode;
|
testctrl = aCtrl[i].ctrlCode;
|
||||||
@@ -5073,7 +5077,7 @@ int SQLITE_CDECL main(int argc, char **argv){
|
|||||||
sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
|
sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( zHistory ) shell_read_history(zHistory);
|
if( zHistory ){ shell_read_history(zHistory); }
|
||||||
rc = process_input(&data, 0);
|
rc = process_input(&data, 0);
|
||||||
if( zHistory ){
|
if( zHistory ){
|
||||||
shell_stifle_history(100);
|
shell_stifle_history(100);
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
**
|
**
|
||||||
** The official C-language API documentation for SQLite is derived
|
** The official C-language API documentation for SQLite is derived
|
||||||
** from comments in this file. This file is the authoritative source
|
** from comments in this file. This file is the authoritative source
|
||||||
** on how SQLite interfaces are suppose to operate.
|
** on how SQLite interfaces are supposed to operate.
|
||||||
**
|
**
|
||||||
** The name of this file under configuration management is "sqlite.h.in".
|
** The name of this file under configuration management is "sqlite.h.in".
|
||||||
** The makefile makes some minor changes to this file (such as inserting
|
** The makefile makes some minor changes to this file (such as inserting
|
||||||
|
@@ -267,7 +267,8 @@ struct sqlite3_api_routines {
|
|||||||
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
||||||
void(*)(void*), unsigned char);
|
void(*)(void*), unsigned char);
|
||||||
int (*strglob)(const char*,const char*);
|
int (*strglob)(const char*,const char*);
|
||||||
sqlite3_value (*value_dup)(const sqlite3_value*);
|
/* Version 3.8.11 and later */
|
||||||
|
sqlite3_value *(*value_dup)(const sqlite3_value*);
|
||||||
void (*value_free)(sqlite3_value*);
|
void (*value_free)(sqlite3_value*);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -3078,7 +3078,9 @@ int sqlite3CantopenError(int);
|
|||||||
# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
|
# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
|
||||||
# define sqlite3Tolower(x) tolower((unsigned char)(x))
|
# define sqlite3Tolower(x) tolower((unsigned char)(x))
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
|
||||||
int sqlite3IsIdChar(u8);
|
int sqlite3IsIdChar(u8);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Internal function prototypes
|
** Internal function prototypes
|
||||||
@@ -3106,7 +3108,9 @@ void sqlite3ScratchFree(void*);
|
|||||||
void *sqlite3PageMalloc(int);
|
void *sqlite3PageMalloc(int);
|
||||||
void sqlite3PageFree(void*);
|
void sqlite3PageFree(void*);
|
||||||
void sqlite3MemSetDefault(void);
|
void sqlite3MemSetDefault(void);
|
||||||
|
#ifndef SQLITE_OMIT_BUILTIN_TEST
|
||||||
void sqlite3BenignMallocHooks(void (*)(void), void (*)(void));
|
void sqlite3BenignMallocHooks(void (*)(void), void (*)(void));
|
||||||
|
#endif
|
||||||
int sqlite3HeapNearlyFull(void);
|
int sqlite3HeapNearlyFull(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3250,7 +3254,9 @@ int sqlite3BitvecSet(Bitvec*, u32);
|
|||||||
void sqlite3BitvecClear(Bitvec*, u32, void*);
|
void sqlite3BitvecClear(Bitvec*, u32, void*);
|
||||||
void sqlite3BitvecDestroy(Bitvec*);
|
void sqlite3BitvecDestroy(Bitvec*);
|
||||||
u32 sqlite3BitvecSize(Bitvec*);
|
u32 sqlite3BitvecSize(Bitvec*);
|
||||||
|
#ifndef SQLITE_OMIT_BUILTIN_TEST
|
||||||
int sqlite3BitvecBuiltinTest(int,int*);
|
int sqlite3BitvecBuiltinTest(int,int*);
|
||||||
|
#endif
|
||||||
|
|
||||||
RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
|
RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
|
||||||
void sqlite3RowSetClear(RowSet*);
|
void sqlite3RowSetClear(RowSet*);
|
||||||
@@ -3355,8 +3361,10 @@ void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
|
|||||||
void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
|
void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
|
||||||
int sqlite3FunctionUsesThisSrc(Expr*, SrcList*);
|
int sqlite3FunctionUsesThisSrc(Expr*, SrcList*);
|
||||||
Vdbe *sqlite3GetVdbe(Parse*);
|
Vdbe *sqlite3GetVdbe(Parse*);
|
||||||
|
#ifndef SQLITE_OMIT_BUILTIN_TEST
|
||||||
void sqlite3PrngSaveState(void);
|
void sqlite3PrngSaveState(void);
|
||||||
void sqlite3PrngRestoreState(void);
|
void sqlite3PrngRestoreState(void);
|
||||||
|
#endif
|
||||||
void sqlite3RollbackAll(sqlite3*,int);
|
void sqlite3RollbackAll(sqlite3*,int);
|
||||||
void sqlite3CodeVerifySchema(Parse*, int);
|
void sqlite3CodeVerifySchema(Parse*, int);
|
||||||
void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb);
|
void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb);
|
||||||
|
@@ -102,7 +102,11 @@ const char sqlite3IsEbcdicIdChar[] = {
|
|||||||
};
|
};
|
||||||
#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
|
#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Make the IdChar function accessible from ctime.c */
|
||||||
|
#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
|
||||||
int sqlite3IsIdChar(u8 c){ return IdChar(c); }
|
int sqlite3IsIdChar(u8 c){ return IdChar(c); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
20
src/vdbe.c
20
src/vdbe.c
@@ -3521,6 +3521,26 @@ case OP_Close: {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||||
|
/* Opcode: ColumnsUsed P1 * * P4 *
|
||||||
|
**
|
||||||
|
** This opcode (which only exists if SQLite was compiled with
|
||||||
|
** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the
|
||||||
|
** table or index for cursor P1 are used. P4 is a 64-bit integer
|
||||||
|
** (P4_INT64) in which the first 63 bits are one for each of the
|
||||||
|
** first 63 columns of the table or index that are actually used
|
||||||
|
** by the cursor. The high-order bit is set if any column after
|
||||||
|
** the 64th is used.
|
||||||
|
*/
|
||||||
|
case OP_ColumnsUsed: {
|
||||||
|
VdbeCursor *pC;
|
||||||
|
pC = p->apCsr[pOp->p1];
|
||||||
|
assert( pC->pCursor );
|
||||||
|
pC->maskUsed = *(u64*)pOp->p4.pI64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Opcode: SeekGE P1 P2 P3 P4 *
|
/* Opcode: SeekGE P1 P2 P3 P4 *
|
||||||
** Synopsis: key=r[P3@P4]
|
** Synopsis: key=r[P3@P4]
|
||||||
**
|
**
|
||||||
|
@@ -171,6 +171,7 @@ int sqlite3VdbeAddOp1(Vdbe*,int,int);
|
|||||||
int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
|
int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
|
||||||
int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
|
int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
|
||||||
int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
|
int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
|
||||||
|
int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int);
|
||||||
int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int);
|
int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int);
|
||||||
int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
|
int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
|
||||||
void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
|
void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
|
||||||
|
@@ -83,6 +83,9 @@ struct VdbeCursor {
|
|||||||
i64 seqCount; /* Sequence counter */
|
i64 seqCount; /* Sequence counter */
|
||||||
i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */
|
i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */
|
||||||
VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */
|
VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */
|
||||||
|
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||||
|
u64 maskUsed; /* Mask of columns used by this cursor */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Cached information about the header for the data record that the
|
/* Cached information about the header for the data record that the
|
||||||
** cursor is currently pointing to. Only valid if cacheStatus matches
|
** cursor is currently pointing to. Only valid if cacheStatus matches
|
||||||
|
@@ -234,6 +234,23 @@ int sqlite3VdbeAddOp4(
|
|||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Add an opcode that includes the p4 value with a P4_INT64 type.
|
||||||
|
*/
|
||||||
|
int sqlite3VdbeAddOp4Dup8(
|
||||||
|
Vdbe *p, /* Add the opcode to this VM */
|
||||||
|
int op, /* The new opcode */
|
||||||
|
int p1, /* The P1 operand */
|
||||||
|
int p2, /* The P2 operand */
|
||||||
|
int p3, /* The P3 operand */
|
||||||
|
const u8 *zP4, /* The P4 operand */
|
||||||
|
int p4type /* P4 operand type */
|
||||||
|
){
|
||||||
|
char *p4copy = sqlite3DbMallocRaw(sqlite3VdbeDb(p), 8);
|
||||||
|
if( p4copy ) memcpy(p4copy, zP4, 8);
|
||||||
|
return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Add an OP_ParseSchema opcode. This routine is broken out from
|
** Add an OP_ParseSchema opcode. This routine is broken out from
|
||||||
** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
|
** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
|
||||||
@@ -398,6 +415,7 @@ static Op *opIterNext(VdbeOpIter *p){
|
|||||||
** * OP_VUpdate
|
** * OP_VUpdate
|
||||||
** * OP_VRename
|
** * OP_VRename
|
||||||
** * OP_FkCounter with P2==0 (immediate foreign key constraint)
|
** * OP_FkCounter with P2==0 (immediate foreign key constraint)
|
||||||
|
** * OP_CreateTable and OP_InitCoroutine (for CREATE TABLE AS SELECT ...)
|
||||||
**
|
**
|
||||||
** Then check that the value of Parse.mayAbort is true if an
|
** Then check that the value of Parse.mayAbort is true if an
|
||||||
** ABORT may be thrown, or false otherwise. Return true if it does
|
** ABORT may be thrown, or false otherwise. Return true if it does
|
||||||
@@ -409,6 +427,8 @@ static Op *opIterNext(VdbeOpIter *p){
|
|||||||
int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
|
int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
|
||||||
int hasAbort = 0;
|
int hasAbort = 0;
|
||||||
int hasFkCounter = 0;
|
int hasFkCounter = 0;
|
||||||
|
int hasCreateTable = 0;
|
||||||
|
int hasInitCoroutine = 0;
|
||||||
Op *pOp;
|
Op *pOp;
|
||||||
VdbeOpIter sIter;
|
VdbeOpIter sIter;
|
||||||
memset(&sIter, 0, sizeof(sIter));
|
memset(&sIter, 0, sizeof(sIter));
|
||||||
@@ -423,6 +443,8 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
|
|||||||
hasAbort = 1;
|
hasAbort = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if( opcode==OP_CreateTable ) hasCreateTable = 1;
|
||||||
|
if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1;
|
||||||
#ifndef SQLITE_OMIT_FOREIGN_KEY
|
#ifndef SQLITE_OMIT_FOREIGN_KEY
|
||||||
if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){
|
if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){
|
||||||
hasFkCounter = 1;
|
hasFkCounter = 1;
|
||||||
@@ -436,7 +458,8 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
|
|||||||
** through all opcodes and hasAbort may be set incorrectly. Return
|
** through all opcodes and hasAbort may be set incorrectly. Return
|
||||||
** true for this case to prevent the assert() in the callers frame
|
** true for this case to prevent the assert() in the callers frame
|
||||||
** from failing. */
|
** from failing. */
|
||||||
return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter );
|
return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter
|
||||||
|
|| (hasCreateTable && hasInitCoroutine) );
|
||||||
}
|
}
|
||||||
#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
|
#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
|
||||||
|
|
||||||
@@ -1219,12 +1242,11 @@ void sqlite3VdbeEnter(Vdbe *p){
|
|||||||
/*
|
/*
|
||||||
** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter().
|
** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter().
|
||||||
*/
|
*/
|
||||||
void sqlite3VdbeLeave(Vdbe *p){
|
static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){
|
||||||
int i;
|
int i;
|
||||||
sqlite3 *db;
|
sqlite3 *db;
|
||||||
Db *aDb;
|
Db *aDb;
|
||||||
int nDb;
|
int nDb;
|
||||||
if( DbMaskAllZero(p->lockMask) ) return; /* The common case */
|
|
||||||
db = p->db;
|
db = p->db;
|
||||||
aDb = db->aDb;
|
aDb = db->aDb;
|
||||||
nDb = db->nDb;
|
nDb = db->nDb;
|
||||||
@@ -1234,6 +1256,10 @@ void sqlite3VdbeLeave(Vdbe *p){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void sqlite3VdbeLeave(Vdbe *p){
|
||||||
|
if( DbMaskAllZero(p->lockMask) ) return; /* The common case */
|
||||||
|
vdbeLeave(p);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
|
#if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
|
||||||
|
@@ -942,6 +942,32 @@ int sqlite3VdbeMemSetStr(
|
|||||||
** If this routine fails for any reason (malloc returns NULL or unable
|
** If this routine fails for any reason (malloc returns NULL or unable
|
||||||
** to read from the disk) then the pMem is left in an inconsistent state.
|
** to read from the disk) then the pMem is left in an inconsistent state.
|
||||||
*/
|
*/
|
||||||
|
static SQLITE_NOINLINE int vdbeMemFromBtreeResize(
|
||||||
|
BtCursor *pCur, /* Cursor pointing at record to retrieve. */
|
||||||
|
u32 offset, /* Offset from the start of data to return bytes from. */
|
||||||
|
u32 amt, /* Number of bytes to return. */
|
||||||
|
int key, /* If true, retrieve from the btree key, not data. */
|
||||||
|
Mem *pMem /* OUT: Return data in this Mem structure. */
|
||||||
|
){
|
||||||
|
int rc;
|
||||||
|
pMem->flags = MEM_Null;
|
||||||
|
if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){
|
||||||
|
if( key ){
|
||||||
|
rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
|
||||||
|
}else{
|
||||||
|
rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
|
||||||
|
}
|
||||||
|
if( rc==SQLITE_OK ){
|
||||||
|
pMem->z[amt] = 0;
|
||||||
|
pMem->z[amt+1] = 0;
|
||||||
|
pMem->flags = MEM_Blob|MEM_Term;
|
||||||
|
pMem->n = (int)amt;
|
||||||
|
}else{
|
||||||
|
sqlite3VdbeMemRelease(pMem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
int sqlite3VdbeMemFromBtree(
|
int sqlite3VdbeMemFromBtree(
|
||||||
BtCursor *pCur, /* Cursor pointing at record to retrieve. */
|
BtCursor *pCur, /* Cursor pointing at record to retrieve. */
|
||||||
u32 offset, /* Offset from the start of data to return bytes from. */
|
u32 offset, /* Offset from the start of data to return bytes from. */
|
||||||
@@ -971,22 +997,7 @@ int sqlite3VdbeMemFromBtree(
|
|||||||
pMem->flags = MEM_Blob|MEM_Ephem;
|
pMem->flags = MEM_Blob|MEM_Ephem;
|
||||||
pMem->n = (int)amt;
|
pMem->n = (int)amt;
|
||||||
}else{
|
}else{
|
||||||
pMem->flags = MEM_Null;
|
rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem);
|
||||||
if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){
|
|
||||||
if( key ){
|
|
||||||
rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
|
|
||||||
}else{
|
|
||||||
rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
|
|
||||||
}
|
|
||||||
if( rc==SQLITE_OK ){
|
|
||||||
pMem->z[amt] = 0;
|
|
||||||
pMem->z[amt+1] = 0;
|
|
||||||
pMem->flags = MEM_Blob|MEM_Term;
|
|
||||||
pMem->n = (int)amt;
|
|
||||||
}else{
|
|
||||||
sqlite3VdbeMemRelease(pMem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
19
src/where.c
19
src/where.c
@@ -4213,6 +4213,10 @@ WhereInfo *sqlite3WhereBegin(
|
|||||||
SQLITE_INT_TO_PTR(n), P4_INT32);
|
SQLITE_INT_TO_PTR(n), P4_INT32);
|
||||||
assert( n<=pTab->nCol );
|
assert( n<=pTab->nCol );
|
||||||
}
|
}
|
||||||
|
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||||
|
sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0,
|
||||||
|
(const u8*)&pTabItem->colUsed, P4_INT64);
|
||||||
|
#endif
|
||||||
}else{
|
}else{
|
||||||
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
|
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
|
||||||
}
|
}
|
||||||
@@ -4258,6 +4262,21 @@ WhereInfo *sqlite3WhereBegin(
|
|||||||
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */
|
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */
|
||||||
}
|
}
|
||||||
VdbeComment((v, "%s", pIx->zName));
|
VdbeComment((v, "%s", pIx->zName));
|
||||||
|
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||||
|
{
|
||||||
|
u64 colUsed = 0;
|
||||||
|
int ii, jj;
|
||||||
|
for(ii=0; ii<pIx->nColumn; ii++){
|
||||||
|
jj = pIx->aiColumn[ii];
|
||||||
|
if( jj<0 ) continue;
|
||||||
|
if( jj>63 ) jj = 63;
|
||||||
|
if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue;
|
||||||
|
colUsed |= ((u64)1)<<(ii<63 ? ii : 63);
|
||||||
|
}
|
||||||
|
sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0,
|
||||||
|
(u8*)&colUsed, P4_INT64);
|
||||||
|
}
|
||||||
|
#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb);
|
if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb);
|
||||||
|
@@ -362,11 +362,17 @@ ifcapable icu { lappend tokenizers icu }
|
|||||||
# Some tests to check that the tokenizers can both identify white-space
|
# Some tests to check that the tokenizers can both identify white-space
|
||||||
# codepoints. All codepoints tested below are of type "Zs" in the
|
# codepoints. All codepoints tested below are of type "Zs" in the
|
||||||
# UnicodeData.txt file.
|
# UnicodeData.txt file.
|
||||||
|
#
|
||||||
|
# Note that codepoint 6158 has changed from Zs to Cf in recent versions
|
||||||
|
# of UnicodeData.txt. So take that into account for the "icu" tests.
|
||||||
|
#
|
||||||
foreach T $tokenizers {
|
foreach T $tokenizers {
|
||||||
do_isspace_test 6.$T.1 $T 32
|
do_isspace_test 6.$T.1 $T 32
|
||||||
do_isspace_test 6.$T.2 $T 160
|
do_isspace_test 6.$T.2 $T 160
|
||||||
do_isspace_test 6.$T.3 $T 5760
|
do_isspace_test 6.$T.3 $T 5760
|
||||||
|
if {$T!="icu"} {
|
||||||
do_isspace_test 6.$T.4 $T 6158
|
do_isspace_test 6.$T.4 $T 6158
|
||||||
|
}
|
||||||
do_isspace_test 6.$T.5 $T 8192
|
do_isspace_test 6.$T.5 $T 8192
|
||||||
do_isspace_test 6.$T.6 $T 8193
|
do_isspace_test 6.$T.6 $T 8193
|
||||||
do_isspace_test 6.$T.7 $T 8194
|
do_isspace_test 6.$T.7 $T 8194
|
||||||
@@ -382,7 +388,11 @@ foreach T $tokenizers {
|
|||||||
do_isspace_test 6.$T.17 $T 8287
|
do_isspace_test 6.$T.17 $T 8287
|
||||||
do_isspace_test 6.$T.18 $T 12288
|
do_isspace_test 6.$T.18 $T 12288
|
||||||
|
|
||||||
|
if {$T!="icu"} {
|
||||||
do_isspace_test 6.$T.19 $T {32 160 5760 6158}
|
do_isspace_test 6.$T.19 $T {32 160 5760 6158}
|
||||||
|
} else {
|
||||||
|
do_isspace_test 6.$T.19 $T {32 160 5760 8192}
|
||||||
|
}
|
||||||
do_isspace_test 6.$T.20 $T {8192 8193 8194 8195}
|
do_isspace_test 6.$T.20 $T {8192 8193 8194 8195}
|
||||||
do_isspace_test 6.$T.21 $T {8196 8197 8198 8199}
|
do_isspace_test 6.$T.21 $T {8196 8197 8198 8199}
|
||||||
do_isspace_test 6.$T.22 $T {8200 8201 8202 8239}
|
do_isspace_test 6.$T.22 $T {8200 8201 8202 8239}
|
||||||
|
Binary file not shown.
@@ -808,4 +808,20 @@ do_execsql_test table-17.1 {
|
|||||||
SELECT p, q, '|' FROM t3 ORDER BY p;
|
SELECT p, q, '|' FROM t3 ORDER BY p;
|
||||||
} {1 1 | 2 2 |}
|
} {1 1 | 2 2 |}
|
||||||
|
|
||||||
|
# 2015-06-16
|
||||||
|
# Ticket [https://www.sqlite.org/src/tktview/873cae2b6e25b1991ce5e9b782f9cd0409b96063]
|
||||||
|
# Make sure a CREATE TABLE AS statement correctly rolls back partial changes to the
|
||||||
|
# sqlite_master table when the SELECT on the right-hand side aborts.
|
||||||
|
#
|
||||||
|
do_catchsql_test table-18.1 {
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
BEGIN;
|
||||||
|
CREATE TABLE t1 AS SELECT zeroblob(2e20);
|
||||||
|
} {1 {string or blob too big}}
|
||||||
|
do_execsql_test table-18.2 {
|
||||||
|
COMMIT;
|
||||||
|
PRAGMA integrity_check;
|
||||||
|
} {ok}
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@@ -9,6 +9,28 @@ echo '********** No optimizations. Includes FTS4 and RTREE *********'
|
|||||||
gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \
|
gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \
|
||||||
-ansi -DHAVE_STDINT_H -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE \
|
-ansi -DHAVE_STDINT_H -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE \
|
||||||
sqlite3.c
|
sqlite3.c
|
||||||
|
echo '********** Android configuration ******************************'
|
||||||
|
gcc -c \
|
||||||
|
-DHAVE_USLEEP=1 \
|
||||||
|
-DSQLITE_HAVE_ISNAN \
|
||||||
|
-DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
|
||||||
|
-DSQLITE_THREADSAFE=2 \
|
||||||
|
-DSQLITE_TEMP_STORE=3 \
|
||||||
|
-DSQLITE_POWERSAFE_OVERWRITE=1 \
|
||||||
|
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
|
||||||
|
-DSQLITE_DEFAULT_AUTOVACUUM=1 \
|
||||||
|
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 \
|
||||||
|
-DSQLITE_ENABLE_FTS3 \
|
||||||
|
-DSQLITE_ENABLE_FTS3_BACKWARDS \
|
||||||
|
-DSQLITE_ENABLE_FTS4 \
|
||||||
|
-DSQLITE_OMIT_BUILTIN_TEST \
|
||||||
|
-DSQLITE_OMIT_COMPILEOPTION_DIAGS \
|
||||||
|
-DSQLITE_OMIT_LOAD_EXTENSION \
|
||||||
|
-DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 \
|
||||||
|
-DSQLITE_ENABLE_ICU \
|
||||||
|
-DUSE_PREAD64 \
|
||||||
|
-Wshadow -Wall -Wextra \
|
||||||
|
-Os sqlite3.c shell.c
|
||||||
echo '********** No optimizations. ENABLE_STAT4. THREADSAFE=0 *******'
|
echo '********** No optimizations. ENABLE_STAT4. THREADSAFE=0 *******'
|
||||||
gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \
|
gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \
|
||||||
-ansi -DSQLITE_ENABLE_STAT4 -DSQLITE_THREADSAFE=0 \
|
-ansi -DSQLITE_ENABLE_STAT4 -DSQLITE_THREADSAFE=0 \
|
||||||
|
Reference in New Issue
Block a user