1
0
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:
drh
2015-06-17 18:18:51 +00:00
27 changed files with 330 additions and 160 deletions

View File

@@ -240,12 +240,13 @@ static int icuNext(
** The set of routines that implement the simple tokenizer ** The set of routines that implement the simple tokenizer
*/ */
static const sqlite3_tokenizer_module icuTokenizerModule = { static const sqlite3_tokenizer_module icuTokenizerModule = {
0, /* iVersion */ 0, /* iVersion */
icuCreate, /* xCreate */ icuCreate, /* xCreate */
icuDestroy, /* xCreate */ icuDestroy, /* xCreate */
icuOpen, /* xOpen */ icuOpen, /* xOpen */
icuClose, /* xClose */ icuClose, /* xClose */
icuNext, /* xNext */ icuNext, /* xNext */
0, /* xLanguageid */
}; };
/* /*

View File

@@ -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]);

View File

@@ -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

View File

@@ -1 +1 @@
c39cb0e2571f58c87053de009e2c135d71b2c3af 199bfb67fdf642cca6cd5d460fa4dc602b94837a

View File

@@ -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. */ if( pCur->info.nSize==0 ){
static void getCellInfo(BtCursor *pCur){ int iPage = pCur->iPage;
if( pCur->info.nSize==0 ){ pCur->curFlags |= BTCF_ValidNKey;
int iPage = pCur->iPage; btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); }else{
pCur->curFlags |= BTCF_ValidNKey; assertCellInfo(pCur);
}else{
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 */
/* /*

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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
}; };
/* /*

View File

@@ -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 ){

View File

@@ -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();

View File

@@ -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.
*/ */
#define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) #if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0
#define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) # 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 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);
}
} }

View File

@@ -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);

View File

@@ -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

View File

@@ -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*);
}; };

View File

@@ -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);

View File

@@ -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
/* /*

View File

@@ -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]
** **

View File

@@ -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*);

View File

@@ -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

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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
do_isspace_test 6.$T.4 $T 6158 if {$T!="icu"} {
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
do_isspace_test 6.$T.19 $T {32 160 5760 6158} if {$T!="icu"} {
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.

View File

@@ -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

View File

@@ -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 \