From: drh Date: Wed, 15 Jan 2020 14:26:58 +0000 (+0000) Subject: Merge all recent enhancements and fixes from trunk. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=106ab91fc836e0359a817b32b3a2b80027d8ec1f;p=thirdparty%2Fsqlite.git Merge all recent enhancements and fixes from trunk. FossilOrigin-Name: f783917800a5ce7c4bb31725b26d266cd4f133a0cc8414c6bf4789a8cd1e45c8 --- 106ab91fc836e0359a817b32b3a2b80027d8ec1f diff --cc manifest index a4339e04bd,db3464521a..f298f51bcd --- a/manifest +++ b/manifest @@@ -1,13 -1,13 +1,13 @@@ - C Bring\sthe\sreuse-schema\sbranch\sup-to-date\swith\sversion\s3.30.0. - D 2019-10-04T15:31:42.731 -C Fix\sthe\surifuncs.c\sextension\s(used\sfor\stesting\sand\sdebugging\sonly)\sso\sthat\nthe\ssqlite3_filename_database()\sSQL\sfunction\sand\sits\ssiblings\scorrectly\shandle\nan\sinvalid\sschema\sname\spassed\sin\sas\sthe\sargument. -D 2020-01-14T16:50:09.276 ++C Merge\sall\srecent\senhancements\sand\sfixes\sfrom\strunk. ++D 2020-01-15T14:26:58.112 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 - F Makefile.in 4f63722008696418bae434379987f9987cba2ce823579512f2dd5f0ff734c04a -F Makefile.in 9dfc7936f675785309b74d09202bb656732325e65df889e5aaa18cc8932e5b0c ++F Makefile.in e97846dfaeb3851107b4dcbffbfc1245d54ff953cf08cc27ab85f1044d057bb7 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 - F Makefile.msc bfa3ab0a9d6a81ac5156084c67b75e2c9b66fd543954673ff2135075eef07414 -F Makefile.msc fab23c6b10cb6f06a7e9c407fc2e35cb184a6d653f1b793bda87fcee2eafa4f6 ++F Makefile.msc a5fc3fada762671dbeb34d1995448c06afb1ec4d287e4bb72c6889e8f1291935 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a - F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 + F VERSION 081500f0aeaadc989d85aafbc717af45512018aebc73d89e5c2368fe62a600ff F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@@ -40,7 -40,7 +40,8 @@@ F contrib/sqlitecon.tcl 210a913ad63f9f9 F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 +F doc/shared_schema.md 759fc374709fccf4e5d2d0cbd05f8fedd38fb022bdd8a6c5b5f492684c7023b9 + F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 @@@ -448,7 -453,7 +454,7 @@@ F ext/userauth/userauth.c f81aa5a3ecacf F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 - F main.mk f20c19fda395ae00a77662586eec40ba90aee6b1873ae275a7c2b23ed6d63d48 -F main.mk 7ce055f3df31a4f7d21e38f493f907c21db1f673863a573e231f55e2ab005023 ++F main.mk 4f739b347cce517de440e0c22e6fdd10f9290b716efa6005ae7cfacbbd5f1a77 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@@ -460,38 -465,38 +466,38 @@@ F spec.template 86a4a43b99ebb3e75e6b9a7 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a - F src/alter.c deddf439893a8157b19b2b69e9537ed12aa2e4ddf5738141932f6d0330d1bb44 - F src/analyze.c 050e013f2b1d0f6f334e147c4c0f8a24f4b7dfb83c24fc62a2da7ebb50e45dfb - F src/attach.c 6a1a045ff64c542882d1159a1df0aebaeaad86c9ed204edd979e94e8e9feefe1 -F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c -F src/attach.c df0ead9091042c68964856ecc08dba55d5403ad5f3ca865d9d396d71528c511a ++F src/alter.c 5584426b5622b10d2c4cd6695585fcdc4216c0bd0e33ff9958106096ab770fb0 ++F src/analyze.c caa9cc97a066a9f0cac443d67676cf4883afb89153a4fdc9ccd61a3a8ae8ef9b ++F src/attach.c 167b341f4c62807853643f9428b1197b4efd691dd443641556776d3c5c1c443c F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 - F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f - F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 - F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f - F src/build.c d7bb76a055fb4b44f5d2426ccfe80c8b5b0b1d6de53e71777a2d73f895e4e9a0 - F src/callback.c 2e6db109a37219464a3a5ed6f2f330af4a0500a1a224122f4be472e454efe2cf + F src/btree.c 7af5ff0f88ba856c2681f6eeb457590b24f787e994f18cbdb44c2de2d33f757e + F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 + F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 -F src/build.c bd2f382562b08f14748d54402220be1082c2f8ff8973fad47e45a381c438f9bf -F src/callback.c c547d00963ae28100117b4fb1f0f32242109b5804374ee3bfe01138a54da7f76 ++F src/build.c b22d3580d09eccb8779b6a08a20b79289d73058c16c779c54b8454eee6d5ef77 ++F src/callback.c 63422679f285cf2252c57d8705f4f613a4ecd191d82c413ea57b0b15b35fc827 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 +F src/ctime.c 15d1010037db3577d2e90e793197c539e86860ab272d7a49e4e976425d0eba62 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 - F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 - F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 - F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf - F src/expr.c 1e9a6da29e3e13c14783891e867e19a54e2731c6a9b58d011cc4f3b4742a59e4 + F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a + F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da + F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 + F src/expr.c 003c59158b33d7f3b198122cb0d1e13c06517cc3932e56b42283eb0e96696d66 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 - F src/fkey.c 2c14c9431a2de2c0d9444d0cc27e4360f4829455f689decfff01cac383fe0894 - F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 - F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 -F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 ++F src/fkey.c 2d234423b9aaf3b59dc8e0ee361f47ddf7806f655c94f75abfa74638c71f2025 + F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c + F src/global.c 59601d885a0dbbfbd22ed2d030424a5e7f1b9809a17ca46686058bbc4a55e980 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 - F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da + F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 - F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 + F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa - F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d - F src/main.c dcdd6acc2ec4a790aedf741cb684c43f632c41bbbc34a41129f5cde43437433c - F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 + F src/loadext.c 8cd803f1747c03a50b32fe87ebfb5851998d0cdafefe02737daa95e0616b42bb -F src/main.c da8b42cee9b83cc923bf23d1945c9fb48cf57cb0422d5fe43a1ff88dc453b97b ++F src/main.c c9f8a7005341d833c2879ec24ecf224ae979cd14d33c42b0b895bd4f8d66fb8e + F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@@ -510,33 -515,33 +516,33 @@@ F src/os.c 669cc3839cc35d20f81faf0be1ab F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 - F src/os_unix.c a76a75f179cb233d54e505c3e0c84832224cfe5dfb3ee470bdcaf1ed29da57ab + F src/os_unix.c ad7640c04eed946052a3b12856362a773d0a717696707313037186df0e2b59f2 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a - F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b - F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 - F src/parse.y 50bfcb34be7320dd0cb875021a93ae6451c8f0b083f21b71934a1a3a9108015a + F src/pager.c 52a2923ebd6ca0e2ce917b5860ffe893a344481b5fa4c2a2568ad156168bc558 + F src/pager.h 71fe1d5016ec54d0cc5d344cd474e563450b438c59f535e8c1ec8a13b1373f14 + F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 - F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 - F src/pragma.c f76a8ddaf4aa0e2dab3c080ad5c9fc4599c3431fe8f2ca36d6a129441e739d1a - F src/pragma.h 583d641cfd146d31c91d7ba2770d6b8413c3ff0dc4f4a56645216c983a119c08 - F src/prepare.c 43e4601125f076d6c30b33c47dfcb3cffcdc1f26f02c4339b6f27c63016c88cd + F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 9145cc0d7309b49d383fe15deca9ab592830b8b532e7fb25e9e36b6f470cbf66 -F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd -F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 ++F src/pragma.c 21e7a213702f29fe652e7b856b3bde55070c889957b5c04da68985b1eaa5f39d ++F src/pragma.h 3b8fc00c101f379352e1c733ce9c5180ac6826575d0cca118c6e70fd20664d02 ++F src/prepare.c 3078898f6883b7f0e656428fddfc55aabde531fab390f35a7224938af5a6a75f F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 - F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 + F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 - F src/select.c f509982c96bb24ccf57a0155fbe1e6184e0b8fb8866a04397dc41baa400e5240 - F src/shell.c.in 2c49eff321d70abe720d5799f6abfb12c1093dda3956ac813060eb81a5cc8b05 - F src/sqlite.h.in ba0f0a99948d98adcab93824f6203b50ba81f69c4376cbba8e4e392fd25a8ebe + F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 -F src/shell.c.in 1b2a636ba5b676f844a2af2a5f719b5c4ace7c6825d56270e2ae912b2a5fc840 -F src/sqlite.h.in cedb3737511a45ae35fba6e4d6c250ae36f6b82da0de38113efa1a3bc83ee105 ++F src/shell.c.in 6d2c6d34db31b59ab36ddc3ec77158b848bd3ffe54f6db9b2b519875990a7095 ++F src/sqlite.h.in c7784a160e407b0b602f6a2c22ba43c1c6621d2378880509f04c8cd1e891e353 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 - F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 - F src/sqliteInt.h 88d98a058528319eebb598a71353faaf81ea6d070ebf3c83cccfb19418fdc1a0 + F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db -F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 ++F src/sqliteInt.h be6a29e1fc0b9340b412a616b1b685dfa057ac3c6817b2bdcd3b071d4d4fa355 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b - F src/status.c d9f7d66ae8bee9ffbe4cf7ae72a8d3d429a269336dee1e705ecb3dbea27fa5e2 -F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 ++F src/status.c f6e2b6c37873620ce2cb597f5606a1c9adca4c0db1ff3a08a37231e920d21985 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 - F src/tclsqlite.c 02d9f47e1797c7aa4174fe90dc5380fb99057303e0b6443fa1b103e9de65cf35 - F src/test1.c 17e1395cbddeb9226b756d723a7566b45b43b99a5f9f55afb4ff70888de6ad6f -F src/tclsqlite.c f2dae14bfe7a35c94b6d515df88071014678ec39dafebdcf8e6bde91d62516c1 ++F src/tclsqlite.c adf091277c67f47e0cdfdedfa2231777340021e26d7108192b32b9fce4308d1d + F src/test1.c 4d0ab2f67053a4fff87d1d3586ecc0e5322a1fc45dd4119ab11dc96de44f17a1 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@@ -591,33 -595,33 +597,33 @@@ F src/test_windirent.h 90dfbe95442c9762 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c - F src/tokenize.c 3e08eadda7a23a58dd45976c68c600ca2b61a6015c2e61849b1e0cb62f9a9169 - F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 - F src/trigger.c 63761fc1306cf27eb1c875410d23452224ece3aafd14a0b73d6f53776050d06a - F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 - F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 - F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 - F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 -F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d ++F src/tokenize.c 1f2627ae84b327c8a55425d0e53568e56a86a304ea4c91e016a58283549e8367 + F src/treeview.c 438c1000587b33faba35e87596bebcf7f40638d98f33781cdd9e04711b18b09c -F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc ++F src/trigger.c 8256290482385fad62daaf9b8f0b1e2c0a74931d34a92d0ccd5c675e16b37c68 + F src/update.c 9ad19af96aff95dc02a923a99f97c1bc0b909009a29a2914b796f786b9ac0c60 + F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 + F src/utf.c 736ff76753236ffbc8b5b939f5e0607f28aeaa7c780b3a56b419228f0a81c87b + F src/util.c e5f3971160154e5c9b660fd119b02ec4890e87cd18a5bc4d45ee60cddbb9e6a2 -F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 35dcc7d43c2635853773d994b052061283a4e5b0e60e799cef83e410d90f3145 -F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 +F src/vacuum.c 5b9b4771ffb47aaef038c4ad5f1acd76dfbc9e0a4f101c1ba7f7ac9c2ba96374 - F src/vdbe.c a70a294f7f05313e32ffe67c1b1e5f33820d5985f83f3aa794d7e963bbffd960 - F src/vdbe.h 2cfde8249aac55d7f508752e27919e17a30add7bf7444dc221ae5a65d2bafe9d - F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 - F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e - F src/vdbeaux.c 38f1e2dcb4571ddc9e75459345ab8f229ad62e0bdc0a1f7545112e6e7f443bbd ++F src/vdbe.c 8877d4f3ca4c6375fbf437ee3aa214bafe248b0fc063e1d32fb2cd2b22edfc41 ++F src/vdbe.h dfe0c985275820175d9ffb21372de10a651823957ce8aadd055c812bc76db83c + F src/vdbeInt.h 30d3e8b991547cdf39025e416a0a737b0416d46747af70ae058f60e2e0466fe7 + F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c ff690e6c9314ef281de7c06f8c8c33393f0afca80aabb1fe69836dcf2d60b0bf -F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 ++F src/vdbeaux.c eafd650c15e201bdd796b5f5f4e573a652b5a5ee69f6b24fcc5b89e7ebc2d977 +F src/vdbeblob.c 40028e015fe557a945c99edb6cbf844ea96d853c3e8ac4eb5c1e49bff59f154e - F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 - F src/vdbesort.c da75f505aba230060ce6472605a4aa6494f73eeb1071e1cc2643c3d4035e671b + F src/vdbemem.c ad9e6217635f2b04df98bc57b12c98cefc9c0a1745cca47f4e8109119213253d + F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 - F src/vtab.c 043b188f5f3472935c08686b3f006ca07b26fbacb6eb371f8cd4b06602ab094e -F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 ++F src/vtab.c 0119233719474ebefeea02f3bc9c08edcb2e409dbf7ed0820060223be8122aff F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 - F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d + F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a - F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd - F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 - F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 - F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b - F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 - F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 + F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d + F src/where.c df2bea0e0122e853d9f1a8ec68920744166d2a524e338eba92e5470538ecd1f9 + F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 + F src/wherecode.c ec8870d6fe79668dd12d7edc65ae9771828d6cdfe478348c8abd872a89fdbadd + F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 + F src/window.c f8ba2ee12a19b51d3ba42c16277c74185ee9215306bc0d5a03974ade8b5bc98f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@@ -1403,7 -1404,7 +1413,7 @@@ F test/tabfunc01.test 5ca6d004157a3e886 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 - F test/tclsqlite.test 47dded95a07b8916da62902724ce3a59d60331ed5ba2bfe42d1189ce0413c0f3 -F test/tclsqlite.test 6f8705d09377e2f2ff482ab181a1388773953a280623fff2ccab0e87d2bc10a2 ++F test/tclsqlite.test 13aef7a9fca1a4d43124636489f7676f8aabcfd030ebba4d315b5b38dee43c9f F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@@ -1593,12 -1594,12 +1603,13 @@@ F test/triggerD.test 8e7f3921a92a5797d4 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 + F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a -F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 -F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 +F test/tt3_checkpoint.c 9a7fe00e07700af027769d83ef67ab727927ae6c865ecdc71fe8011194200c53 +F test/tt3_index.c 95592839426dc85ce5a7a57b41be2cbf3c2ec3457b9cd841a06ed5877f712c7c +F test/tt3_lookaside1.c 2ddd99bfffeef288f0786827ef68f912f6f47ce3d3184e62f05808d8e13b920e +F test/tt3_reuseschema.c 4d52e141f89f009028d8ab0bd1f0697d0edffa94bafc1fff0f7ad4d9d9baa549 +F test/tt3_stress.c bbd430f23fa64f466ea8f212756f5f7135a2f8ff5accad85550c0ba73be76b16 +F test/tt3_vacuum.c ca42adcf8a671abbe34338b828464269e21758a6b4857b889dabfd39a3206d98 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a @@@ -1789,9 -1790,9 +1800,9 @@@ F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa - F tool/mkpragmatab.tcl ee69ec15f46275c873083e7e643adda86b3368cf587dab6b69eb7aa324d8242d -F tool/mkpragmatab.tcl ca12b1c718ececdab2d3aacb437bc3c81ebf68467f19d7974e17f18844a3a48f ++F tool/mkpragmatab.tcl 85493320069444f15553b98cc274517b853519c188ead3e5eb61045babfb0c4e F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 - F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b + F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f F tool/mksqlite3c.tcl 5fed3d75069d8f66f202d3b5200b0cea4aa7108481acd06732a06fdd42eb83a2 @@@ -1856,7 -1857,7 +1867,7 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 - P 067961241293b99b7f716e6f05e302b8354c9e7216296148b6f4ab59f8d3f4b0 c20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f - R 8446e9bb49d694ba552d7092cfcb2561 -P 54bf04811951db6c894f272f870e3e41f8f5e05a25c1115efbbdbd0d8bba54be -R ef60df967e796bd9bfc273160d5104d4 ++P 6e09afecd6086211253b5f8eab718dde097f92a88100e54604a3f063c1a1fc98 3d7434a9d85dae9135473d1c58c22ac01a282e654807aa10be9b39f127291594 ++R 15ca3da604b66877479d6d4906c92531 U drh - Z 64ac795d118c8062077fc7428aa80632 -Z 6fa8f0dab0c264087d10e9adb2b33207 ++Z 80ccbe9cfd70e1dc3c5202c2d4d8869e diff --cc manifest.uuid index 4e688faa6b,cea784779f..05ad65025d --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 6e09afecd6086211253b5f8eab718dde097f92a88100e54604a3f063c1a1fc98 -3d7434a9d85dae9135473d1c58c22ac01a282e654807aa10be9b39f127291594 ++f783917800a5ce7c4bb31725b26d266cd4f133a0cc8414c6bf4789a8cd1e45c8 diff --cc src/pragma.h index 067f76aa6d,3edf5c1c30..48eb2fccfd --- a/src/pragma.h +++ b/src/pragma.h @@@ -241,15 -239,15 +246,15 @@@ static const PragmaName aPragmaName[] #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_OneSchema, - /* ColNames: */ 35, 3, + /* ColNames: */ 41, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1|PragFlg_OneSchema, - /* ColNames: */ 45, 1, + /* ColNames: */ 49, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@@ -278,8 -276,8 +283,8 @@@ #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) {/* zName: */ "foreign_key_check", /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_OneSchema, - /* ColNames: */ 31, 4, + /* ColNames: */ 37, 4, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) @@@ -567,8 -565,8 +572,8 @@@ #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG) {/* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_OneSchema, - /* ColNames: */ 21, 5, + /* ColNames: */ 27, 5, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@@ -663,8 -668,8 +675,8 @@@ /* iArg: */ 0 }, {/* zName: */ "wal_checkpoint", /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, - /* ePragFlg: */ PragFlg_NeedSchema, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_OneSchema, - /* ColNames: */ 38, 3, + /* ColNames: */ 44, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) diff --cc src/shell.c.in index 1451a7b5ef,f355737f59..f8760237fa --- a/src/shell.c.in +++ b/src/shell.c.in @@@ -4145,17 -4141,14 +4148,19 @@@ static void open_db(ShellState *p, int break; } case SHELL_OPEN_READONLY: { - sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0); + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READONLY|p->openFlags, 0); break; } + case SHELL_OPEN_SHAREDSCHEMA: { + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_SHARED_SCHEMA,0); + break; + } case SHELL_OPEN_UNSPEC: case SHELL_OPEN_NORMAL: { - sqlite3_open(p->zDbFilename, &p->db); + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); break; } } @@@ -8274,9 -8062,8 +8305,10 @@@ static int do_meta_command(char *zLine p->openMode = SHELL_OPEN_APPENDVFS; }else if( optionMatch(z, "readonly") ){ p->openMode = SHELL_OPEN_READONLY; + }else if( optionMatch(z, "sharedschema") ){ + p->openMode = SHELL_OPEN_SHAREDSCHEMA; - }else if( z[0]=='-' ){ + }else if( optionMatch(z, "nofollow") ){ + p->openFlags |= SQLITE_OPEN_NOFOLLOW; #ifdef SQLITE_ENABLE_DESERIALIZE }else if( optionMatch(z, "deserialize") ){ p->openMode = SHELL_OPEN_DESERIALIZE; @@@ -10514,8 -10300,8 +10552,10 @@@ int SQLITE_CDECL wmain(int argc, wchar_ #endif }else if( strcmp(z,"-readonly")==0 ){ data.openMode = SHELL_OPEN_READONLY; + }else if( strcmp(z,"-sharedschema")==0 ){ + data.openMode = SHELL_OPEN_SHAREDSCHEMA; + }else if( strcmp(z,"-nofollow")==0 ){ + data.openFlags = SQLITE_OPEN_NOFOLLOW; #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) }else if( strncmp(z, "-A",2)==0 ){ /* All remaining command-line arguments are passed to the ".archive" @@@ -10619,8 -10405,8 +10659,10 @@@ #endif }else if( strcmp(z,"-readonly")==0 ){ data.openMode = SHELL_OPEN_READONLY; + }else if( strcmp(z,"-sharedschema")==0 ){ + data.openMode = SHELL_OPEN_SHAREDSCHEMA; + }else if( strcmp(z,"-nofollow")==0 ){ + data.openFlags |= SQLITE_OPEN_NOFOLLOW; }else if( strcmp(z,"-ascii")==0 ){ data.mode = MODE_Ascii; sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, diff --cc src/sqlite.h.in index f1721bc99a,c61c0e8b31..5e2c496fa6 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@@ -568,10 -571,9 +571,11 @@@ int sqlite3_exec #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + #define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */ /* Reserved: 0x00F00000 */ +#define SQLITE_OPEN_SHARED_SCHEMA 0x01000000 /* Ok for sqlite3_open_v2() */ + /* ** CAPI3REF: Device Characteristics diff --cc src/sqliteInt.h index 3fb786b93f,53e7095daa..8481d82dda --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@@ -1572,10 -1630,8 +1644,11 @@@ struct sqlite3 #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ #define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ #define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ + #define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ +#define DBFLAG_SchemaInuse 0x0020 /* Do not release sharable schemas */ +#define DBFLAG_FreeSchema 0x0040 /* Free extra shared schemas on release */ + /* ** Bits of the sqlite3.dbOptFlags field that are used by the ** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to @@@ -1961,13 -2067,17 +2084,20 @@@ struct VTable sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ + u8 eVtabRisk; /* Riskiness of allowing hacker access */ int iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ +#ifdef SQLITE_ENABLE_SHARED_SCHEMA + char *zName; /* Table name (REUSE_SCHEMA mode) */ +#endif }; + /* Allowed values for VTable.eVtabRisk + */ + #define SQLITE_VTABRISK_Low 0 + #define SQLITE_VTABRISK_Normal 1 + #define SQLITE_VTABRISK_High 2 + /* ** The schema for each SQL table and view is represented in memory ** by an instance of the following structure. diff --cc src/tclsqlite.c index eed7a43b92,6a8b52b6bc..6381d47a35 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@@ -3670,10 -3674,8 +3674,11 @@@ static int sqliteCmdUsage ){ Tcl_WrongNumArgs(interp, 1, objv, "HANDLE ?FILENAME? ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN?" + " ?-nofollow BOOLEAN?" " ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?" +#ifdef SQLITE_ENABLE_SHARED_SCHEMA + " ?-shared-schema BOOLEAN?" +#endif #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_CODEC_FROM_TCL) " ?-key CODECKEY?" #endif diff --cc src/vtab.c index 93ce2293e2,013511cfb4..eb027ca6bf --- a/src/vtab.c +++ b/src/vtab.c @@@ -505,8 -488,9 +506,9 @@@ void sqlite3VtabFinishParse(Parse *pPar sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp0(v, OP_Expire); - zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName); + zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt); - sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + sqlite3VdbeAddParseSchemaOp(pParse, iDb, zWhere); + sqlite3DbFree(db, zStmt); iReg = ++pParse->nMem; sqlite3VdbeLoadString(v, iReg, pTab->zName); @@@ -608,10 -587,7 +610,11 @@@ static int vtabCallConstructor } pVTable->db = db; pVTable->pMod = pMod; +#ifdef SQLITE_ENABLE_SHARED_SCHEMA + pVTable->zName = (char*)&pVTable[1]; + memcpy(pVTable->zName, pTab->zName, nByte-sizeof(VTable)); +#endif + pVTable->eVtabRisk = SQLITE_VTABRISK_Normal; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; @@@ -651,24 -627,14 +654,24 @@@ rc = SQLITE_ERROR; }else{ int iCol; - u8 oooHidden = 0; + u16 oooHidden = 0; /* If everything went according to plan, link the new VTable structure - ** into the linked list headed by pTab->pVTable. Then loop through the - ** columns of the table to see if any of them contain the token "hidden". - ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from - ** the type string. */ - pVTable->pNext = pTab->pVTable; - pTab->pVTable = pVTable; + ** into the linked list headed by pTab->pVTable. Or, if this is a + ** reusable schema, into the linked list headed by Db.pVTable. + ** + ** Then loop through the columns of the table to see if any of them + ** contain the token "hidden". If so, set the Column COLFLAG_HIDDEN flag + ** and remove the token from the type string. */ +#ifdef SQLITE_ENABLE_SHARED_SCHEMA + if( IsSharedSchema(db) && iDb!=1 ){ + pVTable->pNext = db->aDb[iDb].pVTable; + db->aDb[iDb].pVTable = pVTable; + }else +#endif /* ifdef SQLITE_ENABLE_SHARED_SCHEMA */ + { + pVTable->pNext = pTab->pVTable; + pTab->pVTable = pVTable; + } for(iCol=0; iColnCol; iCol++){ char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); diff --cc test/tclsqlite.test index 468e2efb78,b01da0ec23..2f1a0affcc --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@@ -25,10 -25,7 +25,10 @@@ set testprefix tc # Check the error messages generated by tclsqlite # - set r "sqlite_orig HANDLE ?FILENAME? ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN? ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?" + set r "sqlite_orig HANDLE ?FILENAME? ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN? ?-nofollow BOOLEAN? ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?" +ifcapable sharedschema { + append r " ?-shared-schema BOOLEAN?" +} if {[sqlite3 -has-codec]} { append r " ?-key CODECKEY?" }