From: drh Date: Sun, 21 Sep 2014 22:49:20 +0000 (+0000) Subject: Merge all recent trunk changes into the sessions branch. X-Git-Tag: version-3.13.0~148^2~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b011d83b4d377beb19d919bbe1a758cd360a9b2;p=thirdparty%2Fsqlite.git Merge all recent trunk changes into the sessions branch. FossilOrigin-Name: 6406b77f2c447751a2fbb16f01c61cdcfd6af59e --- 6b011d83b4d377beb19d919bbe1a758cd360a9b2 diff --cc main.mk index 79fd1b63d2,4a7ac02710..f958c1572f --- a/main.mk +++ b/main.mk @@@ -46,8 -46,7 +46,8 @@@ # TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP) TCCX += -I$(TOP)/ext/rtree -I$(TOP)/ext/icu -I$(TOP)/ext/fts3 - TCCX += -I$(TOP)/ext/async + TCCX += -I$(TOP)/ext/async -I$(TOP)/ext/userauth +TCCX += -I$(TOP)/ext/session # Object files for the SQLite library. # @@@ -217,10 -214,9 +217,12 @@@ SRC += $(TOP)/ext/rtree/sqlite3rtree.h \ $(TOP)/ext/rtree/rtree.h \ $(TOP)/ext/rtree/rtree.c +SRC += \ + $(TOP)/ext/session/sqlite3session.c \ + $(TOP)/ext/session/sqlite3session.h - + SRC += \ + $(TOP)/ext/userauth/userauth.c \ + $(TOP)/ext/userauth/sqlite3userauth.h # Generated source code files # @@@ -567,9 -562,9 +571,12 @@@ fts3_write.o: $(TOP)/ext/fts3/fts3_writ rtree.o: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c + userauth.o: $(TOP)/ext/userauth/userauth.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/userauth/userauth.c + +sqlite3session.o: $(TOP)/ext/session/sqlite3session.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/session/sqlite3session.c + # Rules for building test programs and for running tests # diff --cc manifest index df9dd11580,ddf26d66a1..ffe55892fc --- a/manifest +++ b/manifest @@@ -1,9 -1,9 +1,9 @@@ - C Merge\ssupport\sfor\slarge\sfiles\son\sAndroid\sfrom\strunk. - D 2014-09-08T15:04:24.810 -C Correctly\shandle\san\sORDER\sBY\sclause\son\san\souter\squery\swhen\sapplying\nthe\scompound-subquery\sflattening\soptimization.\s\sTicket\s[89398880bcfff].\nAlso\sadd\sthe\sSQLITE_ENABLE_SELECTTRACE\soption\sfor\sadditional\sdebugging\nand\sanalysis\sinformation\sabout\sselect\sstatement\sprocessing. -D 2014-09-21T22:31:52.593 ++C Merge\sall\srecent\strunk\schanges\sinto\sthe\ssessions\sbranch. ++D 2014-09-21T22:49:20.257 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a +F Makefile.in dd5f245aa8c741bc65845747203c8ce2f3fb6c83 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc e31dee24038965fb6269d6d61073fd6b7e331dec +F Makefile.msc 35808af7f8d999176ed5b38fb482a87a129ee3e1 F Makefile.vxworks 034289efa9d591b04b1a73598623119c306cbba0 F README.md 64f270c43c38c46de749e419c22f0ae2f4499fe8 F VERSION 53a0b870e7f16d3b06623c31d233a304c163a6af @@@ -144,26 -145,13 +145,29 @@@ F ext/rtree/rtree_util.tcl 06aab2ed5b82 F ext/rtree/sqlite3rtree.h 83349d519fe5f518b3ea025d18dd1fe51b1684bd F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 +F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a +F ext/session/session1.test 3733d71eb9a99b14d51fa5219d5b8a82407c3be8 +F ext/session/session2.test 99ca0da7ddb617d42bafd83adccf99f18ae0384b +F ext/session/session3.test a7a9ce59b8d1e49e2cc23d81421ac485be0eea01 +F ext/session/session4.test a6ed685da7a5293c5d6f99855bcf41dbc352ca84 +F ext/session/session5.test 8fdfaf9dba28a2f1c6b89b06168bdab1fef2d478 +F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 +F ext/session/session8.test 7d35947ad329b8966f095d34f9617a9eff52dc65 +F ext/session/session9.test 776e46785c29c11cda01f5205d0f1e8f8f9a46bf +F ext/session/sessionA.test eb05c13e4ef1ca8046a3a6dbf2d5f6f5b04a11d4 +F ext/session/sessionB.test 276267cd7fc37c2e2dd03f1e2ed9ada336a8bdb4 +F ext/session/session_common.tcl 1539d8973b2aea0025c133eb0cc4c89fcef541a5 +F ext/session/sessionfault.test e7965159a73d385c1a4af12d82c3a039ebdd71a6 +F ext/session/sqlite3session.c 4c7689bd8286147f7d9bf5d4b6ca5e7e7ee588ab +F ext/session/sqlite3session.h 66c14a2f6193c47773770307636e88c43db6f839 +F ext/session/test_session.c a252fb669d3a1b3552ee7b87fe610debc0afeb7b + F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220 + F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 + F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 - F main.mk 4dfbd8fbc91ee5732554b31a205960241c4fc059 -F main.mk bbc8b6000ed143a1a8d31d3b4995c359a3188fa1 ++F main.mk 7711bc77822814799b853271ee19ac79e98bfb4b F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk c6b3fa301db6ef7ac916b14c60868aeaec1337b5 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@@ -184,30 -172,30 +188,30 @@@ F src/auth.c d8abcde53426275dab6243b441 F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5 - F src/btree.c b1c1cd1cc3ae2e433a23b9a6c9ab53805707d8cd + F src/btree.c 6aa61c0e3d20d1d1acc8fb33d8f0ebd675305d3c F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8 F src/btreeInt.h e0ecb5dba292722039a7540beb3fc448103273cc - F src/build.c 8cb237719c185eec7bd8449b2e747491ded11932 + F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c 535183afb3c75628b78ce82612931ac7cdf26f14 - F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a + F src/ctime.c 16cd19215d9fd849ee2b7509b092f2e0bbd6a958 F src/date.c 57a7f9ba9f6b4d5268f5e411739066a611f99036 -F src/delete.c fae81cc2eb14b75267d4f47d3cfc9ae02aae726f +F src/delete.c de3d07d6602b90ae6e8bdebeb7b3265bb846377f - F src/expr.c 441a7e24e2f7bea9475778fa8acce9e8a69ca8f0 + F src/expr.c 4f101c8ddc6d5a22303c88278069f5261562a9a8 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c da985ae673efef2c712caef825a5d2edb087ead7 - F src/func.c 0517037766e18eff7dce298e6b3a8e6311df75ec + F src/func.c 1629ccdd8ef3f19d7accc9d9287190489469ff81 F src/global.c 5110fa12e09729b84eee0191c984ec4008e21937 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 - F src/insert.c 92e955206fadb4d1184161d00894b32c90879e86 -F src/insert.c 5b9243a33726008cc4132897d2be371db12a13be ++F src/insert.c 4f6df86bbed2d7b59e4601730407876825dd7b71 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d - F src/legacy.c 87c92f4a08e2f70220e3b22a9c3b2482d36a134a - F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b - F src/loadext.c 31c2122b7dd05a179049bbf163fd4839f181cbab - F src/main.c faf3629e61ba31912b474316c02f173878ddd566 - F src/malloc.c 954de5f998c23237e04474a3f2159bf483bba65a + F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e + F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 + F src/loadext.c de741e66e5ddc1598d904d7289239696e40ed994 -F src/main.c d15621461fb0c52675eba2b650492ed1beef69ab ++F src/main.c 1010acfb69ccd62e34e3b83664537450225c74e2 + F src/malloc.c 5bb99ee1e08ad58e457063cf79ce521db0e24195 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c faf615aafd8be74a71494dfa027c113ea5c6615f F src/mem2.c dce31758da87ec2cfa52ba4c5df1aed6e07d8e8f @@@ -224,32 -212,32 +228,32 @@@ F src/os.c 1b147e4cf7cc39e618115c14a086 F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa - F src/os_unix.c addd023b26c623fec4dedc110fc4370a65b4768c + F src/os_unix.c 9096a1b1449182e67e759f59994eee04113bc587 F src/os_win.c 0a4042ef35f322e86fa01f6c8884c5e645b911e7 F src/os_win.h 09e751b20bbc107ffbd46e13555dc73576d88e21 - F src/pager.c 31da9594ad4c3b5851bb6fe1a95c33835ab7ddce + F src/pager.c caab007743821d96752597c9cfd7351654697b06 F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428 - F src/parse.y 22d6a074e5f5a7258947a1dc55a9bf946b765dd0 - F src/pcache.c 2048affdb09a04478b5fc6e64cb1083078d369be + F src/parse.y b98772da2bb5415970085b707203f92569400aa8 + F src/pcache.c 4121a0571c18581ee9f82f086d5e2030051ebd6a F src/pcache.h 9b559127b83f84ff76d735c8262f04853be0c59a F src/pcache1.c dab8ab930d4a73b99768d881185994f34b80ecaa - F src/pragma.c 14bcdb504128a476cce5bbc086d5226c5e46c225 - F src/prepare.c 3842c1dfc0b053458e3adcf9f6efc48e03e3fe3d - F src/printf.c e74925089a85e3c9f0e315595f41c139d3d118c2 + F src/pragma.c 3f3e959390a10c0131676f0e307acce372777e0f + F src/prepare.c 6ef0cf2f9274982988ed6b7cab1be23147e94196 + F src/printf.c 3a47f526b173813d9a7f4e7044007771ba68cde1 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece - F src/resolve.c 0d1621e45fffe4b4396477cf46e41a84b0145ffb + F src/resolve.c a3466128b52a86c466e47ac1a19e2174f7b5cf89 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e - F src/select.c b4457526cee73c0b69fad42f799f619b1d5a8a8a - F src/shell.c ec6d5f630ed617dc80cbc35d9e45fe47f07923db - F src/sqlite.h.in 70de5c9e5ac117363db78d144c7e6f1f65d007a1 + F src/select.c a83ed8bc2a31c131e3addb6f0488b68334085e7b -F src/shell.c dad23987c34faddb061a339da3e92e05ccc6935e -F src/sqlite.h.in 8b018219ce988913e5977d5de9ab4beb33be23b6 ++F src/shell.c 85aae71dcc9bd6df28047b95ab631eb0ac91401f ++F src/sqlite.h.in 1af072be5ed8902c8c12b5b105487d0efedd00b4 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad - F src/sqlite3ext.h 1f40357fb9b12a80c5a3b2b109fd249b009213d4 - F src/sqliteInt.h 4d6c5c87324c2b6218c01a0895c0d298fffb5aff + F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d -F src/sqliteInt.h 5ecde2191721a94cdce0d5248e26a373e0b17a70 ++F src/sqliteInt.h 35f074ded974804602e3ed89576a74c9b7255c93 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 - F src/table.c 4e28a53e66bad8d014a510ef0205f5497c712b08 - F src/tclsqlite.c 9d0073dda76ab2508c8fde50950f4556fe2fdafb - F src/test1.c 22bfe1ce9f2f3746d682093a475ec0a33e0e55d8 + F src/table.c 2e99ef7ef16187e17033d9398dc962ce22dab5cb -F src/tclsqlite.c c67d310c833046cccc192125d64ad422ab882684 ++F src/tclsqlite.c 684c317b85f4729de12909bfad80d3f5500357cf + F src/test1.c 523cd70ded28db71af9a30ec184cbe0957de9575 F src/test2.c 98049e51a17dc62606a99a9eb95ee477f9996712 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df @@@ -262,7 -250,7 +266,7 @@@ F src/test_async.c 21e11293a2f72080eda7 F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12 F src/test_backup.c 3875e899222b651e18b662f86e0e50daa946344e F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f - F src/test_config.c a65043d01ad3bd2dfe9a3aa7e39a9935b069f6aa -F src/test_config.c 6f721f0337b96d58e81ff69bba101113c8168c2b ++F src/test_config.c 5a2a9a580f9c2dfd2ffd52966fd361f2148909d1 F src/test_demovfs.c 69b2085076654ebc18014cbc6386f04409c959a9 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f @@@ -295,21 -283,21 +299,21 @@@ F src/test_vfs.c f84075a388527892ff1849 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 22dded4283dc4b25422f6444cdcb8d6b1ea0b5ff - F src/tokenize.c 722872c816887fd66931333c59570ebd9622a95f + F src/tokenize.c 3df63041994f55afeb168b463ec836e8f1c50e7c F src/trigger.c 25571661fdeae8c7f975ff40ffec205520a3f92f -F src/update.c 729f6f18fc27740591d085e1172cebe311144bf0 +F src/update.c b9e5295d3a78e96b7c2978c4f9d224d06880f031 - F src/utf.c 77abb5e6d27f3d236e50f7c8fff1d00e15262359 + F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c 4006c01772bd8d8ac4306d523bbcee41d3e392d8 F src/vacuum.c 59f03f92bcff57faa6a8ca256eb29ccddfb0614a - F src/vdbe.c 16b7d573a683e70a1e502332c5f90dd48fa34736 - F src/vdbe.h ca3b6df299adce6e2f499c57e42ae54f142ae823 - F src/vdbeInt.h 0dec00acd7e490a456a0ebaa6f478de94da7b52d - F src/vdbeapi.c d63985095b5d24b522fc206c547df1683a4e73ee - F src/vdbeaux.c 264284931ecd079076ab40a71522570107b8e723 -F src/vdbe.c de1af1795bebdad20c23e82bafa2f531e9893198 -F src/vdbe.h 09f5b4e3719fa454f252322b1cdab5cf1f361327 -F src/vdbeInt.h f177bed1ec8d4eb5c7089f012aeb95f374745735 -F src/vdbeapi.c e9e33b59834e3edc8790209765e069874c269d9d -F src/vdbeaux.c a05adc3c96abdaf3db14768ddd63132fc9678060 -F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4 -F src/vdbemem.c 1e105dacf5190fc85a8ec2107c0dcc1884e75099 ++F src/vdbe.c 5e6d4ef36cfff2bacb4d11eccc99bd55c76692f5 ++F src/vdbe.h d61daeffed696e21630759de9e135ee298ad9573 ++F src/vdbeInt.h 0e6e8d18199cef7dd5e9fa5de8490f60806259f0 ++F src/vdbeapi.c cdded67e36d2a20f6d1c7d56f008a646557d2bf0 ++F src/vdbeaux.c 07b0045d0f34d0ad70c1c42ff75246a7e64e4e87 +F src/vdbeblob.c d65b01f439df63911ac3d7a9a85c15503965f2c3 - F src/vdbemem.c dc36ea9fe26c25550c50085f388167086ef7d73a - F src/vdbesort.c ab39574ec6e0c6213bd2a5c09cca9f9f8ba98450 - F src/vdbetrace.c 16d39c1ef7d1f4a3a7464bea3b7b4bdd7849c415 ++F src/vdbemem.c 5096fe50a1bd12bc2294a8b27ca6e6d1b15ef607 + F src/vdbesort.c 5c1bacf90578d22b630fbf6ed98ccf60d83435ef + F src/vdbetrace.c 4f29b04edb0cec3d5fcd9b566d9f0e75c8984362 F src/vtab.c 019dbfd0406a7447c990e1f7bd1dfcdb8895697f F src/wal.c 10e7de7ce90865a68153f001a61f1d985cd17983 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@@ -1210,7 -1199,8 +1216,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f - P d4cce2c71e64ab7b6a65a81b88b69445ed859351 ad7063aa1a0db32cdbe71815545b2edca57d3bcc - R 4a5cc1720b7ac28a8c5dae667ce4d5c3 -P 59e2c9df02d7e988c5ad44c560ead1e5288b12e7 9683e001ed38b41979220eef0bdfcb54df5f3191 -R df45958fe8f93552efb788581c98f0f7 -T +closed 9683e001ed38b41979220eef0bdfcb54df5f3191 ++P c2885c6bb24cc55178467e57e77bf71df58b3b13 d5880abd63c83c88e135257373afa0a3fd88297e ++R 9d7f30c83131a55806d3c1dd053387df U drh - Z 6dac05eb8bc8db62f0a6dc6a2d623660 -Z d861c46be738b6f104b52fa4441ce204 ++Z c53e54ee2e290caf615c330d235d140a diff --cc manifest.uuid index fefc26aff6,7cf6d685c3..a34006bb05 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - c2885c6bb24cc55178467e57e77bf71df58b3b13 -d5880abd63c83c88e135257373afa0a3fd88297e ++6406b77f2c447751a2fbb16f01c61cdcfd6af59e diff --cc src/shell.c index c7089fa8f2,9745e0ff25..493822a592 --- a/src/shell.c +++ b/src/shell.c @@@ -3188,198 -3101,14 +3191,205 @@@ static int do_meta_command(char *zLine } }else - + #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) + if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ + extern int sqlite3SelectTrace; + sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; + }else + #endif + +#if defined(SQLITE_ENABLE_SESSION) + if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ + OpenSession *pSession = &p->aSession[0]; + char **azCmd = &azArg[1]; + int iSes = 0; + int nCmd = nArg - 1; + int i; + if( nArg<=1 ) goto session_syntax_error; + open_db(p, 0); + if( nArg>=3 ){ + for(iSes=0; iSesnSession; iSes++){ + if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; + } + if( iSesnSession ){ + pSession = &p->aSession[iSes]; + azCmd++; + nCmd--; + }else{ + pSession = &p->aSession[0]; + iSes = 0; + } + } + + /* .session attach TABLE + ** Invoke the sqlite3session_attach() interface to attach a particular + ** table so that it is never filtered. + */ + if( strcmp(azCmd[0],"attach")==0 ){ + if( nCmd!=2 ) goto session_syntax_error; + if( pSession->p==0 ){ + session_not_open: + fprintf(stderr, "ERROR: No sessions are open\n"); + }else{ + rc = sqlite3session_attach(pSession->p, azCmd[1]); + if( rc ){ + fprintf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); + rc = 0; + } + } + }else + + /* .session changeset FILE + ** .session patchset FILE + ** Write a changeset or patchset into a file. The file is overwritten. + */ + if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ + FILE *out = 0; + if( nCmd!=2 ) goto session_syntax_error; + if( pSession->p==0 ) goto session_not_open; + out = fopen(azCmd[1], "wb"); + if( out==0 ){ + fprintf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]); + }else{ + int szChng; + void *pChng; + if( azCmd[0][0]=='c' ){ + rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); + }else{ + rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); + } + if( rc ){ + printf("Error: error code %d\n", rc); + rc = 0; + } + if( pChng + && fwrite(pChng, szChng, 1, out)!=1 ){ + fprintf(stderr, "ERROR: Failed to write entire %d-byte output\n", + szChng); + } + sqlite3_free(pChng); + fclose(out); + } + }else + + /* .session close + ** Close the identified session + */ + if( strcmp(azCmd[0], "close")==0 ){ + if( nCmd!=1 ) goto session_syntax_error; + if( p->nSession ){ + session_close(pSession); + p->aSession[iSes] = p->aSession[--p->nSession]; + } + }else + + /* .session enable ?BOOLEAN? + ** Query or set the enable flag + */ + if( strcmp(azCmd[0], "enable")==0 ){ + int ii; + if( nCmd>2 ) goto session_syntax_error; + ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); + if( p->nSession ){ + ii = sqlite3session_enable(pSession->p, ii); + fprintf(p->out, "session %s enable flag = %d\n", pSession->zName, ii); + } + }else + + /* .session filter GLOB .... + ** Set a list of GLOB patterns of table names to be excluded. + */ + if( strcmp(azCmd[0], "filter")==0 ){ + int ii, nByte; + if( nCmd<2 ) goto session_syntax_error; + if( p->nSession ){ + for(ii=0; iinFilter; ii++){ + sqlite3_free(pSession->azFilter[ii]); + } + sqlite3_free(pSession->azFilter); + nByte = sizeof(pSession->azFilter[0])*(nCmd-1); + pSession->azFilter = sqlite3_malloc( nByte ); + if( pSession->azFilter==0 ){ + fprintf(stderr, "Error: out or memory\n"); + exit(1); + } + for(ii=1; iiazFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); + } + pSession->nFilter = ii-1; + } + }else + + /* .session indirect ?BOOLEAN? + ** Query or set the indirect flag + */ + if( strcmp(azCmd[0], "indirect")==0 ){ + int ii; + if( nCmd>2 ) goto session_syntax_error; + ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); + if( p->nSession ){ + ii = sqlite3session_indirect(pSession->p, ii); + fprintf(p->out, "session %s indirect flag = %d\n", pSession->zName,ii); + } + }else + + /* .session isempty + ** Determine if the session is empty + */ + if( strcmp(azCmd[0], "isempty")==0 ){ + int ii; + if( nCmd!=1 ) goto session_syntax_error; + if( p->nSession ){ + ii = sqlite3session_isempty(pSession->p); + fprintf(p->out, "session %s isempty flag = %d\n", pSession->zName, ii); + } + }else + + /* .session list + ** List all currently open sessions + */ + if( strcmp(azCmd[0],"list")==0 ){ + for(i=0; inSession; i++){ + fprintf(p->out, "%d %s\n", i, p->aSession[i].zName); + } + }else + + /* .session open DB NAME + ** Open a new session called NAME on the attached database DB. + ** DB is normally "main". + */ + if( strcmp(azCmd[0],"open")==0 ){ + char *zName; + if( nCmd!=3 ) goto session_syntax_error; + zName = azCmd[2]; + if( zName[0]==0 ) goto session_syntax_error; + for(i=0; inSession; i++){ + if( strcmp(p->aSession[i].zName,zName)==0 ){ + fprintf(stderr, "Session \"%s\" already exists\n", zName); + goto meta_command_exit; + } + } + if( p->nSession>=ArraySize(p->aSession) ){ + fprintf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); + goto meta_command_exit; + } + pSession = &p->aSession[p->nSession]; + rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); + if( rc ){ + fprintf(stderr, "Cannot open session: error code=%d\n", rc); + rc = 0; + goto meta_command_exit; + } + pSession->nFilter = 0; + sqlite3session_table_filter(pSession->p, session_filter, pSession); + p->nSession++; + pSession->zName = sqlite3_mprintf("%s", zName); + }else + /* If no command name matches, show a syntax error */ + session_syntax_error: + session_help(p); + }else +#endif #ifdef SQLITE_DEBUG /* Undocumented commands for internal testing. Subject to change diff --cc src/vdbeaux.c index 1e41bca624,87b14a6d87..284e906dca --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@@ -3169,11 -3161,10 +3162,11 @@@ void sqlite3VdbeRecordUnpack pMem->enc = pKeyInfo->enc; pMem->db = pKeyInfo->db; /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ - pMem->zMalloc = 0; + pMem->szMalloc = 0; + pMem->z = 0; d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); pMem++; - u++; + if( (++u)>=p->nField ) break; } assert( u<=pKeyInfo->nField + 1 ); p->nField = u; diff --cc src/vdbemem.c index ea4def3f86,36db80fa18..90cd3dadf6 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@@ -747,12 -795,11 +795,10 @@@ void sqlite3VdbeMemShallowCopy(Mem *pTo int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ int rc = SQLITE_OK; - assert( pTo->db==pFrom->db ); assert( (pFrom->flags & MEM_RowSet)==0 ); - VdbeMemReleaseExtern(pTo); + if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); memcpy(pTo, pFrom, MEMCELLSIZE); pTo->flags &= ~MEM_Dyn; - pTo->xDel = 0; - if( pTo->flags&(MEM_Str|MEM_Blob) ){ if( 0==(pFrom->flags&MEM_Static) ){ pTo->flags |= MEM_Ephem;