1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Merge latest trunk changes with this branch.

FossilOrigin-Name: 251022034219819a1dc356542770ff46e3147a080f072eb20af6106771dadd92
This commit is contained in:
dan
2018-06-07 20:35:28 +00:00
28 changed files with 381 additions and 171 deletions

View File

@@ -1 +1 @@
3.24.0 3.25.0

18
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for sqlite 3.24.0. # Generated by GNU Autoconf 2.69 for sqlite 3.25.0.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -726,8 +726,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sqlite' PACKAGE_NAME='sqlite'
PACKAGE_TARNAME='sqlite' PACKAGE_TARNAME='sqlite'
PACKAGE_VERSION='3.24.0' PACKAGE_VERSION='3.25.0'
PACKAGE_STRING='sqlite 3.24.0' PACKAGE_STRING='sqlite 3.25.0'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@@ -1465,7 +1465,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures sqlite 3.24.0 to adapt to many kinds of systems. \`configure' configures sqlite 3.25.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1530,7 +1530,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of sqlite 3.24.0:";; short | recursive ) echo "Configuration of sqlite 3.25.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1655,7 +1655,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
sqlite configure 3.24.0 sqlite configure 3.25.0
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2074,7 +2074,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by sqlite $as_me 3.24.0, which was It was created by sqlite $as_me 3.25.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -12242,7 +12242,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sqlite $as_me 3.24.0, which was This file was extended by sqlite $as_me 3.25.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -12308,7 +12308,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
sqlite config.status 3.24.0 sqlite config.status 3.25.0
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,12 +1,12 @@
C Add\swindow\sfunctions\slag()\sand\slead(). C Merge\slatest\strunk\schanges\swith\sthis\sbranch.
D 2018-06-07T20:08:59.730 D 2018-06-07T20:35:28.263
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 681fb88cccf1fd58c0b9648f6a09b75332206ef72ca76012ad11699c320cec5f F Makefile.msc 681fb88cccf1fd58c0b9648f6a09b75332206ef72ca76012ad11699c320cec5f
F README.md 7764d56778d567913ef11c82da9ab94aefa0826f7c243351e4e2d7adaef6f373 F README.md 7764d56778d567913ef11c82da9ab94aefa0826f7c243351e4e2d7adaef6f373
F VERSION b7c9d1d11cb70ef8e90cfcf3c944aa58a9f801cc2ad487eebb0a110c16dfc2df F VERSION d3e3afdec1165a5e593dcdfffd8e0f33a2b0186067eb51a073ef6c4aec34923d
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
@@ -33,7 +33,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63
F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977
F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc
F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55
F configure 80e2dcad8ab88aacc58b55eb0e395f79184b45fcfaa3f36fc20d2e71cfa0a7e4 x F configure 481df2c668b5c8cd5723dbcda88df8e6796a23884877109d1fe558667a0474bf x
F configure.ac d4529ebb26ae046269334f1dac65f2b1d6927c2efe22b2ec24dce24dfe4f83dd F configure.ac d4529ebb26ae046269334f1dac65f2b1d6927c2efe22b2ec24dce24dfe4f83dd
F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
F doc/lemon.html ac63db056bce24b7368e29319cd1a7eb5f1798cc85922d96a80b6c3a4ff9f51b F doc/lemon.html ac63db056bce24b7368e29319cd1a7eb5f1798cc85922d96a80b6c3a4ff9f51b
@@ -429,22 +429,22 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c cf7a8af45cb0ace672f47a1b29ab24092a9e8cd8d945a9974e3b5d925f548594 F src/alter.c 819b14b58e71565f8da505a9c1d5d9d904605f85cd64179cf9c7d1edcdad6c25
F src/analyze.c 1250e69bd137314845afec5c489fc49c9de7baef68970b5530a7bc28f7611db1 F src/analyze.c 1250e69bd137314845afec5c489fc49c9de7baef68970b5530a7bc28f7611db1
F src/attach.c 3af6abc40733d10014b401c89a4e8ecfa7c3855517c62004461875220a3af453 F src/attach.c 3af6abc40733d10014b401c89a4e8ecfa7c3855517c62004461875220a3af453
F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8 F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8
F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
F src/btree.c 7c26bc1d8ee43ea312c07c9abe332514d85f48aae37661e170cdd790a138b7d8 F src/btree.c c38cd920641bf05c932caf657524927115c721489f14cc109efc4da5c43205b2
F src/btree.h d46a8e31a4bd15572cdb6f2c940966f57b605b865628028c5eccf7d1bed83bac F src/btree.h 7b557914561f60a0eb76c2e22c23ab5b82f87b734a91c1b9385654b6474fdf7f
F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
F src/build.c 5fc41458505331bfb0c175f40b9a13cb335f826bed3ae311aaae000c132d7b16 F src/build.c 5fc41458505331bfb0c175f40b9a13cb335f826bed3ae311aaae000c132d7b16
F src/callback.c 36caff1e7eb7deb58572d59c41cee8f064a11d00297616995c5050ea0cfc1288 F src/callback.c 36caff1e7eb7deb58572d59c41cee8f064a11d00297616995c5050ea0cfc1288
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 849d4cebe008cfc6e4799b034a172b4eaf8856b100739632a852732ba66eee48 F src/ctime.c 849d4cebe008cfc6e4799b034a172b4eaf8856b100739632a852732ba66eee48
F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
F src/dbpage.c 8db4c97f630e7d83f884ea75caf1ffd0988c160e9d530194d93721c80821e0f6 F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3
F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91 F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
F src/delete.c 4c8c7604277a2041647f96b78f4b9a47858e9217e4fb333d35e7b5ab32c5b57f F src/delete.c 4c8c7604277a2041647f96b78f4b9a47858e9217e4fb333d35e7b5ab32c5b57f
F src/expr.c 7c8880478dfacabff1c3e405fa11dc37e1e244a81bf6d175faecf36adb705ef0 F src/expr.c 7c8880478dfacabff1c3e405fa11dc37e1e244a81bf6d175faecf36adb705ef0
@@ -459,7 +459,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 76b1dc902e4c3930d9a17a40cd8ee2e94b1fd8cce766672caef164a6d5d4df1d F src/insert.c 76b1dc902e4c3930d9a17a40cd8ee2e94b1fd8cce766672caef164a6d5d4df1d
F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
F src/loadext.c 6aae5739198d96c51ae6eb97c4a5b1744c22ed7a5a565a5399a717780d48a36b F src/loadext.c 6aae5739198d96c51ae6eb97c4a5b1744c22ed7a5a565a5399a717780d48a36b
F src/main.c 0402e234155e0aad75fe6cd204864f492495be8605a50b4b3d4d72895cced3ce F src/main.c a086ab7d6e4e3f07bd5789d16f977d425f9482e7b3baeeb2f17bde0e6bfb2bc1
F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
@@ -488,15 +488,15 @@ F src/parse.y 9eaa457cff322e0dd5f52e363eab0b73f11bcd35bdced58274dead597e1a3d6a
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170 F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880 F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
F src/pragma.c c0d13c0e82a9197aef5533d63300c5b0c8a216ae1fd14ada64e1f12f398d7e82 F src/pragma.c 71c585f1d26e14b931fa4573f587933d6dfddecd9d9001b0f126f74f7306bf87
F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
F src/prepare.c 95a9dba7a5d032039a77775188cb3b6fb17f2fa1a0b7cd915b30b4b823383ffa F src/prepare.c e966ecc97c3671ff0e96227c8c877b83f2d33ea371ee190bbf1698b36b5605c0
F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365 F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c 172f4c514b41dabc00cf5ada72f6de6f897881d50de5fd33a94f3d1e5c36dafc F src/resolve.c 172f4c514b41dabc00cf5ada72f6de6f897881d50de5fd33a94f3d1e5c36dafc
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 2af92d42734da1785fceed72260221bc66e0b24638b1894ad2c3b11a33a790a4 F src/select.c 3e7d9bc70fa6baebd6e34cce5ec79879ff1dd4caec0fd05f45fd87b25e53d2b8
F src/shell.c.in c29cb307d6275131e6f9874e0fa73f87acf40a22c4a82faba2059a93b4d294d1 F src/shell.c.in 4d0ddf10c403710d241bf920163dcf032c21119aebb61e70840942c0eafecdf9
F src/sqlite.h.in 63b07f76731f2b1e55c48fdb9f0508dcc6fbe3971010b8612ffd847c3c56d9a1 F src/sqlite.h.in 63b07f76731f2b1e55c48fdb9f0508dcc6fbe3971010b8612ffd847c3c56d9a1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7 F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7
@@ -507,7 +507,7 @@ F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
F src/tclsqlite.c 916a92de77ec5cbe27818ca194d8cf0c58aa7ad5b87527098f6aa5a6068800ce F src/tclsqlite.c 916a92de77ec5cbe27818ca194d8cf0c58aa7ad5b87527098f6aa5a6068800ce
F src/test1.c b5e21f2ec8386cabb67346c9399603ddb33f76094a0941f280b403aa93631717 F src/test1.c b5e21f2ec8386cabb67346c9399603ddb33f76094a0941f280b403aa93631717
F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
F src/test3.c b8434949dfb8aff8dfa082c8b592109e77844c2135ed3c492113839b6956255b F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6
F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d
F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8 F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8
@@ -564,12 +564,12 @@ F src/update.c 46dc24c6158446aaab45caee09b6d99327cb479268b83ffeb5b701823da3b67b
F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88 F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
F src/vacuum.c 37730af7540033135909ecaee3667dddec043293428d8718546d0d64ba4a5025 F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855
F src/vdbe.c 29f340316af05a314f4a4f7e7c96332ba7cda3b837d7c31f7aee2264a3a57424 F src/vdbe.c ed57efaa055c36e6f3152921398fa23e615474a6c00a7ef3e257e797cb5d1d12
F src/vdbe.h e3f43bcc27ff30b0f25a6104d0cb5657e1c4b5e1b5cd2dd2216d5bcc2156a746 F src/vdbe.h e3f43bcc27ff30b0f25a6104d0cb5657e1c4b5e1b5cd2dd2216d5bcc2156a746
F src/vdbeInt.h 1688454271594ade96a233394fdf3ba662e4d5b6c5d285bf0d29002f565b76fa F src/vdbeInt.h 83fefe125fb54eb3ea9346002cac7f78cccb6b8ab707fcdb00688a071cbd0337
F src/vdbeapi.c 765a0bbe01311626417de6cb743f7f25f9f98435c98a9df4bb0714d11014633d F src/vdbeapi.c 765a0bbe01311626417de6cb743f7f25f9f98435c98a9df4bb0714d11014633d
F src/vdbeaux.c b00d35805a2b326d1371ab7ce8f3a95c8af35b1431367ffe482fc2c735d69fb1 F src/vdbeaux.c daecbbefaf0adfc428cddbfa5164c1d744496ba5dd19f840845ecac652913802
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
F src/vdbemem.c d80b04b4c1b65807201bfaadb11ef0ad7c8fd5ca8e5b8bc4858960e79394d1d1 F src/vdbemem.c d80b04b4c1b65807201bfaadb11ef0ad7c8fd5ca8e5b8bc4858960e79394d1d1
F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
@@ -579,16 +579,16 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c aa9cffc7a2bad6b826a86c8562dd4978398720ed41cb8ee7aa9d054eb8b456a0 F src/wal.c aa9cffc7a2bad6b826a86c8562dd4978398720ed41cb8ee7aa9d054eb8b456a0
F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f
F src/where.c 60ec752fcbe9f9e0271ac60548d159a540a1ee47a4f9fedc85e88a3d0e392dd1 F src/where.c 7dcb13bbcfd8c926546946556014c8f5aa0829eb8b65a6c18f8d187d265200a5
F src/whereInt.h cbae2bcd37cfebdb7812a8b188cdb19634ced2b9346470d1c270556b0c33ea53 F src/whereInt.h b09753e74bf92a8b17cf0e41ca94c44432c454544be6699b5311dcc57bf229c6
F src/wherecode.c 728c7f70731430ccdac807a79969873e1af6968bf1c4745dff3f9dd35f636cc8 F src/wherecode.c 3317f2b083a66d3e65a03edf316ade4ccb0a99c9956273282ebb579b95d4ba96
F src/whereexpr.c e90b2e76dcabc81edff56633bf281bc01d93b71e0c81482dc06925ce39f5844a F src/whereexpr.c e90b2e76dcabc81edff56633bf281bc01d93b71e0c81482dc06925ce39f5844a
F src/window.c 4a476f74f11eb02447fa51ef9465c13d1e888b839441d4aa8c742234df8afb48 F src/window.c 4a476f74f11eb02447fa51ef9465c13d1e888b839441d4aa8c742234df8afb48
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 6ff7b43c2b4b905c74dc4a813d201d0fa64c5783 F test/all.test 6ff7b43c2b4b905c74dc4a813d201d0fa64c5783
F test/alter.test b820ab9dcf85f8e3a65bc8326accb2f0c7be64ef F test/alter.test b820ab9dcf85f8e3a65bc8326accb2f0c7be64ef
@@ -779,7 +779,7 @@ F test/e_fts3.test 8cf40550bb088a6aa187c818c00fabe26ef82900a4cd5c66b427ccafe28be
F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e
F test/e_reindex.test 2bebf7b393e519198b7c654407221cf171a439b8 F test/e_reindex.test 2bebf7b393e519198b7c654407221cf171a439b8
F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8
F test/e_select.test 6fd45fd4a59ec82b6dda7468699dcc0ec1a72538577750b4f90357a62c1d2723 F test/e_select.test c5a669b4d63217aa10094ba737ba3ddd07bd439d4bc7a5b798f6ea32511cbe7c
F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f
F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10
F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528
@@ -968,6 +968,7 @@ F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068
F test/in5.test 7ae37fcd4a5e198291c6ab5f31a5bb3d15397efe8b75a6736d7a95a7b8dd9e08 F test/in5.test 7ae37fcd4a5e198291c6ab5f31a5bb3d15397efe8b75a6736d7a95a7b8dd9e08
F test/in6.test 77c3e1d356d8aeb0864051f0677d3c0a032cf97b7f33a0ba8fa2b04a663f6b7b
F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822
F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f
F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4
@@ -1215,7 +1216,7 @@ F test/select1.test 2e760bab8f3658b3b97debcf52860d0d2e20aa6cbe8b40e678ddb99871a1
F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054
F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328
F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535 F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546
F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0 F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0
F test/select7.test f659f231489349e8c5734e610803d7654207318f F test/select7.test f659f231489349e8c5734e610803d7654207318f
F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d
@@ -1243,7 +1244,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69
F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e
F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939
F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
F test/shell1.test 50154b0c4779df435b9e60ca60104b05f1cc217eab1aa383131359329e73d939 F test/shell1.test 707c03fbd07ac506cfb6fa09da4ee22e2b50453c3db2f404694116eb990168f3
F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b
F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494
F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d
@@ -1587,7 +1588,7 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf
F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f
F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747
F test/where.test f19ea3fa31c425b04af42c8b192a5b595ee84498df8d27dcd79ec043b25fbbfb F test/where.test 6bfcd29db193b814e5736832ffa899b4ff2969a106b718a79375063d5eb02b29
F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where2.test 478d2170637b9211f593120648858593bf2445a1
F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c
F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8
@@ -1739,7 +1740,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 060b26402880daab085ad01f5f0dbde957c7a22cd219be5b8ec94fba883051a0 P ef34207073c21ce8618486777671ae78d23f290acd6d3c37e91a49b69cb506ac 09fffbdf9f2f6ce31a22d5a6df7a45f19a16628da622f12d6e33171cce09fb21
R a6d08205275dc3d4fe75aeb0f2cd2aa0 R 6c2ae8ade7aa49d26d158d84b6d725cd
U dan U dan
Z a61f4779920493cec5c537f8753f226f Z 10ebbb803780df16eda225e4dabc5af4

View File

@@ -1 +1 @@
ef34207073c21ce8618486777671ae78d23f290acd6d3c37e91a49b69cb506ac 251022034219819a1dc356542770ff46e3147a080f072eb20af6106771dadd92

View File

@@ -142,7 +142,7 @@ static void renameParentFunc(
} }
} }
zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput), zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput);
sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC); sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC);
sqlite3DbFree(db, zOutput); sqlite3DbFree(db, zOutput);
} }

View File

@@ -382,7 +382,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
** before this function exits. ** before this function exits.
*/ */
if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){ if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
rc = sqlite3BtreeBeginTrans(p->pSrc, 0); rc = sqlite3BtreeBeginTrans(p->pSrc, 0, 0);
bCloseTrans = 1; bCloseTrans = 1;
} }
@@ -398,10 +398,10 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
/* Lock the destination database, if it is not locked already. */ /* Lock the destination database, if it is not locked already. */
if( SQLITE_OK==rc && p->bDestLocked==0 if( SQLITE_OK==rc && p->bDestLocked==0
&& SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2)) && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2,
(int*)&p->iDestSchema))
){ ){
p->bDestLocked = 1; p->bDestLocked = 1;
sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema);
} }
/* Do not allow backup if the destination database is in WAL mode /* Do not allow backup if the destination database is in WAL mode

View File

@@ -3300,7 +3300,7 @@ int sqlite3BtreeNewDb(Btree *p){
** when A already has a read lock, we encourage A to give up and let B ** when A already has a read lock, we encourage A to give up and let B
** proceed. ** proceed.
*/ */
int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){
BtShared *pBt = p->pBt; BtShared *pBt = p->pBt;
int rc = SQLITE_OK; int rc = SQLITE_OK;
@@ -3428,13 +3428,18 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
trans_begun: trans_begun:
if( rc==SQLITE_OK && wrflag ){ if( rc==SQLITE_OK ){
if( pSchemaVersion ){
*pSchemaVersion = get4byte(&pBt->pPage1->aData[40]);
}
if( wrflag ){
/* This call makes sure that the pager has the correct number of /* This call makes sure that the pager has the correct number of
** open savepoints. If the second parameter is greater than 0 and ** open savepoints. If the second parameter is greater than 0 and
** the sub-journal is not already open, then it will be opened here. ** the sub-journal is not already open, then it will be opened here.
*/ */
rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint); rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
} }
}
btreeIntegrity(p); btreeIntegrity(p);
sqlite3BtreeLeave(p); sqlite3BtreeLeave(p);
@@ -10091,11 +10096,11 @@ int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
pBt->btsFlags &= ~BTS_NO_WAL; pBt->btsFlags &= ~BTS_NO_WAL;
if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL; if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL;
rc = sqlite3BtreeBeginTrans(pBtree, 0); rc = sqlite3BtreeBeginTrans(pBtree, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
u8 *aData = pBt->pPage1->aData; u8 *aData = pBt->pPage1->aData;
if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){ if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){
rc = sqlite3BtreeBeginTrans(pBtree, 2); rc = sqlite3BtreeBeginTrans(pBtree, 2, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){

View File

@@ -78,7 +78,7 @@ int sqlite3BtreeGetOptimalReserve(Btree*);
int sqlite3BtreeGetReserveNoMutex(Btree *p); int sqlite3BtreeGetReserveNoMutex(Btree *p);
int sqlite3BtreeSetAutoVacuum(Btree *, int); int sqlite3BtreeSetAutoVacuum(Btree *, int);
int sqlite3BtreeGetAutoVacuum(Btree *); int sqlite3BtreeGetAutoVacuum(Btree *);
int sqlite3BtreeBeginTrans(Btree*,int); int sqlite3BtreeBeginTrans(Btree*,int,int*);
int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
int sqlite3BtreeCommitPhaseTwo(Btree*, int); int sqlite3BtreeCommitPhaseTwo(Btree*, int);
int sqlite3BtreeCommit(Btree*); int sqlite3BtreeCommit(Btree*);

View File

@@ -369,7 +369,7 @@ static int dbpageBegin(sqlite3_vtab *pVtab){
int i; int i;
for(i=0; i<db->nDb; i++){ for(i=0; i<db->nDb; i++){
Btree *pBt = db->aDb[i].pBt; Btree *pBt = db->aDb[i].pBt;
if( pBt ) sqlite3BtreeBeginTrans(pBt, 1); if( pBt ) sqlite3BtreeBeginTrans(pBt, 1, 0);
} }
return SQLITE_OK; return SQLITE_OK;
} }

View File

@@ -4115,7 +4115,7 @@ int sqlite3_snapshot_get(
if( iDb==0 || iDb>1 ){ if( iDb==0 || iDb>1 ){
Btree *pBt = db->aDb[iDb].pBt; Btree *pBt = db->aDb[iDb].pBt;
if( 0==sqlite3BtreeIsInTrans(pBt) ){ if( 0==sqlite3BtreeIsInTrans(pBt) ){
rc = sqlite3BtreeBeginTrans(pBt, 0); rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot);
} }
@@ -4153,7 +4153,7 @@ int sqlite3_snapshot_open(
if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ if( 0==sqlite3BtreeIsInReadTrans(pBt) ){
rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot); rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3BtreeBeginTrans(pBt, 0); rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0); sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0);
} }
} }
@@ -4185,7 +4185,7 @@ int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){
if( iDb==0 || iDb>1 ){ if( iDb==0 || iDb>1 ){
Btree *pBt = db->aDb[iDb].pBt; Btree *pBt = db->aDb[iDb].pBt;
if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ if( 0==sqlite3BtreeIsInReadTrans(pBt) ){
rc = sqlite3BtreeBeginTrans(pBt, 0); rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt));
sqlite3BtreeCommit(pBt); sqlite3BtreeCommit(pBt);

View File

@@ -1564,6 +1564,11 @@ void sqlite3Pragma(
assert( sqlite3NoTempsInRange(pParse,1,7+j) ); assert( sqlite3NoTempsInRange(pParse,1,7+j) );
sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v);
loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1);
if( !isQuick ){
/* Sanity check on record header decoding */
sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3);
sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
}
/* Verify that all NOT NULL columns really are NOT NULL */ /* Verify that all NOT NULL columns really are NOT NULL */
for(j=0; j<pTab->nCol; j++){ for(j=0; j<pTab->nCol; j++){
char *zErr; char *zErr;
@@ -1606,9 +1611,6 @@ void sqlite3Pragma(
sqlite3ExprListDelete(db, pCheck); sqlite3ExprListDelete(db, pCheck);
} }
if( !isQuick ){ /* Omit the remaining tests for quick_check */ if( !isQuick ){ /* Omit the remaining tests for quick_check */
/* Sanity check on record header decoding */
sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3);
sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
/* Validate index entries for the current row */ /* Validate index entries for the current row */
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
int jmp2, jmp3, jmp4, jmp5; int jmp2, jmp3, jmp4, jmp5;

View File

@@ -188,7 +188,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** will be closed before this function returns. */ ** will be closed before this function returns. */
sqlite3BtreeEnter(pDb->pBt); sqlite3BtreeEnter(pDb->pBt);
if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){ if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){
rc = sqlite3BtreeBeginTrans(pDb->pBt, 0); rc = sqlite3BtreeBeginTrans(pDb->pBt, 0, 0);
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc));
goto initone_error_out; goto initone_error_out;
@@ -433,7 +433,7 @@ static void schemaIsValid(Parse *pParse){
** on the b-tree database, open one now. If a transaction is opened, it ** on the b-tree database, open one now. If a transaction is opened, it
** will be closed immediately after reading the meta-value. */ ** will be closed immediately after reading the meta-value. */
if( !sqlite3BtreeIsInReadTrans(pBt) ){ if( !sqlite3BtreeIsInReadTrans(pBt) ){
rc = sqlite3BtreeBeginTrans(pBt, 0); rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
sqlite3OomFault(db); sqlite3OomFault(db);
} }

View File

@@ -5104,11 +5104,17 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
} }
} }
/* /*
** Update the accumulator memory cells for an aggregate based on ** Update the accumulator memory cells for an aggregate based on
** the current cursor position. ** the current cursor position.
**
** If regAcc is non-zero and there are no min() or max() aggregates
** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator
** registers i register regAcc contains 0. The caller will take care
** of setting and clearing regAcc.
*/ */
static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
int i; int i;
int regHit = 0; int regHit = 0;
@@ -5172,6 +5178,9 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
** Another solution would be to change the OP_SCopy used to copy cached ** Another solution would be to change the OP_SCopy used to copy cached
** values to an OP_Copy. ** values to an OP_Copy.
*/ */
if( regHit==0 && pAggInfo->nAccumulator ){
regHit = regAcc;
}
if( regHit ){ if( regHit ){
addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);
} }
@@ -6067,8 +6076,6 @@ int sqlite3Select(
pParse->nMem += pGroupBy->nExpr; pParse->nMem += pGroupBy->nExpr;
sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag);
VdbeComment((v, "clear abort flag")); VdbeComment((v, "clear abort flag"));
sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
VdbeComment((v, "indicate accumulator empty"));
sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1);
/* Begin a loop that will extract all source rows in GROUP BY order. /* Begin a loop that will extract all source rows in GROUP BY order.
@@ -6201,7 +6208,7 @@ int sqlite3Select(
** the current row ** the current row
*/ */
sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeJumpHere(v, addr1);
updateAccumulator(pParse, &sAggInfo); updateAccumulator(pParse, iUseFlag, &sAggInfo);
sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag);
VdbeComment((v, "indicate data in accumulator")); VdbeComment((v, "indicate data in accumulator"));
@@ -6253,6 +6260,8 @@ int sqlite3Select(
*/ */
sqlite3VdbeResolveLabel(v, addrReset); sqlite3VdbeResolveLabel(v, addrReset);
resetAccumulator(pParse, &sAggInfo); resetAccumulator(pParse, &sAggInfo);
sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
VdbeComment((v, "indicate accumulator empty"));
sqlite3VdbeAddOp1(v, OP_Return, regReset); sqlite3VdbeAddOp1(v, OP_Return, regReset);
} /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
@@ -6318,6 +6327,23 @@ int sqlite3Select(
}else }else
#endif /* SQLITE_OMIT_BTREECOUNT */ #endif /* SQLITE_OMIT_BTREECOUNT */
{ {
int regAcc = 0; /* "populate accumulators" flag */
/* If there are accumulator registers but no min() or max() functions,
** allocate register regAcc. Register regAcc will contain 0 the first
** time the inner loop runs, and 1 thereafter. The code generated
** by updateAccumulator() only updates the accumulator registers if
** regAcc contains 0. */
if( sAggInfo.nAccumulator ){
for(i=0; i<sAggInfo.nFunc; i++){
if( sAggInfo.aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ) break;
}
if( i==sAggInfo.nFunc ){
regAcc = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc);
}
}
/* This case runs if the aggregate has no GROUP BY clause. The /* This case runs if the aggregate has no GROUP BY clause. The
** processing is much simpler since there is only a single row ** processing is much simpler since there is only a single row
** of output. ** of output.
@@ -6339,7 +6365,8 @@ int sqlite3Select(
if( pWInfo==0 ){ if( pWInfo==0 ){
goto select_end; goto select_end;
} }
updateAccumulator(pParse, &sAggInfo); updateAccumulator(pParse, regAcc, &sAggInfo);
if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc);
if( sqlite3WhereIsOrdered(pWInfo)>0 ){ if( sqlite3WhereIsOrdered(pWInfo)>0 ){
sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo));
VdbeComment((v, "%s() by index", VdbeComment((v, "%s() by index",

View File

@@ -2567,8 +2567,7 @@ static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
int iOp; /* Index of operation in p->aiIndent[] */ int iOp; /* Index of operation in p->aiIndent[] */
const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
"NextIfOpen", "PrevIfOpen", 0 };
const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
"Rewind", 0 }; "Rewind", 0 };
const char *azGoto[] = { "Goto", 0 }; const char *azGoto[] = { "Goto", 0 };
@@ -2972,6 +2971,7 @@ static int shell_exec(
/* Reprepare pStmt before reactiving trace modes */ /* Reprepare pStmt before reactiving trace modes */
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
if( pArg ) pArg->pStmt = pStmt;
} }
restore_debug_trace_modes(); restore_debug_trace_modes();
} }
@@ -5284,7 +5284,8 @@ static int arExtractCommand(ArCommand *pAr){
"SELECT " "SELECT "
" ($dir || name)," " ($dir || name),"
" writefile(($dir || name), %s, mode, mtime) " " writefile(($dir || name), %s, mode, mtime) "
"FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"; "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
" AND name NOT GLOB '*..[/\\]*'";
const char *azExtraArg[] = { const char *azExtraArg[] = {
"sqlar_uncompress(data, sz)", "sqlar_uncompress(data, sz)",

View File

@@ -133,7 +133,7 @@ static int SQLITE_TCLAPI btree_begin_transaction(
} }
pBt = sqlite3TestTextToPtr(argv[1]); pBt = sqlite3TestTextToPtr(argv[1]);
sqlite3BtreeEnter(pBt); sqlite3BtreeEnter(pBt);
rc = sqlite3BtreeBeginTrans(pBt, 1); rc = sqlite3BtreeBeginTrans(pBt, 1, 0);
sqlite3BtreeLeave(pBt); sqlite3BtreeLeave(pBt);
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);

View File

@@ -224,7 +224,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){
*/ */
rc = execSql(db, pzErrMsg, "BEGIN"); rc = execSql(db, pzErrMsg, "BEGIN");
if( rc!=SQLITE_OK ) goto end_of_vacuum; if( rc!=SQLITE_OK ) goto end_of_vacuum;
rc = sqlite3BtreeBeginTrans(pMain, 2); rc = sqlite3BtreeBeginTrans(pMain, 2, 0);
if( rc!=SQLITE_OK ) goto end_of_vacuum; if( rc!=SQLITE_OK ) goto end_of_vacuum;
/* Do not attempt to change the page size for a WAL database */ /* Do not attempt to change the page size for a WAL database */

View File

@@ -3202,8 +3202,7 @@ case OP_AutoCommit: {
*/ */
case OP_Transaction: { case OP_Transaction: {
Btree *pBt; Btree *pBt;
int iMeta; int iMeta = 0;
int iGen;
assert( p->bIsReader ); assert( p->bIsReader );
assert( p->readOnly==0 || pOp->p2==0 ); assert( p->readOnly==0 || pOp->p2==0 );
@@ -3216,7 +3215,7 @@ case OP_Transaction: {
pBt = db->aDb[pOp->p1].pBt; pBt = db->aDb[pOp->p1].pBt;
if( pBt ){ if( pBt ){
rc = sqlite3BtreeBeginTrans(pBt, pOp->p2); rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta);
testcase( rc==SQLITE_BUSY_SNAPSHOT ); testcase( rc==SQLITE_BUSY_SNAPSHOT );
testcase( rc==SQLITE_BUSY_RECOVERY ); testcase( rc==SQLITE_BUSY_RECOVERY );
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
@@ -3249,19 +3248,17 @@ case OP_Transaction: {
p->nStmtDefCons = db->nDeferredCons; p->nStmtDefCons = db->nDeferredCons;
p->nStmtDefImmCons = db->nDeferredImmCons; p->nStmtDefImmCons = db->nDeferredImmCons;
} }
}
/* Gather the schema version number for checking: assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
if( pOp->p5
&& (iMeta!=pOp->p3
|| db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i)
){
/*
** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema
** version is checked to ensure that the schema has not changed since the ** version is checked to ensure that the schema has not changed since the
** SQL statement was prepared. ** SQL statement was prepared.
*/ */
sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta);
iGen = db->aDb[pOp->p1].pSchema->iGeneration;
}else{
iGen = iMeta = 0;
}
assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
if( pOp->p5 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){
sqlite3DbFree(db, p->zErrMsg); sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
/* If the schema-cookie from the database file matches the cookie /* If the schema-cookie from the database file matches the cookie
@@ -3370,59 +3367,78 @@ case OP_SetCookie: {
** values need not be contiguous but all P1 values should be small integers. ** values need not be contiguous but all P1 values should be small integers.
** It is an error for P1 to be negative. ** It is an error for P1 to be negative.
** **
** If P5!=0 then use the content of register P2 as the root page, not ** Allowed P5 bits:
** the value of P2 itself. ** <ul>
** ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
** There will be a read lock on the database whenever there is an ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** open cursor. If the database was unlocked prior to this instruction ** of OP_SeekLE/OP_IdxGT)
** then a read lock is acquired as part of this instruction. A read ** </ul>
** lock allows other processes to read the database but prohibits
** any other process from modifying the database. The read lock is
** released when all cursors are closed. If this instruction attempts
** to get a read lock but fails, the script terminates with an
** SQLITE_BUSY error code.
** **
** The P4 value may be either an integer (P4_INT32) or a pointer to ** The P4 value may be either an integer (P4_INT32) or a pointer to
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
** structure, then said structure defines the content and collating ** object, then table being opened must be an [index b-tree] where the
** sequence of the index being opened. Otherwise, if P4 is an integer ** KeyInfo object defines the content and collating
** value, it is set to the number of columns in the table. ** sequence of that index b-tree. Otherwise, if P4 is an integer
** value, then the table being opened must be a [table b-tree] with a
** number of columns no less than the value of P4.
** **
** See also: OpenWrite, ReopenIdx ** See also: OpenWrite, ReopenIdx
*/ */
/* Opcode: ReopenIdx P1 P2 P3 P4 P5 /* Opcode: ReopenIdx P1 P2 P3 P4 P5
** Synopsis: root=P2 iDb=P3 ** Synopsis: root=P2 iDb=P3
** **
** The ReopenIdx opcode works exactly like ReadOpen except that it first ** The ReopenIdx opcode works like OP_OpenRead except that it first
** checks to see if the cursor on P1 is already open with a root page ** checks to see if the cursor on P1 is already open on the same
** number of P2 and if it is this opcode becomes a no-op. In other words, ** b-tree and if it is this opcode becomes a no-op. In other words,
** if the cursor is already open, do not reopen it. ** if the cursor is already open, do not reopen it.
** **
** The ReopenIdx opcode may only be used with P5==0 and with P4 being ** The ReopenIdx opcode may only be used with P5==0 or P5==OPFLAG_SEEKEQ
** a P4_KEYINFO object. Furthermore, the P3 value must be the same as ** and with P4 being a P4_KEYINFO object. Furthermore, the P3 value must
** every other ReopenIdx or OpenRead for the same cursor number. ** be the same as every other ReopenIdx or OpenRead for the same cursor
** number.
** **
** See the OpenRead opcode documentation for additional information. ** Allowed P5 bits:
** <ul>
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** of OP_SeekLE/OP_IdxGT)
** </ul>
**
** See also: OP_OpenRead, OP_OpenWrite
*/ */
/* Opcode: OpenWrite P1 P2 P3 P4 P5 /* Opcode: OpenWrite P1 P2 P3 P4 P5
** Synopsis: root=P2 iDb=P3 ** Synopsis: root=P2 iDb=P3
** **
** Open a read/write cursor named P1 on the table or index whose root ** Open a read/write cursor named P1 on the table or index whose root
** page is P2. Or if P5!=0 use the content of register P2 to find the ** page is P2 (or whose root page is held in register P2 if the
** root page. ** OPFLAG_P2ISREG bit is set in P5 - see below).
** **
** The P4 value may be either an integer (P4_INT32) or a pointer to ** The P4 value may be either an integer (P4_INT32) or a pointer to
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
** structure, then said structure defines the content and collating ** object, then table being opened must be an [index b-tree] where the
** sequence of the index being opened. Otherwise, if P4 is an integer ** KeyInfo object defines the content and collating
** value, it is set to the number of columns in the table, or to the ** sequence of that index b-tree. Otherwise, if P4 is an integer
** largest index of any column of the table that is actually used. ** value, then the table being opened must be a [table b-tree] with a
** number of columns no less than the value of P4.
** **
** This instruction works just like OpenRead except that it opens the cursor ** Allowed P5 bits:
** in read/write mode. For a given table, there can be one or more read-only ** <ul>
** cursors or a single read/write cursor but not both. ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** of OP_SeekLE/OP_IdxGT)
** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek
** and subsequently delete entries in an index btree. This is a
** hint to the storage engine that the storage engine is allowed to
** ignore. The hint is not used by the official SQLite b*tree storage
** engine, but is used by COMDB2.
** <li> <b>0x10 OPFLAG_P2ISREG</b>: Use the content of register P2
** as the root page, not the value of P2 itself.
** </ul>
** **
** See also OpenRead. ** This instruction works like OpenRead except that it opens the cursor
** in read/write mode.
**
** See also: OP_OpenRead, OP_ReopenIdx
*/ */
case OP_ReopenIdx: { case OP_ReopenIdx: {
int nField; int nField;
@@ -3478,6 +3494,7 @@ case OP_OpenWrite:
if( pOp->p5 & OPFLAG_P2ISREG ){ if( pOp->p5 & OPFLAG_P2ISREG ){
assert( p2>0 ); assert( p2>0 );
assert( p2<=(p->nMem+1 - p->nCursor) ); assert( p2<=(p->nMem+1 - p->nCursor) );
assert( pOp->opcode==OP_OpenWrite );
pIn2 = &aMem[p2]; pIn2 = &aMem[p2];
assert( memIsValid(pIn2) ); assert( memIsValid(pIn2) );
assert( (pIn2->flags & MEM_Int)!=0 ); assert( (pIn2->flags & MEM_Int)!=0 );
@@ -3606,7 +3623,7 @@ case OP_OpenEphemeral: {
rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx,
BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1); rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0);
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
/* If a transient index is required, create it by calling /* If a transient index is required, create it by calling
@@ -4014,6 +4031,25 @@ seek_not_found:
break; break;
} }
/* Opcode: SeekHit P1 P2 * * *
** Synopsis: seekHit=P2
**
** Set the seekHit flag on cursor P1 to the value in P2.
** The seekHit flag is used by the IfNoHope opcode.
**
** P1 must be a valid b-tree cursor. P2 must be a boolean value,
** either 0 or 1.
*/
case OP_SeekHit: {
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
assert( pOp->p2==0 || pOp->p2==1 );
pC->seekHit = pOp->p2 & 1;
break;
}
/* Opcode: Found P1 P2 P3 P4 * /* Opcode: Found P1 P2 P3 P4 *
** Synopsis: key=r[P3@P4] ** Synopsis: key=r[P3@P4]
** **
@@ -4048,7 +4084,34 @@ seek_not_found:
** advanced in either direction. In other words, the Next and Prev ** advanced in either direction. In other words, the Next and Prev
** opcodes do not work after this operation. ** opcodes do not work after this operation.
** **
** See also: Found, NotExists, NoConflict ** See also: Found, NotExists, NoConflict, IfNoHope
*/
/* Opcode: IfNoHope P1 P2 P3 P4 *
** Synopsis: key=r[P3@P4]
**
** Register P3 is the first of P4 registers that form an unpacked
** record.
**
** Cursor P1 is on an index btree. If the seekHit flag is set on P1, then
** this opcode is a no-op. But if the seekHit flag of P1 is clear, then
** check to see if there is any entry in P1 that matches the
** prefix identified by P3 and P4. If no entry matches the prefix,
** jump to P2. Otherwise fall through.
**
** This opcode behaves like OP_NotFound if the seekHit
** flag is clear and it behaves like OP_Noop if the seekHit flag is set.
**
** This opcode is used in IN clause processing for a multi-column key.
** If an IN clause is attached to an element of the key other than the
** left-most element, and if there are no matches on the most recent
** seek over the whole key, then it might be that one of the key element
** to the left is prohibiting a match, and hence there is "no hope" of
** any match regardless of how many IN clause elements are checked.
** In such a case, we abandon the IN clause search early, using this
** opcode. The opcode name comes from the fact that the
** jump is taken if there is "no hope" of achieving a match.
**
** See also: NotFound, SeekHit
*/ */
/* Opcode: NoConflict P1 P2 P3 P4 * /* Opcode: NoConflict P1 P2 P3 P4 *
** Synopsis: key=r[P3@P4] ** Synopsis: key=r[P3@P4]
@@ -4073,6 +4136,14 @@ seek_not_found:
** **
** See also: NotFound, Found, NotExists ** See also: NotFound, Found, NotExists
*/ */
case OP_IfNoHope: { /* jump, in3 */
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
if( pC->seekHit ) break;
/* Fall through into OP_NotFound */
}
case OP_NoConflict: /* jump, in3 */ case OP_NoConflict: /* jump, in3 */
case OP_NotFound: /* jump, in3 */ case OP_NotFound: /* jump, in3 */
case OP_Found: { /* jump, in3 */ case OP_Found: { /* jump, in3 */
@@ -4221,7 +4292,7 @@ case OP_NotExists: /* jump, in3 */
pC = p->apCsr[pOp->p1]; pC = p->apCsr[pOp->p1];
assert( pC!=0 ); assert( pC!=0 );
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
pC->seekOp = 0; pC->seekOp = OP_SeekRowid;
#endif #endif
assert( pC->isTable ); assert( pC->isTable );
assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->eCurType==CURTYPE_BTREE );
@@ -4875,6 +4946,9 @@ case OP_NullRow: {
assert( pC->uc.pCursor!=0 ); assert( pC->uc.pCursor!=0 );
sqlite3BtreeClearCursor(pC->uc.pCursor); sqlite3BtreeClearCursor(pC->uc.pCursor);
} }
#ifdef SQLITE_DEBUG
if( pC->seekOp==0 ) pC->seekOp = OP_NullRow;
#endif
break; break;
} }
@@ -5062,12 +5136,7 @@ case OP_Rewind: { /* jump */
** If P5 is positive and the jump is taken, then event counter ** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented. ** number P5-1 in the prepared statement is incremented.
** **
** See also: Prev, NextIfOpen ** See also: Prev
*/
/* Opcode: NextIfOpen P1 P2 P3 P4 P5
**
** This opcode works just like Next except that if cursor P1 is not
** open it behaves a no-op.
*/ */
/* Opcode: Prev P1 P2 P3 P4 P5 /* Opcode: Prev P1 P2 P3 P4 P5
** **
@@ -5095,11 +5164,6 @@ case OP_Rewind: { /* jump */
** If P5 is positive and the jump is taken, then event counter ** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented. ** number P5-1 in the prepared statement is incremented.
*/ */
/* Opcode: PrevIfOpen P1 P2 P3 P4 P5
**
** This opcode works just like Prev except that if cursor P1 is not
** open it behaves a no-op.
*/
/* Opcode: SorterNext P1 P2 * * P5 /* Opcode: SorterNext P1 P2 * * P5
** **
** This opcode works just like OP_Next except that P1 must be a ** This opcode works just like OP_Next except that P1 must be a
@@ -5114,10 +5178,6 @@ case OP_SorterNext: { /* jump */
assert( isSorter(pC) ); assert( isSorter(pC) );
rc = sqlite3VdbeSorterNext(db, pC); rc = sqlite3VdbeSorterNext(db, pC);
goto next_tail; goto next_tail;
case OP_PrevIfOpen: /* jump */
case OP_NextIfOpen: /* jump */
if( p->apCsr[pOp->p1]==0 ) break;
/* Fall through */
case OP_Prev: /* jump */ case OP_Prev: /* jump */
case OP_Next: /* jump */ case OP_Next: /* jump */
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( pOp->p1>=0 && pOp->p1<p->nCursor );
@@ -5128,17 +5188,17 @@ case OP_Next: /* jump */
assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->eCurType==CURTYPE_BTREE );
assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext );
assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious );
assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext );
assert( pOp->opcode!=OP_PrevIfOpen || pOp->p4.xAdvance==sqlite3BtreePrevious);
/* The Next opcode is only used after SeekGT, SeekGE, and Rewind. /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found.
** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */
assert( pOp->opcode!=OP_Next || pOp->opcode!=OP_NextIfOpen assert( pOp->opcode!=OP_Next
|| pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE
|| pC->seekOp==OP_Rewind || pC->seekOp==OP_Found); || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found
assert( pOp->opcode!=OP_Prev || pOp->opcode!=OP_PrevIfOpen || pC->seekOp==OP_NullRow);
assert( pOp->opcode!=OP_Prev
|| pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE
|| pC->seekOp==OP_Last ); || pC->seekOp==OP_Last
|| pC->seekOp==OP_NullRow);
rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3);
next_tail: next_tail:

View File

@@ -85,6 +85,7 @@ struct VdbeCursor {
Bool isEphemeral:1; /* True for an ephemeral table */ Bool isEphemeral:1; /* True for an ephemeral table */
Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */
Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */
Bool seekHit:1; /* See the OP_SeekHit and OP_IfNoHope opcodes */
Btree *pBtx; /* Separate file holding temporary table */ Btree *pBtx; /* Separate file holding temporary table */
i64 seqCount; /* Sequence counter */ i64 seqCount; /* Sequence counter */
int *aAltMap; /* Mapping from table to index column numbers */ int *aAltMap; /* Mapping from table to index column numbers */

View File

@@ -689,7 +689,6 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
break; break;
} }
case OP_Next: case OP_Next:
case OP_NextIfOpen:
case OP_SorterNext: { case OP_SorterNext: {
pOp->p4.xAdvance = sqlite3BtreeNext; pOp->p4.xAdvance = sqlite3BtreeNext;
pOp->p4type = P4_ADVANCE; pOp->p4type = P4_ADVANCE;
@@ -699,8 +698,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
assert( pOp->p2>=0 ); assert( pOp->p2>=0 );
break; break;
} }
case OP_Prev: case OP_Prev: {
case OP_PrevIfOpen: {
pOp->p4.xAdvance = sqlite3BtreePrevious; pOp->p4.xAdvance = sqlite3BtreePrevious;
pOp->p4type = P4_ADVANCE; pOp->p4type = P4_ADVANCE;
/* The code generator never codes any of these opcodes as a jump /* The code generator never codes any of these opcodes as a jump
@@ -4129,7 +4127,7 @@ int sqlite3VdbeRecordCompareWithSkip(
u32 idx1; /* Offset of first type in header */ u32 idx1; /* Offset of first type in header */
int rc = 0; /* Return value */ int rc = 0; /* Return value */
Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */ Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */
KeyInfo *pKeyInfo = pPKey2->pKeyInfo; KeyInfo *pKeyInfo;
const unsigned char *aKey1 = (const unsigned char *)pKey1; const unsigned char *aKey1 = (const unsigned char *)pKey1;
Mem mem1; Mem mem1;
@@ -4224,7 +4222,7 @@ int sqlite3VdbeRecordCompareWithSkip(
if( (d1+mem1.n) > (unsigned)nKey1 ){ if( (d1+mem1.n) > (unsigned)nKey1 ){
pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT;
return 0; /* Corruption */ return 0; /* Corruption */
}else if( pKeyInfo->aColl[i] ){ }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){
mem1.enc = pKeyInfo->enc; mem1.enc = pKeyInfo->enc;
mem1.db = pKeyInfo->db; mem1.db = pKeyInfo->db;
mem1.flags = MEM_Str; mem1.flags = MEM_Str;
@@ -4275,7 +4273,7 @@ int sqlite3VdbeRecordCompareWithSkip(
} }
if( rc!=0 ){ if( rc!=0 ){
if( pKeyInfo->aSortOrder[i] ){ if( pPKey2->pKeyInfo->aSortOrder[i] ){
rc = -rc; rc = -rc;
} }
assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) );
@@ -4284,10 +4282,11 @@ int sqlite3VdbeRecordCompareWithSkip(
} }
i++; i++;
if( i==pPKey2->nField ) break;
pRhs++; pRhs++;
d1 += sqlite3VdbeSerialTypeLen(serial_type); d1 += sqlite3VdbeSerialTypeLen(serial_type);
idx1 += sqlite3VarintLen(serial_type); idx1 += sqlite3VarintLen(serial_type);
}while( idx1<(unsigned)szHdr1 && i<pPKey2->nField && d1<=(unsigned)nKey1 ); }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 );
/* No memory allocation is ever used on mem1. Prove this using /* No memory allocation is ever used on mem1. Prove this using
** the following assert(). If the assert() fails, it indicates a ** the following assert(). If the assert() fails, it indicates a
@@ -4299,7 +4298,7 @@ int sqlite3VdbeRecordCompareWithSkip(
** value. */ ** value. */
assert( CORRUPT_DB assert( CORRUPT_DB
|| vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc)
|| pKeyInfo->db->mallocFailed || pPKey2->pKeyInfo->db->mallocFailed
); );
pPKey2->eqSeen = 1; pPKey2->eqSeen = 1;
return pPKey2->default_rc; return pPKey2->default_rc;
@@ -4625,7 +4624,7 @@ int sqlite3VdbeIdxKeyCompare(
if( rc ){ if( rc ){
return rc; return rc;
} }
*res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked); *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0);
sqlite3VdbeMemRelease(&m); sqlite3VdbeMemRelease(&m);
return SQLITE_OK; return SQLITE_OK;
} }

View File

@@ -5083,10 +5083,17 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){
sqlite3VdbeJumpHere(v, pIn->addrInTop+1); sqlite3VdbeJumpHere(v, pIn->addrInTop+1);
if( pIn->eEndLoopOp!=OP_Noop ){ if( pIn->eEndLoopOp!=OP_Noop ){
if( pIn->nPrefix ){
assert( pLoop->wsFlags & WHERE_IN_EARLYOUT );
sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur,
sqlite3VdbeCurrentAddr(v)+2,
pIn->iBase, pIn->nPrefix);
VdbeCoverage(v);
}
sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop);
VdbeCoverage(v); VdbeCoverage(v);
VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen); VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Prev);
VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen); VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Next);
} }
sqlite3VdbeJumpHere(v, pIn->addrInTop-1); sqlite3VdbeJumpHere(v, pIn->addrInTop-1);
} }

View File

@@ -82,6 +82,8 @@ struct WhereLevel {
struct InLoop { struct InLoop {
int iCur; /* The VDBE cursor used by this IN operator */ int iCur; /* The VDBE cursor used by this IN operator */
int addrInTop; /* Top of the IN loop */ int addrInTop; /* Top of the IN loop */
int iBase; /* Base register of multi-key index record */
int nPrefix; /* Number of prior entires in the key */
u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */ u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */
} *aInLoop; /* Information about each nested IN operator */ } *aInLoop; /* Information about each nested IN operator */
} in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */ } in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */
@@ -555,3 +557,4 @@ void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*);
#define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */ #define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */
#define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ #define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/
#define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */ #define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */
#define WHERE_IN_EARLYOUT 0x00040000 /* Perhaps quit IN loops early */

View File

@@ -591,7 +591,14 @@ static int codeEqualityTerm(
sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v);
if( i==iEq ){ if( i==iEq ){
pIn->iCur = iTab; pIn->iCur = iTab;
pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next;
if( iEq>0 && (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){
pIn->iBase = iReg - i;
pIn->nPrefix = i;
pLoop->wsFlags |= WHERE_IN_EARLYOUT;
}else{
pIn->nPrefix = 0;
}
}else{ }else{
pIn->eEndLoopOp = OP_Noop; pIn->eEndLoopOp = OP_Noop;
} }
@@ -1658,6 +1665,9 @@ Bitmask sqlite3WhereCodeOneLoopStart(
** above has already left the cursor sitting on the correct row, ** above has already left the cursor sitting on the correct row,
** so no further seeking is needed */ ** so no further seeking is needed */
}else{ }else{
if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){
sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur);
}
op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
assert( op!=0 ); assert( op!=0 );
sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint);
@@ -1721,6 +1731,10 @@ Bitmask sqlite3WhereCodeOneLoopStart(
testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE );
} }
if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){
sqlite3VdbeAddOp2(v, OP_SeekHit, iIdxCur, 1);
}
/* Seek the table cursor, if required */ /* Seek the table cursor, if required */
if( omitTable ){ if( omitTable ){
/* pIdx is a covering index. No need to access the main table. */ /* pIdx is a covering index. No need to access the main table. */

View File

@@ -65,7 +65,7 @@ do_test aggnested-2.0 {
t1.* t1.*
FROM t1; FROM t1;
} }
} {A,B,B 3 33 333 3333} } {A,B,B 1 11 111 1111}
db2 close db2 close
##################### Test cases for ticket [bfbf38e5e9956ac69f] ############ ##################### Test cases for ticket [bfbf38e5e9956ac69f] ############

View File

@@ -801,7 +801,7 @@ do_select_tests e_select-4.1 {
4 "SELECT z2.* FROM z1,z2 LIMIT 1" {{} 21} 4 "SELECT z2.* FROM z1,z2 LIMIT 1" {{} 21}
5 "SELECT z2.*, z1.* FROM z1,z2 LIMIT 1" {{} 21 51.65 -59.58 belfries} 5 "SELECT z2.*, z1.* FROM z1,z2 LIMIT 1" {{} 21 51.65 -59.58 belfries}
6 "SELECT count(*), * FROM z1" {6 63 born -26} 6 "SELECT count(*), * FROM z1" {6 51.65 -59.58 belfries}
7 "SELECT max(a), * FROM z1" {63 63 born -26} 7 "SELECT max(a), * FROM z1" {63 63 born -26}
8 "SELECT *, min(a) FROM z1" {-5 {} 75 -5} 8 "SELECT *, min(a) FROM z1" {-5 {} 75 -5}
@@ -939,13 +939,13 @@ do_execsql_test e_select-4.6.0 {
INSERT INTO a2 VALUES(10, 4); INSERT INTO a2 VALUES(10, 4);
} {} } {}
do_select_tests e_select-4.6 { do_select_tests e_select-4.6 {
1 "SELECT one, two, count(*) FROM a1" {4 10 4} 1 "SELECT one, two, count(*) FROM a1" {1 1 4}
2 "SELECT one, two, count(*) FROM a1 WHERE one<3" {2 3 2} 2 "SELECT one, two, count(*) FROM a1 WHERE one<3" {1 1 2}
3 "SELECT one, two, count(*) FROM a1 WHERE one>3" {4 10 1} 3 "SELECT one, two, count(*) FROM a1 WHERE one>3" {4 10 1}
4 "SELECT *, count(*) FROM a1 JOIN a2" {4 10 10 4 16} 4 "SELECT *, count(*) FROM a1 JOIN a2" {1 1 1 1 16}
5 "SELECT *, sum(three) FROM a1 NATURAL JOIN a2" {3 6 2 3} 5 "SELECT *, sum(three) FROM a1 NATURAL JOIN a2" {1 1 1 3}
6 "SELECT *, sum(three) FROM a1 NATURAL JOIN a2" {3 6 2 3} 6 "SELECT *, sum(three) FROM a1 NATURAL JOIN a2" {1 1 1 3}
7 "SELECT group_concat(three, ''), a1.* FROM a1 NATURAL JOIN a2" {12 3 6} 7 "SELECT group_concat(three, ''), a1.* FROM a1 NATURAL JOIN a2" {12 1 1}
} }
# EVIDENCE-OF: R-04486-07266 Or, if the dataset contains zero rows, then # EVIDENCE-OF: R-04486-07266 Or, if the dataset contains zero rows, then
@@ -1128,7 +1128,7 @@ do_select_tests e_select-4.13 {
2.1 "SELECT up FROM c1 GROUP BY up HAVING down>10" {y} 2.1 "SELECT up FROM c1 GROUP BY up HAVING down>10" {y}
2.2 "SELECT up FROM c1 GROUP BY up HAVING up='y'" {y} 2.2 "SELECT up FROM c1 GROUP BY up HAVING up='y'" {y}
2.3 "SELECT i, j FROM c2 GROUP BY i>4 HAVING i>6" {9 36} 2.3 "SELECT i, j FROM c2 GROUP BY i>4 HAVING j>6" {5 10}
} }
# EVIDENCE-OF: R-23927-54081 Each expression in the result-set is then # EVIDENCE-OF: R-23927-54081 Each expression in the result-set is then
@@ -1154,12 +1154,12 @@ do_select_tests e_select-4.15 {
# for the same row. # for the same row.
# #
do_select_tests e_select-4.15 { do_select_tests e_select-4.15 {
1 "SELECT i, j FROM c2 GROUP BY i%2" {8 28 9 36} 1 "SELECT i, j FROM c2 GROUP BY i%2" {2 1 1 0}
2 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j<30" {8 28} 2 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j<30" {2 1 1 0}
3 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {9 36} 3 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {}
4 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {9 36} 4 "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {}
5 "SELECT count(*), i, k FROM c2 NATURAL JOIN c3 GROUP BY substr(k, 1, 1)" 5 "SELECT count(*), i, k FROM c2 NATURAL JOIN c3 GROUP BY substr(k, 1, 1)"
{2 5 boron 2 2 helium 1 3 lithium} {2 4 beryllium 2 1 hydrogen 1 3 lithium}
} }
# EVIDENCE-OF: R-19334-12811 Each group of input dataset rows # EVIDENCE-OF: R-19334-12811 Each group of input dataset rows

77
test/in6.test Normal file
View File

@@ -0,0 +1,77 @@
# 2018-06-07
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# A multi-key index that uses an IN operator on one of the keys other
# than the left-most key is able to abort the IN-operator loop early
# if key terms further to the left do not match.
#
# Call this the "multikey-IN-operator early-out optimization" or
# just "IN-early-out" optimization for short.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix in6
do_test in6-1.1 {
db eval {
CREATE TABLE t1(a,b,c,d);
WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)
INSERT INTO t1(a,b,c,d)
SELECT 100, 200+x/2, 300+x/5, x FROM c;
CREATE INDEX t1abc ON t1(a,b,c);
}
set ::sqlite_search_count 0
db eval {
SELECT d FROM t1
WHERE a=99
AND b IN (200,205,201,204)
AND c IN (304,302,309,308);
}
} {}
do_test in6-1.2 {
set ::sqlite_search_count
} {0} ;# Without the IN-early-out optimization, this value would be 15
# The multikey-IN-operator early-out optimization does not apply
# when the IN operator is on the left-most column of the index.
#
do_test in6-1.3 {
db eval {
EXPLAIN
SELECT d FROM t1
WHERE a IN (98,99,100,101)
AND b=200 AND c=300;
}
} {~/(IfNoHope|SeekHit)/}
set sqlite_search_count 0
do_execsql_test in6-1.4 {
SELECT d FROM t1
WHERE a=100
AND b IN (200,201,202,204)
AND c IN (300,302,301,305)
ORDER BY +d;
} {1 2 3 4 5 8 9}
do_test in6-1.5 {
set ::sqlite_search_count
} {39}
do_execsql_test in6-2.1 {
CREATE TABLE t2(e INT UNIQUE, f TEXT);
SELECT d, f FROM t1 LEFT JOIN t2 ON (e=d)
WHERE a=100
AND b IN (200,201,202,204)
AND c IN (300,302,301,305)
ORDER BY +d;
} {1 {} 2 {} 3 {} 4 {} 5 {} 8 {} 9 {}}
finish_test

View File

@@ -154,7 +154,7 @@ do_test select5-5.5 {
execsql { execsql {
SELECT a, b FROM t2 GROUP BY a; SELECT a, b FROM t2 GROUP BY a;
} }
} {1 4 6 4} } {1 2 6 4}
# Test rendering of columns for the GROUP BY clause. # Test rendering of columns for the GROUP BY clause.
# #

View File

@@ -637,6 +637,19 @@ do_test shell1-3.23b.4 {
catchcmd "test.db" ".stats OFF BAD" catchcmd "test.db" ".stats OFF BAD"
} {1 {Usage: .stats ?on|off?}} } {1 {Usage: .stats ?on|off?}}
# Ticket 7be932dfa60a8a6b3b26bcf7623ec46e0a403ddb 2018-06-07
# Adverse interaction between .stats and .eqp
#
do_test shell1-3.23b.5 {
catchcmd "test.db" [string map {"\n " "\n"} {
CREATE TEMP TABLE t1(x);
INSERT INTO t1 VALUES(1),(2);
.stats on
.eqp full
SELECT * FROM t1;
}]
} {/1\n2\n/}
# .tables ?TABLE? List names of tables # .tables ?TABLE? List names of tables
# If TABLE specified, only list tables matching # If TABLE specified, only list tables matching
# LIKE pattern TABLE. # LIKE pattern TABLE.

View File

@@ -490,12 +490,12 @@ ifcapable subquery {
count { count {
SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1; SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
} }
} {2 1 9 5} } {2 1 9 4}
do_test where-5.15 { do_test where-5.15 {
count { count {
SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1; SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1;
} }
} {2 1 9 3 1 16 9} } {2 1 9 3 1 16 8}
do_test where-5.100 { do_test where-5.100 {
db eval { db eval {
SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969) SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)