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

Merge the latest trunk changes into the sessions branch.

FossilOrigin-Name: cfd110bf5db2c1993a5e2ca718648bd9c17ee22c
This commit is contained in:
drh
2013-12-24 12:09:42 +00:00
48 changed files with 619 additions and 266 deletions

View File

@@ -403,12 +403,14 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
/* Step 2 */ /* Step 2 */
switch( z[1] ){ switch( z[1] ){
case 'a': case 'a':
stem(&z, "lanoita", "ate", m_gt_0) || if( !stem(&z, "lanoita", "ate", m_gt_0) ){
stem(&z, "lanoit", "tion", m_gt_0); stem(&z, "lanoit", "tion", m_gt_0);
}
break; break;
case 'c': case 'c':
stem(&z, "icne", "ence", m_gt_0) || if( !stem(&z, "icne", "ence", m_gt_0) ){
stem(&z, "icna", "ance", m_gt_0); stem(&z, "icna", "ance", m_gt_0);
}
break; break;
case 'e': case 'e':
stem(&z, "rezi", "ize", m_gt_0); stem(&z, "rezi", "ize", m_gt_0);
@@ -417,43 +419,54 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
stem(&z, "igol", "log", m_gt_0); stem(&z, "igol", "log", m_gt_0);
break; break;
case 'l': case 'l':
stem(&z, "ilb", "ble", m_gt_0) || if( !stem(&z, "ilb", "ble", m_gt_0)
stem(&z, "illa", "al", m_gt_0) || && !stem(&z, "illa", "al", m_gt_0)
stem(&z, "iltne", "ent", m_gt_0) || && !stem(&z, "iltne", "ent", m_gt_0)
stem(&z, "ile", "e", m_gt_0) || && !stem(&z, "ile", "e", m_gt_0)
stem(&z, "ilsuo", "ous", m_gt_0); ){
stem(&z, "ilsuo", "ous", m_gt_0);
}
break; break;
case 'o': case 'o':
stem(&z, "noitazi", "ize", m_gt_0) || if( !stem(&z, "noitazi", "ize", m_gt_0)
stem(&z, "noita", "ate", m_gt_0) || && !stem(&z, "noita", "ate", m_gt_0)
stem(&z, "rota", "ate", m_gt_0); ){
stem(&z, "rota", "ate", m_gt_0);
}
break; break;
case 's': case 's':
stem(&z, "msila", "al", m_gt_0) || if( !stem(&z, "msila", "al", m_gt_0)
stem(&z, "ssenevi", "ive", m_gt_0) || && !stem(&z, "ssenevi", "ive", m_gt_0)
stem(&z, "ssenluf", "ful", m_gt_0) || && !stem(&z, "ssenluf", "ful", m_gt_0)
stem(&z, "ssensuo", "ous", m_gt_0); ){
stem(&z, "ssensuo", "ous", m_gt_0);
}
break; break;
case 't': case 't':
stem(&z, "itila", "al", m_gt_0) || if( !stem(&z, "itila", "al", m_gt_0)
stem(&z, "itivi", "ive", m_gt_0) || && !stem(&z, "itivi", "ive", m_gt_0)
stem(&z, "itilib", "ble", m_gt_0); ){
stem(&z, "itilib", "ble", m_gt_0);
}
break; break;
} }
/* Step 3 */ /* Step 3 */
switch( z[0] ){ switch( z[0] ){
case 'e': case 'e':
stem(&z, "etaci", "ic", m_gt_0) || if( !stem(&z, "etaci", "ic", m_gt_0)
stem(&z, "evita", "", m_gt_0) || && !stem(&z, "evita", "", m_gt_0)
stem(&z, "ezila", "al", m_gt_0); ){
stem(&z, "ezila", "al", m_gt_0);
}
break; break;
case 'i': case 'i':
stem(&z, "itici", "ic", m_gt_0); stem(&z, "itici", "ic", m_gt_0);
break; break;
case 'l': case 'l':
stem(&z, "laci", "ic", m_gt_0) || if( !stem(&z, "laci", "ic", m_gt_0) ){
stem(&z, "luf", "", m_gt_0); stem(&z, "luf", "", m_gt_0);
}
break; break;
case 's': case 's':
stem(&z, "ssen", "", m_gt_0); stem(&z, "ssen", "", m_gt_0);
@@ -494,9 +507,11 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
z += 3; z += 3;
} }
}else if( z[2]=='e' ){ }else if( z[2]=='e' ){
stem(&z, "tneme", "", m_gt_1) || if( !stem(&z, "tneme", "", m_gt_1)
stem(&z, "tnem", "", m_gt_1) || && !stem(&z, "tnem", "", m_gt_1)
stem(&z, "tne", "", m_gt_1); ){
stem(&z, "tne", "", m_gt_1);
}
} }
} }
break; break;
@@ -515,8 +530,9 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
} }
break; break;
case 't': case 't':
stem(&z, "eta", "", m_gt_1) || if( !stem(&z, "eta", "", m_gt_1) ){
stem(&z, "iti", "", m_gt_1); stem(&z, "iti", "", m_gt_1);
}
break; break;
case 'u': case 'u':
if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){

View File

@@ -395,7 +395,7 @@ mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c
$(TLIBS) $(THREADLIB) $(TLIBS) $(THREADLIB)
sqlite3.o: sqlite3.c sqlite3.o: sqlite3.c
$(TCCX) -c sqlite3.c $(TCCX) -I. -c sqlite3.c
# This target creates a directory named "tsrc" and fills it with # This target creates a directory named "tsrc" and fills it with
# copies of all of the C source code and header files needed to # copies of all of the C source code and header files needed to
@@ -642,7 +642,7 @@ wordcount$(EXE): $(TOP)/test/wordcount.c sqlite3.c
$(TOP)/test/wordcount.c sqlite3.c $(TOP)/test/wordcount.c sqlite3.c
speedtest1$(EXE): $(TOP)/test/speedtest1.c sqlite3.o speedtest1$(EXE): $(TOP)/test/speedtest1.c sqlite3.o
$(TCC) -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.o $(THREADLIB) $(TCC) -I. -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.o $(THREADLIB)
# This target will fail if the SQLite amalgamation contains any exported # This target will fail if the SQLite amalgamation contains any exported
# symbols that do not begin with "sqlite3_". It is run as part of the # symbols that do not begin with "sqlite3_". It is run as part of the

101
manifest
View File

@@ -1,5 +1,5 @@
C Merge\sin\sall\srecent\spreformance\senhancements\sfrom\strunk. C Merge\sthe\slatest\strunk\schanges\sinto\sthe\ssessions\sbranch.
D 2013-12-14T18:24:46.659 D 2013-12-24T12:09:42.648
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in e4ee6d36cdf6136aee0158675a3b24dd3bf31a5a F Makefile.in e4ee6d36cdf6136aee0158675a3b24dd3bf31a5a
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -86,7 +86,7 @@ F ext/fts3/fts3_expr.c 5165c365cb5a035f5be8bb296f7aa3211d43e4ac
F ext/fts3/fts3_hash.c 8dd2d06b66c72c628c2732555a32bc0943114914 F ext/fts3/fts3_hash.c 8dd2d06b66c72c628c2732555a32bc0943114914
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 e319e108661147bcca8dd511cd562f33a1ba81b5
F ext/fts3/fts3_porter.c a465b49fcb8249a755792f87516eff182efa42b3 F ext/fts3/fts3_porter.c 7f8b4bf5af7c0f20f73b8e87e14fa9298f52e290
F ext/fts3/fts3_snippet.c 51beb5c1498176fd9caccaf1c75b55cb803a985a F ext/fts3/fts3_snippet.c 51beb5c1498176fd9caccaf1c75b55cb803a985a
F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763 F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763
F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038 F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038
@@ -156,7 +156,7 @@ F ext/session/test_session.c d38968307c05229cc8cd603722cf305d6f768832
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff
F main.mk 3cbbebc94dfb328e26647e13be242ded25b7e17f F main.mk a3028a846754a96c8841d1a7227890c471c65ec2
F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f
F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338 F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338
@@ -175,7 +175,7 @@ F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083 F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083
F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f
F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3 F src/attach.c 3801129015ef59d76bf23c95ef9b0069d18a0c52
F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53 F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
@@ -188,21 +188,21 @@ F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd
F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
F src/delete.c 65c34400e401c482501dac5cd14a12621260f6d0 F src/delete.c e9806af75b7f4015f6410ad87a2a12c353339499
F src/expr.c 31a2b65339f6c3795d4cfa5e99798cd72f9fdfdf F src/expr.c ffe4bc79c66f711f450a6113fbd1943b9b2380f7
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5
F src/func.c fed87f35cf4da4a798b726d84abefc209b48d831 F src/func.c 6325ac2ec10833ccf4d5c36d323709221d37ea19
F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486
F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4
F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22
F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
F src/insert.c db64e62555482dcdc3903b0f01d910094ac0dcb2 F src/insert.c de6cd4bb09a38560d2dd8ae96ec8b4a7ac6d6d70
F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
F src/main.c 292a67f4f803068ce5d160cfe76c052d8713e045 F src/main.c 2c674289707ebd814b33b8594c930d60861013b9
F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
@@ -216,7 +216,7 @@ F src/mutex_noop.c 7682796b7d8d39bf1c138248858efcd10c9e1553
F src/mutex_unix.c c3a4e00f96ba068a8dbef34084465979aaf369cc F src/mutex_unix.c c3a4e00f96ba068a8dbef34084465979aaf369cc
F src/mutex_w32.c 6108c88e1cb38d8fbb3534b170793815cbedbf97 F src/mutex_w32.c 6108c88e1cb38d8fbb3534b170793815cbedbf97
F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30 F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30
F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be F src/os.c 1b147e4cf7cc39e618115c14a086aed44bc91ace
F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f
@@ -228,21 +228,21 @@ F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b
F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7
F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 F src/prepare.c 677521ab7132615a8a26107a1d1c3132f44ae337
F src/printf.c ba8b28e9d4ce984430e9f33f6ef1c85a1826d1dd F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269
F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/select.c 819bb090c9a348d17f69f136cad2bfa9ee9cbb41
F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344
F src/sqlite.h.in 9ccaa04411778b0b3a95df6a9fc9c396b779f0cb F src/sqlite.h.in 9ccaa04411778b0b3a95df6a9fc9c396b779f0cb
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
F src/sqliteInt.h 8c7d6a7f3474c3b487311baeb03ba72120e35716 F src/sqliteInt.h edf19afa8c416413008d9b402f2991e2fb0b3e51
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
F src/tclsqlite.c 758fa6b6cfd39330db8b71b1f94e46f03ef375b8 F src/tclsqlite.c fa8d54ebdb7d91e0f6e7472ee5d8b7b543e65adb
F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93 F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93
F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35
F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c
@@ -290,24 +290,24 @@ F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4
F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba
F src/update.c 4ada523da2d315996296456a8e384f11983a9aa0 F src/update.c 3143bbdfc8c2d78b74dba15133df04843221ce0d
F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
F src/vdbe.c d8df062f9b24a5cb83348ca2c14ff211a321a092 F src/vdbe.c ad89fac32d84b5b40778a20a707206630e9cf655
F src/vdbe.h b7bfa7b468fcad2cf1890969fe7459325da00385 F src/vdbe.h 4c15d2c90b52fce24e1bd5eaa783f7451849e95b
F src/vdbeInt.h 062d6e86551ffad25056f3e154fbe5a02e4d8cce F src/vdbeInt.h 08d79db15519f98d6d2c2dedaebfbb7f3d69a6d8
F src/vdbeapi.c 647d65813a5595c7f667b9f43d119ecd8d70be08 F src/vdbeapi.c 647d65813a5595c7f667b9f43d119ecd8d70be08
F src/vdbeaux.c 0ee1dc808fe245bc85988c12478582d666351330 F src/vdbeaux.c 4dc5258ac337fd6600d1efb144b34316d2bbe05a
F src/vdbeblob.c a2809461743e0b9dd9be871149ac65e8d2c80c08 F src/vdbeblob.c 6e791541114d482074e031ef8dbc3d5e5c180e23
F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2
F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74
F src/where.c b8f3aab1e5843012895b89a183dcdd6cef0708db F src/where.c 60bc8c5b00e2292c24a42455d022eeeda33a16f1
F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358 F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -338,7 +338,7 @@ F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0
F test/atof1.test 08a61df9365c341f334a65f4348897312d8f3db7 F test/atof1.test 08a61df9365c341f334a65f4348897312d8f3db7
F test/attach.test 0d112b7713611fdf0340260192749737135fda5f F test/attach.test 0d112b7713611fdf0340260192749737135fda5f
F test/attach2.test 0ec5defa340363de6cd50fd595046465e9aaba2d F test/attach2.test 0ec5defa340363de6cd50fd595046465e9aaba2d
F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e F test/attach3.test 359eb65d00102cdfcef6fa4e81dc1648f8f80b27
F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c
F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0
F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f
@@ -378,7 +378,7 @@ F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3
F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0
F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de
F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738 F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738
F test/capi3.test f5eab498a0927d498e6d75c14567addb995ceccb F test/capi3.test 56ab450125ead38846cbae7e5b6a216686c3cffa
F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4
F test/capi3c.test 93d24621c9ff84da9da060f30431e0453db1cdb0 F test/capi3c.test 93d24621c9ff84da9da060f30431e0453db1cdb0
F test/capi3d.test 6d0fc0a86d73f42dd19a7d8b7761ab9bc02277d0 F test/capi3d.test 6d0fc0a86d73f42dd19a7d8b7761ab9bc02277d0
@@ -388,7 +388,7 @@ F test/check.test 5831ddb6f2c687782eaf2e1a07b6e17f24c4f763
F test/close.test 340bd24cc58b16c6bc01967402755027c37eb815 F test/close.test 340bd24cc58b16c6bc01967402755027c37eb815
F test/closure01.test dbb28f1ea9eeaf0a53ec5bc0fed352e479def8c7 F test/closure01.test dbb28f1ea9eeaf0a53ec5bc0fed352e479def8c7
F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91
F test/collate1.test b709989e6e6ff6e1d2bd64231c2c1d8146846c9e F test/collate1.test 73b91005f264b7c403e2d63a6708d150679ac99a
F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621
F test/collate3.test 79558a286362cb9ed603c6fa543f1cda7f563f0f F test/collate3.test 79558a286362cb9ed603c6fa543f1cda7f563f0f
F test/collate4.test f04d5168685f2eef637ecfa2d4ddf8ec0d600177 F test/collate4.test f04d5168685f2eef637ecfa2d4ddf8ec0d600177
@@ -470,7 +470,7 @@ F test/eqp.test 57c6c604c2807fb5531731c5323133453c24afac
F test/errmsg.test f31592a594b44ee121371d25ddd5d63497bb3401 F test/errmsg.test f31592a594b44ee121371d25ddd5d63497bb3401
F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3 F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3
F test/exclusive.test c7ebbc756eacf544c108b15eed64d7d4e5f86b75 F test/exclusive.test c7ebbc756eacf544c108b15eed64d7d4e5f86b75
F test/exclusive2.test 881193eccec225cfed9d7f744b65e57f26adee25 F test/exclusive2.test 32798111aae78a5deec980eee383213f189df308
F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
F test/exists.test 8f7b27b61c2fbe5822f0a1f899c715d14e416e30 F test/exists.test 8f7b27b61c2fbe5822f0a1f899c715d14e416e30
F test/expr.test 67c9fd6f8f829e239dc8b0f4a08a73c08b09196d F test/expr.test 67c9fd6f8f829e239dc8b0f4a08a73c08b09196d
@@ -523,13 +523,13 @@ F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e
F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a
F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654
F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0 F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0
F test/fts3aa.test ad272d695095a55c16a5091dbdcce7c5f55da605 F test/fts3aa.test edd20ddbbc5b6015ab340abf2ca278ae11ec387d
F test/fts3ab.test 09aeaa162aee6513d9ff336b6932211008b9d1f9 F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f
F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63
F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49
F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda
F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c
F test/fts3ag.test 0b7d303f61ae5d620c4efb5e825713ea34ff9441 F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53
F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894
F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285
F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc
@@ -549,7 +549,7 @@ F test/fts3conf.test ee8500c86dd58ec075e8831a1e216a79989436de
F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb
F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba
F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7
F test/fts3d.test bf640d79722b720fa1c81834c48cdaa45d531b1a F test/fts3d.test c8a193513a269ec4c205ca09645e26e0bc71b860
F test/fts3defer.test 0be4440b73a2e651fc1e472066686d6ada4b9963 F test/fts3defer.test 0be4440b73a2e651fc1e472066686d6ada4b9963
F test/fts3defer2.test a3b6cbeabaf28c9398652a4d101ea224d9358479 F test/fts3defer2.test a3b6cbeabaf28c9398652a4d101ea224d9358479
F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd
@@ -563,7 +563,7 @@ F test/fts3fault2.test 3198eef2804deea7cac8403e771d9cbcb752d887
F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6
F test/fts3matchinfo.test ff423e73faab8fc6d7adeefedf74dd8e2b0b14e0 F test/fts3matchinfo.test ff423e73faab8fc6d7adeefedf74dd8e2b0b14e0
F test/fts3near.test 12895557870b0f9af7cc0be81a0171abb2d12f12 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905
F test/fts3prefix.test b36d4f00b128a51e7b386cc013a874246d9d7dc1 F test/fts3prefix.test b36d4f00b128a51e7b386cc013a874246d9d7dc1
F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce
F test/fts3query.test 4fefd43ff24993bc2c9b2778f2bec0cc7629e7ed F test/fts3query.test 4fefd43ff24993bc2c9b2778f2bec0cc7629e7ed
@@ -571,7 +571,7 @@ F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0
F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e
F test/fts3snippet.test d524af6bcef4714e059ef559113dbdc924cd33d1 F test/fts3snippet.test d524af6bcef4714e059ef559113dbdc924cd33d1
F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca
F test/fts3tok1.test b10d0a12a0ab5f905cea1200b745de233f37443f F test/fts3tok1.test c551043de056b0b1582a54e878991f57bad074bc
F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d
F test/fts3varint.test 752c08ed5d32c5d7dc211b056f4ed68a76b7e36e F test/fts3varint.test 752c08ed5d32c5d7dc211b056f4ed68a76b7e36e
F test/fts4aa.test 0c3152322c7f0b548cc942ad763eaba0da87ccca F test/fts4aa.test 0c3152322c7f0b548cc942ad763eaba0da87ccca
@@ -585,7 +585,7 @@ F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891
F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7 F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7
F test/fts4merge4.test c19c85ca1faa7b6d536832b49c12e1867235f584 F test/fts4merge4.test c19c85ca1faa7b6d536832b49c12e1867235f584
F test/fts4noti.test aed33ba44808852dcb24bf70fa132e7bf530f057 F test/fts4noti.test aed33ba44808852dcb24bf70fa132e7bf530f057
F test/fts4unicode.test e28ba1a14181e709dcdf47455f207adf14c7cfe0 F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
F test/func.test 00667bbeac044d007f6f021af1b9f6150f0c7ff8 F test/func.test 00667bbeac044d007f6f021af1b9f6150f0c7ff8
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
@@ -717,7 +717,7 @@ F test/misuse.test ba4fb5d1a6101d1c171ea38b3c613d0661c83054
F test/mmap1.test 93d167b328255cbe6679fe1e1a23be1b1197d07b F test/mmap1.test 93d167b328255cbe6679fe1e1a23be1b1197d07b
F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022
F test/mmap3.test c92273e16eb8d23c1d55c9815b446bb72ef0512e F test/mmap3.test c92273e16eb8d23c1d55c9815b446bb72ef0512e
F test/mmapfault.test 97507ee06172df99057dbf1c40294eabd82cbb13 F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3
F test/multiplex.test e08cc7177bd6d85990ee1d71100bb6c684c02256 F test/multiplex.test e08cc7177bd6d85990ee1d71100bb6c684c02256
F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a
F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101
@@ -753,6 +753,7 @@ F test/permutations.test 79927c8175c4dc889f30486388490dae229b3b11
F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429 F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429
F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13
F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
F test/printf2.test 414fcba6d6c10e0a5e58efd213811e5ead4635a0
F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca
@@ -786,7 +787,7 @@ F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38
F test/schema4.test e6a66e20cc69f0e306667c08be7fda3d11707dc5 F test/schema4.test e6a66e20cc69f0e306667c08be7fda3d11707dc5
F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e
F test/securedel.test 87a2561151af1f1e349071a89fdd77059f50113c F test/securedel.test 21749c32ccc30f1ea9e4b9f33295a6521ec20fa0
F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5
F test/select1.test fc2a61f226a649393664ad54bc5376631801517c F test/select1.test fc2a61f226a649393664ad54bc5376631801517c
F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
@@ -816,14 +817,14 @@ F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5
F test/shared_err.test 0079c05c97d88cfa03989b7c20a8b266983087aa F test/shared_err.test 0079c05c97d88cfa03989b7c20a8b266983087aa
F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
F test/shell1.test e7c0b9ebda25d5e78f0a3ea0dc4e31bb6d8098c0 F test/shell1.test e7c0b9ebda25d5e78f0a3ea0dc4e31bb6d8098c0
F test/shell2.test e1d3790f064e50b2f973502f45750012667486df F test/shell2.test c57da3a381c099b02c813ba156298d5c2f5c93a3
F test/shell3.test 5e8545ec72c4413a0e8d4c6be56496e3c257ca29 F test/shell3.test 5e8545ec72c4413a0e8d4c6be56496e3c257ca29
F test/shell4.test aa4eef8118b412d1a01477a53426ece169ea86a9 F test/shell4.test aa4eef8118b412d1a01477a53426ece169ea86a9
F test/shell5.test cee83b4385f842fec1f2a0bec9ea811f35386edf F test/shell5.test cee83b4385f842fec1f2a0bec9ea811f35386edf
F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868
F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
F test/skipscan1.test 6bb4891c2cc5efd5690a9da9e7508e53d4a68e10 F test/skipscan1.test 8c777ffd9dad6ee6d2568160cb2158f0b5cd9dd2
F test/skipscan2.test 5a4db0799c338ddbacb154aaa5589c0254b36a8d F test/skipscan2.test 5a4db0799c338ddbacb154aaa5589c0254b36a8d
F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f
F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24 F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24
@@ -836,10 +837,10 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523
F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715
F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa
F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b
F test/speedtest1.c bb3a4cc62b6cf29f5bc72c85d2bee5991e207be7 F test/speedtest1.c 7130d2cb6db45baa553a4ab2f715116c71c2d9f4
F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be
F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298
F test/stat.test c8eccfe8fcd3f3cfc864ce22d5b9e803a3c69940 F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de
F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
F test/subquery.test 666fdecceac258f5fd84bed09a64e49d9f37edd9 F test/subquery.test 666fdecceac258f5fd84bed09a64e49d9f37edd9
F test/subquery2.test 91e1e364072aeff431d1f9689b15147e421d88c7 F test/subquery2.test 91e1e364072aeff431d1f9689b15147e421d88c7
@@ -896,7 +897,7 @@ F test/tkt-80e031a00f.test 9a154173461a4dbe2de49cda73963e04842d52f7
F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c
F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356
F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5
F test/tkt-94c04eaadb.test fa9c71192f7e2ea2d51bf078bc34e8da6088bf71 F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223
F test/tkt-9d68c883.test 458f7d82a523d7644b54b497c986378a7d8c8b67 F test/tkt-9d68c883.test 458f7d82a523d7644b54b497c986378a7d8c8b67
F test/tkt-9f2eb3abac.test 85bc63e749f050e6a61c8f9207f1eee65c9d3395 F test/tkt-9f2eb3abac.test 85bc63e749f050e6a61c8f9207f1eee65c9d3395
F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4
@@ -1056,9 +1057,9 @@ F test/vtabE.test 7c4693638d7797ce2eda17af74292b97e705cc61
F test/vtabF.test fd5ad376f5a34fe0891df1f3cddb4fe7c3eb077e F test/vtabF.test fd5ad376f5a34fe0891df1f3cddb4fe7c3eb077e
F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
F test/vtab_shared.test 82f463886e18d7f8395a4b6167c91815efe54839 F test/vtab_shared.test 6acafaae7126c9f49be72c2f57eb8bef3024f1cb
F test/wal.test a59d00eaa0901e42b8a2ef21f2a4c972ee1f1bd4 F test/wal.test 40073e54359d43354925b2b700b7eebd5e207285
F test/wal2.test d4b470f13c87f6d8268b004380afa04c3c67cb90 F test/wal2.test a8e3963abf6b232cf0b852b09b53665ef34007af
F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0 F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0
F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
F test/wal5.test 8f888b50f66b78821e61ed0e233ded5de378224b F test/wal5.test 8f888b50f66b78821e61ed0e233ded5de378224b
@@ -1073,7 +1074,7 @@ F test/walcksum.test 9afeb96240296c08c72fc524d199c912cfe34daa
F test/walcrash.test 451d79e528add5c42764cea74aa2750754171b25 F test/walcrash.test 451d79e528add5c42764cea74aa2750754171b25
F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36
F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af
F test/walfault.test 54ad6e849c727f4da463964b9eb8c8e8e155cf82 F test/walfault.test 1f8389f7709877e9b4cc679033d71d6fe529056b
F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483
F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c
F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496
@@ -1161,7 +1162,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P e579661a7950fe9f8eb10012946100c874ba54b0 5716fc2341ddd8cf64139e7168597f864da4e10b P 32477642d79615fb85680bdac812ad9655cf6902 cc72c5aec7fe93d4a1368517aab949dc98d33003
R 44ea540ed51c079699ffafd30e405197 R 78ce3efefe8e1d1aa8c19dbbb86af6d1
U drh U drh
Z a4d623448ba4efed34874461e572fbbf Z 99f0c83c836f43da179f2c44da61e31f

View File

@@ -1 +1 @@
32477642d79615fb85680bdac812ad9655cf6902 cfd110bf5db2c1993a5e2ca718648bd9c17ee22c

View File

@@ -38,10 +38,6 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
if( pExpr ){ if( pExpr ){
if( pExpr->op!=TK_ID ){ if( pExpr->op!=TK_ID ){
rc = sqlite3ResolveExprNames(pName, pExpr); rc = sqlite3ResolveExprNames(pName, pExpr);
if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){
sqlite3ErrorMsg(pName->pParse, "invalid name: \"%s\"", pExpr->u.zToken);
return SQLITE_ERROR;
}
}else{ }else{
pExpr->op = TK_STRING; pExpr->op = TK_STRING;
} }

View File

@@ -780,7 +780,6 @@ int sqlite3GenerateIndexKey(
Table *pTab = pIdx->pTable; Table *pTab = pIdx->pTable;
int regBase; int regBase;
int nCol; int nCol;
Index *pPk;
if( piPartIdxLabel ){ if( piPartIdxLabel ){
if( pIdx->pPartIdxWhere ){ if( pIdx->pPartIdxWhere ){
@@ -794,16 +793,9 @@ int sqlite3GenerateIndexKey(
} }
nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn;
regBase = sqlite3GetTempRange(pParse, nCol); regBase = sqlite3GetTempRange(pParse, nCol);
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
for(j=0; j<nCol; j++){ for(j=0; j<nCol; j++){
i16 idx = pIdx->aiColumn[j]; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j],
if( pPk ) idx = sqlite3ColumnOfIndex(pPk, idx); regBase+j);
if( idx<0 || idx==pTab->iPKey ){
sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regBase+j);
}else{
sqlite3VdbeAddOp3(v, OP_Column, iDataCur, idx, regBase+j);
sqlite3ColumnDefault(v, pTab, pIdx->aiColumn[j], -1);
}
} }
if( regOut ){ if( regOut ){
const char *zAff; const char *zAff;

View File

@@ -2170,6 +2170,11 @@ void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){
*/ */
void sqlite3ExprCachePush(Parse *pParse){ void sqlite3ExprCachePush(Parse *pParse){
pParse->iCacheLevel++; pParse->iCacheLevel++;
#ifdef SQLITE_DEBUG
if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
printf("PUSH to %d\n", pParse->iCacheLevel);
}
#endif
} }
/* /*
@@ -2183,6 +2188,11 @@ void sqlite3ExprCachePop(Parse *pParse, int N){
assert( N>0 ); assert( N>0 );
assert( pParse->iCacheLevel>=N ); assert( pParse->iCacheLevel>=N );
pParse->iCacheLevel -= N; pParse->iCacheLevel -= N;
#ifdef SQLITE_DEBUG
if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
printf("POP to %d\n", pParse->iCacheLevel);
}
#endif
for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
if( p->iReg && p->iLevel>pParse->iCacheLevel ){ if( p->iReg && p->iLevel>pParse->iCacheLevel ){
cacheEntryClear(pParse, p); cacheEntryClear(pParse, p);
@@ -2277,6 +2287,11 @@ void sqlite3ExprCacheClear(Parse *pParse){
int i; int i;
struct yColCache *p; struct yColCache *p;
#if SQLITE_DEBUG
if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
printf("CLEAR\n");
}
#endif
for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
if( p->iReg ){ if( p->iReg ){
cacheEntryClear(pParse, p); cacheEntryClear(pParse, p);
@@ -3413,7 +3428,17 @@ int sqlite3ExprCodeExprList(
}else{ }else{
int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
if( inReg!=target+i ){ if( inReg!=target+i ){
sqlite3VdbeAddOp2(pParse->pVdbe, copyOp, inReg, target+i); VdbeOp *pOp;
Vdbe *v = pParse->pVdbe;
if( copyOp==OP_Copy
&& (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy
&& pOp->p1+pOp->p3+1==inReg
&& pOp->p2+pOp->p3+1==target+i
){
pOp->p3++;
}else{
sqlite3VdbeAddOp2(v, copyOp, inReg, target+i);
}
} }
} }
} }

View File

@@ -218,6 +218,32 @@ static void instrFunc(
sqlite3_result_int(context, N); sqlite3_result_int(context, N);
} }
/*
** Implementation of the printf() function.
*/
static void printfFunc(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
PrintfArguments x;
StrAccum str;
const char *zFormat;
int n;
if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){
x.nArg = argc-1;
x.nUsed = 0;
x.apArg = argv+1;
sqlite3StrAccumInit(&str, 0, 0, SQLITE_MAX_LENGTH);
str.db = sqlite3_context_db_handle(context);
sqlite3XPrintf(&str, SQLITE_PRINTF_SQLFUNC, zFormat, &x);
n = str.nChar;
sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
SQLITE_DYNAMIC);
}
}
/* /*
** Implementation of the substr() function. ** Implementation of the substr() function.
** **
@@ -1648,6 +1674,7 @@ void sqlite3RegisterGlobalFunctions(void){
FUNCTION(instr, 2, 0, 0, instrFunc ), FUNCTION(instr, 2, 0, 0, instrFunc ),
FUNCTION(substr, 2, 0, 0, substrFunc ), FUNCTION(substr, 2, 0, 0, substrFunc ),
FUNCTION(substr, 3, 0, 0, substrFunc ), FUNCTION(substr, 3, 0, 0, substrFunc ),
FUNCTION(printf, -1, 0, 0, printfFunc ),
FUNCTION(unicode, 1, 0, 0, unicodeFunc ), FUNCTION(unicode, 1, 0, 0, unicodeFunc ),
FUNCTION(char, -1, 0, 0, charFunc ), FUNCTION(char, -1, 0, 0, charFunc ),
FUNCTION(abs, 1, 0, 0, absFunc ), FUNCTION(abs, 1, 0, 0, absFunc ),

View File

@@ -1515,47 +1515,49 @@ void sqlite3GenerateConstraintChecks(
/* Generate code to handle collisions */ /* Generate code to handle collisions */
regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField);
if( HasRowid(pTab) ){ if( isUpdate || onError==OE_Replace ){
sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); if( HasRowid(pTab) ){
/* Conflict only if the rowid of the existing index entry sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR);
** is different from old-rowid */ /* Conflict only if the rowid of the existing index entry
if( isUpdate ){ ** is different from old-rowid */
sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); if( isUpdate ){
} sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData);
}else{
int x;
/* Extract the PRIMARY KEY from the end of the index entry and
** store it in registers regR..regR+nPk-1 */
if( (isUpdate || onError==OE_Replace) && pIdx!=pPk ){
for(i=0; i<pPk->nKeyCol; i++){
x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]);
sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i);
VdbeComment((v, "%s.%s", pTab->zName,
pTab->aCol[pPk->aiColumn[i]].zName));
} }
} }else{
if( isUpdate ){ int x;
/* If currently processing the PRIMARY KEY of a WITHOUT ROWID /* Extract the PRIMARY KEY from the end of the index entry and
** table, only conflict if the new PRIMARY KEY values are actually ** store it in registers regR..regR+nPk-1 */
** different from the old. if( pIdx!=pPk ){
** for(i=0; i<pPk->nKeyCol; i++){
** For a UNIQUE index, only conflict if the PRIMARY KEY values x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]);
** of the matched index row are different from the original PRIMARY sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i);
** KEY values of this row before the update. */ VdbeComment((v, "%s.%s", pTab->zName,
int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; pTab->aCol[pPk->aiColumn[i]].zName));
int op = OP_Ne; }
int regCmp = (pIdx->autoIndex==2 ? regIdx : regR); }
if( isUpdate ){
for(i=0; i<pPk->nKeyCol; i++){ /* If currently processing the PRIMARY KEY of a WITHOUT ROWID
char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); ** table, only conflict if the new PRIMARY KEY values are actually
x = pPk->aiColumn[i]; ** different from the old.
if( i==(pPk->nKeyCol-1) ){ **
addrJump = addrUniqueOk; ** For a UNIQUE index, only conflict if the PRIMARY KEY values
op = OP_Eq; ** of the matched index row are different from the original PRIMARY
** KEY values of this row before the update. */
int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol;
int op = OP_Ne;
int regCmp = (pIdx->autoIndex==2 ? regIdx : regR);
for(i=0; i<pPk->nKeyCol; i++){
char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]);
x = pPk->aiColumn[i];
if( i==(pPk->nKeyCol-1) ){
addrJump = addrUniqueOk;
op = OP_Eq;
}
sqlite3VdbeAddOp4(v, op,
regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ
);
} }
sqlite3VdbeAddOp4(v, op,
regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ
);
} }
} }
} }

View File

@@ -1062,8 +1062,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){
** Return a static string containing the name corresponding to the error code ** Return a static string containing the name corresponding to the error code
** specified in the argument. ** specified in the argument.
*/ */
#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ #if defined(SQLITE_TEST)
defined(SQLITE_DEBUG_OS_TRACE)
const char *sqlite3ErrName(int rc){ const char *sqlite3ErrName(int rc){
const char *zName = 0; const char *zName = 0;
int i, origRc = rc; int i, origRc = rc;
@@ -2662,6 +2661,8 @@ static int openDatabase(
SQLITE_DEFAULT_LOCKING_MODE); SQLITE_DEFAULT_LOCKING_MODE);
#endif #endif
if( rc ) sqlite3Error(db, rc, 0);
/* Enable the lookaside-malloc subsystem */ /* Enable the lookaside-malloc subsystem */
setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
sqlite3GlobalConfig.nLookaside); sqlite3GlobalConfig.nLookaside);

View File

@@ -107,7 +107,21 @@ int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
** routine has no return value since the return value would be meaningless. ** routine has no return value since the return value would be meaningless.
*/ */
int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
DO_OS_MALLOC_TEST(id); #ifdef SQLITE_TEST
if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){
/* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite
** is using a regular VFS, it is called after the corresponding
** transaction has been committed. Injecting a fault at this point
** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM
** but the transaction is committed anyway.
**
** The core must call OsFileControl() though, not OsFileControlHint(),
** as if a custom VFS (e.g. zipvfs) returns an error here, it probably
** means the commit really has failed and an error should be returned
** to the user. */
DO_OS_MALLOC_TEST(id);
}
#endif
return id->pMethods->xFileControl(id, op, pArg); return id->pMethods->xFileControl(id, op, pArg);
} }
void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){

View File

@@ -528,7 +528,11 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
** Free all memory allocations in the pParse object ** Free all memory allocations in the pParse object
*/ */
void sqlite3ParserReset(Parse *pParse){ void sqlite3ParserReset(Parse *pParse){
if( pParse ) sqlite3ExprListDelete(pParse->db, pParse->pConstExpr); if( pParse ){
sqlite3 *db = pParse->db;
sqlite3DbFree(db, pParse->aLabel);
sqlite3ExprListDelete(db, pParse->pConstExpr);
}
} }
/* /*

View File

@@ -151,11 +151,28 @@ void sqlite3AppendSpace(StrAccum *pAccum, int N){
/* /*
** Set the StrAccum object to an error mode. ** Set the StrAccum object to an error mode.
*/ */
void setStrAccumError(StrAccum *p, u8 eError){ static void setStrAccumError(StrAccum *p, u8 eError){
p->accError = eError; p->accError = eError;
p->nAlloc = 0; p->nAlloc = 0;
} }
/*
** Extra argument values from a PrintfArguments object
*/
static sqlite3_int64 getIntArg(PrintfArguments *p){
if( p->nArg<=p->nUsed ) return 0;
return sqlite3_value_int64(p->apArg[p->nUsed++]);
}
static double getDoubleArg(PrintfArguments *p){
if( p->nArg<=p->nUsed ) return 0.0;
return sqlite3_value_double(p->apArg[p->nUsed++]);
}
static char *getTextArg(PrintfArguments *p){
if( p->nArg<=p->nUsed ) return 0;
return (char*)sqlite3_value_text(p->apArg[p->nUsed++]);
}
/* /*
** On machines with a small stack size, you can redefine the ** On machines with a small stack size, you can redefine the
** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired.
@@ -169,10 +186,10 @@ void setStrAccumError(StrAccum *p, u8 eError){
** Render a string given by "fmt" into the StrAccum object. ** Render a string given by "fmt" into the StrAccum object.
*/ */
void sqlite3VXPrintf( void sqlite3VXPrintf(
StrAccum *pAccum, /* Accumulate results here */ StrAccum *pAccum, /* Accumulate results here */
int useExtended, /* Allow extended %-conversions */ u32 bFlags, /* SQLITE_PRINTF_* flags */
const char *fmt, /* Format string */ const char *fmt, /* Format string */
va_list ap /* arguments */ va_list ap /* arguments */
){ ){
int c; /* Next character in the format string */ int c; /* Next character in the format string */
char *bufpt; /* Pointer to the conversion buffer */ char *bufpt; /* Pointer to the conversion buffer */
@@ -190,6 +207,8 @@ void sqlite3VXPrintf(
etByte flag_longlong; /* True if the "ll" flag is present */ etByte flag_longlong; /* True if the "ll" flag is present */
etByte done; /* Loop termination flag */ etByte done; /* Loop termination flag */
etByte xtype = 0; /* Conversion paradigm */ etByte xtype = 0; /* Conversion paradigm */
u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */
u8 useIntern; /* Ok to use internal conversions (ex: %T) */
char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
sqlite_uint64 longvalue; /* Value for integer types */ sqlite_uint64 longvalue; /* Value for integer types */
LONGDOUBLE_TYPE realvalue; /* Value for real types */ LONGDOUBLE_TYPE realvalue; /* Value for real types */
@@ -204,9 +223,18 @@ void sqlite3VXPrintf(
etByte flag_dp; /* True if decimal point should be shown */ etByte flag_dp; /* True if decimal point should be shown */
etByte flag_rtz; /* True if trailing zeros should be removed */ etByte flag_rtz; /* True if trailing zeros should be removed */
#endif #endif
PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */
char buf[etBUFSIZE]; /* Conversion buffer */ char buf[etBUFSIZE]; /* Conversion buffer */
bufpt = 0; bufpt = 0;
if( bFlags ){
if( (bArgList = (bFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){
pArgList = va_arg(ap, PrintfArguments*);
}
useIntern = bFlags & SQLITE_PRINTF_INTERNAL;
}else{
bArgList = useIntern = 0;
}
for(; (c=(*fmt))!=0; ++fmt){ for(; (c=(*fmt))!=0; ++fmt){
if( c!='%' ){ if( c!='%' ){
int amt; int amt;
@@ -238,7 +266,11 @@ void sqlite3VXPrintf(
/* Get the field width */ /* Get the field width */
width = 0; width = 0;
if( c=='*' ){ if( c=='*' ){
width = va_arg(ap,int); if( bArgList ){
width = (int)getIntArg(pArgList);
}else{
width = va_arg(ap,int);
}
if( width<0 ){ if( width<0 ){
flag_leftjustify = 1; flag_leftjustify = 1;
width = -width; width = -width;
@@ -255,7 +287,11 @@ void sqlite3VXPrintf(
precision = 0; precision = 0;
c = *++fmt; c = *++fmt;
if( c=='*' ){ if( c=='*' ){
precision = va_arg(ap,int); if( bArgList ){
precision = (int)getIntArg(pArgList);
}else{
precision = va_arg(ap,int);
}
if( precision<0 ) precision = -precision; if( precision<0 ) precision = -precision;
c = *++fmt; c = *++fmt;
}else{ }else{
@@ -286,7 +322,7 @@ void sqlite3VXPrintf(
for(idx=0; idx<ArraySize(fmtinfo); idx++){ for(idx=0; idx<ArraySize(fmtinfo); idx++){
if( c==fmtinfo[idx].fmttype ){ if( c==fmtinfo[idx].fmttype ){
infop = &fmtinfo[idx]; infop = &fmtinfo[idx];
if( useExtended || (infop->flags & FLAG_INTERN)==0 ){ if( useIntern || (infop->flags & FLAG_INTERN)==0 ){
xtype = infop->type; xtype = infop->type;
}else{ }else{
return; return;
@@ -326,7 +362,9 @@ void sqlite3VXPrintf(
case etRADIX: case etRADIX:
if( infop->flags & FLAG_SIGNED ){ if( infop->flags & FLAG_SIGNED ){
i64 v; i64 v;
if( flag_longlong ){ if( bArgList ){
v = getIntArg(pArgList);
}else if( flag_longlong ){
v = va_arg(ap,i64); v = va_arg(ap,i64);
}else if( flag_long ){ }else if( flag_long ){
v = va_arg(ap,long int); v = va_arg(ap,long int);
@@ -347,7 +385,9 @@ void sqlite3VXPrintf(
else prefix = 0; else prefix = 0;
} }
}else{ }else{
if( flag_longlong ){ if( bArgList ){
longvalue = (u64)getIntArg(pArgList);
}else if( flag_longlong ){
longvalue = va_arg(ap,u64); longvalue = va_arg(ap,u64);
}else if( flag_long ){ }else if( flag_long ){
longvalue = va_arg(ap,unsigned long int); longvalue = va_arg(ap,unsigned long int);
@@ -407,7 +447,11 @@ void sqlite3VXPrintf(
case etFLOAT: case etFLOAT:
case etEXP: case etEXP:
case etGENERIC: case etGENERIC:
realvalue = va_arg(ap,double); if( bArgList ){
realvalue = getDoubleArg(pArgList);
}else{
realvalue = va_arg(ap,double);
}
#ifdef SQLITE_OMIT_FLOATING_POINT #ifdef SQLITE_OMIT_FLOATING_POINT
length = 0; length = 0;
#else #else
@@ -562,7 +606,9 @@ void sqlite3VXPrintf(
#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ #endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */
break; break;
case etSIZE: case etSIZE:
*(va_arg(ap,int*)) = pAccum->nChar; if( !bArgList ){
*(va_arg(ap,int*)) = pAccum->nChar;
}
length = width = 0; length = width = 0;
break; break;
case etPERCENT: case etPERCENT:
@@ -571,7 +617,12 @@ void sqlite3VXPrintf(
length = 1; length = 1;
break; break;
case etCHARX: case etCHARX:
c = va_arg(ap,int); if( bArgList ){
bufpt = getTextArg(pArgList);
c = bufpt ? bufpt[0] : 0;
}else{
c = va_arg(ap,int);
}
buf[0] = (char)c; buf[0] = (char)c;
if( precision>=0 ){ if( precision>=0 ){
for(idx=1; idx<precision; idx++) buf[idx] = (char)c; for(idx=1; idx<precision; idx++) buf[idx] = (char)c;
@@ -583,10 +634,14 @@ void sqlite3VXPrintf(
break; break;
case etSTRING: case etSTRING:
case etDYNSTRING: case etDYNSTRING:
bufpt = va_arg(ap,char*); if( bArgList ){
bufpt = getTextArg(pArgList);
}else{
bufpt = va_arg(ap,char*);
}
if( bufpt==0 ){ if( bufpt==0 ){
bufpt = ""; bufpt = "";
}else if( xtype==etDYNSTRING ){ }else if( xtype==etDYNSTRING && !bArgList ){
zExtra = bufpt; zExtra = bufpt;
} }
if( precision>=0 ){ if( precision>=0 ){
@@ -602,7 +657,13 @@ void sqlite3VXPrintf(
int needQuote; int needQuote;
char ch; char ch;
char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
char *escarg = va_arg(ap,char*); char *escarg;
if( bArgList ){
escarg = getTextArg(pArgList);
}else{
escarg = va_arg(ap,char*);
}
isnull = escarg==0; isnull = escarg==0;
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
k = precision; k = precision;
@@ -637,6 +698,7 @@ void sqlite3VXPrintf(
} }
case etTOKEN: { case etTOKEN: {
Token *pToken = va_arg(ap, Token*); Token *pToken = va_arg(ap, Token*);
assert( bArgList==0 );
if( pToken && pToken->n ){ if( pToken && pToken->n ){
sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
} }
@@ -647,6 +709,7 @@ void sqlite3VXPrintf(
SrcList *pSrc = va_arg(ap, SrcList*); SrcList *pSrc = va_arg(ap, SrcList*);
int k = va_arg(ap, int); int k = va_arg(ap, int);
struct SrcList_item *pItem = &pSrc->a[k]; struct SrcList_item *pItem = &pSrc->a[k];
assert( bArgList==0 );
assert( k>=0 && k<pSrc->nSrc ); assert( k>=0 && k<pSrc->nSrc );
if( pItem->zDatabase ){ if( pItem->zDatabase ){
sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase);
@@ -810,7 +873,7 @@ char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){
sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), sqlite3StrAccumInit(&acc, zBase, sizeof(zBase),
db->aLimit[SQLITE_LIMIT_LENGTH]); db->aLimit[SQLITE_LIMIT_LENGTH]);
acc.db = db; acc.db = db;
sqlite3VXPrintf(&acc, 1, zFormat, ap); sqlite3VXPrintf(&acc, SQLITE_PRINTF_INTERNAL, zFormat, ap);
z = sqlite3StrAccumFinish(&acc); z = sqlite3StrAccumFinish(&acc);
if( acc.accError==STRACCUM_NOMEM ){ if( acc.accError==STRACCUM_NOMEM ){
db->mallocFailed = 1; db->mallocFailed = 1;
@@ -966,14 +1029,12 @@ void sqlite3DebugPrintf(const char *zFormat, ...){
} }
#endif #endif
#ifndef SQLITE_OMIT_TRACE
/* /*
** variable-argument wrapper around sqlite3VXPrintf(). ** variable-argument wrapper around sqlite3VXPrintf().
*/ */
void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){ void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ...){
va_list ap; va_list ap;
va_start(ap,zFormat); va_start(ap,zFormat);
sqlite3VXPrintf(p, 1, zFormat, ap); sqlite3VXPrintf(p, bFlags, zFormat, ap);
va_end(ap); va_end(ap);
} }
#endif

View File

@@ -598,7 +598,6 @@ static void selectInnerLoop(
/* If the destination is an EXISTS(...) expression, the actual /* If the destination is an EXISTS(...) expression, the actual
** values returned by the SELECT are not required. ** values returned by the SELECT are not required.
*/ */
sqlite3ExprCacheClear(pParse);
sqlite3ExprCodeExprList(pParse, pEList, regResult, sqlite3ExprCodeExprList(pParse, pEList, regResult,
(eDest==SRT_Output)?SQLITE_ECEL_DUP:0); (eDest==SRT_Output)?SQLITE_ECEL_DUP:0);
} }
@@ -1565,7 +1564,7 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){
Vdbe *sqlite3GetVdbe(Parse *pParse){ Vdbe *sqlite3GetVdbe(Parse *pParse){
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
if( v==0 ){ if( v==0 ){
v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); v = pParse->pVdbe = sqlite3VdbeCreate(pParse);
#ifndef SQLITE_OMIT_TRACE #ifndef SQLITE_OMIT_TRACE
if( v ){ if( v ){
sqlite3VdbeAddOp0(v, OP_Trace); sqlite3VdbeAddOp0(v, OP_Trace);
@@ -3823,14 +3822,23 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
int i; int i;
struct AggInfo_func *pFunc; struct AggInfo_func *pFunc;
if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ int nReg = pAggInfo->nFunc + pAggInfo->nColumn;
return; if( nReg==0 ) return;
} #ifdef SQLITE_DEBUG
/* Verify that all AggInfo registers are within the range specified by
** AggInfo.mnReg..AggInfo.mxReg */
assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 );
for(i=0; i<pAggInfo->nColumn; i++){ for(i=0; i<pAggInfo->nColumn; i++){
sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem); assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg
&& pAggInfo->aCol[i].iMem<=pAggInfo->mxReg );
} }
for(i=0; i<pAggInfo->nFunc; i++){
assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg
&& pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg );
}
#endif
sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg);
for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){ for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem);
if( pFunc->iDistinct>=0 ){ if( pFunc->iDistinct>=0 ){
Expr *pE = pFunc->pExpr; Expr *pE = pFunc->pExpr;
assert( !ExprHasProperty(pE, EP_xIsSelect) ); assert( !ExprHasProperty(pE, EP_xIsSelect) );
@@ -3876,7 +3884,6 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
struct AggInfo_col *pC; struct AggInfo_col *pC;
pAggInfo->directMode = 1; pAggInfo->directMode = 1;
sqlite3ExprCacheClear(pParse);
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){ for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
int nArg; int nArg;
int addrNext = 0; int addrNext = 0;
@@ -4409,6 +4416,7 @@ int sqlite3Select(
sNC.pParse = pParse; sNC.pParse = pParse;
sNC.pSrcList = pTabList; sNC.pSrcList = pTabList;
sNC.pAggInfo = &sAggInfo; sNC.pAggInfo = &sAggInfo;
sAggInfo.mnReg = pParse->nMem+1;
sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0;
sAggInfo.pGroupBy = pGroupBy; sAggInfo.pGroupBy = pGroupBy;
sqlite3ExprAnalyzeAggList(&sNC, pEList); sqlite3ExprAnalyzeAggList(&sNC, pEList);
@@ -4423,6 +4431,7 @@ int sqlite3Select(
sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
sNC.ncFlags &= ~NC_InAggFunc; sNC.ncFlags &= ~NC_InAggFunc;
} }
sAggInfo.mxReg = pParse->nMem;
if( db->mallocFailed ) goto select_end; if( db->mallocFailed ) goto select_end;
/* Processing for aggregates with GROUP BY is very different and /* Processing for aggregates with GROUP BY is very different and

View File

@@ -3038,7 +3038,10 @@ static int process_input(struct callback_data *p, FILE *in){
seenInterrupt = 0; seenInterrupt = 0;
} }
lineno++; lineno++;
if( nSql==0 && _all_whitespace(zLine) ) continue; if( nSql==0 && _all_whitespace(zLine) ){
if( p->echoOn ) printf("%s\n", zLine);
continue;
}
if( zLine && zLine[0]=='.' && nSql==0 ){ if( zLine && zLine[0]=='.' && nSql==0 ){
if( p->echoOn ) printf("%s\n", zLine); if( p->echoOn ) printf("%s\n", zLine);
rc = do_meta_command(zLine, p); rc = do_meta_command(zLine, p);
@@ -3100,6 +3103,7 @@ static int process_input(struct callback_data *p, FILE *in){
} }
nSql = 0; nSql = 0;
}else if( nSql && _all_whitespace(zSql) ){ }else if( nSql && _all_whitespace(zSql) ){
if( p->echoOn ) printf("%s\n", zSql);
nSql = 0; nSql = 0;
} }
} }

View File

@@ -743,6 +743,7 @@ typedef struct Module Module;
typedef struct NameContext NameContext; typedef struct NameContext NameContext;
typedef struct Parse Parse; typedef struct Parse Parse;
typedef struct PreUpdate PreUpdate; typedef struct PreUpdate PreUpdate;
typedef struct PrintfArguments PrintfArguments;
typedef struct RowSet RowSet; typedef struct RowSet RowSet;
typedef struct Savepoint Savepoint; typedef struct Savepoint Savepoint;
typedef struct Select Select; typedef struct Select Select;
@@ -1695,6 +1696,7 @@ struct AggInfo {
int sortingIdx; /* Cursor number of the sorting index */ int sortingIdx; /* Cursor number of the sorting index */
int sortingIdxPTab; /* Cursor number of pseudo-table */ int sortingIdxPTab; /* Cursor number of pseudo-table */
int nSortingColumn; /* Number of columns in the sorting index */ int nSortingColumn; /* Number of columns in the sorting index */
int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */
ExprList *pGroupBy; /* The group by clause */ ExprList *pGroupBy; /* The group by clause */
struct AggInfo_col { /* For each column used in source tables */ struct AggInfo_col { /* For each column used in source tables */
Table *pTab; /* Source table */ Table *pTab; /* Source table */
@@ -2296,6 +2298,9 @@ struct Parse {
int nMem; /* Number of memory cells used so far */ int nMem; /* Number of memory cells used so far */
int nSet; /* Number of sets used so far */ int nSet; /* Number of sets used so far */
int nOnce; /* Number of OP_Once instructions so far */ int nOnce; /* Number of OP_Once instructions so far */
int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */
int nLabel; /* Number of labels used */
int *aLabel; /* Space to hold the labels */
int ckBase; /* Base register of data during check constraints */ int ckBase; /* Base register of data during check constraints */
int iPartIdxTab; /* Table corresponding to a partial index */ int iPartIdxTab; /* Table corresponding to a partial index */
int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
@@ -2776,10 +2781,20 @@ void sqlite3StatusSet(int, int);
# define sqlite3IsNaN(X) 0 # define sqlite3IsNaN(X) 0
#endif #endif
void sqlite3VXPrintf(StrAccum*, int, const char*, va_list); /*
#ifndef SQLITE_OMIT_TRACE ** An instance of the following structure holds information about SQL
void sqlite3XPrintf(StrAccum*, const char*, ...); ** functions arguments that are the parameters to the printf() function.
#endif */
struct PrintfArguments {
int nArg; /* Total number of arguments */
int nUsed; /* Number of arguments used so far */
sqlite3_value **apArg; /* The argument values */
};
#define SQLITE_PRINTF_INTERNAL 0x01
#define SQLITE_PRINTF_SQLFUNC 0x02
void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list);
void sqlite3XPrintf(StrAccum*, u32, const char*, ...);
char *sqlite3MPrintf(sqlite3*,const char*, ...); char *sqlite3MPrintf(sqlite3*,const char*, ...);
char *sqlite3VMPrintf(sqlite3*,const char*, va_list); char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
char *sqlite3MAppendf(sqlite3*,char*,const char*,...); char *sqlite3MAppendf(sqlite3*,char*,const char*,...);
@@ -3138,8 +3153,7 @@ void *sqlite3HexToBlob(sqlite3*, const char *z, int n);
u8 sqlite3HexToInt(int h); u8 sqlite3HexToInt(int h);
int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ #if defined(SQLITE_TEST)
defined(SQLITE_DEBUG_OS_TRACE)
const char *sqlite3ErrName(int); const char *sqlite3ErrName(int);
#endif #endif

View File

@@ -1574,9 +1574,9 @@ static int DbUseNre(void){
*/ */
# define SQLITE_TCL_NRE 0 # define SQLITE_TCL_NRE 0
# define DbUseNre() 0 # define DbUseNre() 0
# define Tcl_NRAddCallback(a,b,c,d,e,f) 0 # define Tcl_NRAddCallback(a,b,c,d,e,f) (void)0
# define Tcl_NREvalObj(a,b,c) 0 # define Tcl_NREvalObj(a,b,c) 0
# define Tcl_NRCreateCommand(a,b,c,d,e,f) 0 # define Tcl_NRCreateCommand(a,b,c,d,e,f) (void)0
#endif #endif
/* /*
@@ -2855,7 +2855,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
** or savepoint. */ ** or savepoint. */
if( DbUseNre() ){ if( DbUseNre() ){
Tcl_NRAddCallback(interp, DbTransPostCmd, cd, 0, 0, 0); Tcl_NRAddCallback(interp, DbTransPostCmd, cd, 0, 0, 0);
Tcl_NREvalObj(interp, pScript, 0); (void)Tcl_NREvalObj(interp, pScript, 0);
}else{ }else{
rc = DbTransPostCmd(&cd, interp, Tcl_EvalObjEx(interp, pScript, 0)); rc = DbTransPostCmd(&cd, interp, Tcl_EvalObjEx(interp, pScript, 0));
} }
@@ -3517,8 +3517,7 @@ static void MD5Final(unsigned char digest[16], MD5Context *ctx){
byteReverse(ctx->in, 14); byteReverse(ctx->in, 14);
/* Append length in bits and transform */ /* Append length in bits and transform */
((uint32 *)ctx->in)[ 14 ] = ctx->bits[0]; memcpy(ctx->in + 14*4, ctx->bits, 8);
((uint32 *)ctx->in)[ 15 ] = ctx->bits[1];
MD5Transform(ctx->buf, (uint32 *)ctx->in); MD5Transform(ctx->buf, (uint32 *)ctx->in);
byteReverse((unsigned char *)ctx->buf, 4); byteReverse((unsigned char *)ctx->buf, 4);

View File

@@ -72,7 +72,7 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM);
} }
#ifndef SQLITE_OMIT_FLOATING_POINT #ifndef SQLITE_OMIT_FLOATING_POINT
if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
} }
#endif #endif
@@ -496,10 +496,10 @@ void sqlite3Update(
newmask = sqlite3TriggerColmask( newmask = sqlite3TriggerColmask(
pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError
); );
sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1); /*sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);*/
for(i=0; i<pTab->nCol; i++){ for(i=0; i<pTab->nCol; i++){
if( i==pTab->iPKey ){ if( i==pTab->iPKey ){
/*sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);*/ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
}else{ }else{
j = aXRef[i]; j = aXRef[i];
if( j>=0 ){ if( j>=0 ){
@@ -513,6 +513,8 @@ void sqlite3Update(
testcase( i==31 ); testcase( i==31 );
testcase( i==32 ); testcase( i==32 );
sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
} }
} }
} }

View File

@@ -1121,7 +1121,7 @@ case OP_Move: {
} }
/* Opcode: Copy P1 P2 P3 * * /* Opcode: Copy P1 P2 P3 * *
** Synopsis: r[P2@P3]=r[P1@P3] ** Synopsis: r[P2@P3+1]=r[P1@P3+1]
** **
** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3.
** **
@@ -2464,7 +2464,7 @@ case OP_Column: {
VdbeMemRelease(pDest); VdbeMemRelease(pDest);
sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest); sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest);
}else{ }else{
/* This branch happens only when content is on overflow pages */ /* This branch happens only when content is on overflow pages */
t = aType[p2]; t = aType[p2];
if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0
&& ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0))

View File

@@ -162,7 +162,7 @@ typedef struct VdbeOpList VdbeOpList;
** Prototypes for the VDBE interface. See comments on the implementation ** Prototypes for the VDBE interface. See comments on the implementation
** for a description of what each of these routines does. ** for a description of what each of these routines does.
*/ */
Vdbe *sqlite3VdbeCreate(sqlite3*); Vdbe *sqlite3VdbeCreate(Parse*);
int sqlite3VdbeAddOp0(Vdbe*,int); int sqlite3VdbeAddOp0(Vdbe*,int);
int sqlite3VdbeAddOp1(Vdbe*,int,int); int sqlite3VdbeAddOp1(Vdbe*,int,int);
int sqlite3VdbeAddOp2(Vdbe*,int,int,int); int sqlite3VdbeAddOp2(Vdbe*,int,int,int);

View File

@@ -312,12 +312,9 @@ struct Vdbe {
Mem **apArg; /* Arguments to currently executing user function */ Mem **apArg; /* Arguments to currently executing user function */
Mem *aColName; /* Column names to return */ Mem *aColName; /* Column names to return */
Mem *pResultSet; /* Pointer to an array of results */ Mem *pResultSet; /* Pointer to an array of results */
Parse *pParse; /* Parsing context used to create this Vdbe */
int nMem; /* Number of memory locations currently allocated */ int nMem; /* Number of memory locations currently allocated */
int nOp; /* Number of instructions in the program */ int nOp; /* Number of instructions in the program */
int nOpAlloc; /* Number of slots allocated for aOp[] */
int nLabel; /* Number of labels used */
int *aLabel; /* Space to hold the labels */
u16 nResColumn; /* Number of columns in one row of the result set */
int nCursor; /* Number of slots in apCsr[] */ int nCursor; /* Number of slots in apCsr[] */
u32 magic; /* Magic number for sanity checking */ u32 magic; /* Magic number for sanity checking */
char *zErrMsg; /* Error message written here */ char *zErrMsg; /* Error message written here */
@@ -330,6 +327,7 @@ struct Vdbe {
u32 cacheCtr; /* VdbeCursor row cache generation counter */ u32 cacheCtr; /* VdbeCursor row cache generation counter */
int pc; /* The program counter */ int pc; /* The program counter */
int rc; /* Value to return */ int rc; /* Value to return */
u16 nResColumn; /* Number of columns in one row of the result set */
u8 errorAction; /* Recovery action to do in case of an error */ u8 errorAction; /* Recovery action to do in case of an error */
u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 minWriteFileFormat; /* Minimum file format for writable database files */
bft explain:2; /* True if EXPLAIN present on SQL command */ bft explain:2; /* True if EXPLAIN present on SQL command */

View File

@@ -20,7 +20,8 @@
/* /*
** Create a new virtual database engine. ** Create a new virtual database engine.
*/ */
Vdbe *sqlite3VdbeCreate(sqlite3 *db){ Vdbe *sqlite3VdbeCreate(Parse *pParse){
sqlite3 *db = pParse->db;
Vdbe *p; Vdbe *p;
p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); p = sqlite3DbMallocZero(db, sizeof(Vdbe) );
if( p==0 ) return 0; if( p==0 ) return 0;
@@ -32,6 +33,10 @@ Vdbe *sqlite3VdbeCreate(sqlite3 *db){
p->pPrev = 0; p->pPrev = 0;
db->pVdbe = p; db->pVdbe = p;
p->magic = VDBE_MAGIC_INIT; p->magic = VDBE_MAGIC_INIT;
p->pParse = pParse;
assert( pParse->aLabel==0 );
assert( pParse->nLabel==0 );
assert( pParse->nOpAlloc==0 );
return p; return p;
} }
@@ -88,13 +93,14 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
** unchanged (this is so that any opcodes already allocated can be ** unchanged (this is so that any opcodes already allocated can be
** correctly deallocated along with the rest of the Vdbe). ** correctly deallocated along with the rest of the Vdbe).
*/ */
static int growOpArray(Vdbe *p){ static int growOpArray(Vdbe *v){
VdbeOp *pNew; VdbeOp *pNew;
Parse *p = v->pParse;
int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op)));
pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op)); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op));
if( pNew ){ if( pNew ){
p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op); p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op);
p->aOp = pNew; v->aOp = pNew;
} }
return (pNew ? SQLITE_OK : SQLITE_NOMEM); return (pNew ? SQLITE_OK : SQLITE_NOMEM);
} }
@@ -133,7 +139,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
i = p->nOp; i = p->nOp;
assert( p->magic==VDBE_MAGIC_INIT ); assert( p->magic==VDBE_MAGIC_INIT );
assert( op>0 && op<0xff ); assert( op>0 && op<0xff );
if( p->nOpAlloc<=i ){ if( p->pParse->nOpAlloc<=i ){
if( growOpArray(p) ){ if( growOpArray(p) ){
return 1; return 1;
} }
@@ -152,6 +158,15 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
#endif #endif
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
if( p->db->flags & SQLITE_VdbeAddopTrace ){ if( p->db->flags & SQLITE_VdbeAddopTrace ){
int jj, kk;
Parse *pParse = p->pParse;
for(jj=kk=0; jj<SQLITE_N_COLCACHE; jj++){
struct yColCache *x = pParse->aColCache + jj;
if( x->iLevel>pParse->iCacheLevel || x->iReg==0 ) continue;
printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn);
kk++;
}
if( kk ) printf("\n");
sqlite3VdbePrintOp(0, i, &p->aOp[i]); sqlite3VdbePrintOp(0, i, &p->aOp[i]);
test_addop_breakpoint(); test_addop_breakpoint();
} }
@@ -235,9 +250,10 @@ int sqlite3VdbeAddOp4Int(
** **
** Zero is returned if a malloc() fails. ** Zero is returned if a malloc() fails.
*/ */
int sqlite3VdbeMakeLabel(Vdbe *p){ int sqlite3VdbeMakeLabel(Vdbe *v){
Parse *p = v->pParse;
int i = p->nLabel++; int i = p->nLabel++;
assert( p->magic==VDBE_MAGIC_INIT ); assert( v->magic==VDBE_MAGIC_INIT );
if( (i & (i-1))==0 ){ if( (i & (i-1))==0 ){
p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel,
(i*2+1)*sizeof(p->aLabel[0])); (i*2+1)*sizeof(p->aLabel[0]));
@@ -253,12 +269,13 @@ int sqlite3VdbeMakeLabel(Vdbe *p){
** be inserted. The parameter "x" must have been obtained from ** be inserted. The parameter "x" must have been obtained from
** a prior call to sqlite3VdbeMakeLabel(). ** a prior call to sqlite3VdbeMakeLabel().
*/ */
void sqlite3VdbeResolveLabel(Vdbe *p, int x){ void sqlite3VdbeResolveLabel(Vdbe *v, int x){
Parse *p = v->pParse;
int j = -1-x; int j = -1-x;
assert( p->magic==VDBE_MAGIC_INIT ); assert( v->magic==VDBE_MAGIC_INIT );
assert( j<p->nLabel ); assert( j<p->nLabel );
if( j>=0 && p->aLabel ){ if( j>=0 && p->aLabel ){
p->aLabel[j] = p->nOp; p->aLabel[j] = v->nOp;
} }
} }
@@ -407,7 +424,8 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
int i; int i;
int nMaxArgs = *pMaxFuncArgs; int nMaxArgs = *pMaxFuncArgs;
Op *pOp; Op *pOp;
int *aLabel = p->aLabel; Parse *pParse = p->pParse;
int *aLabel = pParse->aLabel;
p->readOnly = 1; p->readOnly = 1;
p->bIsReader = 0; p->bIsReader = 0;
for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){
@@ -470,12 +488,13 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
pOp->opflags = sqlite3OpcodeProperty[opcode]; pOp->opflags = sqlite3OpcodeProperty[opcode];
if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){ if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){
assert( -1-pOp->p2<p->nLabel ); assert( -1-pOp->p2<pParse->nLabel );
pOp->p2 = aLabel[-1-pOp->p2]; pOp->p2 = aLabel[-1-pOp->p2];
} }
} }
sqlite3DbFree(p->db, p->aLabel); sqlite3DbFree(p->db, pParse->aLabel);
p->aLabel = 0; pParse->aLabel = 0;
pParse->nLabel = 0;
*pMaxFuncArgs = nMaxArgs; *pMaxFuncArgs = nMaxArgs;
assert( p->bIsReader!=0 || p->btreeMask==0 ); assert( p->bIsReader!=0 || p->btreeMask==0 );
} }
@@ -519,7 +538,7 @@ VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){
int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
int addr; int addr;
assert( p->magic==VDBE_MAGIC_INIT ); assert( p->magic==VDBE_MAGIC_INIT );
if( p->nOp + nOp > p->nOpAlloc && growOpArray(p) ){ if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p) ){
return 0; return 0;
} }
addr = p->nOp; addr = p->nOp;
@@ -873,7 +892,17 @@ static int translateP(char c, const Op *pOp){
} }
/* /*
** Compute a string for the "comment" field of a VDBE opcode listing ** Compute a string for the "comment" field of a VDBE opcode listing.
**
** The Synopsis: field in comments in the vdbe.c source file gets converted
** to an extra string that is appended to the sqlite3OpcodeName(). In the
** absence of other comments, this synopsis becomes the comment on the opcode.
** Some translation occurs:
**
** "PX" -> "r[X]"
** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1
** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0
** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x
*/ */
static int displayComment( static int displayComment(
const Op *pOp, /* The opcode to be commented */ const Op *pOp, /* The opcode to be commented */
@@ -907,7 +936,13 @@ static int displayComment(
ii += 3; ii += 3;
jj += sqlite3Strlen30(zTemp+jj); jj += sqlite3Strlen30(zTemp+jj);
v2 = translateP(zSynopsis[ii], pOp); v2 = translateP(zSynopsis[ii], pOp);
if( v2>1 ) sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){
ii += 2;
v2++;
}
if( v2>1 ){
sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1);
}
}else if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ }else if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){
ii += 4; ii += 4;
} }
@@ -1139,6 +1174,9 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){
#else #else
zCom[0] = 0 zCom[0] = 0
#endif #endif
/* NB: The sqlite3OpcodeName() function is implemented by code created
** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the
** information from the vdbe.c source text */
fprintf(pOut, zFormat1, pc, fprintf(pOut, zFormat1, pc,
sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5,
zCom zCom
@@ -1570,6 +1608,7 @@ void sqlite3VdbeMakeReady(
assert( p->nOp>0 ); assert( p->nOp>0 );
assert( pParse!=0 ); assert( pParse!=0 );
assert( p->magic==VDBE_MAGIC_INIT ); assert( p->magic==VDBE_MAGIC_INIT );
assert( pParse==p->pParse );
db = p->db; db = p->db;
assert( db->mallocFailed==0 ); assert( db->mallocFailed==0 );
nVar = pParse->nVar; nVar = pParse->nVar;
@@ -1593,8 +1632,8 @@ void sqlite3VdbeMakeReady(
/* Allocate space for memory registers, SQL variables, VDBE cursors and /* Allocate space for memory registers, SQL variables, VDBE cursors and
** an array to marshal SQL function arguments in. ** an array to marshal SQL function arguments in.
*/ */
zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */
zEnd = (u8*)&p->aOp[p->nOpAlloc]; /* First byte past end of zCsr[] */ zEnd = (u8*)&p->aOp[pParse->nOpAlloc]; /* First byte past end of zCsr[] */
resolveP2Values(p, &nArg); resolveP2Values(p, &nArg);
p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort);
@@ -2597,7 +2636,6 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
} }
for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]);
vdbeFreeOpArray(db, p->aOp, p->nOp); vdbeFreeOpArray(db, p->aOp, p->nOp);
sqlite3DbFree(db, p->aLabel);
sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->aColName);
sqlite3DbFree(db, p->zSql); sqlite3DbFree(db, p->zSql);
sqlite3DbFree(db, p->pFree); sqlite3DbFree(db, p->pFree);

View File

@@ -259,7 +259,7 @@ int sqlite3_blob_open(
} }
} }
pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(db); pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse);
assert( pBlob->pStmt || db->mallocFailed ); assert( pBlob->pStmt || db->mallocFailed );
if( pBlob->pStmt ){ if( pBlob->pStmt ){
Vdbe *v = (Vdbe *)pBlob->pStmt; Vdbe *v = (Vdbe *)pBlob->pStmt;

View File

@@ -125,9 +125,9 @@ char *sqlite3VdbeExpandSql(
if( pVar->flags & MEM_Null ){ if( pVar->flags & MEM_Null ){
sqlite3StrAccumAppend(&out, "NULL", 4); sqlite3StrAccumAppend(&out, "NULL", 4);
}else if( pVar->flags & MEM_Int ){ }else if( pVar->flags & MEM_Int ){
sqlite3XPrintf(&out, "%lld", pVar->u.i); sqlite3XPrintf(&out, 0, "%lld", pVar->u.i);
}else if( pVar->flags & MEM_Real ){ }else if( pVar->flags & MEM_Real ){
sqlite3XPrintf(&out, "%!.15g", pVar->r); sqlite3XPrintf(&out, 0, "%!.15g", pVar->r);
}else if( pVar->flags & MEM_Str ){ }else if( pVar->flags & MEM_Str ){
int nOut; /* Number of bytes of the string text to include in output */ int nOut; /* Number of bytes of the string text to include in output */
#ifndef SQLITE_OMIT_UTF16 #ifndef SQLITE_OMIT_UTF16
@@ -148,15 +148,17 @@ char *sqlite3VdbeExpandSql(
while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; }
} }
#endif #endif
sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z); sqlite3XPrintf(&out, 0, "'%.*q'", nOut, pVar->z);
#ifdef SQLITE_TRACE_SIZE_LIMIT #ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); if( nOut<pVar->n ){
sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut);
}
#endif #endif
#ifndef SQLITE_OMIT_UTF16 #ifndef SQLITE_OMIT_UTF16
if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8);
#endif #endif
}else if( pVar->flags & MEM_Zero ){ }else if( pVar->flags & MEM_Zero ){
sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero); sqlite3XPrintf(&out, 0, "zeroblob(%d)", pVar->u.nZero);
}else{ }else{
int nOut; /* Number of bytes of the blob to include in output */ int nOut; /* Number of bytes of the blob to include in output */
assert( pVar->flags & MEM_Blob ); assert( pVar->flags & MEM_Blob );
@@ -166,11 +168,13 @@ char *sqlite3VdbeExpandSql(
if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT;
#endif #endif
for(i=0; i<nOut; i++){ for(i=0; i<nOut; i++){
sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff); sqlite3XPrintf(&out, 0, "%02x", pVar->z[i]&0xff);
} }
sqlite3StrAccumAppend(&out, "'", 1); sqlite3StrAccumAppend(&out, "'", 1);
#ifdef SQLITE_TRACE_SIZE_LIMIT #ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); if( nOut<pVar->n ){
sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut);
}
#endif #endif
} }
} }
@@ -229,7 +233,7 @@ void sqlite3ExplainPrintf(Vdbe *pVdbe, const char *zFormat, ...){
sqlite3AppendSpace(&p->str, p->aIndent[n-1]); sqlite3AppendSpace(&p->str, p->aIndent[n-1]);
} }
va_start(ap, zFormat); va_start(ap, zFormat);
sqlite3VXPrintf(&p->str, 1, zFormat, ap); sqlite3VXPrintf(&p->str, SQLITE_PRINTF_INTERNAL, zFormat, ap);
va_end(ap); va_end(ap);
} }
} }

View File

@@ -3928,6 +3928,7 @@ static int whereLoopAddBtreeIndex(
&& saved_nEq==saved_nSkip && saved_nEq==saved_nSkip
&& saved_nEq+1<pProbe->nKeyCol && saved_nEq+1<pProbe->nKeyCol
&& pProbe->aiRowEst[saved_nEq+1]>=18 /* TUNING: Minimum for skip-scan */ && pProbe->aiRowEst[saved_nEq+1]>=18 /* TUNING: Minimum for skip-scan */
&& (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK
){ ){
LogEst nIter; LogEst nIter;
pNew->u.btree.nEq++; pNew->u.btree.nEq++;

View File

@@ -322,7 +322,6 @@ do_test attach3-12.9 {
db_list db_list
} {main temp {}} } {main temp {}}
do_test attach3-12.10 { do_test attach3-12.10 {
breakpoint
execsql { execsql {
DETACH ? DETACH ?
} }

View File

@@ -1191,7 +1191,6 @@ do_test capi3-18.2 {
sqlite3_reset $STMT sqlite3_reset $STMT
sqlite3_errcode db sqlite3_errcode db
} {SQLITE_SCHEMA} } {SQLITE_SCHEMA}
breakpoint
do_test capi3-18.3 { do_test capi3-18.3 {
sqlite3_errmsg db sqlite3_errmsg db
} {database schema has changed} } {database schema has changed}

View File

@@ -75,7 +75,6 @@ do_test collate1-1.1 {
} }
} {{} 0x119 0x2D} } {{} 0x119 0x2D}
do_test collate1-1.2 { do_test collate1-1.2 {
breakpoint
execsql { execsql {
SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex; SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex;
} }

View File

@@ -301,7 +301,6 @@ do_test exclusive2-3.3 {
readPagerChangeCounter test.db readPagerChangeCounter test.db
} {4} } {4}
do_test exclusive2-3.4 { do_test exclusive2-3.4 {
breakpoint
execsql { execsql {
INSERT INTO t1 VALUES(randstr(200, 200)); INSERT INTO t1 VALUES(randstr(200, 200));
} }

View File

@@ -146,7 +146,6 @@ do_test fts3aa-3.3 {
execsql {SELECT rowid FROM t1 WHERE content MATCH '-two one'} execsql {SELECT rowid FROM t1 WHERE content MATCH '-two one'}
} {1 5 9 13 17 21 25 29} } {1 5 9 13 17 21 25 29}
breakpoint
do_test fts3aa-4.1 { do_test fts3aa-4.1 {
execsql {SELECT rowid FROM t1 WHERE content MATCH 'one OR two'} execsql {SELECT rowid FROM t1 WHERE content MATCH 'one OR two'}
} {1 2 3 5 6 7 9 10 11 13 14 15 17 18 19 21 22 23 25 26 27 29 30 31} } {1 2 3 5 6 7 9 10 11 13 14 15 17 18 19 21 22 23 25 26 27 29 30 31}

View File

@@ -115,7 +115,6 @@ for {set i 1} {$i<=15} {incr i} {
db eval "INSERT INTO t4(norm,plusone,invert) VALUES([join $vset ,]);" db eval "INSERT INTO t4(norm,plusone,invert) VALUES([join $vset ,]);"
} }
breakpoint
do_test fts3ab-4.1 { do_test fts3ab-4.1 {
execsql {SELECT rowid FROM t4 WHERE t4 MATCH 'norm:one'} execsql {SELECT rowid FROM t4 WHERE t4 MATCH 'norm:one'}
} {1 3 5 7 9 11 13 15} } {1 3 5 7 9 11 13 15}

View File

@@ -78,7 +78,6 @@ do_test fts3ag-1.10 {
# Test that docListOrMerge() correctly handles reaching the end of one # Test that docListOrMerge() correctly handles reaching the end of one
# doclist before it reaches the end of the other. # doclist before it reaches the end of the other.
do_test fts3ag-1.11 { do_test fts3ag-1.11 {
breakpoint
execsql {SELECT rowid FROM t1 WHERE t1 MATCH 'this OR also'} execsql {SELECT rowid FROM t1 WHERE t1 MATCH 'this OR also'}
} {1 2} } {1 2}
do_test fts3ag-1.12 { do_test fts3ag-1.12 {

View File

@@ -253,7 +253,6 @@ check_doclist fts3d-4.4.10 1 0 was {[2 0[1]]}
# Optimize should leave the result in the level of the highest-level # Optimize should leave the result in the level of the highest-level
# prior segment. # prior segment.
breakpoint
do_test fts3d-4.5 { do_test fts3d-4.5 {
execsql { execsql {
SELECT OPTIMIZE(t1) FROM t1 LIMIT 1; SELECT OPTIMIZE(t1) FROM t1 LIMIT 1;

View File

@@ -165,7 +165,6 @@ do_test fts3near-3.6 {
SELECT offsets(t1) FROM t1 WHERE content MATCH 'three NEAR/0 "two four"' SELECT offsets(t1) FROM t1 WHERE content MATCH 'three NEAR/0 "two four"'
} }
} {{0 0 8 5 0 1 14 3 0 2 18 4}} } {{0 0 8 5 0 1 14 3 0 2 18 4}}
breakpoint
do_test fts3near-3.7 { do_test fts3near-3.7 {
execsql { execsql {
SELECT offsets(t1) FROM t1 WHERE content MATCH '"two four" NEAR/0 three'} SELECT offsets(t1) FROM t1 WHERE content MATCH '"two four" NEAR/0 three'}

View File

@@ -90,7 +90,6 @@ do_execsql_test 1.13.1 {
INSERT INTO c1(x) VALUES('a b c'); INSERT INTO c1(x) VALUES('a b c');
INSERT INTO c1(x) VALUES('d e f'); INSERT INTO c1(x) VALUES('d e f');
} }
breakpoint
do_execsql_test 1.13.2 { do_execsql_test 1.13.2 {
SELECT * FROM c1, t1 WHERE input = x AND c1.rowid=t1.rowid; SELECT * FROM c1, t1 WHERE input = x AND c1.rowid=t1.rowid;
} { } {

View File

@@ -392,7 +392,6 @@ foreach T $tokenizers {
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# Test that the private use ranges are treated as alphanumeric. # Test that the private use ranges are treated as alphanumeric.
# #
breakpoint
foreach {tn1 c} { foreach {tn1 c} {
1 \ue000 2 \ue001 3 \uf000 4 \uf8fe 5 \uf8ff 1 \ue000 2 \ue001 3 \uf000 4 \uf8fe 5 \uf8ff
} { } {
@@ -557,7 +556,3 @@ do_execsql_test 11.1 {
} }
finish_test finish_test

View File

@@ -41,7 +41,6 @@ do_test 1-pre {
do_faultsim_test 1 -prep { do_faultsim_test 1 -prep {
faultsim_restore_and_reopen faultsim_restore_and_reopen
db func a_string a_string db func a_string a_string
breakpoint
execsql { execsql {
PRAGMA mmap_size = 1000000; PRAGMA mmap_size = 1000000;
PRAGMA cache_size = 5; PRAGMA cache_size = 5;

99
test/printf2.test Normal file
View File

@@ -0,0 +1,99 @@
# 2013-12-17
#
# 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.
#
#***********************************************************************
# This file implements regression tests for SQLite library. The
# focus of this file is testing the printf() SQL function.
#
#
# EVIDENCE-OF: R-63057-40065 The printf(FORMAT,...) SQL function works
# like the sqlite3_mprintf() C-language function and the printf()
# function from the standard C library.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# EVIDENCE-OF: R-40086-60101 If the FORMAT argument is missing or NULL
# then the result is NULL.
#
do_execsql_test printf2-1.1 {
SELECT quote(printf()), quote(printf(NULL,1,2,3));
} {NULL NULL}
do_execsql_test printf2-1.2 {
SELECT printf('hello');
} {hello}
do_execsql_test printf2-1.3 {
SELECT printf('%d,%d,%d',55,-11,3421);
} {55,-11,3421}
do_execsql_test printf2-1.4 {
SELECT printf('%d,%d,%d',55,'-11',3421);
} {55,-11,3421}
do_execsql_test printf2-1.5 {
SELECT printf('%d,%d,%d,%d',55,'-11',3421);
} {55,-11,3421,0}
do_execsql_test printf2-1.6 {
SELECT printf('%.2f',3.141592653);
} {3.14}
do_execsql_test printf2-1.7 {
SELECT printf('%.*f',2,3.141592653);
} {3.14}
do_execsql_test printf2-1.8 {
SELECT printf('%*.*f',5,2,3.141592653);
} {{ 3.14}}
do_execsql_test printf2-1.9 {
SELECT printf('%d',314159.2653);
} {314159}
do_execsql_test printf2-1.10 {
SELECT printf('%lld',314159.2653);
} {314159}
do_execsql_test printf2-1.11 {
SELECT printf('%lld%n',314159.2653,'hi');
} {314159}
# EVIDENCE-OF: R-20555-31089 The %z format is interchangable with %s.
#
do_execsql_test printf2-1.12 {
SELECT printf('%.*z',5,'abcdefghijklmnop');
} {abcde}
do_execsql_test printf2-1.13 {
SELECT printf('%c','abcdefghijklmnop');
} {a}
# EVIDENCE-OF: R-02347-27622 The %n format is silently ignored and does
# not consume an argument.
#
do_execsql_test printf2-2.1 {
CREATE TABLE t1(a,b,c);
INSERT INTO t1 VALUES(1,2,3);
INSERT INTO t1 VALUES(-1,-2,-3);
INSERT INTO t1 VALUES('abc','def','ghi');
INSERT INTO t1 VALUES(1.5,2.25,3.125);
SELECT printf('(%s)-%n-(%s)',a,b,c) FROM t1 ORDER BY rowid;
} {(1)--(2) (-1)--(-2) (abc)--(def) (1.5)--(2.25)}
# EVIDENCE-OF: R-56064-04001 The %p format is an alias for %X.
#
do_execsql_test printf2-2.2 {
SELECT printf('%s=(%p)',a,a) FROM t1 ORDER BY a;
} {-1=(FFFFFFFFFFFFFFFF) 1=(1) 1.5=(1) abc=(0)}
# EVIDENCE-OF: R-29410-53018 If there are too few arguments in the
# argument list, missing arguments are assumed to have a NULL value,
# which is translated into 0 or 0.0 for numeric formats or an empty
# string for %s.
#
do_execsql_test printf2-2.3 {
SELECT printf('%s=(%d/%g/%s)',a) FROM t1 ORDER BY a;
} {-1=(0/0/) 1=(0/0/) 1.5=(0/0/) abc=(0/0/)}
finish_test

View File

@@ -47,7 +47,6 @@ do_test securedel-1.3 {
} }
} {0 0} } {0 0}
do_test securedel-1.4 { do_test securedel-1.4 {
breakpoint
db eval { db eval {
PRAGMA secure_delete=ON; PRAGMA secure_delete=ON;
PRAGMA db2.secure_delete; PRAGMA db2.secure_delete;

View File

@@ -155,7 +155,8 @@ SELECT * FROM foo1;
2 2
SELECT * FROM foo2; SELECT * FROM foo2;
1 1
2}} 2
}}
# Test with echo on and headers on using dot command and # Test with echo on and headers on using dot command and
# multiple commands per line. # multiple commands per line.
@@ -192,6 +193,7 @@ a
SELECT * FROM foo2; SELECT * FROM foo2;
b b
1 1
2}} 2
}}
finish_test finish_test

View File

@@ -187,4 +187,26 @@ do_execsql_test skipscan1-3.2sort {
SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a;
} {~/*ORDER BY*/} } {~/*ORDER BY*/}
# Ticket 520070ec7fbaac: Array overrun in the skip-scan optimization
# 2013-12-22
#
do_execsql_test skipscan1-4.1 {
CREATE TABLE t4(a,b,c,d,e,f,g,h,i);
CREATE INDEX t4all ON t4(a,b,c,d,e,f,g,h);
INSERT INTO t4 VALUES(1,2,3,4,5,6,7,8,9);
ANALYZE;
DELETE FROM sqlite_stat1;
INSERT INTO sqlite_stat1
VALUES('t4','t4all','655360 163840 40960 10240 2560 640 160 40 10');
ANALYZE sqlite_master;
SELECT i FROM t4 WHERE a=1;
SELECT i FROM t4 WHERE b=2;
SELECT i FROM t4 WHERE c=3;
SELECT i FROM t4 WHERE d=4;
SELECT i FROM t4 WHERE e=5;
SELECT i FROM t4 WHERE f=6;
SELECT i FROM t4 WHERE g=7;
SELECT i FROM t4 WHERE h=8;
} {9 9 9 9 9 9 9 9}
finish_test finish_test

View File

@@ -9,6 +9,7 @@ static const char zHelp[] =
" --autovacuum Enable AUTOVACUUM mode\n" " --autovacuum Enable AUTOVACUUM mode\n"
" --cachesize N Set the cache size to N\n" " --cachesize N Set the cache size to N\n"
" --exclusive Enable locking_mode=EXCLUSIVE\n" " --exclusive Enable locking_mode=EXCLUSIVE\n"
" --explain Like --sqlonly but with added EXPLAIN keywords\n"
" --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n" " --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n"
" --incrvacuum Enable incremenatal vacuum mode\n" " --incrvacuum Enable incremenatal vacuum mode\n"
" --journalmode M Set the journal_mode to MODE\n" " --journalmode M Set the journal_mode to MODE\n"
@@ -49,6 +50,7 @@ static struct Global {
int bWithoutRowid; /* True for --without-rowid */ int bWithoutRowid; /* True for --without-rowid */
int bReprepare; /* True to reprepare the SQL on each rerun */ int bReprepare; /* True to reprepare the SQL on each rerun */
int bSqlOnly; /* True to print the SQL once only */ int bSqlOnly; /* True to print the SQL once only */
int bExplain; /* Print SQL with EXPLAIN prefix */
int szTest; /* Scale factor for test iterations */ int szTest; /* Scale factor for test iterations */
const char *zWR; /* Might be WITHOUT ROWID */ const char *zWR; /* Might be WITHOUT ROWID */
const char *zNN; /* Might be NOT NULL */ const char *zNN; /* Might be NOT NULL */
@@ -290,6 +292,24 @@ void speedtest1_final(void){
} }
} }
/* Print an SQL statement to standard output */
static void printSql(const char *zSql){
int n = (int)strlen(zSql);
while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; }
if( g.bExplain ) printf("EXPLAIN ");
printf("%.*s;\n", n, zSql);
if( g.bExplain
#if SQLITE_VERSION_NUMBER>=3007010
&& ( sqlite3_strglob("CREATE *", zSql)==0
|| sqlite3_strglob("DROP *", zSql)==0
|| sqlite3_strglob("ALTER *", zSql)==0
)
#endif
){
printf("%.*s;\n", n, zSql);
}
}
/* Run SQL */ /* Run SQL */
void speedtest1_exec(const char *zFormat, ...){ void speedtest1_exec(const char *zFormat, ...){
va_list ap; va_list ap;
@@ -298,9 +318,7 @@ void speedtest1_exec(const char *zFormat, ...){
zSql = sqlite3_vmprintf(zFormat, ap); zSql = sqlite3_vmprintf(zFormat, ap);
va_end(ap); va_end(ap);
if( g.bSqlOnly ){ if( g.bSqlOnly ){
int n = (int)strlen(zSql); printSql(zSql);
while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; }
printf("%.*s;\n", n, zSql);
}else{ }else{
char *zErrMsg = 0; char *zErrMsg = 0;
int rc = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg); int rc = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
@@ -318,9 +336,7 @@ void speedtest1_prepare(const char *zFormat, ...){
zSql = sqlite3_vmprintf(zFormat, ap); zSql = sqlite3_vmprintf(zFormat, ap);
va_end(ap); va_end(ap);
if( g.bSqlOnly ){ if( g.bSqlOnly ){
int n = (int)strlen(zSql); printSql(zSql);
while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; }
printf("%.*s;\n", n, zSql);
}else{ }else{
int rc; int rc;
if( g.pStmt ) sqlite3_finalize(g.pStmt); if( g.pStmt ) sqlite3_finalize(g.pStmt);
@@ -378,6 +394,19 @@ static void randomFunc(
sqlite3_result_int64(context, (sqlite3_int64)speedtest1_random()); sqlite3_result_int64(context, (sqlite3_int64)speedtest1_random());
} }
/* Estimate the square root of an integer */
static int est_square_root(int x){
int y0 = x/2;
int y1;
int n;
for(n=0; y0>0 && n<10; n++){
y1 = (y0 + x/y0)/2;
if( y1==y0 ) break;
y0 = y1;
}
return y0;
}
/* /*
** The main and default testset ** The main and default testset
*/ */
@@ -484,15 +513,13 @@ void testset_main(void){
speedtest1_begin_test(150, "CREATE INDEX five times"); speedtest1_begin_test(150, "CREATE INDEX five times");
speedtest1_exec( speedtest1_exec("BEGIN;");
"BEGIN;\n" speedtest1_exec("CREATE UNIQUE INDEX t1b ON t1(b);");
"CREATE UNIQUE INDEX t1b ON t1(b);\n" speedtest1_exec("CREATE INDEX t1c ON t1(c);");
"CREATE INDEX t1c ON t1(c);\n" speedtest1_exec("CREATE UNIQUE INDEX t2b ON t2(b);");
"CREATE UNIQUE INDEX t2b ON t2(b);\n" speedtest1_exec("CREATE INDEX t2c ON t2(c DESC);");
"CREATE INDEX t2c ON t2(c DESC);\n" speedtest1_exec("CREATE INDEX t3bc ON t3(b,c);");
"CREATE INDEX t3bc ON t3(b,c);\n" speedtest1_exec("COMMIT;");
"COMMIT;\n"
);
speedtest1_end_test(); speedtest1_end_test();
@@ -566,10 +593,8 @@ void testset_main(void){
n = sz; n = sz;
speedtest1_begin_test(190, "DELETE and REFILL one table", n); speedtest1_begin_test(190, "DELETE and REFILL one table", n);
speedtest1_exec( speedtest1_exec("DELETE FROM t2;");
"DELETE FROM t2;" speedtest1_exec("INSERT INTO t2 SELECT * FROM t1;");
"INSERT INTO t2 SELECT * FROM t1;"
);
speedtest1_end_test(); speedtest1_end_test();
@@ -663,9 +688,17 @@ void testset_main(void){
speedtest1_exec("REPLACE INTO t3(a,b,c) SELECT a,b,c FROM t1"); speedtest1_exec("REPLACE INTO t3(a,b,c) SELECT a,b,c FROM t1");
speedtest1_end_test(); speedtest1_end_test();
speedtest1_begin_test(300, "Refill a %d-row table using (b&1)==(a&1)", sz);
speedtest1_exec("DELETE FROM t2;");
speedtest1_exec("INSERT INTO t2(a,b,c)\n"
" SELECT a,b,c FROM t1 WHERE (b&1)==(a&1);");
speedtest1_exec("INSERT INTO t2(a,b,c)\n"
" SELECT a,b,c FROM t1 WHERE (b&1)<>(a&1);");
speedtest1_end_test();
n = sz/5; n = sz/5;
speedtest1_begin_test(300, "%d four-ways joins", n); speedtest1_begin_test(310, "%d four-ways joins", n);
speedtest1_exec("BEGIN"); speedtest1_exec("BEGIN");
speedtest1_prepare( speedtest1_prepare(
"SELECT t1.c FROM t1, t2, t3, t4\n" "SELECT t1.c FROM t1, t2, t3, t4\n"
@@ -684,7 +717,15 @@ void testset_main(void){
speedtest1_exec("COMMIT"); speedtest1_exec("COMMIT");
speedtest1_end_test(); speedtest1_end_test();
speedtest1_begin_test(320, "subquery in result set", n);
speedtest1_prepare(
"SELECT sum(a), max(c),\n"
" avg((SELECT a FROM t2 WHERE 5+t2.b=t1.b) AND rowid<?1), max(c)\n"
" FROM t1 WHERE rowid<?1;"
);
sqlite3_bind_int(g.pStmt, 1, est_square_root(g.szTest)*50);
speedtest1_run();
speedtest1_end_test();
speedtest1_begin_test(980, "PRAGMA integrity_check"); speedtest1_begin_test(980, "PRAGMA integrity_check");
speedtest1_exec("PRAGMA integrity_check"); speedtest1_exec("PRAGMA integrity_check");
@@ -757,6 +798,9 @@ int main(int argc, char **argv){
cacheSize = integerValue(argv[i]); cacheSize = integerValue(argv[i]);
}else if( strcmp(z,"exclusive")==0 ){ }else if( strcmp(z,"exclusive")==0 ){
doExclusive = 1; doExclusive = 1;
}else if( strcmp(z,"explain")==0 ){
g.bSqlOnly = 1;
g.bExplain = 1;
}else if( strcmp(z,"heap")==0 ){ }else if( strcmp(z,"heap")==0 ){
if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]); if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]);
nHeap = integerValue(argv[i+1]); nHeap = integerValue(argv[i+1]);
@@ -896,6 +940,7 @@ int main(int argc, char **argv){
speedtest1_exec("PRAGMA journal_mode=%s", zJMode); speedtest1_exec("PRAGMA journal_mode=%s", zJMode);
} }
if( g.bExplain ) printf(".explain\n.echo on\n");
if( strcmp(zTSet,"main")==0 ){ if( strcmp(zTSet,"main")==0 ){
testset_main(); testset_main();
}else if( strcmp(zTSet,"debug1")==0 ){ }else if( strcmp(zTSet,"debug1")==0 ){

View File

@@ -164,7 +164,6 @@ db close
forcedelete test.db forcedelete test.db
sqlite3 db test.db sqlite3 db test.db
register_dbstat_vtab db register_dbstat_vtab db
breakpoint
do_execsql_test stat-5.1 { do_execsql_test stat-5.1 {
PRAGMA auto_vacuum = OFF; PRAGMA auto_vacuum = OFF;
CREATE VIRTUAL TABLE temp.stat USING dbstat; CREATE VIRTUAL TABLE temp.stat USING dbstat;

View File

@@ -44,7 +44,6 @@ do_test tkt-94c94-2.1 {
execsql { CREATE TABLE t2(x, y) } db execsql { CREATE TABLE t2(x, y) } db
} {} } {}
do_test tkt-94c94-2.2 { do_test tkt-94c94-2.2 {
breakpoint
execsql { INSERT INTO t2 VALUES(1, 2) } db2 execsql { INSERT INTO t2 VALUES(1, 2) } db2
} {} } {}
do_test tkt-94c94-2.3 { do_test tkt-94c94-2.3 {

View File

@@ -116,7 +116,6 @@ do_test vtab_shared-1.10 {
} {1 {database table is locked: sqlite_master}} } {1 {database table is locked: sqlite_master}}
do_test vtab_shared-1.11 { do_test vtab_shared-1.11 {
breakpoint
execsql { execsql {
CREATE VIRTUAL TABLE t2 USING echo(t0); CREATE VIRTUAL TABLE t2 USING echo(t0);
CREATE VIRTUAL TABLE t3 USING echo(t0); CREATE VIRTUAL TABLE t3 USING echo(t0);

View File

@@ -852,7 +852,6 @@ do_test wal-13.1.2 {
sqlite3 db test.db sqlite3 db test.db
execsql { SELECT * FROM t2 } execsql { SELECT * FROM t2 }
} {B 2} } {B 2}
breakpoint
do_test wal-13.1.3 { do_test wal-13.1.3 {
db close db close
file exists test.db-wal file exists test.db-wal

View File

@@ -1279,7 +1279,6 @@ foreach {tn settings restart_sync commit_sync ckpt_sync} {
PRAGMA synchronous = [lindex $settings 2]; PRAGMA synchronous = [lindex $settings 2];
" {0 wal} " {0 wal}
if { $tn==2} breakpoint
do_test 15.$tn.2 { do_test 15.$tn.2 {
set sync(normal) 0 set sync(normal) 0
set sync(full) 0 set sync(full) 0

View File

@@ -567,7 +567,6 @@ do_test walfault-14-pre {
} {} } {}
do_faultsim_test walfault-14 -prep { do_faultsim_test walfault-14 -prep {
faultsim_restore_and_reopen faultsim_restore_and_reopen
breakpoint
execsql { execsql {
SELECT count(*) FROM abc; SELECT count(*) FROM abc;
PRAGMA locking_mode = exclusive; PRAGMA locking_mode = exclusive;